日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

001 从人物血量学习数据查找

發(fā)布時(shí)間:2025/3/21 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 001 从人物血量学习数据查找 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 前言
    • 游戲選擇與環(huán)境搭建
    • 查找人物血量
    • 查找血量基址
      • 第一條線(簡(jiǎn)單)
      • 第二條線(一般)
      • 第三條線(困難)
    • 總結(jié)

前言

本系列文章旨在從零開(kāi)始學(xué)習(xí)游戲輔助的工作流程和開(kāi)發(fā)方法,了解游戲背后的攻防對(duì)抗手段,重點(diǎn)側(cè)重?cái)?shù)據(jù)和call的追蹤查找。

側(cè)重方向在于學(xué)習(xí)整個(gè)分析過(guò)程以及思路方法,最終實(shí)現(xiàn)的效果和游戲不是關(guān)心的重點(diǎn)。

涉及到的技術(shù)有:

  • windows API Hook
  • dll注入
  • 匯編語(yǔ)言
  • 軟件逆向
  • Windows編程
  • C/C++基礎(chǔ)

沒(méi)有上述的前置知識(shí)建議勸退

游戲選擇與環(huán)境搭建

這里用來(lái)進(jìn)行分析的游戲是口袋西游,鏈接如下:

鏈接:https://pan.baidu.com/s/1nXUoK8UUEI3t3-hgAQ5pBg
提取碼:e57t
復(fù)制這段內(nèi)容后打開(kāi)百度網(wǎng)盤手機(jī)App,操作更方便哦

下載以后直接解壓縮,element文件夾中的ELEMENTCLIENT.EXE就是口袋西游主程序

選擇這個(gè)游戲的好處在于,這個(gè)游戲是老版本的口袋西游,不會(huì)一直更新,難度也非常適合新手,方便進(jìn)行調(diào)試學(xué)習(xí)。

在正式開(kāi)始逆向之前建議先玩一段時(shí)間,熟悉一下游戲規(guī)則,后續(xù)操作起來(lái)會(huì)比較方便

查找人物血量

首先用CE附加游戲

直接搜索當(dāng)前的人物血量值810

然后通過(guò)換裝備的方式改變一下當(dāng)前的人物血量,再次搜索,會(huì)得到兩個(gè)值,一個(gè)是當(dāng)前血量,一個(gè)是最大血量

區(qū)分的方式是通過(guò)再次換裝然后觀察數(shù)據(jù)變化進(jìn)行分辨,或者直接在CE中修改數(shù)據(jù)

查找血量基址

接下來(lái)我們要通過(guò)這個(gè)地址把血量的基址追出來(lái)。

血量為零時(shí)角色會(huì)被判斷死亡,血量不足最大值時(shí)會(huì)有一個(gè)回血的效果,而這些都會(huì)導(dǎo)致血量無(wú)時(shí)無(wú)刻被訪問(wèn)。

接著在當(dāng)前地址右鍵,找出是什么訪問(wèn)了這個(gè)地址,可以看到這里有四條匯編語(yǔ)句在訪問(wèn)當(dāng)前這個(gè)血量地址

008199FA - DB 87 88020000 - fild dword ptr [edi+00000288] 0055C062 - 8B 9E 88020000 - mov ebx,[esi+00000288] 00482A36 - 8B 8E 88020000 - mov ecx,[esi+00000288] 00482AA9 - 89 96 88020000 - mov [esi+00000288],edx

無(wú)論我們從哪條匯編開(kāi)始追都能得到我們想要的基址,區(qū)別在于難度不一樣。在學(xué)習(xí)階段盡可能嘗試所有的難度以應(yīng)付后期的實(shí)戰(zhàn),這里先從第一條線開(kāi)始追

第一條線(簡(jiǎn)單)

008199FA - DB 87 88020000 - fild dword ptr [edi+00000288]

在這個(gè)地址下斷

這里很快就能追到基址

  • edi+0x288是血量
  • edi來(lái)自于eax+0x28
  • eax來(lái)自eax+0x1C
  • eax=[0xD0DF1C]

最后得出血量基址公式為

血量=[[[0xD0DF1C+1C]+0x28]+0x288]

在CE里添加這個(gè)地址

數(shù)值顯示和當(dāng)前血量一致,說(shuō)明基址正確

第二條線(一般)

0055C062 - 8B 9E 88020000 - mov ebx,[esi+00000288]

在這個(gè)地址下斷,讓程序斷下

用OD載入,直接在第一條匯編語(yǔ)句上面下斷,這個(gè)時(shí)候esi+0x288的值是0x32A(810),也就是人物的當(dāng)前血量。那么接著我們就要往上找這個(gè)esi來(lái)自于哪里。

借助OD的寄存器高亮插件一直往上翻,可以找到一條給esi賦值的語(yǔ)句,也就是說(shuō)

血量=[eax+0x288]

而eax前面有一個(gè)call,所以可能是上面這個(gè)call的返回值,進(jìn)入這個(gè)call


