004 人物数据查找和代码编写
文章目錄
- 角色血量基址查找
- 分析角色其他屬性
- 分析角色名字
- 搜索角色坐標(biāo)
- 數(shù)據(jù)整理
- 代碼編寫
接著我們來開始找游戲數(shù)據(jù),以編寫自動(dòng)打怪為目標(biāo),找齊這個(gè)功能所需要的所有的數(shù)據(jù)。第一個(gè)需要用到的數(shù)據(jù)就是角色屬性。
角色血量基址查找
直接搜索當(dāng)前人物的血值
修改血值之后再次掃描
接著我們修改第二個(gè)數(shù)值,然后打開角色屬性。發(fā)現(xiàn)第一個(gè)數(shù)值也會(huì)跟著修改,說明第一個(gè)數(shù)值的來源是第二個(gè)地址
對這個(gè)地址下內(nèi)存訪問斷點(diǎn),斷點(diǎn)斷下。[rax+0x1AC]是人物血量,這里就可以獲得人物血量的兩層偏移
[[rsi+0x65C]+0x1AC]這里繼續(xù)追rsi的來源
rsi來源于rdx
rdx來源于rbx
rbx來源于rax
進(jìn)入函數(shù)發(fā)現(xiàn)rax來源于rbx
rbx來源于rcx
rcx來源于[rcx+0x248]
[[[rcx+0x248]+0x65C]+0x1AC]再上層有個(gè)0x71C的偏移
[[[[rcx+0x71C]+0x248]+0x65C]+0x1AC]rcx來源于rax,繼續(xù)跟上面的call
最后可以追到一個(gè)基地址
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1AC]分析角色其他屬性
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1AC] 血量 [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B0] 最大血量 [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B4] 藍(lán)量 [[[0x00007FF77C447050+0x71C]+0x248]+0x638] 角色名字分析角色名字
直接掃描角色名字
把不帶后綴的地址全部拉下來,里面有一個(gè)綠色的基地址,可以直接用這個(gè)基地址
通過修改的方式 確定人物名稱的地址
對這個(gè)地址下硬件訪問斷點(diǎn),斷點(diǎn)斷下,返回上層
發(fā)現(xiàn)這里是調(diào)用的系統(tǒng)的函數(shù),接著在這個(gè)函數(shù)重新下斷點(diǎn)
此時(shí)[rdi+0x638]是我們要追的地址
rdi來源于rcx
rcx來源于rsi
rsi來源于rax,而rax上面的call就是我們追血量時(shí)經(jīng)過的第一個(gè)call。那么角色名字就等于
[[[0x00007FF77C447050+0x71C]+0x248]+0x638]搜索角色坐標(biāo)
我們在人物的對象下面并沒有找到角色的坐標(biāo),那么說明這個(gè)坐標(biāo)有可能是加密了。最快的方法是找到發(fā)包函數(shù),然后通過發(fā)包函數(shù)找到走路call,看走路call傳入的參數(shù)是什么
這里用CE的話用未知初始值和變動(dòng)的值去掃描,這里過程省略
[[[0x00007FF77C447050+0x71C]+0x248]+80] X坐標(biāo) [[[0x00007FF77C447050+0x71C]+0x248]+84] Y坐標(biāo) [[[0x00007FF77C447050+0x71C]+0x248]+88] Z坐標(biāo)數(shù)據(jù)整理
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1AC] 血量 [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B0] 最大血量 [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B4] 藍(lán)量 [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x13C] 等級 [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x14C] 經(jīng)驗(yàn) [[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x150] 最大經(jīng)驗(yàn) [[[0x00007FF77C447050+0x71C]+0x248]+0x638] 角色名字 [[[0x00007FF77C447050+0x71C]+0x248]+80] X坐標(biāo) [[[0x00007FF77C447050+0x71C]+0x248]+84] Y坐標(biāo) [[[0x00007FF77C447050+0x71C]+0x248]+88] Z坐標(biāo)偏移:"MMOGame-Win64-Shipping.exe"+0x2F67050代碼編寫
首先在_stuObj中添加人物相關(guān)的屬性
struct _stuObj {int m_StuType; //0 人物 //--------------------------------公用------------------------------------------------wstring m_Name; //名字 DWORD m_Obj; //對象DWORD m_ID; //ID//--------------------------------角色------------------------------------------------DWORD m_Level; //等級DWORD m_Exp; //經(jīng)驗(yàn)DWORD m_MaxExp; //最大經(jīng)驗(yàn) }然后在GameData.h中添加一個(gè)函數(shù)聲明
//人物屬性 _stuObj GetRoleData();函數(shù)實(shí)現(xiàn)如下:
//獲取角色屬性 _stuObj GetRoleData() {_stuObj selfdata;selfdata.m_StuType = Em_Role;//坐標(biāo)selfdata.m_Obj_Pos.x = ReadFloat(g_SelfObj + 0x80);selfdata.m_Obj_Pos.y = ReadFloat(g_SelfObj + 0x84);selfdata.m_Obj_Pos.z = ReadFloat(g_SelfObj + 0x88);//名字DWORD nameAddr = ReadDword(g_SelfObj + 0x638);selfdata.m_Name = ReadWChar(nameAddr);//屬性DWORD dwAttrBase = ReadDword(g_SelfObj + 0x65C);selfdata.m_Obj_HP = ReadDword(dwAttrBase + 0x1AC);selfdata.m_Obj_MaxHP = ReadDword(dwAttrBase + 0x1B0);selfdata.m_Obj_MP = ReadDword(dwAttrBase + 0x1B4);selfdata.m_Level = ReadDword(dwAttrBase + 0x13C);selfdata.m_Exp = ReadDword(dwAttrBase + 0x14C);selfdata.m_MaxExp = ReadDword(dwAttrBase + 0x150);return selfdata; }接著輸出一下人物信息
//輸出角色信息case Em_Role:{__OutputDebugStringW(L"名字:%s 等級:%d 血量:%d 最大血量:%d 藍(lán)量:%d 當(dāng)前經(jīng)驗(yàn):%d 升級經(jīng)驗(yàn):%d 坐標(biāo)(x:%f y:%f z:%f)", m_Name.c_str(), m_Level, m_Obj_HP, m_Obj_MaxHP, m_Obj_MP, m_Exp, m_MaxExp, m_Obj_Pos.x, m_Obj_Pos.y, m_Obj_Pos.z);}break;然后在MFC的主窗口界面中添加一個(gè)按鈕響應(yīng)事件
//人物數(shù)據(jù) void MainWnd::OnBnClickedButton1() {GetRoleData().OutputDebugInfo(); }按鈕事件輸出人物數(shù)據(jù)相關(guān)信息。實(shí)際效果如圖:
這樣我們就取到了人物相關(guān)的數(shù)據(jù)了。下一篇文章我們來找周圍遍歷相關(guān)的數(shù)據(jù)。
Github:https://github.com/TonyChen56/GameReverseNote
完整代碼:https://download.csdn.net/download/qq_38474570/79498815
總結(jié)
以上是生活随笔為你收集整理的004 人物数据查找和代码编写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 003 辅助框架的代码实现
- 下一篇: 006 技能数组分析和代码编写