使用ida脚本 恢复/提取 ida未能识别的ELF文件符号表
前言
如果想跳过博主的心路历程请直接到适用范围开始浏览
最近在分析一个mips架构的elf,阅读其他大手子的文章时,他文章中所分析的一个函数只给出了一个准确的函数名,但是我ida的func names里面没有这个函数。然后我想要找这个功能点,于是在Strings里面搜索对应的字符串,是有这个字符串的

然后我顺着xref下去找,xref表中是没有这个函数调用的


但是我留意到0x0048F00C这个地址前后的字符串内容都非常像函数的命名,并且sub_44DC54是一个函数,简单分析一下发现这个函数是符合命名的,再简单检查了几个函数,发现这里就是一张隐藏的符号表!搜了一下没有搜索到别人造的轮子,于是用GPT写了一个脚本,确实可以达到在ida中进行批量重命名来应用这个隐藏符号表的作用。希望这个脚本以及思路能够解决相同的问题!
该脚本的适用范围
ida没有识别到函数的符号信息,但是二进制文件中存在有以下格式的 字符串+函数地址 时,它极有可能是函数的符号表信息。此时可以使用我提供的脚本来在ida中恢复符号表以及导出符号表

如何寻找可能的符号信息?
如果你不知道你的二进制文件中是否存在这样子的信息,请尝试按照以下方法寻找文件中的符号信息
找可能的函数名
可以使用shift+f12打开Strings窗口,在字符串海中寻找可能的函数名。或者根据你对函数功能、一些你所知的命名习惯进行猜测,然后在Strings窗口里面找有没有对应的信息

找交叉引用
找到可能的函数名后,双击找到它的引用

然后再次双击旁边的xref地址,看是否存在与适用范围中相同的地址信息

脚本
git链接:github
git clone https://github.com/RiMuawa/ida-symbol-extractor.git
from idc import *
from idautils import *
from ida_bytes import *
from ida_name import set_name
from ida_funcs import add_func
from ida_funcs import get_func
from ida_kernwin import msg
# set your own address here
start_addr = 0x00
end_addr = 0x00
addr = start_addr
while addr + 8 <= end_addr:
str_ptr = get_wide_dword(addr)
func_ptr = get_wide_dword(addr + 4)
func_name = get_strlit_contents(str_ptr, -1, STRTYPE_C)
if not func_name:
msg("Skipping %X: Invalid string address %X\n" % (addr, str_ptr))
addr += 8
continue
func_name = func_name.decode('utf-8')
if not set_name(func_ptr, func_name, SN_CHECK):
msg("Failed to name: %X -> %s\n" % (func_ptr, func_name))
else:
msg("Named function %X as %s\n" % (func_ptr, func_name))
if not get_func(func_ptr):
add_func(func_ptr)
addr += 8
保存为.py文件/下载python文件后打开,填入你的地址信息,然后在ida中的File → Script file...打开脚本,就可以完成命名了

浙公网安备 33010602011771号