小甲鱼 OllyDbg 教程系列 (十一) : inline patch ( 内嵌补丁 )
?
?
小甲魚 OllyDbg 視頻教程:https://www.bilibili.com/video/av6889190?p=19
程序下載地址:https://pan.baidu.com/s/1u6SWgx83VWDwitNzxT2OXg ? ?提取碼:if41?
PEiD 查殼工具:https://pan.baidu.com/s/1iNS4UlBvmXCxaj5a-AFupw?? ?提取碼:79z5?
?
?
前言
?
inline patch “內嵌補丁” 指在程序文件中把補丁代碼寫入文件里面達到 PJ 的目的。
例:
原程序:??mov eax, dword ptr [ebp+8]????3個字節
想改為:??mov eax, 4????????????????????5個字節
若如此修改,會產生溢出,覆蓋了下面的指令
所以要采用內嵌補丁的方式:
1. 找程序的空白區間,寫入自己需要的指令(mov eax, 4),以及會被覆蓋的指令
2.將原來的指令(mov eax, dword ptr [ebp+8])改為 jmp XXXXXX(補丁的地址)(這個操作也會覆蓋后面的內容)
3.在補丁最后加上 jmp XXXXXXX(原程序后面的內容的地址),跳出補丁,返回主程序
?
?
開始
?
首先用?PEiD?查看,可以看到是?VC6.0?寫的程序:
然后用?OD?載入程序,按?F9?運行,程序運行,然后隨便輸入注冊:
發現程序界面沒什么反應,現在輸入注冊碼,不要點擊?OK。打開?OD ,按下 Ctrl + n ,輸入?killtimer,查找?KillTimer
,右鍵 -》?在每個參考上設置斷點
為什么要在?KillTimer?上設置斷點呢?通過觀察發現了,KillTimer?實現了類似C語言的?switch?case?的效果
點擊?cmp?eax, 3 ,在數據窗口可以看到?是從哪個位置跳轉過過來的,然后右鍵?轉到?上級調用地址,按這種方法直到回溯到程序的開頭
回溯到?程序頭,即switch?case ,然后加上斷點
在向上看程序,函數的開頭加個斷點:
重新載入程序,讓程序在函數開頭的位置斷下來,按?F8?單步調試,觀察?eax?的值的變化:
解釋:
所以就需要用到 內嵌補丁?來進行修補。什么是內嵌補丁,就是在程序中沒用的內存空間寫入補丁。因為程序在內存中都是需要內存對齊的,所以有些沒用的空間都是用 0?來填充進行對齊,可以在這些地方寫入補丁(這里寫入地址為 5E47D0):
快速定位技巧:設置書簽
記住位置或者設置書簽,復制被覆蓋的匯編代碼:
原來位置的修改:
跳轉到要寫入內嵌補丁的位置,開始寫入補丁:
?
粘貼被覆蓋的代碼,然后再跳轉到原來的位置:
保存修改,然后運行程序,發現程序一直死循環。說明程序還有問題,沖洗載入程序,單步調試,當程序運行到?cmp eax,4?時,更改?ZF?標志位,讓程序跳轉實現,然后繼續調試,發現當程序?執行?cmd eax,0B?時,程序正常。所以修改補丁位置?mov eax,4?位?mov eax, 0B
保存程序,然后運行程序,發現程序正常。
說明:當程序 mov?eax,4?時,驗證成功,但是驗證成功后還的?mov eax,0B?跳出循環,所以當?mov eax,4?時,雖然驗證成功,但是沒有跳出循環,所以一直跳出窗口。
?
?
?
總結
以上是生活随笔為你收集整理的小甲鱼 OllyDbg 教程系列 (十一) : inline patch ( 内嵌补丁 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王爽 汇编语言第三版 问题 7.9 将
- 下一篇: linux 之间 copy 传输文件方法