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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

006 技能数组分析和代码编写

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 006 技能数组分析和代码编写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 技能遍歷
      • 技能名字
      • 數據整理
      • 代碼編寫

現在我們已經有了人物的數據和周圍對象的數據,還差一個技能數據和釋放技能call,就可以完成自動打怪的功能。

接著我們來找技能遍歷的數據

技能遍歷

以技能的當前經驗為突破口

直接搜索當前經驗值

篩選得到唯一的一個數值

下訪問斷點,讓斷點斷下,此時[rax]就是我們要追的數值

[rax]

rax來源于上面的call

這個call傳入了一個技能ID和一個基地址作為參數,我們進入call內追rax的來源

經過這三個步驟rax變成了

[rax*10+rdx+4]

這里我們要追一個rdx

技能名字

直接搜索技能名字,把沒有后綴的拿下來

然后確定唯一的一個地址

下訪問斷點,重新打開技能欄

返回上層,這里要追的是[r15+0x38C]

[r15+0x38C]

r15來源于rax,來源于[r12]

[[r12]+0x38C]

r12來源于rcx+0x4

[[rcx+0x4]+0x38C]

rcx來源于r8+rax*4

[[r8+rax*4+0x4]+0x38C]

繼續追r8

r8來源于[rbp+0x130]

[rbp+0x130]是一個數組,我們來追蹤這個數組的來源

往上找引用[rbp+0x130]的位置,發現這里會往這個地址循環寫入值

每一次進來都會寫入一個,進入call內單步跟蹤,看他什么時候往里面寫值

當代碼執行到這里將對象寫入到數組,這里要追rax來源,rax來源于[rbp+0x4]

rbp來源于r8

r8是上層call的參數,也就是eax和rdx

然后根據這一段代碼整理

ID=r8+14*n

r8來源于[rax],來源于[rsp+0x28],而rax此時是一個基地址,繼續往上找到來源

[rsp+0x28]來源于rbx

rbx來源于rax

rax來源于rcx+0x1E8

rcx來源于基地址

數據整理

偏移:0x2F783A4 [0x00007FF7035083A4+0x1E8]+n*14 技能ID [0x00007FF7035083A4+0x1E8]+n*14+4 技能對象 [[[0x00007FF7035083A4+0x1E8]+n*14+4]+0x38C]+0 技能名字 [[0x00007FF7035083A4+0x1E8]+n*14+4]+0x74 技能等級 DWORD [[0x00007FF7035083A4+0x1E8]+n*14+4]+0x3E0 技能最大等級 DWORD

代碼編寫

接著來編寫技能遍歷的代碼,同樣在stu.h中新增技能對象相關的字段

//--------------------------------技能------------------------------------------------BOOL m_Skill_Level; //技能等級BOOL m_Skill_MaxLevel; //最大等級

接著在GameData.h中新增一個函數

//技能遍歷 _stuObjs GetSkillData();

數組的遍歷相對來說比較簡單,只需要一個函數即可。

//技能遍歷 _stuObjs GetSkillData() {_stuObjs skilllist;//技能數組首地址QWORD qSkillArr = ReadQword(g_GameAddr + SkillArray + 0x1E8);//數組大小DWORD dwSize = ReadDword(g_GameAddr + SkillArray + 0x1E8 + 0x8);//開始遍歷for (unsigned int i = 0; i < dwSize; i++){_stuObj skill;skill.m_StuType = Em_Skill;//IDskill.m_ID = ReadDword(qSkillArr + i * 0x14);//對象skill.m_Obj = ReadDword(qSkillArr + i * 0x14 + 0x4);//等級skill.m_Skill_Level = ReadDword(skill.m_Obj + 0x74);//最大等級skill.m_Skill_MaxLevel = ReadDword(skill.m_Obj + 0x3E0);//名字DWORD nameaddr = ReadDword(skill.m_Obj + 0x38C);skill.m_Name = ReadWChar(nameaddr);//保存skilllist.m_data.push_back(skill);}return skilllist; }

然后輸出技能相關的信息

//輸出技能信息case Em_Skill:{__OutputDebugStringW(L"對象:%x ID:%x 名字:%s 等級:%d 最大等級:%d", m_Obj, m_ID, m_Name.c_str(), m_Skill_Level, m_Skill_MaxLevel);}break;

實際效果如圖:

下一篇文章我們來找明文封包call。

Github:https://github.com/TonyChen56/GameReverseNote

完整代碼:https://download.csdn.net/download/qq_38474570/79498815

總結

以上是生活随笔為你收集整理的006 技能数组分析和代码编写的全部內容,希望文章能夠幫你解決所遇到的問題。

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