繁体   English   中英

C ++ / Win32动态调用函数而不知道其签名

[英]C++/Win32 Dynamically calling a function without knowing its signature

这是一个糟糕的主意,但我正在走这条路之前,看看是否可行。

我必须编写一个Win32 C ++程序,该程序可以基于文件动态加载库,该文件包含有关要使用的dll,函数,签名和争论的序列化信息。 加载库很简单(LoadLibraryEx工作正常)。 然后,获得函数指针很容易(没什么大不了的,GetProcAdderss会解决这个问题)。 然而,其余的都是棘手的。

这是我的攻击计划,如果这不是最好的方法,请随时告诉我:

  1. 打开要加载的DLL以及要执行的功能的文件中的序列化信息。
  2. LoadLibraryEx引入DLL
  3. GetProcAddress获取函数指针(将字节数组转换为字符串后)
  4. 将参数(以字节数组形式读取)以字节为单位写入内存。
  5. 获取每个参数开头的地址(通过序列化,我将知道每个参数的大小)。
  6. 使用汇编跳转到函数指针的开头,将堆上的地址推入堆栈中的参数(以相反的顺序)。
  7. 执行并获取返回值地址(作为一个空*?)
  8. 使用返回值(我从程序集获得)的内存地址和返回类型值的大小(我从序列化获得),然后将原始字节写回到文件中。

请记住我的限制:

  1. 除了运行时,我永远不会知道签名,dll,函数名是什么。
  2. 总是从文件中读取它。

有没有更好的方法,这种方法还能行吗?

更新

对于来此线程学习更多信息的任何人,我都找到了解决方案。 在C语言中,您可以使用dlopen动态加载库(此库有一个Winlib以便于使用)。 加载后,您可以使用libffi(支持mac / ios / win 64和32位)动态执行函数。 这只会带您进入C函数和原始类型(指针,uint,int,double,float),也就是关于它。 但是,使用macosx Objective-C桥,您可以通过加载libobjc(将OSX的本机obj-c转换为c“免费电话”桥)来访问Objective-c。 然后通过它动态创建obj-c和c ++类。 可以使用C#及其封送处理功能在Windows上完成类似的技术。

这最终会产生高开销,并且您必须非常注意内存,此外,请勿混合使用C / C#/ C ++的指针。 最后,无论您做什么,在运行时。 绝对要确保您知道自己的类型。 顺便说一句,libffi / cinvoke,令人惊叹的库。

现有的库可以满足您的描述,例如C / Invoke:

http://www.nongnu.org/cinvoke/

一般规则是,如果您有一个糟糕的主意,请将其删除并找到一个好的主意。

如果根本不知道签名,那么您描述的内容就会浮出水面。 假设您的呼叫对我的功能有效。 我将函数从__stdcall更改为__cdecl或返回,您将崩溃。

同样,您不处理退货。

如果您放松“未知”以允许一些限制,例如修复返回类型和调用约定,那么您会领先一些-那么您确实可以模拟该调用,但是这样做有什么用呢? 整个过程听起来像是一个自助式hack-me引擎。

通常的方法是发布一些固定的接口(使用函数签名),并使DLL支持它。 或安排一些统一的数据传输机制。

我建议您描述自己的真正追求,然后在Programmers SE上发问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM