今天閑來無事,好久沒有逆軟件了,本來用CE想找個(gè)基址來寫個(gè)外掛玩玩,結(jié)果發(fā)現(xiàn)這個(gè)是一個(gè)數(shù)組,而且跳躍次數(shù)也比較多,較為麻煩,沒辦法,只有祭出我的大殺器OD來辦它。過程如下:
//------------------------------CE里面看到的數(shù)據(jù):---------------------------//
EAX=0000005A
EBX=00000008
ECX=7383B178
EDX=FFFFFFFB
ESI=7383B2CC
EDI=0000005A
EBP=7383AB24
ESP=0018F66C
EIP=0043FDCC
可能的基址指針 =7383B2CC
0043FDBC - jl 0043FEA1
0043FDC2 - cmp ebx,07
0043FDC5 - mov [esi+ebx*4+000000CC],edi
0043FDCC - jne 0043FE1C
0043FDCE - push 00
//--------------------------------------------------------------------------------------//
//------------------------------------從這里開始用OD了----------------------------------------//
1,0043FDAE 8DB1 54010000 lea esi,dword ptr ds:[ecx+0x154]
開始找esi,目前的偏移是4*ebx+0xCC = 0xEC
2,發(fā)現(xiàn)esi被[ecx + 0x154]賦值,接著找exc的值,此時(shí)的偏移是0x240
3,0043FED3 8BCE mov ecx,esi
ecx是被esi賦值的,接著找上面的esi
4,0043FEC6 8BF1 mov esi,ecx
回過頭esi,又是被ecx賦值的。。。真煩人,繼續(xù)找ecx,fuck,發(fā)現(xiàn)上面沒有push ecx,明顯是thiscall的調(diào)用約定,ecx在這個(gè)子函數(shù)
的外面。
5.0047A360 8BCE mov ecx,esi
瘋了。。。ecx又被esi賦值了。。。
6.0047A297 8DB5 54060000 lea esi,dword ptr ss:[ebp+0x654]
esi是被[ebp+0x654]的值賦值的,所以接下來是找ebp,偏移是ebp+894
7.0047A26B 8D2C88 lea ebp,dword ptr ds:[eax+ecx*4]
發(fā)現(xiàn)是ebp是由[eax+ecx*4]賦值的,在這里看一下ecx的值,再找eax的值,發(fā)現(xiàn)eax是上面call的返回值,故進(jìn)入函數(shù)體
ecx = 84F,故此時(shí)的偏移是29D0
8.004406CA A1 28148E00 mov eax,dword ptr ds:[0x8E1428]
進(jìn)入函數(shù)體里面后,終于發(fā)現(xiàn)了基址0x8E1428 + 0x29D0
最后歸納一下整個(gè)基址的詳細(xì)變化過程:基址:0x8E1428 + 0x84F * 4 + 0x654 + 0x154 + 4 * 0x8 + 0xCC 根據(jù)規(guī)律找各人物之間的關(guān)系吧,肯定是0*XXX,1*XXX.
最后驗(yàn)證,多次重啟游戲后,發(fā)現(xiàn)血量是正常能拿到的。