一个关于push ret HOOK的问题随记一下。

 

在学习内核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
       
     }
}

你可能感兴趣的:(c,汇编,byte,hook)