在学习内核HOOK的问题,发现自已的基础就是XX,记录一下!
曾经的问题:
//加入pushad 及popad 这样会不会影响到JMP地址各个寄存器,
//因为以上代码和JMP到的地址代码为同一个函数。会吗?
//以上汇编代码处理后蓝屏,应该是堆栈不平问题。
问题:如何保证破坏后堆栈平衡?
//正常
lkd> u ObCheckObjectAccess l10
nt!ObCheckObjectAccess:
805c119c 8bff mov edi,edi
805c119e 55 push ebp
805c119f 8bec mov ebp,esp
805c11a1 83ec10 sub esp,10h
805c11a4 8b4508 mov eax,dword ptr [ebp+8]
805c11a7 56 push esi
805c11a8 57 push edi
805c11a9 ff7514 push dword ptr [ebp+14h]
805c11ac 8b78f0 mov edi,dword ptr [eax-10h]
805c11af 8d4df0 lea ecx,[ebp-10h]
805c11b2 51 push ecx
805c11b3 8d4dfc lea ecx,[ebp-4]
805c11b6 33f6 xor esi,esi
805c11b8 51 push ecx
805c11b9 50 push eax
805c11ba 8975f4 mov dword ptr [ebp-0Ch],esi
//HOOK后
push 0AB248D18h //我修改此地址进入我的函数后,直接JMP 805c11a9 以达到目地。
RET
in al,dx
adc byte ptr [ebx+57560845h],cl
805c11a9 push dword ptr [ebp+14h]
805c11ac mov edi,dword ptr [eax-10h]
805c11af lea ecx,[ebp-10h]
805c11b2 push ecx
__declspec(naked) void myhook()
{
__asm
{
//模拟ObCheckObjectAccess函数头如下
pushad
mov edi,edi
push ebp
mov ebp,esp
sub esp,10h
mov eax,dword ptr [ebp+8]
push esi
push edi
popad
//跳转到JMP 805c11a9
mov ebx,ObCheckObjectAccess
add ebx,0xd
jmp ebx
}
}