设为首页 收藏本站
查看: 999|回复: 0

[经验分享] 利用IDAPython给Windows API下条件断点

[复制链接]

尚未签到

发表于 2018-6-14 13:54:55 | 显示全部楼层 |阅读模式
  问题描述:在逆向分析过程,经常需要跟踪操作系统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 DSC0000.jpg
  ③在上图的modules窗口中找到kernel32.dll,然后双击,在右侧出现Module:kernel32.dll标签窗口,如下图所示
DSC0001.jpg

  ④找到LoadLibraryA函数,然后双击,IDA View窗口将导航至LoadLibraryA函数处,点击指定地址左侧的小圆点,即可下断点。下完断点后如下图所示
DSC0002.jpg

  ⑤如果只在加载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函数下条件断点的方法,读者朋友们可根据各自需求进行灵活应用,进而实现复杂分析过程的自动化。希望对大家有帮助。
  附件下载

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-523832-1-1.html 上篇帖子: Windows常用知识总结 下篇帖子: windows共享文件分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表