免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
本次游戲沒法給
內容參考于:微塵網絡安全
上一個內容:4.x86游戲實戰-人物狀態標志位
上一個內容通過CE未知的初始值、未變動的數值、變動的數值篩選找到了人物的狀態標志
現在就有一個問題,游戲重啟之后,地址就會發生變化,變化了代碼也要同步改,這就很麻煩,它有沒有一個固定的地址?答案是有的,我們寫的java、c/c++等語言,到最后都會變成匯編語言,編譯好的匯編代碼不管游戲重啟還是操作系統重啟,它都不會變,然后既然游戲它重啟、操作系統重啟都可以正常找到人物狀態標志這個值,這說明這個值(內存地址)它肯定有一個固定的位置存放著,如果沒有固定的位置存放那么游戲它也不知道怎么找,知道這一點之后,那怎么找這個固定的值?請看下方VCR
首先打開CE
點擊下圖紅框,附加游戲
![]()
然后再次通過 未知的初始值、未變動的數值、變動的數值篩選找人物的狀態標志,找到之后鼠標右擊選擇是什么訪問了這個地址
![]()
然后就會有4個
![]()
然后可以看出都是一個數字加14C,
![]()
然后選中一個點反匯編
![]()
可以看到下圖紅框位置,mov eax,[00A107BC],這個意思是把A107BC是一個內存地址,[]的意思是把內存地址里放的值拿出來,mov 是賦值的意思,合起來就是把A107BC位置里放的值放到eax寄存器中
![]()
然后下圖紅框位置,mov eax,[eax+60],這個60是十六進制的60,肉眼可以看到的數字在沒有特出設定下默認所有工具里都是用十六進制顯示,然后eax+60,這意思就是[A107BC]+60,也就是從 A107BC地址里存放的值加60,加完60之后它又會是一個內存地址,然后通過[]eax+60這個內存地址中的值取出來放到eax中
![]()
然后下圖紅框位置cmp dword ptr[eax+14C],02,這意思是,ptr是地址的意思,dword是4字節數字的意思,dword ptr[eax+14c]的意思是eax+14c是一個內存地址,dword ptr的作用就是把內存地址的值轉成4字節數字,也就是從eax+14c開始往后讀4個字節,eax的值是通過上方mov得到的,eax轉成具體的數字[[A107BC]+60]+14c,然后到這還沒有解釋cmp,這個cmp是匯編指令(匯編代碼),可以百度cmp指令這個關鍵詞去搜(匯編代碼+指令 這樣的關鍵字組合去搜),這個cmp是比較的意思,然后cmp dword ptr[eax+14C],02中的這個02,就是比較[[[A107BC]+60]+14c] 是大于2還是小于2還是等于2,具體是大于還是小于取決去cmp下一行的代碼是什么(cmp只是單純比較,它會把等于、大于、小于全都給比較了,比較完會記錄下來,然后沒別的操作了,具體怎么用后面在說,現在就這樣理解)
![]()
然后上方得到一個[[[A107BC]+60]+14c] 這個,然后最開始說匯編代碼編譯完是不會變化的,然后剛開始有一個mov eax,[A107BC],這一句就是編譯完的代碼,它是不會變的,這里就有一個概念,這個概念叫做基址(基地址),A107BC就是基址,所以正確做法是通過基址+xx數字來得到我們想要的數據,這個xx數字有一個稱呼,叫做偏移
然后回到CE,點擊手動添加地址
![]()
勾選上指針
![]()
然后把 A107BC放進去
![]()
然后點添加偏移
![]()
然后如下圖,下圖的地址不管是游戲重啟還是操作系統重啟它都可以用,它都不會發生變化
![]()
然后寫的時候,數字前面最好加上0x,0x后面的數字會被當做十六進制數字,有些工具會默認以十六進制的方式讀,所以不加0x也可以,但是有的工具不加0x它就會當成十進制讀,所以最好加上0x
![]()
它的esi的值就無法那么輕松的看到,這種的要用動態調式工具,CE頂多搜索點內存里的數據,動態調式后面會寫