我不知道集会,所以我不知道如何解决这个问题。
我有一个程序正在挂钩到另一个程序。我已经获得了函数在钩子程序的.exe
中所处位置的偏移量#define FuncToCall 0x00447E5D
那么现在如何使用__asm {}来调用该函数?
答案 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");
}