1 直接执行
在ida界面,使用"shift+F2"打开编程界面,Scripting language选择"python",将下述代码放入右侧空白的编程区中
代码如下
from idaapi import *
import idc
import os
funcs=[xx1,xx2] #xx为想要计算的函数,如funcs=['main']
total_halstead=0
for func_name in funcs:
#获取函数开始地址
start_addr = idc.LocByName(func_name)
#获取函数结束地址
end_addr= idc.find_func_end(start_addr)
#print("func_name={},start_addr={},end_addr={}".format(func_name,hex(start_addr),hex(end_addr)))
#read_ins为待处理指令,它从函数开始地址开始
read_ins=start_addr
#用于存放操作符,为字典类型,键为操作符,值为操作符个数
ins_dict={
}
#用于存储操作数个数,为字典类型,键为操作符,值为操作数个数
opnd_dict={
}
# 待处理指令一直获取,直到到达函数结束地址
while read_ins != end_addr:
#获取当前指令的助记符
ins_char=idc.GetMnem(read_ins)
#当前指令的第一个操作数,若没有则为空
opnd_num0= idc.GetOpnd(read_ins,0)
#当前指令的第二个操作数,若没有则为空
opnd_num1= idc.GetOpnd(read_ins,1)
#print("ins_char={},ins_num0={},ins_num1={}".format(ins_char,opnd_num0,opnd_num1))
#将ins_char添加/更新ins_dict中
if ins_char not in ins_dict:
ins_dict[ins_char]=1
else:
ins_dict[ins_char]+=1
#将ins_char添加/更新opnd_dict中
if ins_char not in opnd_dict:
if opnd_num0 != "" and opnd_num1 != "":
opnd_dict[ins_char]=2
elif opnd_num0 == "" and opnd_num1 == "":
opnd_dict[ins_char]=0
else:
opnd_dict[ins_char]=1
elif ins_char <