使用__asm从十六进制偏移调用函数

问题描述:

我不知道程序集,所以我不知道如何去做这件事。使用__asm从十六进制偏移调用函数

我有一个挂钩到另一个程序。我已经获得的偏移量,其中功能位于钩程序的.exe

#define FuncToCall 0x00447E5D 

所以现在我怎么能使用__asm {}内调用该函数?

我想你也可以将该地址转换为函数指针并以此方式进行调用。这可能会更好。

+0

所以像((* void)FuncToCal)(); ? – 2009-12-18 03:02:15

+0

是的,但我认为这是UB。 – 2009-12-18 03:06:50

+0

我不是100%的,所以我不想编辑我的帖子,但是如果你知道函数的签名(你应该这样做),你可能可以做类似于: typedef int(* pt2Function) (float,char,char); (void *)FuncToCall)(3.0,'a','b'); – Mongoose 2009-12-18 03:07:48

那么简短的答案是,如果你不知道集会你不应该这样做,哈哈。但是,如果你的意图是在墙上黑客,我的意思是,修改一个合法程序的操作,你不能只是一个地址,并称它为好。您需要查找符号(如果在开心linux领域)或使用sig扫描(或两个D =)来查找实际功能。

一旦你这样做,那么它比较简单,你只需要写一个mov和jmp。假设你有访问正在运行的进程已经和你的签名扫描仪找到了正确的地址,这段代码会得到你想要你想要

mov eax, 0×deadbeef 
jmp eax 

现在,如果你想要这个功能是一个类的方法..你需要做更多的学习。但是这个程序集可以运行任何你想要的静态函数。

对于不同的调用约定也有一些混乱,所以没有评论者试图打电话给我,对于这个问题来说这是远远不够的。

编辑: 顺便说一句,我不使用调用,因为当使用调用时,你必须担心堆栈帧和其他非常混乱的东西。该代码将跳转到任何地址并开始执行。

如果你想回到你的代码那是另一回事,但会得到你的目标函数,只要去其正确调用约定,而不是一个类的方法,等等等等

+0

这是一个很好的介绍信号扫描http://wiki.amxmodx.org/Signature_Scanning – Charles 2009-12-18 03:10:25

感谢的答案,但我弄清楚了。这是我在做什么:

#define FuncToCall 0x00447E5D 
DWORD myfunc = FuncToCall; 
__asm call dword ptr [myfunc]; 

如果它的工作不解决它,并通过golly它的工作。

这是一个棘手的问题: 你可以使用它的参数和返回值。它只是将所有的函数转发给你想要调用的函数,这个函数是由一个指针(FuncToCall)给出的。

void call_FuncToCall(.......) 
{ 
    __asm__ 
    ("call label1\n label1:\n" 
    "pop %eax\n" 
    "movl FuncToCall, %eax\n" 
    "leave\n" 
    "jmp *%eax"); 
}