小華的部落格: 動態記憶體(2)-修改流程

搜尋此網誌

星期一, 7月 30, 2007

動態記憶體(2)-修改流程

前一篇文章中我們介紹了如何透過一些工具去取得你的遊戲程式碼的位址,接著就說明一下整個修改的概念:

1. 先找到程式碼存放的位址,前面我們已經找到了程式碼存放的位址是在44717Ah:
001B:44717A MOV [ESI+228],EDX
001b:44717E ....

2. 修改44717A這個位址的程式碼
001B:44717A JMP 57BF00 <--跳到我們指定的一塊記憶體位址
001B:44717D NOP <--由於修改的JMP 57BF00 指令長度不足原來的,所以增加NOP來補足長度
001b:44717E ....

3. 修改57BF00
001B:57BF00 MOV [ESI+228],EDX <--還原原來被我們破壞掉的程式碼
001B:57BFxx MOV DWORD PTR [57BF30],ESI
001B:57BFxx JMP 44717E
001B:57BFxx

由上面的範例中可以看到整個修改的流程大致上就是如此,先找到他的程式碼的位址,修改它的程式碼,然後跳躍到我們指定的記憶體中,跳躍後我們先去還原原來的程式碼以免造成原來遊戲程式當機,接著把ESI的值存放到我們指定的記憶體位址,那麼當遊戲程式重新分配記憶體位址時,他的位址會放在ESI,而ESI的值會被我們放到我們指定的記憶體中,而我們寫的遊戲輔助程式就直接去我們指定的記憶體中就可以讀到ESI的值了。

※ Softice 修改程式碼的方式鍵入 "A 44717A" ,跟DOS的Debug.com 很像

在上述的方式中,要如何找到一塊可以使用的記憶體? 下面我就提供一個方式:
進入Softice 中,找到你的遊戲視窗名稱,接著鍵入MAP32 指令,如下所示:

:map32 lineage <--lineage 是你遊戲的名稱,這邊是範例,你看的值會不一樣
Owner Obj Name Obj# Address Size Type
lineage .text 0001 017F:00401000 ....
lineage .data 0002 0187:00560000 ....
lineage .rsrc 0005 0187:0057C000 ....

你會看到他把遊戲程式的PE檔頭的一些資訊列印出來給你看,其中.data 後面的560000h代表你的遊戲會把一些資料從記憶體位置560000h 開始存放,而我的方式是從後面自己找一塊來用,例如下一個區塊是從57C000h開始,因此我找57BF00h~57BFFFh 這一塊來當我要使用的地方。

你可以利用Softice 鍵入D 57BF00的方式去看那一塊記憶體有沒有人使用,如果沒有的話你就可以自己拿來用。

沒有留言: