利用IDAPython給Windows API下條件斷點

來源:互聯網
上載者:User

標籤:IDA   IDAPython   斷點   調試   

問題描述:在逆向分析過程,經常需要跟蹤作業系統API的調用情況。使用IDA進行調試的過程中,可以通過介面操作給指定API設定斷點。但是介面操作存在操作不便,不利於分析自動化等缺陷。使用IDAPython指令碼實現給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。需要說明的是,此編輯框中必須是IDC指令碼運算式,不能使用IDAPython指令碼。運算式中Dword(esp+4)是擷取第一個參數值,在此例中就是檔案路徑的指標,GetString(Dword(esp+4))是擷取路徑,strstr則進行搜尋,如果路徑中包含SAEXT.DLL為真,斷點才有效。

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下條件斷點

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.