Like Share Discussion Bookmark Smile

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

Cheat Engine - 第七章 | CE Tutorial Step 6

教程分析

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

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

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

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

解題

以下待更新~

第一步

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

第二步

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

第三步

  • 針對該地址點擊右鍵
  • 選擇 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將訊息複製到剪貼板。

第四步

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

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

第五步

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

第六步

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

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

第七步

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

第八步

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

完整動態解題

總結

那個一級偏移為什麼是 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了。

基址

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