IDAPython实现Halstead复杂度

官方文档:IDAPython documentation

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 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值