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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

背包数据的获取

發(fā)布時間:2023/12/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 背包数据的获取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求:
在自動化助手的UI界面中,能夠實時的顯示玩家背包中的數據,以及重要的屬性信息,比如數量,名稱等

1、分析物品數據屬性,還原C++類

2、分析物品基址或者基址獲取方法

物品數據的初步分析:

搜索背包的物品數據 初步猜測是數組 相鄰的差值都一樣

發(fā)現改變背包的物品位置,數據也被copy了,直接搜字符串

發(fā)現這個地址離太遠了,不可能和別的構成數組 ,說明物品是沒名字的,而是有物品種類

再由這個數據有一個算法來指向名字

鼠標放上去顯示名字 肯定是先有id 然后通過算法 那個算法參數是id 來指向這個名字的位置

所以直接下斷,鼠標移向背包裝備 觸發(fā)斷點

??發(fā)現是有eax讀出來的

一直往上走 發(fā)現ebx像 物品指針

?直接加上偏移 發(fā)現是物品數量

這就是物品指針了。

物品指針-》995800 得到新的指針? +60

關鍵點:

?獲取背包結構:

比較指針

?EBX沒變就去找ECX?

一直往上發(fā)現ECX一直沒變

說明這個體系比較復雜

EAX是46? 應該是從這兒來的?

下斷發(fā)現不是從這來的..

再往前就追到一個和界面有關的地方,鼠標移動就斷下。。

追到這就不追了 涉及到UI 就很底層了? 這么底層的地方找太難了。

我們得找個和UI沒關系的地方

因為物品是獨立的 ,寫入的操作就也比較獨立,訪問的話又會涉及到UI的問題,寫入就可能可以把UI這塊避過去

?

?跟進去往前跳

?這個看起來還好,一上來就看見一個數組結構

ebx是物品指針? 通過edi控制這個指針? edi可能是序號或者大小

item[x]? ? item*[x] 只有這兩種可能? 點第一個edi是0? 第二個edi是1? ...

那么就可以確定這是一個指針數組? 那么edi代表物品在背包里的序號,訪問估計也就是一個循環(huán)0---95了

?超過就異常 包裹大小也就是 /4 得到

也清晰的記錄了背包有多少格

背包基址的分析:

esi來自于上級菜單,往上找~

來自于EBX?

這個函數估計就是更新屬性的東西

?來自esp+20

?指針從這得來的

再試試金幣是不是在包裹里:

很明顯在同一個結構體里?:錢也在背包里

物品類的C++還原:

#pragma once #include"SRO_String.h" //物品 typedef class ITEM {typedef LPVOID(ITEM::* PROC)(); public:static PROC _GetItemRes;protected:int unknowB1[13]; public:int Type;//類型 protected:int unknowB4[21];// public:int elv;//裝備強化程度 protected:int unknowB28[2]; public:int MaxDurability;//最大耐久度int Count;// 數量 protected:int unknowB7[16]; public:int MaxPhyAttack;//最大物理攻擊力int MinPhyAtack;//最小物理攻擊力int MaxMagAttack;//最大魔法攻擊力int MinMagAttack;//最小魔法攻擊力 protected:int unknownnB25[12]; public:int Durability;//耐久度 protected:int unknownB13[43]; public:int plv;//寵物等級 protected:int unknownB31[129]; public:LPVOID GetItemRes();PSROSTRING GetName(); }*PITEM; ITEM::PROC ITEM::_GetItemRes{}; LPVOID ITEM::GetItemRes() {LPVOID resPtr = (this->*_GetItemRes)();resPtr =(LPVOID)((DWORD)resPtr+0x60);return resPtr; }PSROSTRING ITEM::GetName() {return _pgamebase->SRO_Res->ReadItemTitle(GetItemRes());}

背包類的C++還原:

#pragma once #include"ITEM.h" typedef class BackPack {int unknowmB1[232]; public:PITEM* ItemStart;//物品起始地址PITEM* ItemEnd;//物品結束地址 protected:int unknownB7[22]; public:int PackCount();PITEM GetItem(int index); }*PBackPack #include "pch.h" #include "BackPack.h"int BackPack::PackCount() {int allsize = (DWORD)ItemEnd - (DWORD)ItemStart;if (allsize < 0)return 0;allsize = allsize / 4;return allsize; }PITEM BackPack::GetItem(int index) {int max = PackCount();if (index < max){PITEM pitem = ItemStart[index];return pitem;}return NULL; }

追加 初始化操作:

GameBase* _pgamebase; void GameBase::Init() {//主要負責游戲對接類的初始化unsigned* addrRead = (unsigned*)0x1256E3C;SRO_Res = (PRes)0x1036518;SRO_Control = (PControl)addrRead[0];addrRead = (unsigned*)0x1037D3C;SRO_Player = (PAIM)addrRead[0];InitClassProc(&Res::_ReadTitle, 0x9A46C0);InitClassProc(&Res::_ReadItemTitle, 0x9A4640);InitClassProc(&Control::_NormalNotice, 0x848580);InitClassProc(&Control::_NetNotice, 0x844E40);InitClassProc(&Control::_ChatNotice, 0x844E80);InitClassProc(&Control::_GetPPack, 0x866140);InitClassProc(&ITEM::_GetItemRes, 0x995800);InitClassProc(&Pack::_GetPackPack, 0x7722C0); }void GameBase::InitClassProc(LPVOID proc_addr, unsigned value) {unsigned* Writer = (unsigned*)proc_addr;Writer[0] = value; }GameBase::GameBase() {_pgamebase = this;//Init();//初始化基址 完成系統對接 }

裝備欄數據結構的分析:
?

直接搜物品數量找?

直接看改寫

?發(fā)現edx是裝備編號. 那么1E0就是裝備大小了 這是個數組

?edx是序號 22d0是固定的 看看esi

發(fā)現是要找1C301D94的由來

進入函數

?得到基址

裝備欄數據與算法C++還原

#pragma once #include"ITEM.h" //裝備欄enum class EquipType {har = 0,Jacket = 1,Shoulder=2,Hand = 3,Trousers=4,Shoe=5,Weapon=6,WeaponEx=7,Ol=8,Earring=9,NeckLace=10,RingLeft=11,RingRight=12 }; typedef class EquipPack { public:PITEM Getitem(EquipType index); }*PEquipPack;

測試:

void CUIWnd_1::OnBnClickedButton1() {auto _PackBack = _pgamebase->SRO_Control->GetPPack()->GetPackBack();lstPack.ResetContent();CString tmp;for (int i = 0; i < _PackBack->PackCount(); i++){auto item = _PackBack->GetItem(i);if (item != NULL&&item->Type){tmp.Format(L"[%s][數量:%d][耐久:%d/%d]", item->GetNameByWCHAR(), item->Count,item->Durability,item->MaxDurability);lstPack.AddString(tmp);}} }void CUIWnd_1::OnBnClickedButton2() {auto _PackBack = _pgamebase->SRO_Control->GetPPack()->GetEquipPack();lstPack.ResetContent();CString tmp;for (int i = 0; i < 13; i++){auto item = _PackBack->Getitem((EquipType)i);if (item != NULL && item->Type>0){tmp.Format(L"[%s][數量:%d][耐久:%d/%d]", item->GetNameByWCHAR(), item->Count,item->Durability, item->MaxDurability);lstPack.AddString(tmp);}} }

?

總結

以上是生活随笔為你收集整理的背包数据的获取的全部內容,希望文章能夠幫你解決所遇到的問題。

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