008 释放技能call分析
文章目錄
- 釋放技能分析
- 定位普通攻擊call
- 數據整理
- 代碼編寫
釋放技能分析
接著我們需要拿到釋放技能的數據
首先來到明文發包call頭部
釋放技能讓斷點斷下
此時第一次返回的call是選怪的封包call。所有的傳奇類的游戲,都需要先選中怪物,然后在走近怪物,最后攻擊
我們在人物打怪的中途斷下,此時返回的第一層地址才是技能call。這一層的call被加密了。
我們需要返回到第二層。
| mov dword ptr ss:[rsp+0x30],eax | rsp+0x30 計數器 | movzx eax,byte ptr ss:[rsp+0x88] | | mov byte ptr ss:[rsp+0x28],al | rsp+0x28 1 | mov rax,qword ptr ss:[rsp+0x80] | | mov qword ptr ss:[rsp+0x20],rax | rsp+0x20 怪物坐標 | movzx r9d,dil | 技能等級 | movzx r8d,bx | 技能ID | mov edx,esi | 怪物ID | call 0x7FF7F9B75260 | 釋放技能call這個call的參數分析如上。技能call實際上就是普通攻擊call
因為每個角色都自帶一個F1的普通攻擊,這個技能也是有技能ID的。
但是問題來了,這個call需要走近目標以后進行攻擊才會斷下,這就需要多調用一次走路call,那么這個call就不是我們要的call。
我們需要的是調用以后自動走到怪物面前,然后進行攻擊。這樣就得切換一下切入點了。
定位普通攻擊call
我們可以從選中怪物的ID或者對象入手。因為如果要釋放技能的話,選中怪物的ID和對象必定是要傳入的參數,找到了選中怪物的ID或者對象就相當于找到了技能call
首先選中一個怪物,搜索未知的初始值
然后選另一個怪物,搜索變動的值。重復這個步驟
重點分析這一批綠色的地址
其中,有幾個地址在未選中狀態下,數值為0
然后選中時,數值又產生了變化
這里用十六進制顯示,這幾個地址存放的應該是怪物的對象。其中有一個地址存放的是選中的怪物對象
當我們選中以后,把其中一半的地址改為0,此時人物不再進行攻擊,那么說明這三個地址有一個存放的是選中的怪物對象
最終通過修改數值,可以確定唯一的選中的怪物對象
然后在這個位置下一個寫入斷點,讓斷點斷下
這里通用需要先F9步過一次,不然會返回到一個沒有效果的選怪的call。需要讓這個斷點第二次斷下的時候返回。
這個call就是我們要的攻擊怪物的call,里面沒有技能相關的參數。那么這個call應該是個普通攻擊的call。
這個call在傳入怪物對象以后,會自動走到對象周圍,從某種程度上來說,已經解決了我們的問題。可以不需要調用尋路call了。
遠程職業的話不需要這個call,因為直接釋放技能就能打怪,不需要走到怪物身邊。
數據整理
釋放技能call | 48:8BC8 | mov rcx,rax | | 8B05 AC540902 | mov eax,dword ptr ds:[0x7FF6A22212D0] | | 894424 30 | mov dword ptr ss:[rsp+0x30],eax | | 0FB68424 88000000 | movzx eax,byte ptr ss:[rsp+0x88] | | 884424 28 | mov byte ptr ss:[rsp+0x28],al | | 48:8B8424 80000000 | mov rax,qword ptr ss:[rsp+0x80] | | 48:894424 20 | mov qword ptr ss:[rsp+0x20],rax | | 44:0FB6CF | movzx r9d,dil | | 44:0FB7C3 | movzx r8d,bx | | 8BD6 | mov edx,esi | | E8 B091BFFF | call 0x7FF69FD85000 | 釋放技能普通攻擊call | 83C8 01 | or eax,0x1 | | 8905 A4E5E301 | mov dword ptr ds:[0x7FF6A1FDC338],eax | | 48:8D05 35D17E00 | lea rax,qword ptr ds:[0x7FF6A098AED0] | | 48:8905 86E5E301 | mov qword ptr ds:[0x7FF6A1FDC328],rax | | 48:8D0D 37D57000 | lea rcx,qword ptr ds:[0x7FF6A08AB2E0] | | E8 724B4100 | call 0x7FF6A05B2920 | 普通攻擊call一共兩個call,一個給近戰職業用,一個給遠程類職業用
代碼編寫
//釋放技能 void Fn_UseSkill(_stuObj Monster, _stuObj Skill) {//計數器+=1DWORD dwCount = ReadDword(g_GameAddr + UseSkillCount);dwCount += 1;//再釋放技能typedef void(*PFnUseSkill)(QWORD rcx, QWORD rdx, QWORD r8, QWORD r9, _stuPos* pos, QWORD one, QWORD count);PFnUseSkill UserSkill = (PFnUseSkill)(g_GameAddr + UseSkillCall);UserSkill(g_PublicRcx, Monster.m_ID, Skill.m_ID, Skill.m_Level, &Monster.m_Obj_Pos, 1, dwCount); }這里暫時只寫一個釋放技能call,剩下的普通攻擊call各位可以自己去編寫。到這里自動打怪所需要的數據就已經全部找齊了,下一篇文章我們開始編寫自動打怪的代碼。
Github:https://github.com/TonyChen56/GameReverseNote
完整代碼:https://download.csdn.net/download/qq_38474570/79498815
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的008 释放技能call分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 006 技能数组分析和代码编写
- 下一篇: 009 自动打怪功能的设计和实现