繁体   English   中英

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

[英]Using __asm to call a function from hex offset

我不懂汇编程序,所以我不确定该怎么做。

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

#define FuncToCall 0x00447E5D

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

好简短的答案是,如果您不知道汇编程序,那么您不应该这样做,哈哈。

但是,如果您非常想进行黑客入侵,那么我想说的是,修改合法程序的操作,您不仅可以使用一个地址并称其为好。

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

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

mov eax, 0×deadbeef
jmp eax

现在,如果您要使用的函数是一个类方法,则需要做更多的研究。 但是汇编的那一部分将运行您想要的任何静态函数。

同样,处理不同的调用约定也有些混乱,因此没有评论者尝试对此进行呼唤,对于该问题而言,这远远不够。

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

如果您想返回代码,那又是另一回事了,但是只要正确的调用约定(而不是类方法等),那将使目标函数正常运行

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

感谢您的回答,但我知道了。 这就是我在做什么:

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

如果它起作用了,那就不要修复它,而且很高兴它起作用了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM