利用IDAPython给WindowsAPI下条件断点
问题描述:在逆向分析过程,经常需要跟踪操作系统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给WindowsAPI下条件断点
文章位置:http://scjbc.cn/article/jsopge.html