1. 程式人生 > >OD CE找資料總結(下)

OD CE找資料總結(下)

 

十、判斷是否是怪物(角色怪物類別)

 

1、普通攻擊call裡面,在跳轉地方檢視怪物,或者npc對比看哪個跳了。


2、ce選擇怪物搜尋,初始化值,完後選擇npc,選擇改變的。選擇另外一個npc ,選擇沒改變的,以此類推。


3、記憶體遍歷怪物結構。

 

 

 

十一、跨圖尋路call

 

1、call內部頭部下斷點,一直斷下來,可以[esp]!=0x4526c,這裡的4526c是這個call返回到哪個地址。


2、可能注入測試的時候引數需要幾個記憶體地址儲存一些值,不用vs2010寫程式碼,可以直接ce搜尋0的記憶體,完後寫入一些值,把這些記憶體地址push進測試call就行了。


3、有些遊戲城裡的座標和城外的不一樣。


4、有些遊戲的尋路call的引數記憶體地址存放的的座標是加過密的,當執行到這個call的時候,座標被別的call解密修改寫入了。


5、gettickcount是得到作業系統啟動後到現在的秒數,一般用於加密。


6、scanf字眼的是用於得到遊戲介面的內容,比如當前地圖id,當前座標什麼的。


7、堆疊和記憶體都存在的地址,想要找到哪裡修改了這個地址的內容,可以在開頭下斷點,此時斷下來裡面的內容不是要找的內容,完後ce檢視寫入的指令,完後撤銷斷點f9執行到下個斷點(此時地址裡面是要找的內容) 再看ce的監視器,一般找最後出現的指令就是了。


8、一般call呼叫測試不成功,一般都是引數不正確。看看call裡面哪些訪問了引數的,哪些偏移內容,對比我們注入測試的時候,是不是這些偏移地址內的內容和正常情況下不一樣,完後找哪裡寫入的這些內容。比如,寫入的內容是ds:[eax+11c],就找eax來源,發現eax= ds:[esi+02c],發現esi的值=ds:[edx],裡面每次都在變動,ce檢視哪那裡寫入,看最後出現的od跳轉,完後繼續如此的找。

 

其實這種情況一般都是在找到的call上幾層的call下斷點,完後看看此時引數有沒有地圖id、目的目標、當前座標這幾個引數,如果有那就找對了。這個call裡面某個地方的call會改變ds:[eax+11c]裡面的值,完後你第一次找到的call會訪問這個地址的值,因為你沒呼叫那個寫入ds:[eax+11c]地址處的call,所以此時你發現你測試的call沒用。


9、如果你下斷點,想返回上層,此時可能當你的動作觸發後不止一次被斷下來,這種情況最好是在下段點前先看看這個call開頭有沒有提示多個呼叫來自某個地址,如果有,那就沒必要下斷點了,只能按照別的辦法了。


10、有時候進入城裡或者客棧什麼的,是另外一個call負責尋路,可以進入城裡後再尋路,send斷點斷下來找到那個call。

 

11、有時候測試call沒跑進客棧,座標改一改,改型別 double float dword 或者13.1254這種寫入進去,完後不行就退出遊戲重新測試,有時是遊戲問題不是call問題。

 

 

 

十二、拾取,打坐等call

 

1、按照第九步

 

十三、技能陣列(結構)方法:

  

1、搜尋CD時間,一般都是用回城這個技能來搜尋,先用CE搜尋,未知初始化數值,然後搜尋減少的數值。


2、通過技能名字查詢,CE搜尋文字型技能的名字。


3、可以通過快捷欄物件搜尋,或者使用技能更具引數技能id向上找到。


4、設定預設技能或者選擇某個技能,然後搜尋技能名字(搜預設技能物件地址,未知初始化)。


5、一個call開頭前面幾個nop,以為是call開頭,其實可能是跳過來的,注意跳轉。


6、找某個記憶體裡的值何時被寫入的時候找不到,此時要注意上層call的引數push,可能把某個值壓入這個記憶體裡了。


