С++ 64bit dll - Inline Assembly

Статус
В этой теме нельзя размещать новые ответы.

Akatosh

Известный
Автор темы
21
0
Появилась потребность перевести свой dll с 32 бит на 64 (т.к. для инъекции в x64 приложение нужна 64 битная dll).
Простые функции записи значения в адрес и изменения инструкции (например заполнение кода NOP'ами) перевелись и работают нормально, но на ассемблерную вставку (__asm) компилятор ругается - гугл говорит, что в VS 64 битной версии такой возможности нет. Но мне это нужно для инъекции кода.
Хотел бы узнать, как это все делается для 64 бит в Visual Studio?

P.S. Пример на 32 битной версии:

C++:
DWORD jumpBack;
void _declspec (naked) hpFilter()
{
    __asm
    {
        cmp [ebx+10],1
        je sled
        mov [ebx+4],eax
        sled:
        fldz
        jmp [jumpBack]
    }
}

bool Hook(void * toHook, void* ourFunct, int len)
{
    DWORD curProtection;
    DWORD temp;
    VirtualProtect(toHook, len, PAGE_EXECUTE_READWRITE, &curProtection);

    memset(toHook, 0x90, len);
    DWORD relativeAddress = ((DWORD)ourFunct - (DWORD)toHook)-5;

    *(BYTE*)toHook = 0xE9;
    *(DWORD*)((DWORD)toHook + 1) = relativeAddress;
 
    VirtualProtect(toHook, len, curProtection, &temp);
    return true;
}
...
if (GetAsyncKeyState(VK_NUMPAD1))
{
        DWORD hookAddress = ((uint32_t)BASEADDR) + 0x265B7;  // Адрес инструкции ( mov [ebx+4],eax)
        jumpBack = hookAddress + 5;
        Hook((void*)hookAddress, hpFilter, 5);
}
...
 
Последнее редактирование:

FYP

Известный
Администратор
1,757
5,684
проще всего перенести код хука в .asm файл
 
Статус
В этой теме нельзя размещать новые ответы.