是否可以以编程方式获取共享库中函数的签名?

2024-03-08

标题很清楚,我们可以通过以下方式加载库dl_open etc..

但是我怎样才能得到其中函数的签名呢?


这个答案不能笼统地回答。从技术上讲,如果您使用详尽的调试信息编译可执行文件(代码可能仍然是优化的发布版本),则可执行文件将包含额外的部分,从而提供二进制文件的某种反射性。在 *nix 系统上(您提到dl_open)这是通过实现DWARF http://en.wikipedia.org/wiki/DWARF调试额外部分中的数据ELF http://en.wikipedia.org/wiki/Executable_and_Linkable_Format二进制。类似它适用于马赫通用二进制文件在 MacOS X 上。

然而,Windows PE 使用完全不同的格式,因此不幸的是 DWARF 并不是真正的跨平台(实际上,在我的 3D 引擎的早期开发阶段,我为 Windows 实现了一个 ELF/DWARF 加载程序,以便我可以为各种引擎使用通用格式模块,因此通过一些认真的努力就可以做到这一点)。

如果您不想实现自己的加载器或调试信息访问器,那么您可以通过导出的一些额外符号(通过某种标准命名方案)嵌入反射信息,这些符号引用函数名称表,映射到它们的函数名称表。签名。对于 C 源文件,编写解析器从源文件本身提取信息是相当简单的。 C++ OTOH 非常难以正确解析,因此您需要一些成熟的编译器才能正确解析。为此,开发了 GCCXML,从技术上讲,GCC 以 XML 形式而不是对象二进制形式发出 AST。这样发出的 XML 就更容易解析。

从提取的信息中创建一个带有某种链接列表/数组/等的源文件。描述每个功能的结构。如果您不直接导出每个函数的符号,而是使用函数指针初始化反射结构中的某些字段,那么您将获得一个非常漂亮且干净的带注释的导出方案。从技术上讲,您也可以将此信息放在二进制文件的单独部分中,但将其放在只读数据部分中也可以完成这项工作。


然而,如果你得到一个第 3 方二进制文件——比如说最坏的情况,它是从 C 源代码编译的,没有调试信息,并且所有符号都没有被外部引用——你就完蛋了。您能做的最好的事情就是对函数访问可以传递参数的各个位置的方式进行一些二进制分析。

这只会告诉您参数的数量和每个参数值的大小,但不会告诉您类型或名称/含义。当对某些程序进行逆向工程(例如恶意软件分析或安全审计)时,识别传递给函数的参数的类型和含义是主要工作之一。最近,我遇到了一些出于调试目的而必须逆向运行的驱动程序,你无法相信我在 Linux 内核模块中发现 C++ 符号这一事实让我感到多么惊讶(你不能以正常的方式在 Linux 内核中使用 C++) ),但也松了一口气,因为 C++ 名称修饰为我提供了充足的信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以以编程方式获取共享库中函数的签名? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