小甲鱼 OllyDbg 教程系列 (十三) : 把代码和变量注入程序 以及 硬件断点
?
小甲魚 OllyDbg 視頻教程:https://www.bilibili.com/video/av6889190?p=21
程序下載地址:https://pan.baidu.com/s/1A4-BDgbdUgy-cmI4IMMzYw ? ?提取碼:jsdv
?
?
開始,按照慣例,首先用?PEiD?打開,看下是什么語言編寫的程序:
可以看到是?VC6.0 。載入程序,然后運行程序,當(dāng)出現(xiàn)?neg?窗口時,暫停程序,然后查看調(diào)用堆棧:
對應(yīng)代碼位置打上斷點:
重新載入程序,運行,發(fā)現(xiàn)程序斷點到斷點位置,按 F9?運行,neg?窗口出現(xiàn),等一會消失,發(fā)現(xiàn)程序運行到斷點位置的下一行,說明斷點位置正確,這個就是出現(xiàn)?neg?窗口的位置。
現(xiàn)在既然找到斷點位置,常規(guī)做法是?直接?nop?掉這個call?調(diào)用,現(xiàn)在可以 nop掉保存程序,然后運行,發(fā)現(xiàn)不是想要的結(jié)果,說明不能直接?nop。
再重新載入原來的程序,按?F9?發(fā)現(xiàn)程序的三個窗口都是通過這個?call?調(diào)用來顯示的,然后往上看,發(fā)現(xiàn)一個?je?跳轉(zhuǎn),這個可以控制 call?調(diào)用是不是顯示窗口,所以就相當(dāng)于一個?if else ,這里要顯示最后一個窗口?所以就相當(dāng)于等于 2?時跳轉(zhuǎn),
可以找一塊程序自身不用的內(nèi)存空間來寫入內(nèi)聯(lián)補丁。點擊?m ,查看程序的?PE?映射:
雙擊?data?段,進入?data?段,找到?jīng)]有使用位置,下一個硬件寫入斷點,測試要是用的位置在程序運行時有沒有使用,如果在程序運行?的時候使用的那個位置,就按上面方法再找一個位置。然后繼續(xù)測試,直到找到程序在運行時不會使用的位置:
下完?硬件寫入斷點后,重新載入程序,測試要寫入數(shù)據(jù)的位置是否可用(?也就是程序在運行的時候不會往這個位置寫入數(shù)據(jù)?),這個示例中程序不會寫入數(shù)據(jù),這個位置可用。
找到要寫入?內(nèi)聯(lián)補丁的位置:
在要寫入的位置添加書簽,方便通過 右鍵 ->?書簽?直接跳轉(zhuǎn):
在?je?位置添加書簽:
以前是通過手動跳來跳去直接改匯編代碼,現(xiàn)在可以通過插件?NonaWrite?來寫?內(nèi)聯(lián)補丁的 匯編代碼:
開始寫?內(nèi)聯(lián)補丁的匯編代碼:
完成后,內(nèi)聯(lián)匯編?代碼:
現(xiàn)在開始?改?je?跳轉(zhuǎn):
保存所有修改。然后運行修改后的程序,發(fā)現(xiàn)已經(jīng)成功,只有?第二個?neg?窗口:
原程序運行后有3?個?neg?窗口
至此,逆向成功。
可以載入修改后的程序,按?F8?單步調(diào)試追蹤修改后的程序執(zhí)行流程
?
?
?
總結(jié)
以上是生活随笔為你收集整理的小甲鱼 OllyDbg 教程系列 (十三) : 把代码和变量注入程序 以及 硬件断点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 中的 eval 函数
- 下一篇: Grafana 使用教程 --- 开源的