控制台复制就能用,简单易懂
#include <iostream>
 #include <Windows.h>
 using namespace std;
 unsigned long xxxxxxxx = 0;
 void hook64(void* dest,void* myfunc) {    //xxx随便填一个可读写执行的地址,jmp6字节,地址8字节,ret 1字节,一共15字节
     bool xp1 = VirtualProtect(dest, 15, PAGE_EXECUTE_READWRITE, &xxxxxxxx);
     //cout << xp1<<"\n";
     LONGLONG destaddresss = (LONGLONG)dest;
     LONGLONG myfuncaddress = (LONGLONG)myfunc;
    unsigned char* change = (BYTE*)dest;
     *change = 255;  //jmp = FF
     change++;
     *change = 37; //jmp 25 = jmp qword ptr
     change++;
    int* a = (int*)change;  //jmp 25 后面4个字节偏移
     *a = 0;     //偏移填0,表示取jmp指令后8个字节的内容为地址
     change += 4;
    LONGLONG* addres = (LONGLONG*)change;
     *addres = myfuncaddress;
     
     //change += 8;
     //*change = 195;  // C3 = ret   为什么不写ret也没事呢,难道从myfunc返回直接回到main主函数了,没有回到被hook函数
 }
 void myfunc() {
     cout << "messagebox\n";
 }
 int main()
 {
     void* destptr = (void*)GetProcAddress(GetModuleHandleW(L"user32"), "MessageBoxW");
     hook64(destptr, myfunc);
     MessageBoxW(0, L"", L"abc", 0);
    void* destptr1 = (void*)GetProcAddress(GetModuleHandleW(L"kernel32"), "OpenProcess");
     if (destptr1) {
         cout << "1\n";
         hook64(destptr1, myfunc);
         OpenProcess(PROCESS_ALL_ACCESS,0,0);
     }
 }
64位汇编的文章好像比较少,唉,我这个虽然很低级,也不是完全帮不到人吧

浅谈64位进程远程hook技术及64模块导出表的一些变化,附源码_精易论坛










