在反外挂系统中,经常会检测函数的返回地址,确认函数的返回地址在规定的范围之内,从而保证,游戏程序中的函数,不被外挂所调用。这种检查方式就涉及到一个基本的技术问题,如何获得函数的返回地址?
例如下面的第一段代码:
#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