外挂学习之路(11)--- 背包数据的遍历
查找數據主要包括:背包數據遍歷、NPC數據遍歷、怪物數據遍歷、地面物品數據遍歷、技能列表遍歷、周圍玩家數據遍歷、地圖數據的查找、人物信息的查找等等。
本次只討論需要遍歷的數據
為什么要遍歷數據?
一般來講是給我們找到的call當參數使用的,比如我們找到打怪call,但是這個call需要一個參數是怪物的指針,我們上哪去弄這個指針?我們只能去遍歷怪物數據,這些數據包括怪物指針,怪物的坐標,怪物的血量,名字等等信息,把有用的信息提取出來,用編程語言寫個數據結構把它存起來供我們使用時候用。
需要遍歷哪些數據?
不同數據需要不同的信息,如果是提供給call使用的話,我們主要看call需要什么類型的數據,是怪物的指針啊,還是怪物的ID,當然我們也可以遍歷一些用處比較少的屬性,比如怪物名字
找到的遍歷結果一般是什么樣子的?
本次不討論鏈表結構和二叉樹結構,只討論數組結構,比如我們找到的背包物品個數的數組的形式可能是:
個數=[[[[[基地址]+a]+b]+格子編號*0x40]+c
這個時候我們就發現[[[[基地址]+a]+b]+格子編號*0x40是某個格子的指針,從而推導出其他屬性,比如我們可能推導出
名字=[[[[[基地址]+a]+b]+格子編號*0x40]+d
最大疊放=[[[[[基地址]+a]+b]+格子編號*0x40]+e
使用等級=[[[[[基地址]+a]+b]+格子編號*0x40]+f
物品ID=[[[[[基地址]+a]+b]+格子編號*0x40]+h
………
所謂推到辦法,就是看看背包數據,再看看內存數據比較下,猜測出偏移,再驗證下,驗證方法:修改內存,看看物品有沒有相應的更改。
?
如何遍歷背包物品數據
好了,不廢話,說說如何查找這個數組,首先我們必須有個切入點,背包物品最好從背包中某項物品的個數入手,因為很多情況這個數目不止一個,并且可以改變,比如血瓶,右擊一下就減少一瓶。
我們直接有CE搜索995,使用一瓶搜索994,搜索出來兩個結果,
再改變數量發現還是這個兩個地址,這兩個地址都是正確的,但是他們表達的含義不一樣,我們將血瓶移動到第二個格子看看,發現一個值變為0,這就說明這個地址指向的是背包第一個格子中物品的數量,而不是血瓶數量
我們查看訪問這個地址的代碼,然后把血瓶移回第一個格子,看到代碼
打開OD,找到代碼,找到代表物品數量的表達式[eax+14],下面的工作就是找基地址,找這個eax的基地址。
第一個格子中物品的數量=[[[[[[[[15AC044]+10+4]+4]]]+0C+4]+30+4]+ 0*0x28 +0x14]
如何確定這是個數組呢,以及第二個格子和第一個格子的差別應該差在哪里?這個一般在尋找基地址時候就會發現,
比如,舉個例子,我們首先得到? 第一個格子中物品的數量=[eax+14],我們挪動血瓶發現eax的值每個格子都不一樣,并且是個等差數列,這不就明顯了嗎?哈哈
研究游戲名字為《龍武》實戰檢測,他的背包數據很奇葩,有兩個基地址,前32個格子統一基地址,剩余格子(不足32個)另一個基地址。最終確定格子中物品數量表達式為:
前32個格子:[[[[[[[15AC044]+10+4]+4]]]+0C+4]+30+4]+ 格數*0x28 +0x14 ? ? ? ? 格數范圍0-1f
剩余格子: ? ? [[[[[[15AC044]+10+4]+4]+8]+0C+4]+30+4] + 格數*0x28 + 0x14
?
尋找數據的思路:
上面就是按照數量的找法,也有看過相關教程按照每個格子的指針找的,即,每個(些)都應該有個指針,格子會盛放這些指針,互相改變格子中的物品,這些指針也應該隨之改變,并且空格子的指針應該為0,按照這個思路用CE找,也可以找到一個數組,一個指針的數組。但是這些指針是否有用的,如果有call直接使用這些指針的話,這些指針就是游泳的,如果沒有的話,還有需要研究這些指針指向的地址盛放的東西的話,這個研究方式就不太好了,最好是直接下手,需要數量數組就從數量下手,需要ID數組就從ID下手,需要名字就從名字下手。
?
追尋基地址的一些實戰感悟:
感悟1:
毫無疑問如果可以用CE就能找到基地址的話,那實在是太方便了,快速而高效,但是有些時候我們只用CE找不到基地址,這個時候我們只能用OD了,最好是OD和CE結合著用,沒找到一個地址就先用CE試一下。有時純CE找不到基地址原因如下:
1.用CE搜索一個中間地址,搜索搜索結果為空。(中間地址:非基地址,如:物品個數=[[435C9660+0C+4]+30+4] + 格數*0x28 + 0x14,這其中的不是基地址,我們把它簡稱為中間地址)
2.搜索到了地址,右鍵查看訪問代碼,結果沒有代碼出現
3.出現了訪問代碼,最后也找到了一個綠色的地址,突然發現這個綠色地址盛放值是可以變動的,突然為0了等等。
?
感悟2:
有時候用OD跟蹤找基地址,會發現越來越深,這個時候最好做個中間記錄,省的一次追不完,下次又得重頭開始追查,比如我們追背包中物品數量的基地址,可以先做個記錄
物品數量= ?[[435C9660+0C+4]+30+4]+ 格數*0x28 + 0x14
并且記錄下追到的代碼地址,下次接著從這塊代碼入手,
00E07BD1 8B4D EC MOV ECX,DWORD PTRSS:[EBP-14] 00E07BD4 83C1 10 ADD ECX,10 ; ecx=11014270 00E07BD7 E8 A4140000 CALLLWClient.00E09080 ; 關鍵call,在堆棧中寫入435C9660 00E07BDC 8D55 F0 LEA EDX,DWORD PTRSS:[EBP-10] 00E07BDF 52 PUSH EDX這個結果最好驗證下(驗證方法,dd [[435C9660+0C+4]+30+4] + 格數*0x28 + 0x14,如果435C9660是個堆棧地址需要在代碼處下斷點再執行命令)
?
感悟3:
基地址嵌套很深,最后追到基礎地址卻忘了一路是怎么過來的,不得不模擬走好幾遍才能把最后的表達式寫出來,這時有個方法,很有效,方法如下:
比如我們先追到了一段,記錄下
品數量= ?[[435C9660+0C+4]+30+4]+ 格數*0x28 + 0x14
接著我們追這個435C9660的地址是怎么來的,沒遇見一次賦值記錄下來,沒有偏移并且沒有指針就不記錄了,比如move eax,ecx就不用記錄了,追的地址沒變,記錄下每次地址改變值,直接記錄值就可以了,記寄存器名字反倒不方便,記錄如下:
435C9660=[435C9740] 435C9740=[435C9420] 435C9420=[1B757924] 1B757924=1B757920+4 1B757920=[11014280+4] 11014280=11014270+10 11014270=[15AC044]把這些地址迭代進去就可以得到最終的基地+偏移表達式了
物品數量= [[[[[[[15AC044]+10+4]+4]]]+0C+4]+30+4]+ 格數*0x28 +0x14
總結
以上是生活随笔為你收集整理的外挂学习之路(11)--- 背包数据的遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外挂学习之路(9)--- 普通攻击cal
- 下一篇: 外挂学习之路(12)--- 用CE搜索字