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

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


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

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

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

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

脚本
git链接:githubgit clone 094K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9K9f1#2#2j5i4N6S2i4K6u0r3K9h3c8S2i4K6u0V1M7%4W2E0j5X3!0D9i4K6u0V1k6i4S2@1M7X3q4U0N6r3!0J5i4K6u0W2k6$3W2@1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | from idc import *from idautils import *from ida_bytes import *from ida_name import set_namefrom ida_funcs import add_funcfrom ida_funcs import get_funcfrom ida_kernwin import msg# set your own address herestart_addr = 0x00end_addr = 0x00addr = start_addrwhile 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...打开脚本,就可以完成命名了