問題描述:在逆向分析過程,經(jīng)常需要跟蹤操作系統(tǒng)API的調(diào)用情況。使用IDA進(jìn)行調(diào)試的過程中,可以通過界面操作給指定API設(shè)置斷點。但是界面操作存在操作不便,不利于分析自動化等缺陷。使用IDAPython腳本實現(xiàn)給API函數(shù)下條件斷點,可有效解決上述問題。
目前創(chuàng)新互聯(lián)建站已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、景德鎮(zhèn)網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
一、通過界面操作給Windows API下斷點
1、操作過程
以給LoadLibraryA函數(shù)下斷點為例,程序ida01.exe(EXE文件)對應(yīng)的源代碼如下:
#include "windows.h"
int main()
{
LoadLibrary("E:\\Office10\\SAEXT.DLL");
LoadLibrary("E:\\document\\My Knowledge\\Update_x86\\WizTools.dll");
return 0;
}
①用IDA打開EXE文件后,設(shè)置調(diào)試器在入口暫停。操作路徑:點擊Debugger→Debugger setup,選中Suspend on process entry point。
②按F9,運行EXE
③在上圖的modules窗口中找到kernel32.dll,然后雙擊,在右側(cè)出現(xiàn)Module:kernel32.dll標(biāo)簽窗口,如下圖所示
④找到LoadLibraryA函數(shù),然后雙擊,IDA View窗口將導(dǎo)航至LoadLibraryA函數(shù)處,點擊指定地址左側(cè)的小圓點,即可下斷點。下完斷點后如下圖所示
⑤如果只在加載SAEXT.DLL時中斷執(zhí)行,那么可以將斷點設(shè)置成條件斷點。具體方法:在Breakpoints窗口中右擊指定斷點,點擊Edit,然后在condition編輯框中輸入strstr(GetString(Dword(esp+4),-1, 0), "SAEXT.DLL") != -1
。需要說明的是,此編輯框中必須是IDC腳本表達(dá)式,不能使用IDAPython腳本。表達(dá)式中Dword(esp+4)是獲取第一個參數(shù)值,在此例中就是文件路徑的指針,GetString(Dword(esp+4))是獲取路徑,strstr則進(jìn)行搜索,如果路徑中包含SAEXT.DLL為真,斷點才有效。
2、問題分析
①上述下斷點的過程,首先要確定API函數(shù)所在的DLL,而分析人員很難記住API函數(shù)與所在DLL的對應(yīng)關(guān)系
②無法與自動化腳本想結(jié)合,整個過程都需要人工介入
二、IDAPython腳本實現(xiàn)Windows API條件斷點
1、思路
將所有Windows API與DLL的對應(yīng)關(guān)系保存到文件,當(dāng)用戶下斷點時,腳本自動查找API函數(shù)對應(yīng)的DLL文件名。找到文件名后,利用文件名+函數(shù)名定位函數(shù)地址,然后下斷點并設(shè)置相關(guān)條件。
2、腳本代碼
由兩個文件組成,一個是IDAPython腳本break_api.py,一個是存放API函數(shù)和DLL對應(yīng)關(guān)系的數(shù)據(jù)文件win_api.dat(可從附件下載)。兩個文件都放到了[IDA安裝目錄]\Python\script下,break_api.py腳本內(nèi)容如下:
def GetApiModule(api_name):
try:
path = GetIdaDirectory()
path = path + '\\python\\script\\win_api.dat'
f = open(path, 'r')
strall = f.read()
f.close()
except IOError:
Message('Can\'t open win_api.dat.')
return 'none'
pos = strall.find(api_name)
if (-1 == pos):
Message('Can\'t find the api.')
return 'none'
beg = strall.rfind('<', 0, pos)+1
end = strall.find('>', beg)
return strall[beg:end]
def BptAPI(api_name):
dll_name = GetApiModule(api_name)
if dll_name == 'none':
Message('API err.')
return
name = dll_name[0:len(dll_name)-4] + '_' + api_name
ea = LocByName(name)
AddBpt(ea)
SetBptCnd(ea, 'strstr(GetString(Dword(esp+4),-1, 0), "SAEXT.DLL") != -1')
代碼很簡單,不做多余的解釋。
3、腳本使用方法
①用IDA打開EXE文件后,設(shè)置調(diào)試器在入口暫停。操作路徑:點擊Debugger→Debugger setup,選中Suspend on process entry point。
②按F9,運行EXE
③alt+f7,導(dǎo)入break_api.py
④在Output window窗口,選擇Python腳本,然后調(diào)用BptAPI('LoadLibraryA'),即可給LoadLibraryA函數(shù)設(shè)置條件斷點,具體條件和前面的界面操作一致,如果有其他需求,可對條件表達(dá)式進(jìn)行修改。
三、小結(jié)
本文只是簡單給出使用IDAPython腳本給windows API函數(shù)下條件斷點的方法,讀者朋友們可根據(jù)各自需求進(jìn)行靈活應(yīng)用,進(jìn)而實現(xiàn)復(fù)雜分析過程的自動化。希望對大家有幫助。
附件下載
名稱欄目:利用IDAPython給WindowsAPI下條件斷點
網(wǎng)頁路徑:http://muchs.cn/article14/jsopge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站收錄、虛擬主機、網(wǎng)站建設(shè)、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)