我的keellisa ID何时能找回啊
补充一下:对于定位函数地址的小技巧:
1)如果函数本身内部没有合适的代码作为特征码,可以在调用它的函数中定位到调用目标函数的代码,然后再通过计算获得目标函数的地址;
下面是个例子:
// ==========================================================
// 函数名称:GetFunAddr
// 函数用途:
// 输入参数:NONE
// 返 回:NONE
// ==========================================================
/*
$-1A >|. A1 748D3D0F MOV EAX,DWORD PTR DS:[F3D8D74]
$-15 >|. 8B78 34 MOV EDI,DWORD PTR DS:[EAX+34]
$-12 >|. 8B81 B8010000 MOV EAX,DWORD PTR DS:[ECX+1B8]
$-C >|. 85C0 TEST EAX,EAX
$-A >|. 897C24 1C MOV DWORD PTR SS:[ESP+1C],EDI
$-6 >|. 0F8C 94030000 JL 0F39CE58
$ ==> >|. 83F8 06 CMP EAX,6
$+3 >|. 0F8D 8B030000 JGE 0F39CE58
$+9 >|. 8B1485 B0723C0F MOV EDX,DWORD PTR DS:[EAX*4+F3C72B0]
$+10 >|. 81C1 90010000 ADD ECX,190
$+16 >|. 8D5C24 14 LEA EBX,DWORD PTR SS:[ESP+14]
$+1A >|. 895424 14 MOV DWORD PTR SS:[ESP+14],EDX
$+1E >|. E8 190C0000 CALL 0F39D700 ; 目标函数地址
83 F8 06 0F 8D 8B 03 00 00
+1e
+1f
(函数地址)0F39D700 = addr + 1e + [addr + 1f] + 5
*/
bool GetFunAddr(void)
{
int Addr;
int*pAddr;
BYTE Data[]={0x83 ,0xF8 ,0x06 ,0x0F ,0x8D ,0x8B ,0x03 ,0x00 ,0x00};
//搜索特征码
Addr = SearchDataFromProcessByDllName(Data, sizeof(Data), "AchieveSystem.dll");
//判断是否查找到特征码
if( 0 == Addr)
{
return false;
}
//取特征码
pAddr = (int*)(Addr - 0x19);
G_Addr_Fun = Addr + 0x1e + *((int*)(Addr + 0x1f)) + 5;
return true;
}
2)如果目标函数为虚函数,可以通过获得对应类全局变量,然后获得类虚函数表,通过虚函数在虚函数表的偏移获得函数地址。;