裸函数

先写一段代码,通过汇编代码进行理解。

//这是普通的函数
#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的时候,由于编译器自动生成的代码影响程序的执行和稳定。

posted on 2015-06-04 12:35  一蓑烟雨╮゜  阅读(327)  评论(0编辑  收藏  举报

导航