我不知道组装,所以我不知道该怎么做。
我有一个程序连接到另一个程序。我已经获得了函数在挂钩程序的 .exe 中所在位置的偏移量
#define FuncToCall 0x00447E5D
那么现在如何使用 __asm{} 调用该函数?
我不知道组装,所以我不知道该怎么做。
我有一个程序连接到另一个程序。我已经获得了函数在挂钩程序的 .exe 中所在位置的偏移量
#define FuncToCall 0x00447E5D
那么现在如何使用 __asm{} 调用该函数?
简短的回答是,如果你不知道组装,你不应该这样做,哈哈。
但是,如果您如此热衷于墙壁黑客,我的意思是,修改合法程序的操作,您不能只取一个地址并称其为好。
您需要查找符号(如果在快乐的 linux 领域)或使用 sig 扫描(或同时使用 D= )来查找实际功能。
一旦你这样做了,那么它就相对简单了,你只需要写一个mov和jmp。假设您已经可以访问正在运行的进程,并且您的 sig 扫描器找到了正确的地址,那么这段代码将得到您想要的
mov eax, 0×deadbeef
jmp eax
现在,如果你想要的这个函数是一个类方法..你需要做更多的研究。但是那一点汇编将运行您想要的任何静态功能。
处理不同的调用约定也有一些混乱,所以没有评论者试图打电话给我,这对于这个问题来说还远远不够先进。
编辑:顺便说一句,我不使用 call 因为在使用 call 时你必须担心堆栈帧和其他非常混乱的事情。此代码将跳转到任何地址并开始执行。
如果你想返回你的代码那是另一个故事,但只要它正确的调用约定,而不是类方法等,这将使你的目标函数运行
感谢您的回答,但我想通了。这就是我正在做的事情:
#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");
}