7、ce搜尋名字的地址,要範圍搜尋,因為技能名字前面可能還有一些字串和他是一體的,完後結果中找最大的記憶體地址,完後檢視訪問這個地址的程式碼,如果沒有看到訪問的指令,那就搜尋儲存這個技能名字的記憶體地址,可能是訪問了這個儲存技能名字的指標,完後點擊一下那個技能列表按鈕,看看有沒有顯示出來的指令。


8、有時候call開頭下斷點,返回上一層,這個call開頭要看準了,有的時候call開頭沒有紅線提示跳轉,按ctrl+a分析後也沒有,而且旁邊沒有?這個暗示開頭的符號。那麼它就是call開頭,不要弄錯了。
 

 

 

十四、地面物品陣列(結構)方法:

  

1、找距離,找一個不變的地面物品,通過人物走遠走近,搜尋增加或減少的數值。
 

2、找名字吧,不過這個比較麻煩,也比較耗時間,就是CE搜尋未知初始化數值,然後地面掉一個物品,就搜這個物品名字。

    

3、找掉落物品的數量
    

搜尋未知,掉一個,搜增加的值,減少一個就搜減少的值當然不一定能找到就是了,因為很多遊戲都沒有這個值。

 

 

 

十五、任務陣列(結構)方法:

  

1、通過任務打怪的數量來查詢,比如你打15/50,就搜尋15,打16,就搜尋16.(文字型),或者是byte型別。
  

2、通過任務的名字來查詢,CE搜尋任務的名字,這個比較好找。
  

3、通過任務的數量來查詢,這個和方法1差不多(不如接了5個任務,然後在接就搜增加,取消就搜減少)。
  

4、任務狀態參照上面。

 

 

 

十六、裝備陣列(結構)方法:

 

  1、通過裝備的耐久度來搜尋,一般是位元組。


  2、通過裝備的名字來搜尋.CE搜尋裝備的名字。
 

 

 

十七、隊友陣列(結構)方法:

    

1、通過隊伍的數量來搜尋,比如你一個隊伍5個人,就搜5,然後T掉一個,就搜減少。
    

2、搜尋隊伍裡面隊友的血量。
    

3、搜尋隊伍裡面隊友的名字。
   

4、通過搜尋隊伍裡面隊友掉線的方法,因為一般來說組隊了,掉線不會馬上脫離隊伍的,這時候就可以通過上線,下線來搜尋。

 

 

 

十八、寵物陣列(結構)方法:

  

1、通過寵物的屬性來搜尋,比如寵物的血、等級、座標等。
  

2、通過寵物的召喚標誌來搜尋,比如召喚搜1,沒有召喚搜0。
 

 

 

十九、找周圍玩家與NPC陣列

  

1、通過周圍玩家與NPC名字來查詢,CE搜尋任務的名字.這個比較好找。
 

 

 

二十、吃藥call

 

1、一般引數是藥品在揹包的序號,橫豎序號,或者藥品id、6bd什麼的。

 

 

 

二十一、物品等級 人物等級以及cd冷卻時間

 

1、當等級小於物品等級,不會呼叫。我們可以買一個物品等級大於自己的物品,完後根據堆疊表,找到吃藥call完後,下斷點,完後吃那個買來的藥,看能不能斷下來,能斷下來,就進入這個call的下層call,下斷點,直到找到不能斷下來的。完後就在那個call上面找跳轉,或者開頭下斷點,能跳轉就註釋1,完後吃等級低於自己的藥物,也同樣一路註釋下去,對比找到計算人物等級和物品等級的call。


2、cd冷卻偏移也是同樣道理,完後如果當前call上下文很多跳轉,就在附近遇到跳轉就下斷點,遇到jmp,就在他前面的跳轉下斷點,完後寫十幾個後,點選正在cd冷卻中的藥品,完後看在那個斷電的時候,就跳過吃藥call了。

 

 

 

二十二、技能冷卻偏移

 

