利用IDAPython给Windows API下条件断点

问题描述:在逆向分析过程,经常需要跟踪操作系统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函数下条件断点的方法,读者朋友们可根据各自需求进行灵活应用,进而实现复杂分析过程的自动化。希望对大家有帮助。

原文地址:http://blog.51cto.com/watertoeast/2084700

时间: 2024-07-30 13:49:37

利用IDAPython给Windows API下条件断点的相关文章

Delphi Windows API判断文件共享锁定状态

一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定数据是否可读或可写,从而为开发出健壮的程序提供切实依据.   同样,在Windows中,文件可以共享模式打开,它也涉及到锁的操作问题.根据Windows中文件共享时加锁范围的大小,锁可分为全局锁和局部锁:全局锁以锁定文件全部内容为特征,而局部锁以锁定文件的局部内容为特征,且文件的锁定区域不可重复.根

Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

使用windows API函数获取目录下所有文件名---目录下文件的扫描和处理

直接上代码 // test_max.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include <Shlwapi.h> #include <iostream> #include <string> #include <vector> #pragma comment(lib,"shlwapi.lib") //注意放置的位置

利用cygwin创建windows下的crontab定时任务

要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Cygwin-1.7.35 下载地址 环境下载 什么是Cygwin Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购).它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系

Windows环境下利用github快速配置git环境

在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的windows客户端:https://windows.github.com/ 下载完安装后其实就搞定了一大半了.接下来我们把: C:\Users\[你的用户名]\AppData\Local\GitHub\PortableGit_c2ba306e一大串数字\bin C:\Users\[你的用户名]\AppD

【Android】利用adt-bundle在Windows下轻松搭建Android开发环境与Hello world

Android开发环境有三种方式,分别是JDK+SDK+Eclipse+ADT.JDK+adt-bundle与JDK+Android Studio. 不要使用JDK+SDK+Eclipse+ADT这种方式,不是说什么太复杂的,是因为郭嘉的网络你懂的,打开SDK工具之后就根本就下载不了.Android Studio也是不行的,说好集合大量打开环境.安装的时候却还是需要联网. 建议使用JDK+adt-bundle这种方式来搭建Android开发环境.同时adt-bundle认准20131030版本.

Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统上WinRAR或者好压软件一样的存在. 7-Zip软件下载与安装 网上下载相关安装包并完成安装,找到安装目录,复制7z.dll文件到D盘. .bat文件的制作 通过7-Zip软件使用手册了解到,通过动态命令行调用7z.dll可以把文件压缩成.tar.gz格式的,实际上是先将文件压缩成.tar格式的文

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

C#调用windows API的一些方法

使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2.  调用 COM 对象上的接口方法 我主要讨论从dll中导出函数,基本步骤如下: 1.使用 C# 关键字 static 和 extern 声明方法. 2.将 DllImport 属性附加到该方法.DllImport 属性允许您指定包含该方法的 DLL 的名称. 3.如果需要,为方法的参数和返回值指定