首页
社区
课程
招聘
inlinehook的地址问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int fun1(pList target) // Install Hook
{
    if(setup == TRUE) setupList();
    if (target == null) return 1
    if (target->Hooked == TRUE) return 2;
    if (checkOption(*target) != 0)
        if (checkOption(*target) != -6 && checkOption(*target) != -1 && checkOption(*target) != -2) return checkOption(*target);
    byte ownShellCode[length] = { '\x00' },origin[length]; // shellcode
    target->shellcode = ownShellCode;cAddr("MessageBoxW", user32)
    dword SaveNew = 0;
    memcpy(ownShellCode, shellcode,length);
    memcpy(ownShellCode + stepAddr, target->NewFuncAddress, addrlength);
    if (VirtualProtect(target->HookAddress, length, PAGE_EXECUTE_READWRITE, &target->backuppage) != TRUE)return 3;
    memcpy(origin, target->HookAddress, length);
    memcpy(target->HookAddress, ownShellCode, length);
    if (VirtualProtect(target->HookAddress, length, target->backuppage, &SaveNew) != TRUE) return 4;
 
    target->origincode = origin;
    target->Hooked = TRUE;
    return 0;
}

如上,这个是我写的inlinehook函数
是采用

1
2
3
4
push rax
mov rax,xx xx xx xx xx xx
jmp rax
pop rax

的方式跳转的
但是最后的测试出问题了
可以看到我这里的东西已经copy进去了,但是最后会异常
我看了很久实在没啥办法了,求大佬解惑

收藏
2条回答
Bad_Dream 2022-11-8

感谢各位劳烦看本贴了,我已经成功解决了这个问题
只要通过

1
*(DWORD64 *)(ownShellCode + 2) = (DWORD64*)target->HookFuncAddress

的方法可以解决了
另外我的跳转的东西写的也是有问题的
由于push导致跳入函数后
到函数return到ret的时候会跳错
所以最好的一个方法还是

1
2
mov rax,xxxxxxxx
jmp rax

我打算之后再学习一下push + ret的方法的
还是不说废话了 劳烦各位了 谢谢

回复 已采纳
mb_vidsvvxq 2022-11-6

JMP后面好像不能跟寄存器,是当前指令地址的偏移

回复
Bad_Dream: x64有这种方法的  我接触到的一种改变寄存器的是  mov  rax,xx  xx  xx  xx  xx  xx  jmp  rax
回复 2022-11-6