Like Share Discussion Bookmark Smile

J.J. Huang   2019-06-29   Cheat Engine   瀏覽次數:

Cheat Engine - 第九章 | CE Tutorial Step 8

教程分析

第八關:多級指針(密碼是 525927)。

和第六關差不多,不過這次不是一級指針,而是4級指針,就是指向目標數值 的指針 的指針 的指針 的指針

你需要做的是:點擊 Change pointer之後的 3 秒內 將新的數值鎖定在 5000。

解題

第一步

(基本上參照第七章 | CE Tutorial Step 6的步驟,找到指針並搜尋)

  • 首先看到頁面上的 334

  • 接著我們在需要搜尋的值那邊輸入334

  • 點擊首次搜尋

  • 會將搜尋結果顯示在搜尋的結果地址表的框內

  • 點擊 Change value,讓數字變動

  • 根據 1862 數值,在需要搜尋的值重新輸入 (這邊範例為1862)

  • 點擊再次搜尋

  • 此時會發現搜尋的結果地址表的結果變少了 (有時候會精準到剩下一個,或是剩下多個)

  • 將該地址加入到Cheat Table

  • 針對該地址點擊右鍵

  • 選擇 Find out what writes to this address

  • 會跳出This will attach the debugger on Cheat Engine to the current process. Continue?,點擊Yes

  • 點擊 Change value,讓數字變動

  • 此時會發現The following opcodes write to xxxxxxxx視窗內計數器視窗的多了一條指令

  • 左鍵雙擊該指令兩下 會看到0042626C - mov [esi+18],eax (表示指針偏移量為+18)

  • Extra info視窗中,找尋copy memory The value of the pointer needed to find address is probably xxxxxxxx 區塊,在該區塊上點右鍵

  • 點擊copy info to clipboard

  • 點擊New Scan

  • 搜尋類型選擇Exact Value數值類型選擇4 Bytes,勾选 Hex

  • 將剛剛複製的地址貼上01830440,進行搜尋 (指針位置可能不一樣)

  • 這邊結果有點不一樣,搜尋後可以看到地址為黑色 (搜索到的地址不是綠色的基址了,這就需要我們再繼續搜索上一級指針。)

註:0042626C - mov [esi+18],eax,這個的偏移量,在找尋上一級指針的時候,都要做紀錄下來。

第二步

  • 針對該地址點擊右鍵
  • 選擇 Find out what accesses to this address
  • 點擊 Change value,讓數字變動
  • 此時會發現The following opcodes write to xxxxxxxx視窗內計數器視窗的多了兩條指令
    1
    2
    0042622A - 83 3E 00 - cmp dword ptr [esi],00
    0042622F - 8B 36 - mov esi,[esi]
  • cmp 指令跟指針沒什麼關係,對我們有用的是第二條指令 mov esi,[esi]
  • 左鍵雙擊0042622F - 8B 36 - mov esi,[esi]
  • Extra info視窗中,找尋copy memory The value of the pointer needed to find address is probably 01830440 會發現 01830440 與 第一次搜尋的時候是一樣的

分析

這裡提示的地址和上一次提示的地址是一樣的,這是為什麼呢?

CE 默認使用硬件斷點的方式,斷點只能停在指令執行之後,而這條指令正好是把esi 原來指向的地址中的值再賦值給esi,所以執行之後esi 的值已經是被覆蓋掉的值了,而我們想知道的恰恰是執行這條指令之前的esi 值,那麼怎麼辦呢。

我們的 Find out what accesses this address 是感什麼的?查找訪問這個地址的指令,然後我們又發現了 mov esi,[esi] 這條指令訪問了這個地址,那麼 [esi] 原來是啥?原來的 esi 不就是這個我們監視的地址嘛。

所以直接搜索這個地址即可 01810720

第三步

  • 針對該地址點擊右鍵
  • 選擇 Find out what accesses to this address
  • 點擊 Change value,讓數字變動
  • 此時會發現The following opcodes write to xxxxxxxx視窗內計數器視窗的多了兩條指令
    1
    2
    004261EB - 83 7E 14 00 - cmp dword ptr [esi+14],00
    004261F5 - 8B 76 14 - mov esi,[esi+14]
  • cmp 指令跟指針沒什麼關係,對我們有用的是第二條指令 mov esi,[esi+14]
  • 左鍵雙擊004261F5 - 8B 76 14 - mov esi,[esi+14] (表示指針偏移量為+14)
  • Extra info視窗中,找尋copy memory The value of the pointer needed to find address is probably 0183DBA0
  • 點擊New Scan
  • 搜尋類型選擇Exact Value數值類型選擇4 Bytes,勾选 Hex
  • 將剛剛複製的地址貼上0183DBA0,進行搜尋 (指針位置可能不一樣)
  • 搜索到的地址不是綠色的基址了,繼續搜索上一級指針

