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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

004 人物数据查找和代码编写

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 人物数据查找和代码编写的全部內容,希望文章能夠幫你解決所遇到的問題。

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