這一節咱們利用CE和OD去找到被選中的怪物對象,和怪物列表。從而爲後面自動遍歷怪物實現自動打怪的外掛作鋪墊。固然在這以前咱們得了解彙編中數組和列表是怎麼定位的。通常是[eax*4+0x0063fedd],這樣經過自增通用寄存器eax去實現數組下標。0x0063fedd在這裏就是一個基址。由於32位系統的地址是4字節我想這個你們都很是清楚,因此乘以4.廢話很少說了,如今開始打開遊戲盒CE。而且將遊戲進程附加到CE中去。程序員
選中二者之間的值。輸入值1和值0xFFFFFFFF。這是爲了過濾掉0值。不然多查詢出不少值。同時爲了更快速的查詢,我將內存掃描選項設置成00010000和7FFEFFFF之間的內存中進程查找。那麼你們確定會問,那以下的內存呢?若是咱們要找的值在餘下的內存中怎麼辦??這個毫不用小心,若是對windows操做系統內存比較瞭解很容易知道,我設置的這個區間真好是windows的用戶模式區間。咱們的程序都是在這個區間中的。0x00000000至0x0000FFFF是空指針賦值區。主要是用來輔助程序員捕捉空指針賦值。0x80000000至0xFFFFFFFF是內核模式分區,這個空間是2G。在內核模式分區和用戶模式分區之間的是64k禁入分區。因此你們毫無小心的在這個內存區間中去查找,確定能查到咱們想要的值。windows
第一次查詢出的是一個龐大的數字。而後咱們將掃描類型改爲「未改變的」,而後查詢,這樣重複幾回。而後咱們在遊戲中去選中一個怪。數組
而後將將掃描類型改爲「改變的」,在次查詢。再選中其它的怪去查詢改變的值,這樣不停的改變選中的怪去查詢,直到查詢出幾個值,我這裏查詢出一個值。工具
能夠看出它的值是65535。當時我沒選中任何怪,說明未選中怪的時候這個內存中的值是0000FFFFh(16進制)操作系統
咱們已經找出這個被選中怪id存放的地址。命令行
而後將這個值選中到被選取,右擊被選取數據"找出什麼訪問了這個地址"。彈出一個對話框,能夠看到這樣一行彙編指令:「004adb43 mov eax,[edi+00001478]」指針
咱們將這行代碼記錄下來。這個時候關閉CE,咱們須要打開另外一個外掛人員和破解人員必備動態調試工具OD。首先來了解下OD工做區:調試
1區反彙編代碼區,這個區是程序被反彙編器放彙編出的彙編指令。對象
2區是寄存器區。這裏顯示了CPU中的寄存器,咱們能夠在動態調試的時候查看下寄存器的變化。blog
3區是內存註釋區
4區是內存區,這裏顯示了內存狀態。
5區是棧區,這裏會顯示程序在調用過程當中堆棧的變化。
打開OD而且附加遊戲進程。
而後
右擊轉的表達式,而後輸入咱們記錄的那個地址004adb43。跳到訪問被選中怪物id存放的地址的彙編指令那個地方。MOV EAX,DWORD PTR DS:[EDI+1478]這樣一行代碼。就是將被選中怪物的ID放到EAX寄存器。CMP EAX,0FFFF緊接着這行代碼。0000FFFF是沒有怪物被選中時DS:[EDI+1478]中的值。
MOV ECX,DWORD PTR DS:[EAX*4+312DF20] 後面的DS:[EAX*4+312DF20]就是彙編中集合的訪問方式。312DF20是基址,那麼312DF20+0就是這個數組的第一個元素。咱們猜想這個數組存放的就是怪物數組。
咱們在OD的命令行中輸入dd 0312DF20以堆棧形式轉儲。咱們能夠看到一個一個對象地址在這個數組中,這個就是怪物包括玩家的數組。固然有一個熟悉區別它是怪物仍是其它對象。
咱們進入這個數組中的第二個對象。右擊第二個數組-》數據窗口跟隨進入的第二個對象,能夠看到+c這個位置就是對象數組下標是1.恭喜咱們已經找到對象數組了。同時咱們知道只要是放入[eax+00001478]中的id就是被選中怪物。這個就到這裏,下一節分析對象屬性。