之前寫過一篇用OllyDbg做破解, 但是為了獲得資訊,需要通過OllyDbg調試,在適當的地方設斷點,並查看記憶體,非常麻煩,不要說不懂的人,就算是我剛做過,沒過幾個禮拜就忘的差不多了。所以如果這個工具要經常性使用,最好還是能做成一個工具:比如能彈出一個對話方塊顯示需要的資訊。
這次花了兩個晚上搜尋、研究、實踐了一下,終於搞了出來。
首先,在網上找到一篇非常靠譜的文章,正是exactly我想要的:How to inject code into an exe file, 照其步驟走一遍,彈出一個對話方塊應該不是問題了。其基本做法是:
- 在空白程式碼片段(作業碼為00, 一般在最後)插入對MessageBoxA的調用 - 可通過雙擊指令逐行修改添加。
- 在需要的資訊產生之後的某處,加一行JMP到MessageBoxA調用的地方,當然,MessageBoxA傳入的參數是重要訊息的地址
- 因為在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!