小華的部落格: 動態記憶體(3)-撰寫輔助程式

搜尋此網誌

網頁

星期一, 7月 30, 2007

動態記憶體(3)-撰寫輔助程式

前面兩篇文章提到如何去找到動態記憶體指標的程式碼位址,然後注入一段程式碼來取得指標ESI的位址,如果你在Softice 中修改後,並且回到遊戲中去驗證沒問題後(驗證的方式就是回到遊戲中隨便更新一下血量,或是重新啟動遊戲讓他重新配置一個指標位址,接著你可以利用GameMaster直接去讀取57BF30h這個位址的內容,這個內容=ESI,所以你要自己加上228h 的位址才會存放你的血量值),你就可以開始動手寫輔助程式了。

ESI+228h=血量位址

如何撰寫輔助程式呢? 這邊會用到的工具:
VC6 or VB6 or...等 (看你自己習慣用哪一種)
Windosw API (自己翻手冊查相關說明)
Softice (用來看機器碼)

簡單說就是利用ReadProcessMemory 或是WriteProcessMemory方式去對記憶體寫入值,而寫入的值是一堆的機器碼(因為你沒辦法像Softice一樣直接修改,所以只好用機器碼的方式注入你的程式碼到修改的位址去),所以你透過SoftIce 去修改好程式碼後,要記得把機器碼抄錄下來(例如: D 44717A),然後用這兩個API寫進去你要修改的位址。

VC6的方式 :
#define MY_CODE1 0xE9
#define MY_CODE2 0x34 //這部分是要寫入的機器碼的常量定義
.........................

//-----------------------------------------------------------------------------//
DWORD A1 =MY_CODE1;
DWORD A2 =MY_CODE2;
..............

//0x0044717A
WriteProcessMemory(nOK,(LPVOID)0x0044717A+0,&A1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0044717A+1,&A2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0044717A+2,&A3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0044717A+3,&A4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0044717A+4,&A5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0044717A+5,&A6,1,NULL);
//0057BF00
WriteProcessMemory(nOK,(LPVOID)0x0057BF00+0,&B1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0057BF00+1,&B2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0057BF00+2,&B3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0057BF00+3,&B4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0057BF00+4,&B5,1,NULL);
....

VB6方式:
A_Start = &H0044717A '要修改成JMP的地址
A_End = &H0057BF00 '跳躍JMP到的地址

'&H0044717A
Call WriteProcessMemory(A_Start + 0, &HE9, 1)
Call WriteProcessMemory(A_Start + 1, &H3D, 1)
Call WriteProcessMemory(A_Start + 2, &H31, 1)
Call WriteProcessMemory(A_Start + 3, &H30, 1)
...

4 則留言:

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...
作者已經移除這則留言。
Unknown 提到...

請問你在動態記憶體中使用的遊戲是lineage~那能教我如何找到lineage裡施法無動作的記憶體位置嗎~我找了好久就是沒辦法得到。~如果是使用變身檔的方式的話那我會了~只是我很想學像linex一樣的方法~使用記憶體直接修改,這兩種的方式不一樣。因為linex的無動作不會有任何動的感覺。

小華的部落格 提到...

lineage <--只是隨便打的一個名稱啦,我沒完天1很久了...

變身檔方式我都還不會呢,如果可以的話你可以指導我一下(Email給我:harisan3@gmail.com),我對這個蠻有興趣的,另外我有空在去研究看看linex怎麼做的(反組譯看看),而我這幾篇文章只是單純針對程式撰寫部分說明啦,如果要真的改的話目前我自己只有做過一些簡單的部份,像是自動喝水啦,或是抓人物座標然後移動到某個固定位址去...等。

至於動態記憶體位址簡單說就像是C語言的指標,指標指向的位址會一直改變,如果你要找的話可以想辦法設斷點去追程式碼,一般斷點能斷的下來的話,要看懂程式碼就比較簡單了,難是難在斷點難下,而我這些文章最主要是要點出如何去修改動態記憶體指標的程式碼,然後你可以自己寫一個輔助程式去得到它的記憶體位址,而不用擔心下一次啟動遊戲後你又要重新找一次記憶体位址...