IDAPython基础教程4

本文详细介绍了如何使用IDAPython进行代码搜索,包括字节序列、字符串和数值的查找,以及如何判断地址类型,适用于逆向工程和恶意软件分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出的文件名为rabbithole
在这里插入图片描述
首先使用file命令查看一下
在这里插入图片描述
可以看到是64位的可执行文件
接下来我们切换到win,使用IDApro,以此文件为样例,学习IDAPython的用法。
通过前面的学习我们已经能够通过遍历所有已知的函数及其指令来达到一种基本的搜索效果,这当然很有用,不过有时候我们需要搜索一些特定的字节,比如0x48 0xff 0xc2,这3个字节代表的汇编代码为inc rdx
在这里插入图片描述
我们可以选中该指令后右键-》synchronized with->hex view 1,可以看到对应的字节
在这里插入图片描述
我们可以使用idc.FindBinary(ea,flag,searcstr,radix=16)来进行字节或者二进制的搜索,flag代表搜索方向或条件,常用的包括:
SEARCH_UP,SEARCH_DOWN 用来指明搜索方向
SEARCH_NEXT 用来获取下一个已经找到的对象
SEARCH_CASE用来指明是否区分大小写
SEARCH_NOSHOW 用来指明是否显示搜索的进度
SEARCH_UNICODE用于将所有搜索字符串视为Unicode
Searchstr是我们要查找的形态,radix参数在写处理器模块时使用,一般用不到,留空即可
接下来看看如何搜索前面提到的那几个字节,其实在这里我用两个字节就可以精确查找了
import idautils
pattern =‘48 ff’
addr = MinEA()
for x in range(0,5):
addr = idc.FindBinary(addr,SEARCH_DOWN,pattern)
if addr != idc.BADADDR:
print hex(addr),idc.GetDisasm(addr)
在这里插入图片描述首先是将pattern置为对应的字节,然后使用MinEA()获取可执行文件的最开始的地址,然后将idc.FindBinary的返回结果设置为addr变量。拿到结果后,我们首先将其与idc.BADADDR进行比较,然后打印出该地址和该地址的反汇编结果。

通过字节序列来搜索确实很有用,可是有时候我们要查找“check_value”这种字符串呢?我们可以使用FindText(ea,flag,y,x,searcher),ea是地址,flag是搜索方向和搜索类型,y是从ea开始搜索的行数,x是行中的坐标,这两个参数一般置0,现在我们来尝试查找check_value
import idautils
pattern = “check_value”
cur_addr =MinEA()
end = MaxEA()
while cur_addr < end:
cur_addr = idc.FindText(cur_addr,SEARCH_DOWN,0,0,pattern)
if cur_addr == idc.BADADDR:
break
else:
print hex(cur_addr),idc.GetDisasm(cur_addr)
cur_addr = idc.NextHead(cur_addr)
在这里插入图片描述代码中cur_addr标记当前地址,end标记搜寻idb的结束地址,通过函数FindText进行搜索。我们在最后一行cur_addr = idc.NextHead(cur_addr)将每次操作的当前地址更新为下一行地址。这样就可以搜索出全部的check_value.

现在我们知道可以搜索各种类型的地址,那么我们在使用前就需要确定地址是什么类型的,IDAPython已经提供了这组方法,返回的结果是布尔类型,包括:
Idc.isCode(f):如果该地址为代码则返回True
Idc.isData(f):如果为数据返回true
Idc.idUnknown(f):无法鉴别是数据还是代码则返回true
Idc.isHead(f):如果为函数开头则返回true
Idc.isTail(f):如果为函数结尾则返回true
需要注意,这一系列函数是不能直接传递地址的,需要通过GetFlags(ea)对地址进行转换
我们将光标定位到inc上,代码如下
import idautils
ea = idc.ScreenEA()
print hex(ea),idc.GetDisasm(ea)
print idc.isCode(idc.GetFlags(ea))
在这里插入图片描述返回为true,用的是isCode,所以说明这是该地址是代码

我们可以通过idc.FindCode(ea,flag)获取下一个代码指令的地址,比如当我们需要获取某一块数据的结尾时,如果当前的ea是代码地址,idc.FindCode将会返回下一个代码指令的地址。
代码如下
import idautils
ea = idc.ScreenEA()
print hex(ea),idc.GetDisasm(ea)
addr = idc.FindCode(ea,SEARCH_DOWN|SEARCH_NEXT)
print hex(addr),idc.GetDisasm(addr)
在这里插入图片描述0x56218是某个数据的地址,我们将idc.FindCode(ea,SEARCH_DOWN|SEARCH_NEXT)的返回值赋给addr,然后打印出该地址和它的反汇编代码。

我们可以通过idc.FindData(ea,flag)获取下一个数据块类型地址的起始。在之前脚本中将FindCode换成这个函数就行了。
import idautils
ea = idc.ScreenEA()
print hex(ea),idc.GetDisasm(ea)
addr = idc.FindData(ea,SEARCH_DOWN|SEARCH_NEXT)
print hex(addr),idc.GetDisasm(addr)
在这里插入图片描述如果我们需要按照某一数值进行搜索的话则可以使用
FindImmediate(ea,flag,value),我们以0a为例,搜寻所有带0a的地址
下面的代码中没有用到新的函数,就不再解释了
import idautils
addr = MinEA()
while True:
addr,operand = idc.FindImmediate(addr,SEARCH_DOWN|SEARCH_NEXT,0x0A)
if addr != BADADDR:
print hex(addr),idc.GetDisasm(addr),“Operand”,operand
else:
break

在这里插入图片描述

### 使用 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值