码迷,mamicode.com
首页 > 其他好文 > 详细

裸函数

时间:2015-06-04 13:32:19      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

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

//这是普通的函数
#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!