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