中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用IDAPython給Windows API下條件斷點

發布時間:2020-06-17 11:28:26 來源:網絡 閱讀:5087 作者:watertoeast 欄目:安全技術

問題描述:在逆向分析過程,經常需要跟蹤操作系統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利用IDAPython給Windows API下條件斷點

③在上圖的modules窗口中找到kernel32.dll,然后雙擊,在右側出現Module:kernel32.dll標簽窗口,如下圖所示
利用IDAPython給Windows API下條件斷點

④找到LoadLibraryA函數,然后雙擊,IDA View窗口將導航至LoadLibraryA函數處,點擊指定地址左側的小圓點,即可下斷點。下完斷點后如下圖所示
利用IDAPython給Windows API下條件斷點

⑤如果只在加載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函數下條件斷點的方法,讀者朋友們可根據各自需求進行靈活應用,進而實現復雜分析過程的自動化。希望對大家有幫助。

附件下載

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辛集市| 武山县| 若羌县| 安多县| 定边县| 肃南| 嘉荫县| 湖南省| 武城县| 樟树市| 蛟河市| 织金县| 石阡县| 揭东县| 米易县| 大安市| 北京市| 沅江市| 门头沟区| 温泉县| 佛坪县| 大丰市| 昌宁县| 阳曲县| 巴林左旗| 巩义市| 来安县| 峨眉山市| 邯郸县| 交口县| 长丰县| 海林市| 西藏| 临澧县| 瓦房店市| 松江区| 达尔| 永川市| 兰西县| 澄迈县| 全南县|