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*nr8來源于[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 技能数组分析和代码编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 004 人物数据查找和代码编写
- 下一篇: 008 释放技能call分析