Как встроить сборку в C ++? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь внедрить некоторую сборку в приложение, но я получаю ошибки в этой строке: Вот полный код

#define _TOJUMP 0xCDFA43 

BYTE bak_InitDamageBuff[6];

void unHook(BYTE* from, BYTE* backup, size_t size) {
    DWORD protect;
    VirtualProtect(from, size, PAGE_EXECUTE_READWRITE, &protect);
    memcpy(from, backup, size);
    VirtualProtect(from, size, protect, &protect);
}

void Hook(BYTE* from, void* to, BYTE* backup, size_t size) {
    DWORD protect;
    VirtualProtect(from, size, PAGE_EXECUTE_READWRITE, &protect);
    memcpy(backup, from, size);
    DWORD diff = ((DWORD)to - (DWORD)from) - size;
    memset(from, 0x90, size);
    *(BYTE*)from = 0xE9;
    *(DWORD*)((DWORD)from + 1) = diff;
    VirtualProtect(from, size, protect, &protect);
}

DWORD return_address = _TOJUMP + 0x6;
static __declspec(naked) void NewInitDamageBuff() {
    _asm {
        mov [edx + 0x29D0], 0x‭0F4240‬;    <-------------
        jmp return_address;
    }
}

void Main_thread() {
    while (1) {
        Hook((PBYTE)_TOJUMP, &NewInitDamageBuff, bak_InitDamageBuff, 6);
    }
}

Что с ним не так?

Компилятор Visual Studio

Я использую его на португальском языке, но я постараюсь перевести ошибки

- неверный суффикс на число

- целое число литералов должно быть как минимумодно число

  • что-то плохой токен

1 Ответ

0 голосов
/ 10 октября 2018

В вашем 0x‭0F4240‬ есть несколько не-ASCII символов;это то, что давит MSVC.


Встроенный ассемблер MSVC принимает числовые литералы в шестнадцатеричном формате 0xDEADBEEF в стиле C (в отличие от MASM), поэтому ваш ассм выглядит так, как будто он должен компилироваться / собираться.(Полезно это или нет - другое дело.)

Сообщения об ошибках:

<source>(9): error C2059: syntax error: 'bad suffix on number'
<source>(9): error C2153: integer literals must have at least one digit
<source>(9): error C3872: '0xac': this character is not allowed in an identifier
<source>(9): error C2400: inline assembler syntax error in 'second operand'; found 'bad token'

Я включил вашу функцию в проводник компилятора Godbolt , чтобы получить фактическийсообщения об ошибках, с typedef для DWORD, потому что у Godbolt нет Windows.h для его определения.

typedef unsigned long DWORD;
#define _TOJUMP 0xCDFA43

DWORD return_address = _TOJUMP + 0x6;
static __declspec(naked) void NewInitDamageBuff() {
    _asm {
        mov [edx + 0x29D0], 0x‭0F4240‬;   // original
        mov [edx + 0x29D0], 0x0F4240;   // retyped compiles fine if you comment out the original
        jmp return_address;
    }
}

Эти сообщения об ошибках заставили меня думать, что там был не-ASCII символвключите и скопируйте / вставьте в hexdump -C на моем рабочем столе Linux, чтобы подтвердить это:

00000000  6d 6f 76 20 5b 65 64 78  20 2b 20 30 78 32 39 44  |mov [edx + 0x29D|
00000010  30 5d 2c 20 30 78 e2 80  ad 30 46 34 32 34 30 e2  |0], 0x...0F4240.|
00000020  80 ac 3b 0a                                       |..;.|

(. на стороне вывода ASCII означает непечатный байт).

Итак, сразу после 0x в операнде-источнике mov, есть последовательность 80 ad 30 3-байтового UTF-8, которая, очевидно, не печатается как что-либо.

...