buzhifou01 发表于 2019-11-24 19:02

几个ida python脚本的实战例子

在使用ida工具进行逆向分析时,有时需要用到ida python脚本来帮助我们分析程序,接下来分享几个实战例子供大家学习。
例子1:遍历程序中所有的函数并输出程序的起始地址和函数名

ea = ScreenEA()
for function_ea in Functions(SegStart(ea), SegEnd(ea)):
    print hex(function_ea), GetFunctionName(function_ea)

例子2:循环遍历所有段并逐字节获取它们的数据

segments = dict()
for seg_ea in Segments():
data = []
for ea in range(seg_ea, SegEnd(seg_ea)): #遍历段内每个地址

data.append(chr(Byte(ea))) #获取字节及字节对应的字符

segments = ''.join(data) #赋值段中的数据
for seg_name, seg_data in segments.items(): #输出段名及段中数据大小
print seg_name, len(seg_data)
例子3:输出代码段中的指令,并统计指令数量
memories=dict()

for seg in Segments(): #遍历所有的段
        if SegName(seg)=='.text':
                for head in Heads(seg,SegEnd(seg)): #遍历所有指令,head为地址
                        if isCode(GetFlags(head)): #判断是否为指令
                                flag=GetMnem(head) #获取汇编指令
print "flag ",flag
memories=memories.get(flag,0)+1 #统计指令个数
all=map(lambda x:(x,x),memories.items())
all.sort() #排序

for pri,sed in all:
        print pri,sed

例子4:该例子遍历所有函数,并查找所有对每个函数执行的调用,引用将存储在两个字典中。

from sets import Set
ea=ScreenEA()
Par=dict()
son=dict()
for fun in Functions(SegStart(ea),SegEnd(ea)):#遍历函数
        f_name=GetFunctionName(fun)
        Par=Set(map(GetFunctionName,CodeRefsTo(fun,0))) #创建一个集合,其中包含调用(引用)的所有函数的名称
        for fun_son in CodeRefsTo(fun,0): #遍历所有的引用
                fname_son=GetFunctionName(fun_son) #获取引用函数的名称
                son=son.get(fname_son,Set())
                son.add(f_name); #将当前函数添加到函数列表中
        functions=Set(Par.keys()+son.keys()) #获取所有函数的列表
for per in functions:
   print "%d %s %d" % (len(Par.get(per,[])),per,len(son.get(per,[])))

s98 发表于 2019-11-24 19:27

感谢大佬了

bluerabbit 发表于 2019-11-24 19:32

很有用,谢谢

0xdada 发表于 2019-11-24 19:34

对我很有用,谢谢

光之继承者 发表于 2019-11-24 20:01

python脚本这么厉害吗?看来学习python还是很有用的

iamoutdoors 发表于 2019-11-24 20:28

谢谢大侠分享。

道本 发表于 2019-11-24 21:23

多谢楼主分享
页: [1]
查看完整版本: 几个ida python脚本的实战例子