逆向實戰第一講,尋找OllyDbg調試工具的Bug並修復


           逆向實戰第一講,尋找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看看插件是否加載

正常加載沒有問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM