IDAPython基础教程5
给出的⽂件名为rabbithole
⾸先使⽤file命令查看⼀下
vmware虚拟机linux使用教程可以看到是64位的可执⾏⽂件
接下来我们切换到win,使⽤IDApro,以此⽂件为样例,学习IDAPython的⽤法。
不是所有时候我们都需要写⼀段代码来实现⾃动化的代码或者数据的查,在有些情况下我们已经知道了⽬标代码或数据的位置,我们仅仅获取指定区域的代码,这时候可以使⽤idc.SelStart()和idc.SelEnd()
⽐如我们选中如下的范围
使⽤以下脚本获取所选区域地址
import idautils
start = idc.SelStart()
print hex(start)
end = idc.SelEnd()
print hex(end)
脚本中start为所选区域的起始地址,end被赋值为该区域结束地址的下⼀条地址。当然还有个更专业的函数ad_selection(),该函数返回⼀个3元组,元组的第⼀个参数为布尔值,标记所选区域是否可读,第⼆和第三个参数为所选区域的起始和结束地址。
上图是同⼀个区域使⽤ad_selection返回的结果
我们在使⽤IDA时常会添加注释,注释有助于理解代码的结构和功能。
⽐如⼀条简单的异或xor置零指令:xor eax eax,相当于就是给eax置0
我们以这个为例,实现⼀个简单的功能,就是⾃动给这种指令添加注释
添加的注释内容为eax = 0
import idautils
for func in idautils.Functions():
flags = idc.GetFunctionFlags(func)
if flags & FUNC_LIB or flags & FUNC_THUNK:
continue
dism_addr = list(idautils.FuncItems(func))
for ea in dism_addr:
if idc.GetMnem(ea) == “xor”:
if idc.GetOpnd(ea,0) == idc.GetOpnd(ea,1):
美工设计软件培训comment = “% s = 0” % (idc.GetOpnd(ea,0))
idc.MakeComm(ea,comment)
代码解释:⾸先通过idautils.Function()循环遍历所有函数,之后通过
list(idautils.FuncItems(func))将每⼀个函数对应的所有指令放到⼀个list列表中汇总,通过idc.GetMnem(ea)获取list中每⼀条指令的操作码,并判断该操作码是否为“xor”,之后通过函数idc.GetOpnd(ea,n)获取该条指令的两个操作数,并判断这两个操作数是否相等,若相等则给该指令添加注释。
运⾏结果如下
IDAPython可以写注释,那么则呢么查看注释呢?通过
GetCommentEx(ea,repeatable)函数可以获取到当前地址的注释内容,其中ea为指定的地址,repeatable是⼀个布尔值
import idautils
for func in idautils.Functions():
flags = idc.GetFunctionFlags(func)
if flags & FUNC_LIB or flags & FUNC_THUNK:
continue
dism_addr = list(idautils.FuncItems(func))
for ea in dism_addr:
if idc.GetMnem(ea) == “xor”:
if idc.GetOpnd(ea,0) == idc.GetOpnd(ea,1):
comment = “% s = 0” % (idc.GetOpnd(ea,0))
联想怎么安装matlab
idc.MakeComm(ea,comment)python基础代码注释
print idc.GetCommentEx(ea,False)
我们前⾯是在给指令写注释,那么怎么给函数写注释呢。我们通过
idc.SetFunctionCmt(ea,cmt,bool)进⾏函数注释。Wa为函数体中任意⼀处指令的地址,cmt为需要注释的内容,bool为布尔值,false表⽰重复注释,true为普通注释。重复注释的意思就是⽣效之后,其他引⽤的地⽅也会⾃动⽣成注释。
以给check_value函数添加注释为例,定位到函数体重
碱面和小苏打的区别代码如下
import idautils
ea = idc.ScreenEA()
print hex(ea),idc.GetDisasm(ea)
print idc.GetFunctionName(ea)
idc.SetFunctionCmt(ea,“function comment test”,1)
运⾏后可以看到check_value的注释已经⽣成了
因为使⽤的是重复注释,所以交叉引⽤时可以看到引⽤处函数也都进⾏了注释substr函数返回值
同样的,我们使⽤idc.GetFunctionCmt来获取注释某⼀⾏指令所在函数对应的注释,代码如下
import idautils
ea = idc.ScreenEA()
print hex(ea),idc.GetDisasm(ea)
print idc.GetFunctionName(ea)
print idc.GetFunctionCmt(ea,1)
在代码中我们打印出当前指令对应的汇编指令形式及地址,函数名和对应的注释。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。