我们分析的过程中,会在汇编指令做个中记录日志,比如某个寄存器的值了,或者某个函数是做什么的,再或者,我们会直接更改函数的名字,方便每次查看。
这时候,为了效率,或者说能快速的复现上次调试的现场,我们就可以用这个功能,代码也非常简单。
# 通过起始地址,终止地址,以及偏移地址去保存日志
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)