在反外挂系统中,经常会检测函数的返回地址,确认函数的返回地址在规定的范围之内,从而保证,游戏程序中的函数,不被外挂所调用。这种检查方式就涉及到一个基本的技术问题,如何获得函数的返回地址?

例如下面的第一段代码:

#include<stdio.h>
int main()
{
   getchar();
   return 0;
}


 

    非常简单的一段程序,那么我们如何获得该函数的起始地址和返回地址呢?起始地址获取非常容易,如下:

#include<stdio.h>
int main()
{
   printf("%0x\n",main);
   getchar();
   return 0;
}


那么如何获得函数的返回地址呢?这个就相对来说比较困难。我们先看第一段代码反汇编后的结果:

 

#include<stdio.h>
intmain()
{
009919E0  push       ebp  
009919E1  mov        ebp,esp  
009919E3  sub        esp,0C0h  
009919E9  push       ebx  
009919EA  push       esi  
009919EB  push       edi  
009919EC  lea        edi,[ebp-0C0h]  
009919F2  mov        ecx,30h  
009919F7  mov        eax,0CCCCCCCCh  
009919FC  rep stos   dword ptr es:[edi]  
   getchar();
009919FE  mov        esi,esp  
00991A00  call       dword ptr [__imp__getchar (9982B0h)] 
00991A06  cmp        esi,esp  
00991A08  call       @ILT+295(__RTC_CheckEsp) (99112Ch) 
   return 0;
00991A0D  xor        eax,eax  
}
00991A0F  pop        edi  
00991A10  pop        esi  
00991A11  pop        ebx  
00991A12  add        esp,0C0h  
00991A18  cmp        ebp,esp  
00991A1A  call       @ILT+295(__RTC_CheckEsp) (99112Ch) 
00991A1F  mov         esp,ebp 
00991A21  pop        ebp  
00991A22  ret