日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CE入门笔记

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CE入门笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CE入門筆記

文章目錄

  • CE入門筆記
    • 基礎
      • 簡介
      • 安裝
      • 漢化
    • 開始教程
      • Step 1
      • 搜索簡介
      • Step 2
      • Step 3
        • 方法一(提供的方法)
        • 方法二
      • Step 4
      • Step 5
      • Step 6
        • 初始分析
        • 具體操作
      • Step 7
      • Step 8
      • Step 9
    • 總結

基礎

簡介

CE是一款游戲作弊引擎,全稱為Cheat Engine,簡稱為CE。是逆向工程師常用的幾大神器之一,也是游戲漢化、破解以及外掛編寫中常用的工具。

  • 通常用于單機游戲的內存數據修改,可以搜索游戲中的內存數據,并進行修改、鎖定等操作
  • 內置調試器,可以進行反匯編調試、斷點跟蹤、代碼注入等諸多高級功能
  • 支持 lua 語言,可以實現自己定義的邏輯功能,而不僅僅是簡單的鎖定數據。也可以在代碼注入的同時注入 lua 插件,使游戲進程與 CE 進程進行交互。 CE 的大部分功能都可以通過 lua 來操作
  • 它還支持 D3D Hook 功能,可以在游戲中顯示十字準星,也可以繪制功能菜單,同時也可以對 D3D 的調用棧進行跟蹤調試
  • 自帶變速功能,通過 Hook 游戲相關函數改變游戲速度
  • 自帶了一個 Trainer 的功能,可以將自己在 CE 中實現的功能單獨生成一個 exe 文件,并可以使用 lua 創建比默認樣式更加復雜的窗體或功能
  • 除了 CE 界面上提供的功能,可以 lua 引擎使用更多隱藏功能,具體就要看幫助文檔了

以上內容摘抄自CE教程:基礎篇

安裝

從CE官網下載地址可以下載CE安裝包以及漢化語言包。目前最新版本為7.3。

漢化

將漢化包解壓到安裝路徑的languages目錄中,打開CE,從配置窗口中選擇Languages目錄,從中選擇ch_cn,重啟,完成漢化。可能下載的漢化包對應6.7的緣故,整體漢化之后顯示內容為6.7的漢化效果。



開始教程

CE自身提供一個入門教學軟件,在幫助中打開Cheat Engine教程即可,包括32位與64位。我們就從32位入手開始CE的基本入門。

Step 1

第一步是十分簡單的,它教給你如何使用CE附加到一個進程上。

打開進程列表,然后選擇對應的進程就達到目的了。

搜索簡介

在開始第二步之前,此時讓我們簡單對CE主窗口及主要的搜索功能進行一下簡單介紹,圖來自CE教程:基礎篇

在主窗口中,除去上層的標題欄、菜單欄以及工具欄之后,左面的窗口是一個搜索結果列表。它的右側是各種搜索的設置,根據CE本身的介紹我們可以看到,它的基礎功能就是通過對內存中各種各樣的值進行搜索來逐步達到對游戲修改的目的(自己理解)。它能夠記錄每次搜索結果的變化,并于當前游戲中特定位置的結果進行對應,從而達到找到與該變量相關代碼的目的。
基本的設置有兩個,一個是掃描類型,一個是數值類型。

