1

我不知道组装,所以我不知道该怎么做。

我有一个程序连接到另一个程序。我已经获得了函数在挂钩程序的 .exe 中所在位置的偏移量

#define FuncToCall 0x00447E5D

那么现在如何使用 __asm{} 调用该函数?

4

4 回答 4

3

简短的回答是,如果你不知道组装,你不应该这样做,哈哈。

但是,如果您如此热衷于墙壁黑客,我的意思是,修改合法程序的操作,您不能只取一个地址并称其为好。

您需要查找符号(如果在快乐的 linux 领域)或使用 sig 扫描(或同时使用 D= )来查找实际功能。

一旦你这样做了,那么它就相对简单了,你只需要写一个mov和jmp。假设您已经可以访问正在运行的进程,并且您的 sig 扫描器找到了正确的地址,那么这段代码将得到您想要的

mov eax, 0×deadbeef
jmp eax

现在,如果你想要的这个函数是一个类方法..你需要做更多的研究。但是那一点汇编将运行您想要的任何静态功能。

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

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

如果你想返回你的代码那是另一个故事,但只要它正确的调用约定,而不是类方法等,这将使你的目标函数运行

于 2009-12-18T03:06:21.693 回答
1

感谢您的回答,但我想通了。这就是我正在做的事情:

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

如果它有效,请不要修复它,天哪,它有效。

于 2009-12-18T03:32:45.820 回答
1

我认为您也可以将该地址转换为函数指针并以这种方式调用它。那可能会更好。

于 2009-12-18T03:01:35.323 回答
0

这是一个棘手的问题:您也可以将它与参数和返回值一起使用。它只是将所有内容转发给您打算调用的函数,该函数由指向该函数的指针 (FuncToCall) 给出。

void call_FuncToCall(.......)
{
  __asm__
  ("call label1\n label1:\n"
   "pop %eax\n"
   "movl FuncToCall, %eax\n"
   "leave\n"
   "jmp *%eax");
}
于 2011-05-23T08:04:23.303 回答