问题描述:在逆向分析过程,经常需要跟踪操作系统API的调用情况。使用IDA进行调试的过程中,可以通过界面操作给指定API设置断点。但是界面操作存在操作不便,不利于分析自动化等缺陷。使用IDAPython脚本实现给API函数下条件断点,可有效解决上述问题。
成都创新互联致力于互联网网站建设与网站营销,提供成都网站制作、网站设计、网站开发、seo优化、网站排名、互联网营销、微信小程序、公众号商城、等建站开发,成都创新互联网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。一、通过界面操作给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函数下条件断点的方法,读者朋友们可根据各自需求进行灵活应用,进而实现复杂分析过程的自动化。希望对大家有帮助。
附件下载
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。