没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
idapython 主要依赖的的包由以下三部分组成:
idc
idautils
idaapi
一些基础的函数
位置相关函数(用于获取光标,或特殊数据的地址)
idc.ScreenEA() or here()返回当前光标位置
MinEA() 返回 idb 的起始地址
MaxEA() 返回 idb 的结束地址
hex(MinEA()) 将起始地址以 16 进制输出,如下所示:
idc.SegName(ea) 获取 ea 地址的段,比如 text
idc.GetDisasm(ea) 获取 ea 地址的反汇编指令
ida.GetMnem(ea) 获取 ea 地址的反汇编指令操作码
ida.GetOpnd(ea,n) 获取 ea 地址的反汇编指令的第 n 个操作数,由 0 开始,
实例如下:
有时需要用于判断一个地址是否无效,可通过 idaapi.BADADDR 实现,该函数返
回一个内置的无效地址,具体使用如下:
if idaapi.BADADDR != here():
print " vaild addr"
节
idapython 的强大之处在于对 idb 数据库的循环迭代,其中包括指令,交叉
引用等,这些会在下文中提到,反编译文件的数据节迭代会是一个不错的开始,
代码如下所示:
import idautils
for seg in idautils.Segments():
print idc.SegName(seg),idc.SegStart(seg),idc.SegEnd(seg)
idautils.Segments()函数返回该反编译文件中所有的节信息,托 python
的福,这里我们可以非常方便的直接对这些节信息进行循环迭代,每一次迭代会
对一个节进行处理。
每层迭代中使用到以下函数
idc.SegName(seg) 获取节名
idc.SegStart(seg)获取该节的开始
idc.SegEnd(seg)获取该节的结束
通过函数 idc.NextSeg(ea)可以获取下一个节,参数为当前节地址范围内任
意地址皆可。
函数
继数据节之后我们下一个目标是函数。
import idautils
for func in idautils.Functions():
print hex(func),idc.GetFunctionName(func)
idautils.Functions()会返回一个所有函数的起始地址列表,该函数也支持
区域查找,通过给函数传入起始和终止地址,可以控制搜寻的范围。
如 idautils.Functions(start_addr,end_addr),idc.GetFunctionName(ea)
返回一个函数名,ea 可以为该函数中的任意二进制地址。
通过函数 idaapi.get_func(ea),获取一个 idaapi.func_t 的类,该类定义
了函数的一些属性,如下脚本所示,通过该返回的数据结构获取该函数的边界值。
import idautils
ea = idc.ScreenEA()
print ea
func = idaapi.get_func(ea)
print type(func)
print "Start:0x%x,End:0x%x" %(func.startEA,func.endEA)
idaapi.get_func(ea)会返回一个函数类对象,通过命令 dir(class)可以
查看该类的导出函数和属性。
通过 idc.NextFunciton(ea)和 idc.PrevFunction(ea)分别可以获取当前地
址前后的两个函数的地址,传入的 ea 参数为当前函数区间的所有合法地址。
import idautils
ea = idc.ScreenEA()
print ea
next = idc.NextFunction(ea)
pre = idc.PrevFunction(ea)
print "the next is 0x%x,the pre is 0x%x" %(next,pre)
idapython 提过了多种获取数据信息的方式,另一种获取函数边界值的方式
可以通过以下两个函数。
通过函数 idc.GetFunctionAttr(ea,FUNCATTR_START),
idc.GetFunctionAttr(ea,FUNCATTR_END)。获取地址 ea 所在函数的开始和结尾。
通过函数 idc.GetDisasm(ea)获取当前地址的反汇编代码。
通过函数 idc.NextHead(ea)获取当前地址之后下一条指令的起始地址。
但是有时候当一个函数中存在一个大跳时,通过以上两种方式获取的函数边
界值就会出现问题,这个时候最好的方式是通过函数 idautils.FuncItems(ea)
实现该功能,具体的使用会在后文中提到。
import idautils
ea = idc.ScreenEA()
print ea
start = idc.GetFunctionAttr(ea,FUNCATTR_START)
end = idc.GetFunctionAttr(ea,FUNCATTR_END)
cur_addr = start
while cur_addr < end:
print hex(cur_addr),idc.GetDisasm(cur_addr)
cur_addr = idc.NextHead(cur_addr,end)
类似于 idc.GetFunctionAttr(ea, attr),idc.GetFuntionAttr(ea)也是
用于获取函数的一些信息。
通过函数 idc.GetFuntionAttr(ea)返回该函数的类型,idapython 中一共提
供了 9 类函数类型的标签。
可通过下列脚本列举函数标签,
import idautils
ea = idc.ScreenEA()
print ea
for func in idautils.Functions():
flags = idc.GetFunctionFlags(func)
if flags & FUNC_NORET:
print hex(func),"FUNC_NORET"
if flags & FUNC_FAR:
print hex(func), "FUNC_FAR"
if flags & FUNC_LIB:
print hex(func), "FUNC_LIB"
if flags & FUNC_STATIC:
print hex(func), "FUNC_STATIC"
if flags & FUNC_FRAME:
print hex(func), "FUNC_FRAME"
if flags & FUNC_USERFAR:
print hex(func), "FUNC_USERFAR"
if flags & FUNC_HIDDEN:
print hex(func), "FUNC_HIDDEN"
if flags & FUNC_THUNK:
print hex(func), "FUNC_THUNK"
if flags & FUNC_LIB:
print hex(func), "FUNC_BOTTOMBP"
通过 idautils.Functions()获取所有函数的地址列表,通过
idc.GetFunctionGFlage(func)获取函数的 flag,通过 flags&来判断函数的类型。
所有函数的类型如下所述:
FUNC_NORET
标示没有返回值的函数,内部用 1 标示。
FUNC_FAR
该标识的函数很少使用除非被逆向的软件中包含内存节,内部用 2 标示
剩余55页未读,继续阅读
资源评论
- qq_382343822017-04-08很有帮助,谢谢
- qq_325018032018-07-18有用,谢谢
- kunman50682018-03-30很有帮助,谢谢
- daviduniverse2017-10-27very good dude
绝不原创的飞龙
- 粉丝: 1w+
- 资源: 1091
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功