标签:segName cisco get seg 字符串 固件 解析 idc ida
cisco路由器固件反汇编后部分字符串可能无法正确解析:很多字符串由于前面有个\n符号,ida解析的时候不认为前一部分是字符串,导致字符串解析不完整,只把后面一段解析成了字符串。
由此造成F5的时候部分引用字符串代码让人看不懂,而且直接在字符串上按X查看交叉引用会发现找不到交叉引用。
以下脚本可以修复字符串解析不完整的情况。
注意,请在IDA7.5,python3.8环境下食用!
from idaapi import * import idautils import idc def setString(): for seg in idautils.Segments(): segName = idc.get_segm_name(seg) if segName != '.rodata' and segName != '.data': continue segStart = idc.get_segm_start(seg) segEnd = idc.get_segm_end(seg) print(segName,hex(segStart),hex(segEnd)) start = segStart num = 0 while start <= segEnd: flag = idc.create_strlit(start,BADADDR) if flag: newStr = idc.guess_type(start) if 'char[' == newStr[:5] and ']' == newStr[-1:]: strLen = int(newStr[5:-1]) start += strLen num += 1 continue else: idc.create_byte(start) start += 1 print('set ' + str(num) + ' to string') #setString() #ea = idc.get_screen_ea() #print(type(ea)) #value = idc.get_wide_byte(ea) #print(value) #bb = idc.guess_type(ea) #print(bb) #print(hex(ea)) #flag = idc.create_byte(ea) #if flag: # print('success') #else: # print('fail') #addr = idc.get_wide_dword(ea) #print(hex(addr)) #liii = list(idautils.DataRefsFrom(ea)) #print(len(liii)) #print(liii) ''' danger_funcs = ["sub_80D1FC3C"] for func in danger_funcs: addr = idc.get_name_ea_simple(func) if addr != BADADDR: cross_refs = CodeRefsTo(addr, 0) print("Cross References to %s" % func) print("-------------------------------") for ref in cross_refs: print("%08x" % ref) idc.set_color( ref, CIC_ITEM, 0x0000ff) '''
标签:segName,cisco,get,seg,字符串,固件,解析,idc,ida 来源: https://www.cnblogs.com/husterlong/p/16103349.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。