1、同物品冷卻call,有時候在發包call的上面有個跳轉,cd冷卻時間內這個跳轉就會和cd冷卻時間外的不一樣。
 

 

 

二十三、喊話call

 

1,根據第九步,一般引數是有喊話內容。

 

 

 

二十四、跳躍call

 

1,根據第九步,一般沒啥引數。
 

 

 

二十五、開啟npc對話方塊call

 

1、按照第九步找到標誌位,完後od跳轉後到上層後,看是不是那個call,不是的話,就在本層找找其他call,不行就是再上層的call,以此類推。

 

2、一般開啟npc對話方塊call這種類似的動作,要先分析第一先跑到npc對面 完後才執行開啟npc對話方塊,所以找到標誌位後,od跳轉後到上層後,一般不是開啟對話方塊call,要再往上找到引數一般一個的那種call,完後在頭不下斷點,斷兩次。第一次是呼叫尋路call,第二次呼叫開啟對話方塊call。

 

3、引數有時候分析會發現分析道:

 

006A3B32  |> /33D2          /xor edx,edx
006A3B34  |> |8B43 0C        mov eax,dword ptr ds:[ebx+0xC]
006A3B37  |. |B9 07000000   |mov ecx,0x7
006A3B3C  |. |8D7C24 14     |lea edi,dword ptr ss:[esp+0x14]
006A3B40  |. |8D70 08       |lea esi,dword ptr ds:[eax+0x8]
006A3B43  |. |F3:A5         |rep movs dword ptr es:[edi],dword ptr ds:[esi]
006A3B45  |. |8B08          |mov ecx,dword ptr ds:[eax]

引數來自esi,這是批賦值指令,此時大概看一下上下指令,原來是從左子拿出一個物件指標,完後把他裡面的七個資料批處理複製到另外一個結構,以此類推直到左子樹弄完。

 

後面就看不明白了,大概是這麼個意思,此時我們當點選npc開啟對話方塊的時候斷下來,發現裡面七個資料第一個是102,於是乎想要自己遍歷這個二叉樹。

 

找到符合102的那個,可是在當前頭部下段後發現ebx+c裡面都是0。於是檢視那裡寫入,發現另外一處地方寫入,而且發現這個地方有一個call先得出一個物件地址,完後把一些七個值都批覆制到裡面,此時發現那七個值來自esi。 我們此時要弄清楚那個物件指標裡面的七個資料是啥東西,於是我們就到上層找esi來源,於是發現一堆往esi的物件指標裡批覆制的指令。 

 

由於其他的6個數據不變,只有一個類似於指標在變化,就找這個來源吧 。於是就接上上層找,最後找到一個數組,當我們點選npc斷下來的時候,此時陣列第一個元素進去後,再進去就會發現是npc的id +4+8等等,都是些垃圾資料。

 

因為對比了斷下來時候數組裡的,和上面那些指令ebx+c點進去後的對比,發現除了npc 的id,其他都不一樣貌似是垃圾資料,實在不行就進入開啟npc對話方塊call進去後,看看訪問了哪些偏移地址不就知道了?

 


4、關閉對話方塊,由於有些遊戲不發包,所以不能通過bp send來找到,只能通過有關係的行為來找,比如開著對話方塊就不能尋路,可以在尋路call下斷點,進入後對比關閉。


對話方塊後的尋路檢視標誌位跳轉,完後找到一個記憶體地址,裡面是1就標誌開著對話方塊,0就是關著,完後ce檢視寫入的指令,od跳轉到上層,測試呼叫call成功。

上文提到的找到的陣列:


當點選npc,開啟對話方塊的時候ebx=0,進去後是怪物id:

[[[[[00CEBE30+0x20]+0x1D4]+ebx*4]+0x4]+0c]+2=npc id

 

二十六、接受任務,放棄任務

 

1、按照第九步,接受任務有一個引數是npc ID,還有一個引數可以看出是選擇了某個選項。


2、放棄任務的引數一般很少,一般一個。
 

 

 

