我们分析的过程中,会在汇编指令做个中记录日志,比如某个寄存器的值了,或者某个函数是做什么的,再或者,我们会直接更改函数的名字,方便每次查看。

这时候,为了效率,或者说能快速的复现上次调试的现场,我们就可以用这个功能,代码也非常简单。

# 通过起始地址,终止地址,以及偏移地址去保存日志
def saveDebugMessage(self):
    # create file first
    # 用个轻量级的存储shelve
    f = shelve.open(self.id)
    # 保存日志的起始地址
    addr_start = int(self.address_start, 16)
    # 保存日志的终止地址
    addr_end = int(self.address_end, 16)
    log_dict = {}
    log_dict_list = []
    for num in range(addr_start, addr_end):
        # 获取我们当前地址的日志
        com = idc.GetCommentEx(num, True)
        if com != None:
            #获取函数名
            fun_name = idc.GetFunctionName(num)
            print fun_name
            if fun_name != None and not ‘sub’ in fun_name:
                log_dict = {‘offset’: str(num – addr_start), ‘msg’: str(com), ‘funtion_name’: str(fun_name)}
            else:
                log_dict = {‘offset’: str(num – addr_start), ‘msg’: str(com)}
            log_dict_list.append(log_dict)
            pass
    print(log_dict_list)
    # 保存日志
    f[‘info’] = log_dict_list
    f.close()
 # 通过起始地址即可,会自动判断长度,并且获取偏移地址去设置日志
def loadDebugMessage(self):
    f = shelve.open(self.id)
    data = f[‘info’]
    addr_start = int(self.address_start, 16)
    for num in range(0, len(data)):
        offset = data[num][‘offset’]
        msg = data[num][‘msg’]
        fun_name = data[num][‘funtion_name’]
        idc.MakeRptCmt(addr_start + int(offset), msg)
        if fun_name is not None and fun_name != ”:
            idc.SetFunctionCmt(addr_start + int(offset), fun_name, False)

 

本文地址:https://blog.csdn.net/QA1742501631/article/details/107145869