我有弯路问题。 少走弯路,大家都知道,只有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(“”); 在存储器地址(我高度怀疑)码。