有没有办法绕过 C++ 构造函数?

Posted

技术标签:

【中文标题】有没有办法绕过 C++ 构造函数?【英文标题】:Is there a way to detour a c++ constructor? 【发布时间】:2015-04-12 03:04:50 【问题描述】:

有趣的是,不久前我回答了一个关于获取 C++ 构造函数的地址的问题,说它无法完成,所以改用完美转发。但是,就使用 Microsoft 的 Detour 库进行迂回而言,这不是一种选择。 需要地址才能绕过任何呼叫。所以现在我要问一个问题,如果没有构造函数的地址,是否可以绕道而行?如果有,怎么做?

【问题讨论】:

构造函数有一个内存地址(它毕竟是可执行代码,所以它必须驻留在内存中的某处)。您只是不能使用 & 运算符来获取该地址(语言标准禁止这样做)。但是,如果您知道您的编译器如何在内存中布置类的结构,您可能可以通过“创造性”的方式获得构造函数的地址。但我不建议这样做。 好吧,@RemyLebeau,似乎 creative 必须是要走的路。我知道这肯定不会是可移植的,而且我也不希望它是可移植的。只要它在 MS C++ 编译器下工作,我就会很高兴。 【参考方案1】:

不确定 MS Detour,但我通常使用 C++ 中的内联汇编手动挂钩 detour。如果代码(构造函数实例)映射到内存中,并且您可以写入该内存区域,则可以绕道

钩子绕道的基本机制是通过跳转到您的代码洞穴找到替换原始操作码的位置。如果 JUMP 代码与原始操作码的大小不匹配,则用 NOP 填充它。 在您的代码洞穴中执行原始操作码 PUSHAD 和 PUSHFD 使用全局变量做任何你想做的事(推荐) 调用任何不带参数的自定义函数 POPFD 和 POPAD 跳回打补丁的操作码(技能一些字节的 NOPS)

第一步,要获取构造函数实例的地址,需要通过ReadProcessMemory或任何方法搜索其动态地址。我确实从动态加载的 DLL 中绕过了一个函数。为了获得这个函数,我使用HANDLE tempHandle = GetModuleHandle((LPCWSTR)"DLLFileName.dll");,并通过DLL句柄的偏移量。

【讨论】:

以上是关于有没有办法绕过 C++ 构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在其派生类C++的构造函数中调用基类的构造函数[重复]

c++ 在创建时将构造函数参数从父对象传递给子对象

有没有办法初始化一个不涉及编写构造函数的新结构变量?

C++类和对象中

c++没有合适的默认构造函数可用

c++中的构造函数