java 单机接口限流处理方案
439
2022-10-11
利用IDAPython给Windows API下条件断点(id函数python)
问题描述:在逆向分析过程,经常需要跟踪操作系统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; }
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、脚本使用方法
②按F9,运行EXE
③alt+f7,导入break_api.py
④在Output window窗口,选择Python脚本,然后调用BptAPI('LoadLibraryA'),即可给LoadLibraryA函数设置条件断点,具体条件和前面的界面操作一致,如果有其他需求,可对条件表达式进行修改。
三、小结
本文只是简单给出使用IDAPython脚本给windows API函数下条件断点的方法,读者朋友们可根据各自需求进行灵活应用,进而实现复杂分析过程的自动化。希望对大家有帮助。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~