调用未记录的函数[关闭]
Posted
技术标签:
【中文标题】调用未记录的函数[关闭]【英文标题】:Calling undocumented function [closed] 【发布时间】:2018-07-27 11:22:53 【问题描述】:我需要调用一个看起来像 -
的未记录函数struct SomeStruct Func(wchar_t *, bool);
现在的问题是我没有SomeStruct
的定义。我不需要SomeStruct
的定义,只需要调用函数即可。
如何调用此函数或计算SomeStruct
的大小,以便分配struct
的内存?
我的假设是我可以分配一个struct
,它与SomeStruct
占用相同的内存,然后我可以调用该函数并将返回值保存在该临时struct
中。
截至目前,调用此函数时崩溃。
为什么我需要这个是因为我想挂钩这个函数并在发生这种情况时拦截调用。现在要挂钩一个函数,您需要将完全相同的内存返回给调用者,这样它就不会最终破坏堆栈。
我通过查看进程返回的内存以及一些命中和试验来计算出结构大小。
我知道这也可以通过直接从堆栈中读取寄存器来完成,但我现在还不知道。
一旦我弄清楚了,我会在这里发布解决方案。
【问题讨论】:
如果这个函数没有文档,你怎么知道它的签名?此外,未记录的函数通常是出于某种原因而未记录的。通常,原因是它们不是官方 API 的一部分并且可能会更改,这意味着您的代码可能会在任何时候、任何地方中断。所以如果你不介意我问:为什么你绝对必须调用这个函数?特别是考虑到您显然对它返回的内容不感兴趣…… 为什么需要返回值?如果您不知道它的签名,您想如何使用它?如果您不打算使用返回值,请不要将其存储在结构中。 你不能。而且你不能“分配一个struct
,它占用与SomeStruct
相同的内存”,希望它能起作用。不会的。
@PasserBy - 真的可以而且必须为SomeStruct
分配内存是Func
的调用者。调用者必须为SomeStruct
分配内存并将Func
的指针作为隐藏参数传递给它。
@MichaelKenzel我使用体面的步行者获得了函数签名。
【参考方案1】:
它可能取决于编译器,但是当调用返回结构的函数时,调用者会在自己的堆栈中为结构分配空间,然后将指向它的指针作为隐藏参数传递给被调用者。被调用者使用这个指针填充结构字段,然后返回。显然,如果调用者没有分配足够的空间来保存返回值,则被调用者代码中可能会发生堆栈损坏。 然后调用者从返回的结构中使用它需要的任何东西,并根据需要释放分配的空间。
因此,如果这是您的情况,那么请发明一个足够大的SomeStruct
,以免导致数据损坏,然后调用该函数。
【讨论】:
是的,我的情况。我实际上是在挂钩这个函数,并在将值返回给原始调用者之前进行一些处理。我知道这将是困难的,并且通过打击和试验来完成。我正在寻找人们是否知道某种方法可以给我返回的函数的堆栈内存大小。以上是关于调用未记录的函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章