Cheat Engine - 第八章 | CE Tutorial Step 7
教程分析
第七關:代碼注入(密碼是 013370)。
點一下打我減少1滴血。
你需要做的是:點一下打我改成加2滴血。
解題
第一步
- 首先看到頁面上的
100
- 接著我們在需要搜尋的值那邊輸入
100
- 點擊
首次搜尋
- 會將搜尋結果顯示在
搜尋的結果地址表
的框內
第二步
- 點擊
Hit me
,讓數字變動 - 根據
99
數值,在需要搜尋的值重新輸入 (這邊範例為99) - 點擊
再次搜尋
- 此時會發現
搜尋的結果地址表
的結果變少了 (有時候會精準到剩下一個,或是剩下多個)
第三步
- 針對該地址點擊右鍵
- 選擇
Find out what writes to this address
- 會跳出
This will attach the debugger on Cheat Engine to the current process. Continue?
,點擊Yes
- 點擊
Hit me
,讓數字變動 - 此時會發現
The following opcodes write to xxxxxxxx
視窗內計數器視窗的多了一條指令 - 點擊
Show disassembler
- 會打開
Memory viewer
視窗
第四步
- 選中指令
Tutorial-i386.exe+258ED - 83 AB 78040000 01 - sub dword ptr [ebx+00000478],01 { 1 }
(可能會有點不一樣) - 點擊
Tools
->Auto assemble
(簡稱:AA) - 將會打開
Auto assemble
視窗
第五步
- 點擊
Template
->Code injection
- 確認地址就是剛才在
Disassembler
中選擇的那個地址,直接點 OK 即可。
第六步
- 把
sub dword ptr [ebx+00000478],01
改成add dword ptr [ebx+00000478],02
就可以了。 This code can be injected. Are you sure?
點擊Yes
The code injection eas successfull newmem= ******** Got to ********?
點擊No
註:原本這條代碼是把 [ebx+00000478] 這個內存地址的資料減 1,把 sub 改成 add 就是加 1 了,再把 01 改成 02 就是加 2 了。如果想更近一步了解組合語言可以參考X86組合語言/基本指令集
修改前/後:
1 | alloc(newmem,2048) |
1 | alloc(newmem,2048) |
代碼說明
newmem:
、originalcode:
、exit:
、"Tutorial-i386.exe"+258ED:
、returnhere:
這幾個個東西雖然都有冒號,但是的用途是不一樣的。
newmem
和 "Tutorial-i386.exe"+258ED
是具體的內存地址,他表示接下來所有指令將被寫入這個內存地址。
originalcode
、exit
和 returnhere
是標籤,不佔據字節,不佔據指令,他表示一個暫時不知道的地址,僅僅用於跳轉。
所以從newmem:
到"Tutorial-i386.exe"+258ED:
之間的指令都會寫到新分配的地址中,"Tutorial-i386.exe"+258ED:
到結尾的指令都會覆蓋原始指令(實現代碼注入的效果)
而代碼最前面的這四句,就是用來定義這些內存地址或標籤的
1 | alloc(newmem,2048) // 申請 2048 字節的內存,newmem 就是這個內存地址 |
第七步
- 點擊
Hit me
- 可以看到
Next
已經為可以點擊進入下一關
完整動態解題
其他修改方式
在第六步,我們使用注入的方式去修改代碼;更簡單的方式,直接在反彙編窗口中把 sub dword ptr [ebx+00000478],01
中的 01
改成 -02