二十七、任務完成標誌

 

1、根據任務的陣列,隨便選一個任務的結構od記憶體裡修改一下,不是真修改,只是為了改變時候會變紅,完後去完成他對應的任務。切記這個任務完成後不是變成其他的任務,完成後介面上他就消失了。完後再對比od記憶體,看看哪些地方修改了,一般看ffff0203這種資料,比如武林外傳就是03變成00,多對比幾次,有時候不是03變00而是02變其他數字等等。
 

 

 

二十八、遊戲控制元件和子控制元件

 

1、進入登入介面切換線路,第一個是0,第二個是1,以此類推,完後ce找到後,od跳轉進入後,dd 記憶體地址(裡面存放的是剛才ce搜到的地址) 完後找到上面第一個。


element.1234 (此時會注意到第一個控制元件字串list)這種進入後是一堆element.2345 這種就是虛擬函式表完後在存放1234的地址處,ce搜尋訪問的指令,選擇一個od跳轉,檢視ecx來源,完後,看看這個來源記憶體進去是不是剛才第一次看到的list字串,如果是就找來源吧,完後ce檢視訪問他的程式碼,完後od跳轉向上找到來源數。


組數量可以檢視訪問陣列地址的程式碼,找到類似於迴圈遍歷的程式碼也可以找到數量基地址。


2、也可以點選強行登陸等check複選框,ce搜尋1,完後撤銷,ce搜尋0。


3、子控制元件偏移就是按照第一步記憶體中進去發現第一個字串list,那時候就是偏移。


找控制元件陣列:


找控制元件陣列經驗


1、ce搜尋密碼字元個數 最後找到進入遊戲call 他的引數是一個事件id名稱 ecx就是對應的控制元件(大控制元件就是包含小空間的) 。


2、找ecx來源,發現最後找到一個堆疊地址,ce也搜不到來源,比如要找哪裡把資料022cdc寫入哪個堆疊地址,可以ce搜那個022dc,完後檢視訪問指令,從進入遊戲介面,點選返回上一步進入選擇伺服器介面。

檢視監視器中的視窗多出一個數組的指令,完後od跳轉,接著向上跟,最後找到上面說的的eax,發現進入後是當前控制元件陣列,select_server2,座標在1e4,有的控制元件在1d0處周圍。


3、找的過程中,發現假如eax來源於一個堆疊地址,ce搜寫入這個地址的時候,發現一堆雜亂無章的資料,毫無頭緒的時候ce直接搜寫入eax的那個值,比如想找到eax的值0x2145001是啥時候被寫入那個堆疊地址的,就ce搜0x2145001就行了,完後選擇一個,檢視訪問的指令od跳轉接著找。


4、遊戲進入遊戲視窗,啟用後,就是聽到音樂後再下斷點除錯,後期就是不聽到音樂下斷點,啟用後斷下後找資料。


5、下斷點後,斷下來後不能檢視記憶體視窗的偏移,不然彙報不能訪問程序記憶體的錯誤。


6、od記憶體視窗檢視ascii文字的時候要注意用hex 16位檢視,這樣當你按減號的時候,可以返回去不然返不回了。
 

 

 

二十九、遊戲登陸驗證碼

 

1、先進入遊戲,完後看到提示輸入驗證碼的對話方塊後,ce搜尋四位元組,未知初始化資料,完後重新整理驗證碼,搜變動,幾次下來後,移動對話方塊位置,完後搜不變動,完後寫入一些數字,搜不變動,最後剩下4000多個,完後按照地址分幾大類,比如23412c、234125c、2341278發現都是234開頭,那麼就是一類,選擇第一個,以此類推,選擇10個。

 

完後ce檢視訪問程式碼,注意要看帶mov的,而且要是四位元組的,最後od跳轉後, 看是不是迴圈複製圖片資料進去 裡面的資料大概都一樣 比如.......p.........p...........p。  

 

完後剩下兩個後, 發現程式碼存放了好幾個圖片資料,不知道哪個是要找的時候,就看call結尾,發現此處把一個圖片資料複製到了一個固定的地址處 ,那個固定地址就是了。