第四步

  • 針對該地址點擊右鍵
  • 選擇 Find out what accesses to this address
  • 點擊 Change value,讓數字變動
  • 此時會發現The following opcodes write to xxxxxxxx視窗內計數器視窗的多了兩條指令
    1
    2
    004261AA - 83 7E 0C 00 - cmp dword ptr [esi+0C],00
    004261B4 - 8B 76 0C - mov esi,[esi+0C]
  • cmp 指令跟指針沒什麼關係,對我們有用的是第二條指令 mov esi,[esi+0C]
  • 左鍵雙擊004261B4 - 8B 76 0C - mov esi,[esi+0C] (表示指針偏移量為+0C)
  • Extra info視窗中,找尋copy memory The value of the pointer needed to find address is probably 0184DFC0
  • 點擊New Scan
  • 搜尋類型選擇Exact Value數值類型選擇4 Bytes,勾选 Hex
  • 將剛剛複製的地址貼上0184DFC0,進行搜尋 (指針位置可能不一樣)
  • 終於找到綠色基址了

第五步

  • 將基地加入Cheat Table裡面
  • 左鍵兩下Address,複製Change address視窗內的Address (類似:"Tutorial-i386.exe"+201660)

第六步

我們可以藉用彙編語言的指針表示方法來表示一下我們需要的內存地址

[[[[“Tutorial-i386.exe”+201660]+0C]+14]+00]+18

把基址(一級指針) “Tutorial-i386.exe”+201660 的值取出來,加上一級偏移0C,當做地址,這是二級指針的地址,再把二級指針的值取出來,加上14,這是三級指針的地址,依次類推。

  • 點擊Add Address Manuallly,手動添加地址
  • 勾選Pointer
  • 點擊Add Offset增加偏移量,變為四級偏移的指針
  • 輸入剛剛複製的Address
  • 點擊OK
  • 可以看到Cheat Table,多了一個指針的地址 (類似:P->01830458)

第六步

  • 點擊剛剛手動添加的指針地址Value
  • 修改成5000
  • 勾選該指針前方的Check box (用於鎖定該值)

第七步

  • 點擊Cheange poniter
  • 可以看到Next已經為可以點擊進入下一關

完整動態解題

注意

  • 可以通過代碼注入的方式通過此關。
  • 上述過程中,除了對目標數值的地址使用Find writes,其餘都使用Find accesses。其實,對目標數值的地址使用Find accesses也可以。

Pointer scan

CE 內置了搜索指針的工具

  • 首先看到頁面上的 3226

  • 接著我們在需要搜尋的值那邊輸入3226

  • 點擊首次搜尋

  • 會將搜尋結果顯示在搜尋的結果地址表的框內

  • 點擊 Change value,讓數字變動

  • 根據 3188 數值,在需要搜尋的值重新輸入 (這邊範例為3188)

  • 點擊再次搜尋

  • 此時會發現搜尋的結果地址表的結果變少了 (有時候會精準到剩下一個,或是剩下多個)

  • 將該地址加入到Cheat Table

  • 針對該地址點擊右鍵

  • 選擇 Pointer scan for this address

  • 彈出的搜索設置提示框,通常使用默認配置即可。

  • 由於 Pointer 列表過於龐大,所以需要有一個保存的地方,這個自己隨意保存。

  • 點擊確定開始搜索,可以發現有非常多的路徑可以指向我們要找的地址。

  • 點擊 Change pointer (不是Change Value)

  • 看到頁面上的 1114

  • 接著我們在需要搜尋的值那邊輸入1114

  • 點擊首次搜尋

  • 會將搜尋結果顯示在搜尋的結果地址表的框內

  • 點擊 Change value,讓數字變動

  • 根據 910 數值,在需要搜尋的值重新輸入 (這邊範例為910)

  • 點擊再次搜尋

  • 此時會發現搜尋的結果地址表的結果變少了 (有時候會精準到剩下一個,或是剩下多個)

  • 將該地址加入到Cheat Table

  • 複製該地址018BE0F8

  • 然後選擇Pointer scan窗口中的菜單選項Pointer scanner -> Rescan memory - removes pointers not pointing to the right address

  • 然後把新的地址填上就好了,點擊OK就好了

  • 最後只剩下一筆資料,雙擊左鍵將其加入Cheat Table

  • 將該指針修改成5000

  • 勾選該指針前方的Check box (用於鎖定該值)

  • 點擊Cheange poniter

  • 可以看到Next已經為可以點擊進入下一關