IDAPython基础教程4

给出的文件名为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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值