通过签名文件恢复
找到用于静态编译的静态库。
用FLAIR解析器为该库创建一个pat文件。
用sigmake来处理生成的pat文件,并生成一个签名文件。
将生成的签名文件复制到IDA的/sig/目录中
在IDA中shift+F5,选择添加sig文件进行解析
通过符号表恢复
找到加载地址、起始地址和结束地址
通过python脚本恢复
#coding=utf-8
from idaapi import *
from idc import *
symbol_interval = 16 #符号表间隔
load_address = #固件内存加载基址
symbol_table_start = + load_address #符号表起始地址
symbol_table_end = + load_address #符号表结束地址
ea = symbol_table_start
eaEnd = symbol_table_end
while ea < eaEnd:
offset = 0 #4个字节为一组数据
#将函数名指针位置的数据转换为字符串
create_strlit(get_wide_dword(ea-offset), BADADDR)
#将函数名赋值给变量sName
sName = get_strlit_contents(get_wide_dword(ea))
print(sName)
if sName:
#将bytes转为str
sName = str(sName,encoding="utf-8")
#开始修复函数名
eaFunc = get_wide_dword(ea - offset +4)
set_name(eaFunc, sName)
create_insn(eaFunc)
ida_funcs.add_func(eaFunc, BADADDR)
ea += symbol_interval
通过生成新的符号表来恢复
找到源文件,编译源文件来生成新的符号表
通过bindiff恢复
通过bindiff有符号的和无符号的文件恢复函数名(一半很少用bindiff这样的重型工具)