首頁(yè)
社區(qū)
課程
招聘
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;
}

如上,這個(gè)是我寫的inlinehook函數(shù)
是采用

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

的方式跳轉(zhuǎn)的
但是最后的測(cè)試出問題了
可以看到我這里的東西已經(jīng)copy進(jìn)去了,但是最后會(huì)異常
我看了很久實(shí)在沒啥辦法了,求大佬解惑

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

感謝各位勞煩看本貼了,我已經(jīng)成功解決了這個(gè)問題
只要通過

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

的方法可以解決了
另外我的跳轉(zhuǎn)的東西寫的也是有問題的
由于push導(dǎo)致跳入函數(shù)后
到函數(shù)return到ret的時(shí)候會(huì)跳錯(cuò)
所以最好的一個(gè)方法還是

1
2
mov rax,xxxxxxxx
jmp rax

我打算之后再學(xué)習(xí)一下push + ret的方法的
還是不說(shuō)廢話了 勞煩各位了 謝謝

回復(fù) 已采納
mb_vidsvvxq 2022-11-6

JMP后面好像不能跟寄存器,是當(dāng)前指令地址的偏移

回復(fù)
Bad_Dream: x64有這種方法的  我接觸到的一種改變寄存器的是  mov  rax,xx  xx  xx  xx  xx  xx  jmp  rax
回復(fù) 2022-11-6