c++ - 调用未记录的函数

标签 c++ windows dll hook

<分区>

我需要调用一个未记录的函数,它看起来像 -

struct SomeStruct Func(wchar_t *, bool);

现在的问题是我没有SomeStruct 的定义。我不需要 SomeStruct 的定义,只需要调用函数。

如何调用此函数或计算出 SomeStruct 的大小,以便为 struct 分配内存?

我的假设是,我可以分配一个 struct,它占用与 SomeStruct 相同的内存,然后我可以调用该函数,返回值可以保存在该临时 结构

截至目前,它在调用此函数时崩溃。

为什么我需要这个是因为我想 Hook 这个函数并在发生这种情况时拦截调用。现在要 Hook 一个函数,您需要将完全相同的内存返回给调用者,这样它就不会最终破坏堆栈。

我通过查看进程返回的内存以及一些命中和试验计算出结构大小。

我知道这也可以通过直接从堆栈中读取寄存器来完成,但我现在还不知 Prop 体怎么做。

一旦我弄清楚了,我会在此处发布解决方案。

最佳答案

这可能取决于编译器,但是当调用返回结构的函数时,调用者在自己的堆栈中为结构分配空间,然后将指向它的指针作为隐藏参数传递给被调用者。被调用者使用这个指针来填充结构字段,然后返回。显然,如果调用者没有分配足够的空间来保存返回值,则被调用者代码中可能会发生堆栈损坏。 然后,调用者使用返回的结构中需要的任何内容,并根据需要释放分配的空间。

因此,如果这是您的情况,请发明一个足够大的 SomeStruct 以不会导致数据损坏,然后调用该函数。

关于c++ - 调用未记录的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51556938/

相关文章:

c++ - Windows 上文件路径中的特殊字符 (c++)

c# - 寻找花式窗体

c - 如何在没有 luarocks 的情况下编译 LuaFileSystem 库并获取 .dll 文件?

c# - 使用 0 个参数调用 .ctor 的异常 : Retrieving the COM class factory for component with CLSID {ID} failed. HRESULT:0x80070005 (E_ACCESSDENIED)

c++ - 路径的 CMake 命令相等

c++ - C++ 享元模式

c# - 如何从不存在的用户拥有的文件夹中删除 ACL

c++ - 如果您链接 DLL,如果该 DLL 丢失,是否可以启动您的可执行文件

c++ - 在 vector 中的类中调用函数的正确方法

c++ - 是否有 high_resolution_clock 不是 typedef 的标准库实现?