IDAPython基础教程一

IDAPython入门教程
本文详细介绍了IDAPython的基本用法,包括如何在IDA Pro中使用IDAPython进行自动化分析,以及如何通过IDAPython遍历和分析程序的段、函数和指令。适合初学者快速掌握IDAPython的基础知识。

给出的文件名为rabbithole
在这里插入图片描述
首先使用file命令查看一下
在这里插入图片描述
可以看到是64位的可执行文件
接下来我们切换到win,使用IDApro载入,以此文件为样例,学习IDAPython的用法。
首先介绍下IDAPython的背景。
IDAPython创建于2004年。这是GergelyErdelyi和Ero Carrera的共同努力。他们的目标是结合强大的python与自动化分析的IDA的类C脚本语言IDC。IDAPython由三个独立模块组成。第一个是idc,它是封装IDA的IDC函数的兼容性模块。第二个模块是idautils,这是IDA里的一个高级实用功能模块。第三个模块是idaapi,它允许访问更加底层的数据。
那么怎么使用呢?
直接在IDA里调用的话有两种办法:
第一种:
在IDA上方的菜单File->script command
在这里插入图片描述上图中右边用于输入脚本代码,下方是切换IDA和IDAPython,我们需要切换为IDAPython,如下所示
在这里插入图片描述然后输入打印hello的代码,点击run此时在IDA界面最下方就可以看到打印的消息了
在这里插入图片描述当然这个窗口我们使可以所以移动、放大缩小的
为了后面分析方便,我们都排布成这个格式
在这里插入图片描述第二种运行IDAPython的办法就是直接在输出窗口处输入,如下所示
在这里插入图片描述输入后敲击回车即可运行
在接下来的实验过程中,我们会不时地交替使用这两种方式
接下来将rabbithole载入到IDAPro
将光标定位到check_value函数,然后开始进行我们的学习
在这里插入图片描述在深入探索之前,我们需要知道,在使用IDA的函数中最常见被传递的变量是地址。比如这条反汇编的例子

在这里插入图片描述.text是section的名称,其地址是0x00012529,为16进制的格式,后面是其指令。在IDAPython的文档中,地址被记作ea。

获取当前地址有几种不同的方式。最常见的方式是使用idc.ScreenEA()函数或者here()函数,这将返回一个Interger值,如下所示。
在这里插入图片描述在这里插入图片描述如果想获取当前IDB中的最小地址和最大地址可以分别使用MinEA()和MaxEA()
在这里插入图片描述在IDA的反汇编窗口中,每一个能够被描述的元素我们都能使用IDAPython来获取,比如以下的例子
在这里插入图片描述在上图中我们使用idc.SegName(ea)获取当前地址所在的段(segment)名称,利用idc.GetDisasm(ea)来获取当前地址的反汇编语句,利用idc.GetMnem(ea)获取当前反汇编语句的操作符,利用idc.GetOpnd获取操作数,由于定位在check_value,所以打印的是check_value

有时候如果要确认一个地址是否在当前的程序中,可以使用idaapi.BADADDR或者BADADDR来确认该地址
在这里插入图片描述如上图我们首先打印出不存在的地址,然后将其与当前地址比较,如果不等则输出valid addr

打印一行数据好像用途不大,可是别忘了IDAPython结合了python,我们可以用其遍历所有的指令,所有的交叉引用地址,还能搜索所有的代码和数据。我们以遍历所有端的指令为例。
代码如下

import idautils
for seg in idautils.Segments():
print idc.SegName(seg),idc.SegStart(seg),idc.SegEnd(seg)

在这里插入图片描述点击run之后运行结果如图
在这里插入图片描述在上面的代码中idautils.Segments()返回一个可迭代的对象数组,包含的元素是每个段的起始地址。通过这个起始地址我们可以获取段的名称(idc.SegName(ea)),段的起始地址idc.SegStart(ea),段的结束地址(idc.SegEnd(ea).

如果想获取当前地址所在段的下一个段的起始地址可以使用idc.NextSeg(ea)
在这里插入图片描述我们已经知道如何遍历所有段了,那么如何遍历所有段中的所有函数呢?先来看看代码:
在这里插入图片描述运行结果如下

在这里插入图片描述来解释下代码:
Idautils.Functions()会返回一个保存着一直函数首地址的数组,idautils.Functions()也可以指定要查找的函数的起始地址和结束地址,格式为idautils.Funcitons(start_addr,end_addr).通过idc.GetFunctionName(ea)可以通过某个地址获取函数的名称。Ea这个参数可以是处于任何函数中的地址。

刚才提到函数的起始和结束地址(即函数的边界地址),我们可以通过idaapi.get_func(ea)来获取到
在这里插入图片描述结果如下
在这里插入图片描述Idaapi.getfunc(ea)返回一个idaapi.func_t的类给我们,在不清楚这个类能够干什么时,可以使用dir(class)函数来获取这个类的属性看看有哪些可以使用
在这里插入图片描述从输出中我们可以看到startEA,endEA是用于获取起始地址和结束地址的。上面的这些属性只适用于当前的函数。

我们可以使用idc.NextFunciton(ea)和idc.PrevFunction(ea)来获取当前函数的前一个或后一个函数。ea的值需要在被分析的函数地址之内。
在这里插入图片描述结果如下
在这里插入图片描述

### 使用 IDA Python 编写插件脚本 #### 插件开发环境准备 为了编写和调试 IDA Pro 的 Python 脚本,需先安装好 IDAPython插件。该工具集成了Python 解释器到IDA环境中,允许访问Python的数据处理能力以及所有可用的Python库[^1]。 对于不同版本的支持情况,当前IDAPython兼容从IDA 6.6至IDA 7.4之间的多个版本[^2]。这意味着开发者可以根据所使用的IDA具体版本来决定是否能够顺利集成并利用此强大的扩展功能。 #### 创建简单的插件脚本实例 下面给出段基础代码作为入门例子: ```python import idaapi class MyPlugin(idaapi.plugin_t): flags = idaapi.PLUGIN_KEEP comment = "这是个简单插件" help = "显示条消息框" wanted_name = "My First Plugin" wanted_hotkey = "" def init(self): print("初始化插件") return idaapi PLUGIN_OK def run(self, arg): ida_kernwin.warning("欢迎来到我的第个IDA Python插件!") def term(self): print("终止插件") def PLUGIN_ENTRY(): return MyPlugin() ``` 上述代码定义了个名为 `MyPlugin` 的类继承自 `idaapi.plugin_t` 类型,并实现了三个主要方法:`init()`用于初始化操作;`run(arg)`负责执行核心逻辑;而`term()`则是在卸载时调用以清理资源。最后通过函数`PLUGIN_ENTRY()`返回新创建的对象给IDA加载器。 当这个脚本被成功加载之后,每当启动IDA都会自动触发次警告对话框展示预设的消息字符串。 #### 获取更多学习资料 除了官方文档外,还有专门针对该项目编写的教程可供查阅,这些材料有助于深入了解 IDAPython 的目录结构及其内部工作原理等内容[^3]。此外,网络上也有不少实战案例分享,比如有文章介绍了如何借助 MoeCTF 挑战赛中的题目实践逆向工程技巧,从中也能学到很多实用的知识点[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值