C ++和完全动态的功能(C++ and FULLY dynamic functions)

2019-09-17 00:57发布

我有弯路问题。 少走弯路,大家都知道,只有5个字节的空间(即,“JMP”电话和一个4字节地址)之间移动。 正因为如此,不可能在一个类中的方法()的“钩子”的功能,你不能提供this指针,因为根本就没有足够的空间( 这里的问题更彻底地解释)。 所以我一直在集思广益整天的解决方案,现在我想你对该问题的想法,所以我不不知道是否有可能或没有开始3-5天的项目。

我有3个进球开始,我想要的“钩子”的功能是类的方法,我想整个的做法是面向对象(无静电的功能或全局对象)和最差/最难的部分,是完全动态的。 这是我的(理论上)解决方案; 与组件可以在运行时修改的功能(一个很好的例子是任何迂回方法)。 所以,因为我可以动态修改的功能,我不应该还能够动态地创建他们? 例如; 我分配内存,假设〜30个字节(通过的malloc /新)。 那岂不是可以只对应于不同的装配商二进制数字(如0xE9是“JMP”)替换所有字节,然后直接调用地址(因为它包含一个函数)?

注:我知道事先的返回值,所有的参数,我想绕路的所有功能,而且因为我使用的GCC的thiscall约定是几乎等同于_cdecl之一。

所以这是我的想法/即将被执行; 我创建了一个“功能”类。 这个构造函数的自变量的可变参数的量(除了第一个参数,其描述了目标函数的返回值)。

每个参数是自变量的钩将收到的描述(大小,以及它是否是一个指针或没有)。 所以我们可以说,我想创建一个函数类的int * RandomClass::IntCheckNum(short arg1); 。 那我就只需要做这样的: Function func(Type(4, true), Type(4, true), Type(2, false)); 。 其中,“类型”被定义为Type(uint size, bool pointer) 。 然后通过装配,我可以动态创建功能(注:这都将是使用_cdecl调用约定),因为我可以计算的参数和总规模数。

编辑:随着例如, Type(4, true)是返回值(INT *),则scond Type(4, true)是RandomClass this指针和Type(2, false)描述的第一个参数(短ARG1 )。

有了这个实现,我可以轻松拥有类方法作为回调,但它需要一个广泛的汇编代码量(我甚至不特别是在经历)。 最终,唯一非动态的事情是在我的回调类中的方法(这也需要前,后回调)。

所以,我想知道; 这可能吗? 需要多少工作需要,我就在这里的方式在我头上?

编辑:对不起,如果我提出的一切有点模糊,但如果你想要的东西更全面地解释,不要问!

EDIT2:我也想知道,如果我能找到的十六进制值,所有装配运营商的地方? 名单将有助于一吨! 和/或如果可能的话以某种方式“保存”在asm(“”); 在存储器地址(我高度怀疑)码。

Answer 1:

什么你描述通常被称为“置信转换”,而且是相当普遍实现。 历史上,最常见的目的已经16位和32位代码之间的映射(由autogenerating调用现有的16位的一个或反之亦然一个新的32位功能)。 我相信一些C ++编译器产生类似的功能来调整基类的指针的指针子类多重继承,也。

这当然似乎是一个可行的解决您的问题,我不预见任何巨大的问题。 只要确保你分配的内存与操作系统所需的任何标志,以确保内存是可执行文件(最现代化的操作系统给出了非可执行内存默认情况下)。

你会发现这个链接有用的,特别是如果在Win32中工作: http://www.codeproject.com/Articles/16785/Thunking-in-Win32-Simplifying-Callbacks-to-Non-sta

关于寻找组装业务的十六进制值,我所知道的最好的参考是附录的NASM汇编的说明书(和我不只是说,因为我帮着写)。 有可用的副本,在这里: http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html



文章来源: C++ and FULLY dynamic functions