【问题标题】:How to find all the "user defined functions" from ELF and PE file?如何从 ELF 和 PE 文件中找到所有“用户定义的函数”?
【发布时间】:2014-02-02 15:19:50
【问题描述】:

测试平台在 32 位 Linux 和 Windows 上。

我正在尝试识别所有用户定义的动态链接二进制函数,

提取它们的指令并再次将它们组装成二进制文件。

至于ELF文件,我用这个:

nm binary | grep "T"

提取某些函数,我认为所有不以_开头的函数都应该是用户定义的函数。

它适用于小程序...

但是当我测试 coreutils (8.5) 时,例如像 ba​​sename

这是nm

的部分输出
0804b530 T rpl_fflush
0804b590 T rpl_fseeko
0804a400 T set_char_quoting
0804a480 T set_custom_quoting
08049580 T set_program_name
0804a460 T set_quoting_flags
0804a3e0 T set_quoting_style
08049480 T strip_trailing_slashes
08048f70 T usage
0804b0f0 T version_etc
0804b6c0 T atexit

basename的源码中,只定义了三个函数为

main
usage
remove_suffix

但是我在这里使用 nm 来查找很多函数...

基本上我认为像 version_etc *atexit* 这样的函数是在头文件中定义的 包括基本名称

所以我的问题是:

如何准确地从 ELF 文件中找到所有用户定义的函数?

也欢迎任何关于 PE 文件的答案!

谢谢!

【问题讨论】:

  • ELF 文件包含链接到其中的所有函数,包括链接到的静态库中包含的内容。您想要做的唯一机会就是查看包含在ELF 和猜测。

标签: c assembly elf libc


【解决方案1】:

基本上我认为像version_etcatexit这样的函数是在包含的头文件basename中定义的

您对如何构建basename 的心智模型似乎完全不正确。

basename 是由basename.o 构建的一大堆其他对象(它们是coreutils 的一部分)一大堆更多的对象来自其他图书馆。

一旦basename 被链接,就无法判断哪些函数来自哪里。

此外,“用户定义函数”是什么意思?

【讨论】:

  • 嗨,基本上我正在尝试将反汇编的 asm 文件重新组装成二进制文件。我现在被困在链接步骤中......我想做的是选择libc中的所有函数not,组装它,然后使用gcc将obj文件与libc链接。
  • 而对于“用户定义的函数”,我的意思是在反汇编文件中找到的函数,而不是在libc中
  • 我在想,由于二进制是动态链接的,所以在反汇编文件中找到的所有函数都应该是“用户定义的函数”但是在反汇编文件中,我发现了像“rpl_fflush”这样的函数atexit”,它不在basename.c文件中,所以我认为它们应该在包含的头文件中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多