能力值:
( LV2,RANK:10 )
|
-
-
2 楼
应该是你自己的 Inline hook 框架有问题 (参考 KiFastCallEntry Hook、Ring3 Inline hook)
如果是 Inline Hook 了一个被频繁调用的函数 也只是会很慢而已,不会 BSOD 的。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
Inline Hook 的新函数一般是
__declspec(naked) VOID InlineHookNewFunction1(VOID)
{
_asm
{
// 保存各个寄存器的值
pushfd
pushad
}
// DoSomething() ...
KdPrint(("[Vin_Chyi] Ring0 Inline Hook ~~~ \n"));
_asm
{
// 恢复各个寄存器的值
popad
popfd
jmp g_HookCopyBuffer1
}
}
DoSomething() 应该是 特定的功能,才是实际意义上的 NewFunction,而上面这个函数 应该是 ProxyFunction
g_HookCopyBuffer1 处是 从Original Function 拷贝过来的字节码 + 调回返回地址的代码
|
能力值:
( LV9,RANK:380 )
|
-
-
4 楼
__declspec(naked)
VOID NtOpenProcessDeepInlineHook()
{
__asm
{
pop ecx
push [ebp-38]
push [ebp-24]
add ecx, 1
push ecx
ret
}
}
颠倒了。
|
能力值:
( LV6,RANK:80 )
|
-
-
5 楼
[QUOTE=Winker;1129735]__declspec(naked) VOID NtOpenProcessDeepInlineHook(){ __asm { pop ecx push [ebp-38] push [ebp-24] ...[/QUOTE]正解,+1.
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
[QUOTE=Winker;1129735]__declspec(naked)
VOID NtOpenProcessDeepInlineHook()
{
__asm
{
pop ecx
push [ebp-38]
push [ebp-24]
...[/QUOTE]
感谢回复,这里的pop ecx是重定位,这个函数就是Hook后call的函数,pop ecx用来得到返回地址
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
我这个其实只是中继函数,就是第2步Hook后call的函数,要承接上下文,不能pushad破坏原本的堆栈
另外,注意在虚拟机里边跑的没有问题的
|
能力值:
( LV8,RANK:120 )
|
-
-
8 楼
不会分析dump的别瞎玩。
目测是真机里面的这段代码可能不一样
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
dump有分析过,code是一样的
NtOpenProcess Hook部分:
0: kd> u
nt!NtOpenProcess+0x217:
808f4613 8d8548ffffff lea eax,[ebp-0B8h]
808f4619 50 push eax
808f461a e8b1a2cf37 call NtHook!KernNtOpenProcessDeepInlineHook (b85ee8d0)
808f461f 90 nop
808f4620 e84706ffff call nt!ObOpenObjectByPointer (808e4c6c)
808f4625 8bf8 mov edi,eax
808f4627 8d8548ffffff lea eax,[ebp-0B8h]
808f462d 50 push eax
Hook函数:
0: kd> u b85ee8d0
NtHook!KernNtOpenProcessDeepInlineHook
b85ee8d0 59 pop ecx
b85ee8d1 ff75da push dword ptr [ebp-26h]
b85ee8d4 ff75e8 push dword ptr [ebp-18h]
b85ee8d7 83c101 add ecx,1
b85ee8da 51 push ecx
b85ee8db c3 ret
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
[QUOTE=xhflovemy;1129797]dump有分析过,code是一样的 NtOpenProcess Hook部分:
0: kd> u
nt!NtOpenProcess+0x217:
808f4613 8d8548ffffff lea eax,[ebp-0B8h]
808f4619 50 ...[/QUOTE] 多谢提醒,没太注意,两个push真的不一样
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
估计是内核代码不同的原因。
同一张盘装出来的,虚拟机和真实机的内核大小和代码都是不同的。
|
能力值:
( LV9,RANK:190 )
|
-
-
12 楼
ecx寄存器因为你的钩子函数的执行它的值发生了变化了。
__declspec(naked)
VOID NtOpenProcessDeepInlineHook()
{
__asm
{
pop ecx //得到call之后的返回地址,ecx是看了上下文后挑选的
push [ebp-38] //实现原本被hook掉的两个push
push [ebp-24]
add ecx, 1 //计算返回地址(也就是图中的0x805cc620)
push ecx
ret
}
}
改成这样试试
__declspec(naked)
VOID NtOpenProcessDeepInlineHook()
{
__asm
{
pop eax //得到call之后的返回地址,ecx是看了上下文后挑选的
push [ebp-38] //实现原本被hook掉的两个push
push [ebp-24]
add eax, 1 //计算返回地址(也就是图中的0x805cc620)
push eax
ret
}
}
但是我在想 你从NtOpenProcessDeepInlineHook的 ret以后 立即来到0x805cc620,而cpu是要预取下一个指令的这会不会使得call ObOpenObjectByPointer 的指令被影响。如还是蓝屏 就把NtOpenProcessDeepInlineHook的 add eax, 1 去掉试看看,去掉add eax, 1 后我想运行应该不会有问题。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
我的虚拟机和本机里的代码就不一样,每次都得改
|
|
|