用OllyDbg插入代碼彈出對話框


之前寫過一篇用OllyDbg做破解, 但是為了獲得信息,需要通過OllyDbg調試,在適當的地方設斷點,並查看內存,非常麻煩,不要說不懂的人,就算是我剛做過,沒過幾個禮拜就忘的差不多了。所以如果這個工具要經常性使用,最好還是能做成一個工具:比如能彈出一個對話框顯示需要的信息。 

這次花了兩個晚上搜索、研究、實踐了一下,終於搞了出來。

首先,在網上找到一篇非常靠譜的文章,正是exactly我想要的:How to inject code into an exe file, 照其步驟走一遍,彈出一個對話框應該不是問題了。其基本做法是:

  1. 在空白代碼段(操作碼為00, 一般在最后)插入對MessageBoxA的調用 - 可通過雙擊指令逐行修改添加。
  2. 在需要的信息產生之后的某處,加一行JMP到MessageBoxA調用的地方,當然,MessageBoxA傳入的參數是重要信息的地址
  3. 因為在2出插入代碼是實際上是覆蓋了原有代碼,一般是將被覆蓋的代碼放到MessageBoxA調用之后,並在最后加一個JMP,跳回其接下來指令的地址。

下面是幾個值得注意/記錄的地方:

  • 傳給MessageBoxA的message地址,能不用常量地址就盡量不用,因為其可能是動態算出,在不同的session值是不一樣的 - 比如這里,授權碼的地址是在寄存器EBX中,那么直接傳EBX即可
  • 如何保存修改過的exe? RMB->Edit->Select all; RMB->Edit->Copy to executable; In the new window, RMB->save file
  • 有時打開后代碼格式不是很正常,比如明明是正常的指令,卻為解析為數據,可以RMB->Analysis->Remove analysis from module
  • 右鍵jmp指令可以Follow到目標地址
  • exe的斷點、注釋等信息存在:OllyDbg2.1\udd\*.udd文件中

 

修改代碼后直接debug,發現信息是在彈出對話框中顯示了出來。但是,當我保存后執行修改過的exe,卻怎么也無法工作。Debug進去看了一下,是call MessageBoxA這個函數時出的錯,事實上,這個函數調用是針對某個函數地址的,比如:CALL 754DE055, 但檢查發現這個地址卻是錯誤的,並不對應到MessageBoxA的加載地址。

為什么?

一番搜索與思考后,覺得這是ASLR的問題,ASLR=Addresss Space Layout Randomization, 他是Windows vista依賴引入的一個新的機制,其使得系統dll在進程中加載的基地址不再是固定的,從而防止用戶惡意在exe中插入對windows api的調用 - 而它也確實成功了,對於windows xp與windows 2003, 沒有ASLR這個特性,自然也不會有這個問題。

我用的是Windows7的系統,怎么辦? 禁掉ASLR!

你需要下載一個叫做Enhanced Mitigation Experience Toolkit(EMET)的工具,安裝並運行:

如圖所示把ASLR disable掉並重啟即可。

 

然后,插入MessageBoxA並保存,然后運行破解后的代碼,一切ok!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM