逆向實戰第一講,尋找OllyDbg調試工具的Bug並修復
首先我們要知道這個OD的Bug是什么. 我們調試一個UNICODE的窗口,看下其窗口過程.
一丶查看OllyDbg 的Bug
1.1spy++查看窗口,確定是一個Unicode窗口
2.使用Olly附加
使用Od附加之后,點擊窗口,發現獲取的值是錯誤的.所以判斷Od的Bug是針對Unicode窗口,調用了Asi版本的API
3.解決思路
此時我們解決的時候,要Od調Od了. 而出現這個Bug的原因可能是API調用失敗,我們發現,它在調用獲得類的回調的時候出現錯誤
所以可以快速定位這個API
GetClassLongA
GetClassLongW
4.定位此位置發先是否是調用錯誤
此時我們Od調OD,然后定位此API下斷點,看看是否調用錯誤
發先確實是調用A版本的.所以出現錯誤.
二丶解決OD Bug的兩種方式
1.1 API HOOK的方式
首先我們執行到返回,在次API上面我們下HOOK 鈎子,跳轉到我們的代碼執行,然后判斷其是否是Unicode窗口還是 Asi窗口,根據不同我們調用不同的函數返回即可.
此方法雖然可以解決但是有點麻煩.所以不采用
1.2 Dll劫持的方式
這個方法可以有效的劫持DLL,然后執行我們的代碼
我們可以劫持一下這個DLL
首先我們找到我們的劫持工具
選擇它的DLL,然后選擇轉發函數,而后會生成一個CPP,此時我們只需要寫一個DLL,這個DLL的CPP就是這個,和原DLL名字一樣
原DLL名字改為 DBGHELPOrg即可.
在代碼里面寫入我們的代碼
1.首先在我們的轉發里面定義函數
里面寫上我們的代碼
2. 在程序加載的時候,啟動我們的代碼
這里的啟動會在load里面啟動,所以在load里面寫代碼就可以了.
思路:
思路:
定位Call調用GetClasslongA的地方,跟進去之后會看到轉發的IAT表,把里面的內容改為我們的就可以了.
我們剛才已經定位到了調用GetClassLongA的地方,那么此時我們 F7 進去可以看到轉發
我們可以看到IAT表格的位置是 0050D858 ,那么把里面的地址改為我們的地址就可以了
步驟:
1.定義一個指針指向IAT表格
2.修改內存保護屬性
3.把IAT表格里面的內容變成我們的函數地址
4.還原內存保護屬性.
主要是中間一不,修改IAT表中的地址為我們的地址
現在我們試一試看看是否成功
成功獲取.
2.插件修改
對於上面來說有點基礎的,細心的應該可以明白,做了這一切其實簡單的就是
1. 尋找API位置
2. 跳轉的地方下改為我們的函數地址
3.我們的函數地址判斷執行.
但是上面說起來還是比較麻煩,我們自己寫一個OllyDbg的插件解決這個Bug吧.
首先使我們的插件,
開發插件所必須有的2個導出函數
ODBG_Plugindata 這個函數里面是給插件名稱的所以我們需要
ODBG_Plugininit 這個函數是Od啟動的時候調用的.(初始化數據)
當然肯定會有釋放的,這里不寫了.
寫插件第一步
建立一個DLL 工程,添加插件自帶的頭文件
第二步,實現插件的接口
第三步,拷貝我們以前的代碼讓插件初始化的時候去工作
遇到的問題:
如果提示這個問題,那么編譯選項中,鏈接的時候假如這個 /j即可.
啟動OD看看插件是否加載
正常加載沒有問題