【发布时间】:2017-10-05 12:46:56
【问题描述】:
如何通过知道类名和方法名找到一个类来调用它的方法?
详情: 我正在尝试编写库来替换另一个程序中的一些函数,该程序也是由 LD_PRELOAD 功能使用 C++ 编写的。 我需要能够从要集成此库的程序中调用函数。
【问题讨论】:
-
您确实知道符号一旦通过编译器就会是mangled?这意味着一个成员函数,例如
SomeClass::someFunction不会这么简单吧? C++ 规范没有指定重整方案,它取决于编译器及其实现。您需要知道要访问的函数的错位名称。 -
此外,C++ 没有 type introspection 并且不可能获得“只是”一个类。您需要告诉系统获取指向某个类的特定成员函数的指针,使用重整的名称。
-
此外,请记住,非静态成员函数需要调用对象。这通常作为隐藏的第一个参数传递给成员函数,并成为函数中的
this指针。如果覆盖已加载成员函数的函数不处理此特殊参数,则您的代码将永远无法工作。 -
错位名称看起来像 _ZNK4GNET5Skill8GetLevelEv 吗?我在 IDA PRO 中找到了这个名字。我可以找到并调用只知道这种类型名称的函数吗?或者也许我需要找到这个函数所在的地址以便在运行时调用它?如果我没有主程序的来源(我可以通过 IDA 打开它),我需要知道如何调用这些方法的所有可能方式。谢谢。
-
是的,这是一个典型的错误名称。如果你知道这个名字,你就可以获得函数的句柄并调用它。 然而如果它是非静态成员函数,那么(正如我之前所说)它需要一个对象来调用。如果您没有正确类的对象,而这实际上是不可能从库或可执行文件中获取的,那么您根本无法在没有未定义行为的情况下调用它。如果你有定义类的头文件,那么你可以使用该类定义来创建一个对象。
标签: c++ linux ld-preload