【问题标题】:Determine Function signature确定函数签名
【发布时间】:2012-08-29 12:59:05
【问题描述】:

给定一个函数地址,如何确定其签名?

DWORD funcAddr = 0x63001023; // 任意地址 char[MAX] 签名 = ? // 可以设计什么算法?

原因如下:

有一个exe说Calc.exe,一旦进程在PC“A”上启动 我的 exe 拦截进程的创建并将信号发送到 pc“B” 相同的 calc.exe 开始的地方。 然后用户每次点击、移动、 假设加法的内部过程从 pc“A”传递到 pc“B”,其中 它正在虚拟化。所以操作函数参数的所有资源 出现在电脑“B”上,我只需要一个完美的签名...... 因此,即使是从根本上挂钩未知 dll 的危险活动也变得“有点”安全......

请不要推荐任何第三方库。

【问题讨论】:

  • C 和 C++ 都不支持反射。您可以从调试信息中挖掘此信息,需要 .pdb 和 DbgHelp api。
  • @Hans:如何使用DbgHelp api?请您存一个示例代码....
  • @Hans:不幸的是,没有调试信息或.pdb
  • @rohank 想搞点什么? :)
  • 您必须联系编写软件的人,以便他们告诉您函数签名是什么。信息不会记录在任何地方。

标签: c++ c windows visual-c++


【解决方案1】:

嗯,第一件事——这并不容易。你可以放弃。

您需要使用DbgHelp functions,尤其是在符号处理程序下。 您需要确定调用约定、参数和返回类型。需要担心它需要的类型(UDF)。然后创建这些类型,将它们传递给函数,并使用适当的调用约定调用函数。

RunDLL32.EXE 是加载函数、查找函数、其类型并进行调用的工具之一。尝试在命令提示符下运行以下命令:

rundll32 user32.dll LockWorkStation

阅读一些关于 API Hooking 的文章,特别是 Jeffery Ritcher 的一篇文章。

【讨论】:

  • Rundll 不会尝试找出原型。它假定一个特定的原型,如果函数没有该原型(LockWorkstation 没有),那么您会遇到堆栈损坏和未定义的行为。
  • 先生。 Chen 甚至在 2004 年花时间写了an article,说明为什么将 rundll32 与 LockWorkStation 一起使用是错误的。还有another.
  • 没错,我并没有挑战任何人对这个主题的洞察力......只是想找到解决我问题的方法。
  • 是的,RunDLL32 不使用符号或调试信息,它只是加载函数并像具有 WinMain 签名一样调用。
【解决方案2】:

你不能这样做。

但是,您可以使用相同的签名存储boost::function,并制作函数地址和 boost::function 对象的map

在程序中存储函数指针而不是原始地址更安全。

【讨论】:

  • 请指导我使用算法。我不能使用 3rd 方库。
  • 这就是为什么我说Howeverboost::function 是一个类型化的回调类型。来自boost。它不是算法,它是 C++11 中的结构,有 std::function
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 2018-05-25
  • 2013-04-13
  • 2010-09-13
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多