掃描類型包含了5種:

  • 精確數值
  • 值大于
  • 值小于
  • 值介于…兩者之間
  • 未知的初始值
  • 數值類型包含的更多:

    • 二進制
    • 字節
    • 2字節
    • 4字節
    • 8字節
    • 單浮點
    • 雙浮點
    • 等等

    通過這些方式,我們可以指定對應的掃描方法,并根據目標游戲中變量可能的類型,來達到對特定內存的搜索目的。

    Step 2

    這一步表示要將目前的健康值修改為1000。當前值為100。

    根據說明,CE可以記錄每次搜索的地址的內容,并根據當前程序的表現來查找目標地址。首先,使用4字節類型通過精確數值方式搜索100。

    點擊打我,使當前健康值變成97,然后使用97再進行搜索。

    雙擊該地址,將其添加到下方的cheat table中。

    此時,我們雙擊表中的97,并將其修改為1000。

    此時通向第三關的按鈕打開了。

    Step 3

    這一步是將健康值修改為5000,但是不知道初始值與之后的具體值,僅知道每次減少的值以及初始值的范圍為0-500

    方法一(提供的方法)

    根據教程,它提供了一種利用未知的初始值結合減少的數值來進行查找的方式。
    首先使用未知的初始值進行搜索,但是此時是沒有顯示結果的,只有所有結果的記錄。

    點擊“打我”,發現數值減少了8,掃描類型使用"數值減少了…"進行搜索,如果有多個結果,利用這個方式多進行幾次。

    因為我們知道初始值在0-500之內,所有只要發現滿足這一條件的唯一地址,就是我們要找的地址。并將其添加到cheat table中,并修改健康值,完成。

    方法二

    由于我們知道值的范圍,初始的搜索可以使用介于0-500之間將內容限制住

    Step 4

    這一步是需要將兩個值修改為5000以上,不過一個是單浮點一個是雙浮點

    其實這一步與第一步基本一致,不過就是搜索的數值類型變為單浮點與雙浮點

    Step 5

    這一步介紹的是代碼查找功能,主要是通過修改代碼,從而使某個非固定地址數不發生變化

    開始一樣,通過100和之后的變化來查找到目標地址。

    我們需要查找哪段代碼對該地址中的內容進行了修改,所有右擊目標地址,選擇“找出是什么改寫了這個地址”

    其實這塊兒翻譯感覺有些不對味,我們將其修改成原版再看看

    原文是“Find out what writes to this address”, 可以理解為查找是哪段代碼在對該地址中的內容進行了修改。。。

    此時彈出一個新的窗口,窗口名稱為“The following opcodes write to ‘some address’",其中"some address"表示的就是目標地址
    此時再次點擊一下修改值按鈕,上方的列表中就會顯示出對該地址進行修改的opcode。

    按照要求,只要將此處代碼修改為無效代碼就達到目的,最簡單就是修改為nop。右擊該行,彈框中選擇“使用空指令進行替換(Replace with code that does nothing(NOP))”。即達成目的。

    Step 6

    這一步就是理解一下程序中指針的含義并利用CE中指針這樣的一個機制來對某些可變的地址內容進行修改

    初始分析

    指針是C語言中的精髓,也是整個底層中的難點。我認為就是一個變量保存了另外一個變量的地址,這個指針指向某個地方表示這個變量中的內容是目標量所在的地址。按照題目說明,應該是我們初始找到的這個地址不是固定的,而是每次都會變化的,猜測可能是每次malloc導致其發生變化。但是既然是一個變化的地址,那么就會有一個變量保存著這個地址的內容。通過向上查找我們可以找到保存這個地址的變量,即指向目標地址的指針。按照這個邏輯一層一層的向上回溯,找到最終的一個基地址,我理解就是在data段中的一個全局地址或者說靜態地址,這個地址對于程序基地址的偏移是固定的。然后反過來一層層的確定后面的可變地址偏移,最終找到其地址。

    // 一個示例,可能不是很恰當struct struct_1 *g_start; // globalvoid some_func() {g_start = malloc(sizeof(struct_1));g_start->p_struct_2 = malloc(sizeof(struct_2));g_start->p_struct_2->key = key;... }

    我們通過CE找到key這個變量所在的地址,然后由于p_struct_2地址每次是變化的,我們通過key所在的地址推出分配出的p_struct_2的基地址,然后通過這個基地址就能反推出g_start中保存這個地址的指針變量的地址,從而推出g_start所在的地址,從而找到該地址與程序基地址的偏移。這樣以來我們可以通過指針偏移的方式,從g_start地址開始,逐步推出key所在的地址,從而達到對該值控制的目的。

    具體操作

    其實只要了解了具體的原理,具體操作只是讓我們對CE這個工具更深入理解的一個步驟罷了。
    按照之前的步驟,找到地址以及修改這個地址的代碼。與上一步不同的是雙擊或者點擊“More information”來顯示更多信息。

    此時我們看到位置的代碼為mov [edx], eax,表示此時地址保存在edx中,所以我們拿edx的內容到進程中進行修改。此時CE提供了一個比較快捷的方法:在對話框中它根據上下文猜測你想要的拿到某個地址,通常在指針使用時可以相信這個結果。

    此時發現最左邊的地址字體變成了綠色,這就表示這個是地址是基地址,也就是說到了進程的data段,idata段這些地方。將該地址添加到cheat table中或者右擊復制該地址,打開手動添加地址按鈕。在彈出的窗口中選中“pointer”選項,在地址欄中粘貼目標地址,由于offset為0, 所以offset中保持為零。此時CE就已經將該地址處保存的地址顯示到最上面的地址欄中,而這個地址保存的數據顯示到地址欄后面,與當前值一致。

    完成添加后我們可以看到添加的內容,將后面的值修改為5000,點擊最前面使之變成“×”。點擊“change pointer”完成這一步。

    Step 7

    介紹了代碼注入,使每次點擊時減1變成加2

    老方法,查找到修改的地址以及修改值的代碼。此次打開的窗口變成“Show disassembler”。

    這個窗口分為上下兩部分,上面是匯編代碼,下面則是內存視圖。

    選擇“auto assemble”。然后在這個窗口中選擇“Template”菜單,并點擊“Code injection”。

    在該窗口中,將sub dword ptr [ebx+000004A4],01修改為add dword ptr [ebx+000004A4],02,點擊“Execute”即完成。

    上面第一張圖顯示的是注入的代碼,第二張圖顯示的是注入后原地址的代碼。通過這里我猜測CE在完成注入前保存了當前修改的地址信息以及下一個指令的地址信息,然后從堆中分配一塊可讀可寫可執行的區域,將注入代碼以及jmp nextOpAddr的opcode寫到該處。將原地址改為jmp injectOpAddr,后面的地方設為NOP。可能的代碼邏輯如下:

    LPVOID curOpAddr; LPVOID nextOpAddr; LPVOID lpBuffer; // inject codestore(curOpAddr, nextOpAddr); // store current and next op address LPVOID injectOpAddr = VirtualAlloc(hModule, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(hModule, injectOpAddress, lpBuffer, nSize, &lpNumberOfBytesWritten); change_cur_cotent(curOpAddr, injectOpAddr); // change currrent address's opcode

    這種手法好像稱為“inline hook”。

    Step 8

    這一部分講的是多重指針

    其實這一部分的原理在第六部分的時候講過了,不過由于指針本身就比較繞,在實際過程中需要仔細考慮,不要把自己繞進去了。
    初始的查找就不說了。
    開始查找第一層

    此時發現opcode為mov [esi+18], eax,具體指針內容放到esi中,偏移量為0x18。將發現的地址放回重新搜索,發現多個地址。這一步我沒有好的方法,只能一個個的試,但是此時需要注意的是,在查找時不再選擇修改內容,而是訪問內容,因為每次未重啟前這個地址是固定的。

    在多個中我們找到和這個按鈕操作有關的地址,然后在兩個中選擇mov操作的,因為cmp操作與整個指針的地址傳輸沒有任何關系。
    不過我們發現,這次地址給出的建議與第一次查找時給出的建議一致。這個是因為CE默認采用硬件斷點,所以斷點只能停在指令執行之后,而這條指令正好是把 esi 原來指向的地址中的值再賦值給 esi,所以執行之后 esi 的值已經是被覆蓋掉的值了,而我們想知道的恰恰是執行這條指令之前的 esi 值,那么怎么辦呢。

    第一,打開內存視圖,在該指令的前一個指令處下斷點。

    這樣得到了ESI的值

    第二,我們考慮一下,我們之前進行第一次查找時查找的就是這個指針保存的地址,查找到的那個地址不就是這個指針保存的地址,此次偏移為0

    兩者都是0x14d700。

    仍然不是基址,此次為mov esi, [esi+14],偏移為0x14

    還不是基址,此次為mov esi, [esi+0c],偏移為0xc

    終于,找到了基址,利用第6部分的方法,手動添加指針

    Step 9

    其實前8關基本上把CE的基礎內容講完了,這一關感覺上就是一個綜合能力訓練,下次再寫吧。

    總結

    說實話我沒怎么理解整個課程中關于指針這兒的一些要求,貌似6和8兩邊都是通過一個地址向上不斷查找到初始在數據段中的一個全局或者靜態變量,這個變量是一個結構或者指針。好似它們確定會有這樣一個全局性的位置放著它們。也許這個和我想的ASLR導致的地址隨機化不是一回事兒,這點自己有些沒怎么搞明白,也許是malloc。

    總結

    以上是生活随笔為你收集整理的CE入门笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。