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

Cheat Engine - 第七章 | CE Tutorial Step 6

📑 目錄
  1. 教程分析
  2. 解題
    1. 第一步
    2. 第二步
    3. 第三步
    4. 第四步
    5. 第五步
    6. 第六步
    7. 第七步
    8. 第八步
  3. 完整動態解題
  4. 總結
    1. 那個一級偏移為什麼是 0?
    2. 什麼是指針
    3. 基址

教程分析

第六關:指針(密碼是 098712)。

上一關使用了代碼查找器,這一關則使用指針的方法確定地址。

點擊 Change value 數值都會改變。點擊 Change pointer 有點類似重新開始一局遊戲,這意味著,數值的地址會改變。​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

你需要做的是:將數值鎖定在5000,即使點擊 Change pointer 改變了數值所在地址之後。

解題

以下待更新~

第一步

  • 首先看到頁面上的 100
  • 接著我們在需要搜尋的值那邊輸入100
  • 點擊首次搜尋
  • 會將搜尋結果顯示在搜尋的結果地址表的框內

Cheat Engine - 第七章 - 圖 1 (01)​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

第二步

  • 點擊 Change value,讓數字變動
  • 根據 368 數值,在需要搜尋的值重新輸入 (這邊範例為368)
  • 點擊再次搜尋
  • 此時會發現搜尋的結果地址表的結果變少了 (有時候會精準到剩下一個,或是剩下多個)

Cheat Engine - 第七章 - 圖 2 (02)

第三步

  • 針對該地址點擊右鍵
  • 選擇 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視窗內計數器視窗的多了一條指令
  • 點擊More information
  • Extra info視窗中,找尋copy memory The value of the pointer needed to find address is probably xxxxxxxx 區塊,在該區塊上點右鍵
  • 點擊copy info to clipboard

註:copy memory The value of the pointer needed to find address is probably xxxxxxxx,表示copy memory查找地址所需指針的值可能是xxxxxxxxcopy info to clipboard將訊息複製到剪貼板。

Cheat Engine - 第七章 - 圖 3 (03)​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

第四步

  • 搜尋類型選擇Exact Value數值類型選擇4 Bytes,勾选 Hex
  • 將剛剛複製的地址貼上018183F0,進行搜尋 (指針位置可能不一樣)
  • 搜尋後可以看到地址為綠色

註:綠色的地址表示基址,每次遊戲啟動時基址都是不會改變的。

Cheat Engine - 第七章 - 圖 4 (04)

第五步

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

Cheat Engine - 第七章 - 圖 5 (05)​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

第六步

  • 點擊Add Address Manuallly,手動添加地址
  • 勾選Pointer
  • 輸入剛剛複製的Address
  • 點擊OK
  • 可以看到Cheat Table,多了一個指針的地址 (類似:P->018183F0)

Cheat Engine - 第七章 - 圖 6 (06)

Cheat Engine - 第七章 - 圖 7 (07)

註:偏移量的部分,如果只有一個表示為一級偏移,兩個為二級偏移,以此類推,這個後面章節也會特別在提到。​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

第七步

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

Cheat Engine - 第七章 - 圖 8 (08)

Cheat Engine - 第七章 - 圖 9 (09)

第八步

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

Cheat Engine - 第七章 - 圖 10 (10)​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

完整動態解題

Cheat Engine - 第七章 - 圖 11 (11)

總結

那個一級偏移為什麼是 0?

方法一:
我們通過第二關的方法找到的地址為018183C0(你的地址應該與我的不一樣),然後在More Information 中復制的地址為018183C0,用第一個地址(目標地址)減去第二個(基址的值)就是0(這兩個完全一樣嘛…所以就是0)

方法二:
mov [edx],eax,方括號中沒有任何加減法操作,就是 0。​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

如果出現 mov [edx+10],eax ,就填 10 就行了,這裡的 10 是 16 進制的 10 換成 10 進制就是 16。

如果出現[eax*2+edx+00000310] 這種複雜的運算,這時就要看More Information 下面的寄存器了,如果eax=4c、edx=00801234,那麼,應該搜索較大的一個數值,然後將較小的一個數值運算得到一級偏移的結果(另外,有乘法的一定是作為偏移存在的,基址的值一定不存在乘法),即搜索00801234 找到基址,然後一級偏移為4c * 2 + 310 = 3a8,這個為16 進制運算,請使用Windows 自帶的計算器

x86 系列的指令集就是複雜,可以把好幾條運算集成成一條指令。​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

什麼是指針

這個可以從C語言講起(不過指針不是起源於C語言的哦),C語言最牛逼的東西就屬指針啦,指針本身是一個4 字節(32 位程序)或8 字節(64 位程序)的整數,如果將其解釋為一個整數,那麼就是指向那塊內存的地址。 (注意,內存裡的東西只是字節組成的資料,具體是什麼含義要看代碼是怎麼解釋,代碼將其用作指針那就是指針,代碼將其用作整數型變量那就是普通的整數型變量)

看下面這段C語言代碼,代碼中演示瞭如何對同一個地址以不同的方式解釋。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a = 0; // 定义指针
a = (int *)malloc(4); // 分配内存
*a = 1; // 令其等于1
printf("%d\n", *a); // 输出指针a指向的值
printf("0x%08x\n", (unsigned int)a); // 以整數型的方式读取a
free(a); // 释放内存
return 0;
}

x86指令集支持指針這種東西,就是彙編語言中的方括號,mov [edx],eax的意思就是把eax的值存到edx指向的地址中去,如果僅僅為mov edx,eax那麼就僅僅是是 令edx等於eax了。​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌‌​​​‌‌​​‌​​​‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌​​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌‌​‌‌‌

基址

基址在程序每次啟動時都不會變,因為他們的地址是直接寫在代碼中的,如果他們的地址變了,這個程序還怎麼運行了?