标签:
先写一段代码,通过汇编代码进行理解。
//这是普通的函数 #include <stido.h> void __declspec(naked) Function() { } void CommonFunction() { } int _tmain(int argc, _TCHAR* argv[]) { Function(); CommonFunction(); return 0; }
然后在main函数中的Function函数上下断点,转到反汇编窗口查看:
int _tmain(int argc, _TCHAR* argv[]) { 01251400 push ebp 01251401 mov ebp,esp 01251403 sub esp,0C0h 01251409 push ebx 0125140A push esi 0125140B push edi 0125140C lea edi,[ebp-0C0h] 01251412 mov ecx,30h 01251417 mov eax,0CCCCCCCCh 0125141C rep stos dword ptr es:[edi] Function(); 0125141E call Function (012510F0h) CommonFunction(); 01251423 call CommonFunction (01251186h) return 0; 01251428 xor eax,eax } 0125142A pop edi 0125142B pop esi 0125142C pop ebx 0125142D add esp,0C0h 01251433 cmp ebp,esp 01251435 call __RTC_CheckEsp (01251145h) 0125143A mov esp,ebp 0125143C pop ebp 0125143D ret
F11,进入call Function (012510F0h) 。
Function: 012513F0 int 3 012513F1 int 3 012513F2 int 3 012513F3 int 3 012513F4 int 3 012513F5 int 3 012513F6 int 3 012513F7 int 3 012513F8 int 3 012513F9 int 3 012513FA int 3 012513FB int 3 012513FC int 3 012513FD int 3 012513FE int 3 012513FF int 3
完全是空的,任何代码都没有生成,如果再执行,会提示异常,因为什么都没有,退出,重新进入调试状态,进入CommonFunction(),进行查看。
void CommonFunction() { 010F13C0 push ebp 010F13C1 mov ebp,esp 010F13C3 sub esp,0C0h \\提高堆栈 010F13C9 push ebx 010F13CA push esi 010F13CB push edi \\保存环境 010F13CC lea edi,[ebp-0C0h] 010F13D2 mov ecx,30h 010F13D7 mov eax,0CCCCCCCCh 010F13DC rep stos dword ptr es:[edi] \\初始化 } 010F13DE pop edi } 010F13DF pop esi 010F13E0 pop ebx 010F13E1 mov esp,ebp 010F13E3 pop ebp 010F13E4 ret
自动生成了这些代码,以保证代码的正常执行。
总结:
因此我们需要在裸函数里面,自己写上初始化代码,防止以后在hook的时候,由于编译器自动生成的代码影响程序的执行和稳定。
标签:
原文地址:http://www.cnblogs.com/code4st/p/4551452.html