支持下面三种方式的特征码搜索,显示地址:
BOOL scanffileself(const char *pfilename,TAddressList&datalst);
//搜索数据特征 所在位置
int ScanfSpec(CString sspec,INT istartaddr,INT iendaddr);
//根据常量附近的特征码搜索常量数据,如
//A1 B4 A9 91 00; mov eax,dword ptr [91A9B4] 要得到0091A9B4

/**//*
0452b3C: A1 B4A99100 ; mov eax,dword ptr [91A9B4] ioffset=-8
0452b41: 6A 00 ; PUSH 0
0452b43: 6A 00 ; PUSH 0
0452b45: 8B50 1C ; mov edx,dword ptr [eax+1C] --sspec开始--
0452b48: 8B42 28 ; mov eax,dword ptr [edx+28]
0452b4B: 8B82 6C030000 ; mov eax,dword ptr [edx+036C] --sspec结束--
上述地址应该在istartaddr,iendaddr之间
*/
int ScanfConstData(CString sspec,INT istartaddr,INT iendaddr,INT ioffset);
//根据函数调用附近的特征码搜索调用函数,如
//E8 F3 3E 10 00; call 0057BDD0 要得到0057BDD0

/**//* 捡物地址
0477EC4: 8B97 10010000 ; mov edx,dword ptr [edi+110] --sspec开始--
0477ECA: 8B46 20 ; mov eax,dword ptr [esi+20]
0477ECD: 52 ; push edx
0477ECE: 8B49 20 ; mov ecx,dword ptr [ecx+20] --sspec结束--
0477ED1: 50 ; push eax
0477ED2: 81c1 D4000000 ; add ecx 0D4 --sspec也可以在此结束--
0477ED8: E8 F3 3E 10 00; call 0057BDD0 要得到0057BDD0=0477ED8+00013EF3+05 ioffset=21=d8+01-c4
上述地址应该在istartaddr,iendaddr之间
*/
int ScanfCall_Func(CString sspec,INT istartaddr,INT iendaddr,INT ioffset);
//根据函数内的地址搜索函数起始地址,如
//答题地址

/**//*
0581550: 6A FF ; push -1 --函数起始地址--
0581552: 68 98308400 ; push 00843098
...
0581585: 8B4C24 30 ; mov ecx,dword ptr [esp+30] --sspec开始--
0581589: 8B5424 34 ; mov edx,dword ptr [esp+34]
058158D: 8B86 3001 0000; mov eax,dword ptr [esi+130] --sspec结束--
0581593: 894c24 10 ; mov dword ptr[esp+10],ecx --sspec也可以在此结束--
上述地址应该在istartaddr,iendaddr之间
*/
int ScanfFuncStart(CString sspec,INT istartaddr,INT iendaddr,INT ioffset);

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。