找驗證碼圖片基地址經驗:


1、點選重新整理,搜四位元組或者位元組等變動,持續幾個回合,完後輸入一些數字,不點選確定,再輸入不變動。


完後剩下幾千個,你點選確定,這時候彈出驗證失敗請重新輸入,你搜索未變動的,這時候就剩下幾百個了。你歸類一下,看開頭的地址,比如123ffc、123fbv、你發現都是123家族的,你就選擇第一個123ffc,以此類推, 這是我在別的教程那裡學來的。

 

完後選擇幾十個後依次檢視訪問的程式碼,完後你點選重新整理驗證碼,完後看監視器裡有沒有mov 類的指令,沒有就找下一個,有就od跳過去看看是不是批覆制。


看看是不是批覆制類的指令,或者是迴圈複製某些資料到另外一個記憶體中圖片的資料,一般有很多一樣的。

2、記著這些特徵,完後把那些資料改一下,你看看驗證碼發生變化沒有, 發生變化,說明就是這個了。完後檢視哪些地方訪問了這個地址,直到找到一個基地址存放著資料前前後後都不變動,除非點選重新整理。

3、有時候有些資料不是圖片,是遊戲自己畫上去的,怎麼區分呢,就是修改中間的為ff。檢視驗證碼中間是不是多了一條黑線,如果多了,那就是畫上去的。


 

 

三十、遊戲視窗以及遊戲登陸選擇區和伺服器

 

1,直接下showwindow斷點(條件斷點 不然會一直斷下來 無法找到真的)和WritePrivateProfileString斷點就可以找到 記住遊戲要在選區的介面才行 完後選擇一個區 斷下來後 就能看到寫入遊戲ini檔案哪些內容  最後GetPrivateProfileString可以得到對應的內容 WritePrivateProfileString寫入對應的內容

showwidnows的call的引數可能不變,不用繼續向上找,一般是通過getwindowlong得到的一個userdata。
 

 

 

三十一、進入遊戲call和賬號密碼框輸入call

 

密碼賬號找call經驗:
 

1、ce搜尋輸入的個數,找到剩下的幾個,完後檢視訪問,一直斷下來的先pass掉,找到一個沒有輸入就不會斷下來的,完後輸入一個1,斷下來後 堆疊視窗向下檢視有一個引數是31的那個,諸如返回到某個地址的註釋,完後右鍵彙編視窗中跟隨,完後測試。

 
2、ce搜尋的時候,最好檢視兩次訪問,看看變化不,有時候檢視訪問的結果不一樣。


3、d找到的call地址會每次啟動遊戲都變動,所以要getmodulehandle(call的地址-dll的基地址=偏移),  獲得dll的基地址,或者百度搜列舉模組dll,或者在od的M視窗右鍵特徵碼搜尋,搜到的區段 (call的地址減去區段的基地址=偏移)完後瀏覽器外掛收藏夾裡有兩篇文章可以參考,搜尋pe,指定的區段+ 偏移就是要call的地址了。


4、如果是lua call,呼叫他可以直接下lua_dostring斷點,完後做一個動作 完後斷下來,向上層就是主程序領域了,完後呼叫。

 


進入遊戲找call經驗:


1、同上ce搜尋密碼框個數,完後檢視訪問的指令,找到一個不下斷點就不會斷下來的,完後下斷點,完後檢視k堆疊視窗,完後看有沒有挑一個call 的引數是上面說的id,那就找到了。


2、如果是按照bp send找的話,要注意迴圈發包結構,完後檢視訪問寫入封包的地址的指令,完後od跳轉完後下段,完後向上找,挨個nop,直到找打一call被nop掉後,點選進入遊戲,什麼反應東西都沒彈出來。


3、這個call也可以用來幹別的,比如焦點轉移、點選別的按鈕,只有和事件有關的,只是引數變化罷了。 

 

轉載自看雪論壇公眾號