На x86 делаю так: Код (Text): char* pFunc = (char*) GetProcAddress( hModule, FunctionName ); char* pAddr1 = pFunc + 1 + sizeof( int ); char* pAddr2 = (char*) &MyFunction; int RelativeAddr = pAddr2 - pAddr1; char arr[ 1 + sizeof( RelativeAddr ) ]; arr[ 0 ] = (char) 0xE9; // JMP absolute memcpy( arr + 1, &RelativeAddr, sizeof( RelativeAddr ) ); SIZE_T bytesWritten; WriteProcessMemory( GetCurrentProcess(), pFunc, arr, sizeof( arr ), &bytesWritten ); Как написать аналогичный перехват на x64?
Видимо надо использовать команду FF /4 JMP r/m64 Jump near, absolute indirect, RIP = 64-Bit offset from register or memory но не знаю, как машинными кодами сослаться на память, где сохранен адрес функции
Давайте подробнее, я раз в год программируемую на ассемблере, фасма нет, зато есть VS2010. Как смоделировать jmp не понимаю, если писать в коде goto label на метку в своем коде, то C++ использует переход E9 на четырехбайтовое смещение относительно текущего адреса, а мне нужен переход на далекий адрес. Можно посмотреть на call, он похоже кодируется FF /2 CALL r/m64 Call near, absolute indirect, address given in r/m64. В отладчике вижу такое Код (Text): // Получаю адрес функции, которая может находиться далеко от текущего кода, дальше 4 млрд. байт FARPROC fp= GetProcAddress( hModule, FunctionName ); 000000013F57F15A lea rdx,[string FunctionName (13F59AA90h)] 000000013F57F161 mov rcx,qword ptr [rsp+30h] 000000013F57F166 call qword ptr [__imp_GetProcAddress (13F5A9070h)] 000000013F57F16C mov qword ptr [rsp+38h],rax // Смотрим, как C++ делает вызов fp(); 000000013F57F171 call qword ptr [rsp+38h] Смотрим в память Код (Text): 0x000000013F57F171 ff 54 24 38 48 8d 15 14 b9 01 00 48 8b Пожалуйста, видим FF, следующие байты объясняют, что именно эти FF делают, откуда берется адрес, даже +38h видны. Пока не понятно, как эти упражнения помогут добиться перехвата на x64.
фасм ставить 30 секунд. Ты пост гораздо дольше писал, уже давно бы глянул как он генерирует прыжки. Код (Text): use64 jmp far [rax] генерирует: 0xFF , 0x28 Код (Text): use64 call far [rax] 0xFF , 0x18 запишите в начало функции: Код (Text): use64 mov rax ,123456789h;offset of hook jmp rax Сгерененый код: 0x48, 0xB8, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xE0 это самое простое что есть.