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

时间:2009-12-18 02:58:40

标签: c++ c assembly inline-assembly

我不知道集会,所以我不知道如何解决这个问题。

我有一个程序正在挂钩到另一个程序。我已经获得了函数在钩子程序的.exe

中所处位置的偏移量
#define FuncToCall 0x00447E5D

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

4 个答案:

答案 0 :(得分:3)

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

但是,如果你是如此专注于墙上黑客攻击,我的意思是,修改合法程序的操作,你不能只是拿一个地址并称之为好。

你需要查找符号(如果在快乐的linux版本中)或使用sig扫描(或两者都是D =)来查找实际函数。

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

mov eax, 0×deadbeef
jmp eax

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

处理不同的通话惯例也有些混乱,所以没有评论者试着打电话给我,这对于这个问题还远远不够。

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

如果你想回到你的另一个故事的代码,但是这将使你的目标函数与正确的调用约定一样长,而不是类方法等等

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

如果有效,请不要修理它,并且通过它可以正常工作。

答案 3 :(得分:0)

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

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