无源码时如何用GDB定位未被main调用的函数内存地址?
用GDB查找未被引用的函数foo1的内存地址
情况1:可执行文件未剥离符号表(保留符号信息)
这是最直接的场景,直接利用符号表定位:
- 执行
info functions:会列出所有全局函数,在列表里找到foo1,对应行开头就是它的内存地址。 - 或直接执行
print &foo1:GDB会直接输出foo1的内存地址。 - 如果函数名带前缀/命名空间,用通配符匹配:
info functions *foo1*或print &*foo1*。
情况2:可执行文件已被剥离符号表(无符号信息)
此时需要通过函数的汇编特征扫描代码段(.text段):
- 先用
info files获取.text段的起始和结束地址(输出中会显示.text对应的0xXXXXXX到0xYYYYYY范围)。 - 利用GDB Python API扫描.text段,查找x86/x86_64平台下函数的典型起始特征(通常是
push rbp; mov rbp, rsp,对应字节序列0x55 0x48 0x89 0xe5):
在GDB中输入python进入Python交互模式,执行以下代码(替换start_addr和end_addr为你的.text段实际范围):start_addr = 0x400500 # 替换为你的.text段起始地址 end_addr = 0x400800 # 替换为你的.text段结束地址 func_start_sig = b'\x55\x48\x89\xe5' # x86_64函数开头特征 current = start_addr while current < end_addr: try: # 读取当前地址的4字节数据 mem_data = gdb.selected_inferior().read_memory(current, len(func_start_sig)) if mem_data == func_start_sig: print(f"发现可疑函数起始地址:0x{current:x}") # 可选:反汇编该地址附近代码验证 gdb.execute(f"disassemble 0x{current:x}, +32") current += 1 except Exception: current += 1 - 对扫描出的可疑地址,用
disassemble 地址查看汇编代码,结合你对foo1功能的预期(比如是否包含特定字符串、运算逻辑)判断是否为目标函数。
补充:关于你之前尝试的Python-GDB API用法
如果文件未被剥离符号表,正确使用lookup_global_symbol的方式是:
sym = gdb.lookup_global_symbol("foo1") if sym: print(f"foo1的内存地址:0x{sym.value():x}")
之前你得到的内置方法输出,应该是未正确指定符号名导致的。
内容的提问来源于stack exchange,提问作者nastya
相关产品推荐
相关产品推荐

