放出這篇教學壓力其實還蠻大的,畢竟高手這麼多,可能會被揪出一堆錯誤啊~XD,總之我還是個不折不扣的菜鳥,也還在懵懵懂懂的學習中,希望藉由這樣的文章可以有拋磚引玉的效果,若有任何錯誤或是不夠精確的地方也希望前輩們能夠不吝指正。那我們今天要介紹的主角就是傳說中的『OD』,一款用於Debug的彙編級除錯器,以及它的一些簡單的用法。
本文附件:
- [ 找 Call 練習懶人包 ] → [ 點我下載 ]
解壓縮密碼:
來自妖精的號角
練習用程式介紹:
分析找Call教學:
第2步 然後把懶人包裡面的『找Call練習』打開。
第3步 回到OllyICE,點選『檔案』→『附加』。
第4步 選擇『找Call練習』的進程,然後按下『附加』。
第5步 先按下上方的三角形,讓程式可以執行,然後在命令列輸入『bp send』。在這邊bp就是下斷點breakpoint的意思,而send則是這個程式所調用的函數,早期的線上遊戲似乎比較常見。
第6步 回到『找Call練習』,點一下『撿藥水』,你會發現視窗自動跳到OllyICE來了,
並且停留在
74FA6F81 – mov edi,edi
這一行。
第7步 按下Alt+K,來看看有哪些地方調用了這個Call,因為這只是一個練習用的小程式,所以可以看到只有兩處。真正在分析線上遊戲的時候就不會這麼輕鬆了,所以說大家對製作外掛的黑黑們要抱持著十分敬意啊。不是啦,這邊我們就先選第一個跟進去看看,雙擊『調用來自』那一行的地方進入。
第8步 這樣就進來了,可以看到反白停留在這個call的位置。
第9步 稍微往上捲一點,找到這一個數據區塊的源頭,通常會在ret之下,或是一堆空白記憶體的下方。以下圖為例,就是
00418640 – push ebp
這一行。
第10步 從這一行開始往下分析,這邊考驗的就是個人的經驗了,反白的區塊就是值得注意的地方,在
00418669 – lea eax,[ebp-34]
這一行可以看到ebp減去34之後被放入了eax,而底下有個push eax把這個eax作為參數送給Call去調用,所以我們要來看看eax的值的變化。
第11步 由於eax的值是在這一行到下一行之間改變的,所以我們在這一行點右鍵→此處為新EIP。
第12步 按下F8跳轉到下一行,觀察右邊暫存器,可以看到eax顯示紅字,表示有變化了!此時我們將eax的值0018F3E8記錄下來。
第13步 將這幾個必要的參數整個記錄下來(區塊反白→Ctrl+C),然後稍微整理一下。
0041866E 68 10904100 push 00419010
00418673 50 push eax
00418674 8975 DC mov dword ptr ss:[ebp-24],esi ←刪除
00418677 8975 CC mov dword ptr ss:[ebp-34],esi ←刪除
0041867A E8 81000000 call 00418700
只需要留下必要的被push的參數即可,刪除那兩行的作用只是用於清除堆棧,在調用Call的時候並非必要。
第14步 將OD關掉,練習用的程式也會跟著被關閉。重新打開找Call練習的程式,再打開懶人包中的『CodeInEX』,點選左上角的視窗圖示。
第15步 選擇找Call練習的進程,並按下確定。
第16步 由第12步得知eax的值,將此值用mov的方法置入eax中,再加上13步整理出來的push參數及Call本身,就是一個帶有完整參數的指令。如果參數有少給,程式很可能會崩潰。經驗就是在一堆崩潰之中累積起來的,所以看到製作外掛的黑黑們,請抱持著十分敬意呀。那麼因為這是一篇示範用的教學文章,所以我已經先測試過沒問題了,按下『注入遠程代碼』。
第17步 哦~哦哦!程式出現了『撿到超棒的』…?超棒的什麼?顯然我們找到的Call只是Send的主程序,還少給了『物品』的參數。不過到這邊已經成功一半又一半了,至於物品參數,就留待下一篇囉。
時隔四年多 求版主能再更新一次
更新27了~麻煩><
是指下載的網頁嗎?
嗨嗨,你的名字也太可愛XD 可以試試看最…
已更新,感謝!