可以看到這個(gè)call內(nèi)部進(jìn)行了一些運(yùn)算,從下往上進(jìn)行逆推,我們很容易就能得出血量的基址為下面的值:

血量=[[[[0xD0DF1C]+0x1C]+0x28]+0x288]

這里的基址和第一條線是一致的,也沒(méi)有問(wèn)題。

第三條線(困難)

仔細(xì)觀察,其實(shí)第三條線和第四條線其實(shí)是一個(gè)東西

00482A36 - 8B 8E 88020000 - mov ecx,[esi+00000288] 00482AA9 - 89 96 88020000 - mov [esi+00000288],edx

兩個(gè)地址很近, [esi+00000288]來(lái)自edx,而ecx來(lái)自[esi+00000288],那么我們就繼續(xù)往上追esi

在這個(gè)地址下斷,讓程序斷下

esi+288就是當(dāng)前的血量值,接下來(lái)往上追esi的來(lái)源

esi來(lái)源于ecx,繼續(xù)到上層函數(shù)追ecx的值

而這層函數(shù)里并沒(méi)有找到對(duì)ecx賦值的語(yǔ)句,所以繼續(xù)找到上上層函數(shù)


這里ecx來(lái)自于eax,所以我們要進(jìn)到這個(gè)call里面繼續(xù)找eax

這里有兩個(gè)對(duì)eax進(jìn)行賦值的語(yǔ)句,倒推出來(lái)可以得出

血量=[[[ecx+0x8]+0x28]+288]

返回剛剛的位置,繼續(xù)追ecx

這里ecx已經(jīng)到了函數(shù)頭,需要再往上找一層

這里ecx來(lái)自于[ebp+eax*4+0x1C],我們?cè)谶@個(gè)地方下個(gè)斷點(diǎn),這里eax=0,那么ecx就等于[ebp+0x1C],血量地址如下:

血量=[[[[ebp+0x1C]+0x8]+0x28]+288]

繼續(xù)找ebp的來(lái)源

這里ebp來(lái)自eax+0x8,血量地址就等于

血量=[[[[[eax+0x8]+0x1C]+0x8]+0x28]+288]

eax則來(lái)自于[ebx+0x4]

血量=[[[[[[ebx+0x4]+0x8]+0x1C]+0x8]+0x28]+288]

而ebx來(lái)自ecx,所以

血量=[[[[[[ecx+0x4]+0x8]+0x1C]+0x8]+0x28]+288]

這里已經(jīng)到了函數(shù)頭,繼續(xù)返回上一層追ecx


這里下斷 找到上層返回地址

ecx來(lái)自[edi+0x68],所以

血量=[[[[[[[edi+0x68]+0x4]+0x8]+0x1C]+0x8]+0x28]+288]

繼續(xù)追edi

這里edi來(lái)自ecx,那么血量就等于

血量=[[[[[[[ecx+0x68]+0x4]+0x8]+0x1C]+0x8]+0x28]+288]

這個(gè)地方又到了函數(shù)頭部,所以繼續(xù)找到返回地址向上跟

這里ecx來(lái)自ebp,所以

血量=[[[[[[ebp+0x68]+0x4]+0x8]+0x1C]+0x8]+0x28]+288

繼續(xù)找ebp

往上翻的時(shí)候這里會(huì)看到ebp來(lái)自[ebp+0x28],實(shí)際上我們?cè)谶@下個(gè)斷點(diǎn),會(huì)發(fā)現(xiàn)這個(gè)地方根本斷不下來(lái),說(shuō)明這條語(yǔ)句不被訪問(wèn)。

那么這個(gè)[ebp+0x28]就是無(wú)效的,繼續(xù)往上找ebp來(lái)源

這里ebp來(lái)自于ecx,那么

血量=[[[[[[ecx+0x68]+0x4]+0x8]+0x1C]+0x8]+0x28]+288

這里也到也函數(shù)頭,繼續(xù)往上找ecx

返回上層我們發(fā)現(xiàn)ecx=[ebp+0x1C],下個(gè)斷點(diǎn),發(fā)現(xiàn)ebp的值是個(gè)基址,那么ecx就等于[00D11A50+0x1C]

血量=[[[[[[[00D11A50+0x1C]+0x68]+0x4]+0x8]+0x1C]+0x8]+0x28]+288

到這里整個(gè)第三條線的基址數(shù)據(jù)就追完了

在CE里添加這個(gè)基址,結(jié)果為810,正好是我們的人物血量

總結(jié)

在逆向分析數(shù)據(jù)的過(guò)程中會(huì)有很多條線路,無(wú)論是哪條都能追到我們想要的結(jié)果。區(qū)別在于有的是康莊大道,有的是荊棘叢生。

最后我們得出了一條經(jīng)驗(yàn):在實(shí)際分析過(guò)程中如果感覺(jué)數(shù)據(jù)查找比較困難,趕緊勸退,換另外一種方式,曲線救國(guó)。

https://github.com/TonyChen56/GameReverseNote

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的001 从人物血量学习数据查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。