小甲魚 OllyDbg 教程系列 (十一) : inline patch ( 內(nèi)嵌補丁 )
小甲魚 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 “內(nèi)嵌補丁” 指在程序文件中把補丁代碼寫入文件里面達(dá)到 PJ 的目的。
例:
原程序:??mov eax, dword ptr [ebp+8]????3個字節(jié)
想改為:??mov eax, 4????????????????????5個字節(jié)
若如此修改,會產(chǎn)生溢出,覆蓋了下面的指令
所以要采用內(nèi)嵌補丁的方式:
1. 找程序的空白區(qū)間,寫入自己需要的指令(mov eax, 4),以及會被覆蓋的指令
2.將原來的指令(mov eax, dword ptr [ebp+8])改為 jmp XXXXXX(補丁的地址)(這個操作也會覆蓋后面的內(nèi)容)
3.在補丁最后加上 jmp XXXXXXX(原程序后面的內(nèi)容的地址),跳出補丁,返回主程序
?
?
開始
?
首先用?PEiD?查看,可以看到是?VC6.0?寫的程序:

然后用?OD?載入程序,按?F9?運行,程序運行,然后隨便輸入注冊:

發(fā)現(xiàn)程序界面沒什么反應(yīng),現(xiàn)在輸入注冊碼,不要點擊?OK。打開?OD ,按下 Ctrl + n ,輸入?killtimer,查找?KillTimer
,右鍵 -》?在每個參考上設(shè)置斷點

為什么要在?KillTimer?上設(shè)置斷點呢?通過觀察發(fā)現(xiàn)了,KillTimer?實現(xiàn)了類似C語言的?switch?case?的效果



點擊?cmp?eax, 3 ,在數(shù)據(jù)窗口可以看到?是從哪個位置跳轉(zhuǎn)過過來的,然后右鍵?轉(zhuǎn)到?上級調(diào)用地址,按這種方法直到回溯到程序的開頭

回溯到?程序頭,即switch?case ,然后加上斷點

在向上看程序,函數(shù)的開頭加個斷點:

重新載入程序,讓程序在函數(shù)開頭的位置斷下來,按?F8?單步調(diào)試,觀察?eax?的值的變化:

解釋:

所以就需要用到 內(nèi)嵌補丁?來進(jìn)行修補。什么是內(nèi)嵌補丁,就是在程序中沒用的內(nèi)存空間寫入補丁。因為程序在內(nèi)存中都是需要內(nèi)存對齊的,所以有些沒用的空間都是用 0?來填充進(jìn)行對齊,可以在這些地方寫入補?。ㄟ@里寫入地址為 5E47D0):

快速定位技巧:設(shè)置書簽

記住位置或者設(shè)置書簽,復(fù)制被覆蓋的匯編代碼:


原來位置的修改:

跳轉(zhuǎn)到要寫入內(nèi)嵌補丁的位置,開始寫入補?。?/p>
?
粘貼被覆蓋的代碼,然后再跳轉(zhuǎn)到原來的位置:

保存修改,然后運行程序,發(fā)現(xiàn)程序一直死循環(huán)。說明程序還有問題,沖洗載入程序,單步調(diào)試,當(dāng)程序運行到?cmp eax,4?時,更改?ZF?標(biāo)志位,讓程序跳轉(zhuǎn)實現(xiàn),然后繼續(xù)調(diào)試,發(fā)現(xiàn)當(dāng)程序?執(zhí)行?cmd eax,0B?時,程序正常。所以修改補丁位置?mov eax,4?位?mov eax, 0B

保存程序,然后運行程序,發(fā)現(xiàn)程序正常。

說明:當(dāng)程序 mov?eax,4?時,驗證成功,但是驗證成功后還的?mov eax,0B?跳出循環(huán),所以當(dāng)?mov eax,4?時,雖然驗證成功,但是沒有跳出循環(huán),所以一直跳出窗口。
鏈接:https://www.dianjilingqu.com/496841.html