c++ - 调用未记录的函数
问题描述
我需要调用一个未记录的函数,它看起来像 -
struct SomeStruct Func(wchar_t *, bool);
现在的问题是我没有SomeStruct
. 我不需要SomeStruct
只需要调用函数的定义。
如何调用此函数或计算 的大小SomeStruct
以便分配 的内存struct
?
我的假设是我可以分配一个与调用函数struct
相同的内存,SomeStruct
并且返回值可以保存在那个 temp 中struct
。
截至目前,它在调用此函数时崩溃。
为什么我需要这个是因为我想挂钩这个函数并在发生这种情况时拦截调用。现在要挂钩一个函数,您需要将完全相同的内存返回给调用者,这样它就不会最终破坏堆栈。
我通过查看进程返回的内存以及一些命中和试验来确定结构大小。
我知道这也可以通过直接从堆栈中读取寄存器来完成,但我现在还不知道。
一旦我弄清楚了,我会在这里发布解决方案。
解决方案
它可能取决于编译器,但是当调用返回结构的函数时,调用者会在自己的堆栈中为结构分配空间,然后将指向它的指针作为隐藏参数传递给被调用者。被调用者使用这个指针填充结构字段,然后返回。显然,如果调用者没有分配足够的空间来保存返回值,则被调用者代码中可能会发生堆栈损坏。然后调用者从返回的结构中使用它需要的任何东西,并根据需要释放分配的空间。
因此,如果这是您的情况,请发明一个SomeStruct
足够大以不会导致数据损坏的函数,然后调用该函数。
推荐阅读
- amazon-web-services - lambda 层与 Go 兼容吗?
- c# - 如何将此 .XAML 代码转换为 C# 代码
- reactjs - 如何使我的 React Bootstrap 卡水平排列且等距排列(如果可能,也可以响应)
- python - python socket问题读取ip
- javascript - 没想到const在eval$之前改成了null
- amazon-ec2 - 如何在 AWS 上自动扩展 Kubernetes 工作节点
- performance - Neo4j 3.5 - 在我的 12B 关系图上仅搜索关系非常慢 - 如何提高性能?
- wordpress - 使用选项树插件的 create_function() 已折旧
- react-native - 如何在 Visual Studio Code 中调试 react-native
- java - 在 Windows 10 上执行可运行 jar 文件的问题