我正在为一个游戏编写扩展,该游戏为(我们)修改器提供了API。这个API提供了各种各样的东西,但它有一个限制。API仅适用于“引擎”,这意味着基于引擎发布的所有修改(mod)都没有任何特定于(mod的)API。我创建了一个“签名扫描器”(注意:我的插件作为共享库加载,使用-share和-fPIC编译),它可以找到感兴趣的函数(因为我在Linux上)。因此,为了解释清楚,我会举一个具体例子:我已经找到了一个感兴趣的函数的地址,它的函数头非常简单
我了解在这里我可能无法得到完全令人满意的答案,但是我会非常感激一些指导方向的帮助,因为我目前处于岌岌可危的境地...我已经阅读了关于绕道的相关资料,但几乎没有任何文档(特别是针对Linux),我想实现所谓的“蹦床”,但我似乎找不到如何获取此知识的方法。
注:我也对_thiscall感兴趣,但据我所读,使用GNU调用约定并不难以调用。
int * InstallRules(void);
。它不需要任何参数(void),并返回一个整数指针(指向我感兴趣的对象)。现在,我想要做的是创建一个detour(记住我有函数的起始地址),来调用我的自己的函数,我希望它的行为类似于这样:void MyInstallRules(void)
{
if(PreHook() == block) // <-- First a 'pre' hook which can block the function
return;
int * val = InstallRules(); // <-- Call original function
PostHook(val); // <-- Call post hook, if interest of original functions return value
}
现在问题来了,我对函数钩子一窍不通,只有一点点关于AT&T格式的内联汇编的知识。互联网上预制的拦截包仅适用于Windows或使用完全不同的方法(即预加载一个dll来覆盖原始文件)。所以基本上,我应该怎么做才能入门?应该阅读有关调用约定(在这种情况下为cdecl)并学习内联汇编,还是做些其他事情?最好的方法可能是使用Linux拦截的已经运行良好的包装类。最终,我希望得到像这样简单的东西:
void * addressToFunction = SigScanner.FindBySig("Signature_ASfs&43"); // I've already done this part
void * original = PatchFunc(addressToFunction, addressToNewFunction); // This replaces the original function with a hook to mine, but returns a pointer to the original function (relocated ofcourse)
// I might wait for my hook to be called or whatever
// ....
// And then unpatch the patched function (optional)
UnpatchFunc(addressToFunction, addressToNewFunction);
我了解在这里我可能无法得到完全令人满意的答案,但是我会非常感激一些指导方向的帮助,因为我目前处于岌岌可危的境地...我已经阅读了关于绕道的相关资料,但几乎没有任何文档(特别是针对Linux),我想实现所谓的“蹦床”,但我似乎找不到如何获取此知识的方法。
注:我也对_thiscall感兴趣,但据我所读,使用GNU调用约定并不难以调用。