这是一个可怕的想法,但我看到在走这条路之前它是否可行。
我必须编写一个Win32 C ++程序,它可以根据一个文件动态加载库,该文件包含要使用的dll,函数,签名和参数的序列化信息。加载库是微不足道的(LoadLibraryEx工作正常)。然后获取函数指针很容易(不是很重要,GetProcAdderss负责这一点)。然而其余的都很棘手。
这是我的攻击计划,如果这不是最佳方法,请随时告诉我:
请记住我的限制:
有没有更好的方法,这种方法是否有效?
更新
对于那些在这个帖子中学习更多知识的人来说,我找到了一个解决方案。在C中,您可以使用dlopen动态加载库(为了便于使用,还有一个winlib)。加载后,您可以使用libffi动态执行函数(支持mac / ios / win 64和32bit)。这只能让你获得C函数和原始类型(指针,uint,int,double,float)以及它的相关信息。但是,使用macosx objective-c桥接器,您可以通过加载libobjc(osx的本机obj-c到c“免费”桥接器)来访问objective-c。然后通过动态创建obj-c和c ++类。可以使用C#及其编组功能在Windows上完成类似的技术。
这最终导致HIGH开销,你必须非常小心你的内存,此外不要混合来自C / C#/ C ++的指针。最后,无论你做什么,在运行时。绝对确定你知道你的类型....认真。 BTW,libffi / cinvoke,令人惊叹的图书馆。
答案 0 :(得分:3)
现有的库可以执行您所描述的内容,例如C / Invoke:
答案 1 :(得分:2)
一般规则,如果你有一个可怕的想法,请放弃并找到一个好的。
如果根本不知道签名,那么你所描述的内容就会落在脸上。假设您的呼叫适用于我的功能。我将函数从__stdcall更改为__cdecl或返回,您将崩溃。
此外,您不处理退货。
如果你放松“未知”以允许一些限制,比如修复一个返回类型和调用约定,你就有点领先 - 那么你真的可以模仿这个调用,但它有什么用呢?整个事情听起来像是一个自助式黑客入侵引擎。
通常的方法是发布一些固定的接口(使用函数签名),并使DLL支持它。或者安排一些统一的数据传输机制。
我建议你描述一下你真正想要的东西并发帖询问,也许是在程序员SE上。