利用IDAPython給Windows API下條件斷點
一、通過界面操作給Windows API下斷點
1、操作過程
以給LoadLibraryA函數下斷點為例,程序ida01.exe(EXE文件)對應的源代碼如下:
#include "windows.h" int main() { LoadLibrary("E:\\Office10\\SAEXT.DLL"); LoadLibrary("E:\\document\\My Knowledge\\Update_x86\\WizTools.dll"); return 0; }
①用IDA打開EXE文件後,設置調試器在入口暫停。操作路徑:點擊Debugger→Debugger setup,選中Suspend on process entry point。
②按F9,運行EXE
③在上圖的modules窗口中找到kernel32.dll,然後雙擊,在右側出現Module:kernel32.dll標簽窗口,如下圖所示
④找到LoadLibraryA函數,然後雙擊,IDA View窗口將導航至LoadLibraryA函數處,點擊指定地址左側的小圓點,即可下斷點。下完斷點後如下圖所示
⑤如果只在加載SAEXT.DLL時中斷執行,那麽可以將斷點設置成條件斷點。具體方法:在Breakpoints窗口中右擊指定斷點,點擊Edit,然後在condition編輯框中輸入strstr(GetString(Dword(esp+4),-1, 0), "SAEXT.DLL") != -1
2、問題分析
①上述下斷點的過程,首先要確定API函數所在的DLL,而分析人員很難記住API函數與所在DLL的對應關系
②無法與自動化腳本想結合,整個過程都需要人工介入
二、IDAPython腳本實現Windows API條件斷點
1、思路
將所有Windows API與DLL的對應關系保存到文件,當用戶下斷點時,腳本自動查找API函數對應的DLL文件名。找到文件名後,利用文件名+函數名定位函數地址,然後下斷點並設置相關條件。
2、腳本代碼
由兩個文件組成,一個是IDAPython腳本break_api.py,一個是存放API函數和DLL對應關系的數據文件win_api.dat(可從附件下載)。兩個文件都放到了[IDA安裝目錄]\Python\script下,break_api.py腳本內容如下:
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文件後,設置調試器在入口暫停。操作路徑:點擊Debugger→Debugger setup,選中Suspend on process entry point。
②按F9,運行EXE
③alt+f7,導入break_api.py
④在Output window窗口,選擇Python腳本,然後調用BptAPI(‘LoadLibraryA‘),即可給LoadLibraryA函數設置條件斷點,具體條件和前面的界面操作一直,如果有其他需求,可對條件表達式進行修改。
三、小結
本文只是簡單給出使用IDAPython腳本給windows API函數下條件斷點的方法,讀者朋友們可根據各自需求進行靈活應用,進而實現復雜分析過程的自動化。希望對大家有幫助。
利用IDAPython給Windows API下條件斷點