С++ 64bit dll - Inline Assembly

Тема в разделе "C/C++", создана пользователем Akatosh, 31 мар 2018.

Статус темы:
Закрыта.
  1. Akatosh

    Akatosh Участник

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

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

    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);
    }
    ...
     
    #1 Akatosh, 31 мар 2018
    Последнее редактирование: 31 мар 2018
  2. FYP

    FYP
    not-set

    Регистрация:
    9 мар 2013
    Сообщения:
    1.563
    Симпатии:
    4.051
    проще всего перенести код хука в .asm файл
     
Статус темы:
Закрыта.