Как встроить в C++ самоизменяющийся ассемблерный код?

Как бы это встроить в функцию C++.

0041F84E   . 7B 02          JPO SHORT Unmodifi.0041F852
0041F850     B8             DB B8
0041F851     00             DB 00
0041F852   . 8B46 38        MOV EAX,DWORD PTR DS:[ESI+38]
0041F855   . 8B56 24        MOV EDX,DWORD PTR DS:[ESI+24]
0041F858   . 8B4E 10        MOV ECX,DWORD PTR DS:[ESI+10]
0041F85B   . 81EA 8B4B8636  SUB EDX,36864B8B

Как бы я положил DB B8DB 00

void test() {
    __asm {
        ...
        JPO label_0041F852
        __emit 0xB8
        __emit 00
label_0041F852:
        MOV EAX,DWORD PTR DS:[ESI+0x38]
        MOV EDX,DWORD PTR DS:[ESI+0x24]
        MOV ECX,DWORD PTR DS:[ESI+0x10]
        SUB EDX,0x36864B8B
        ...
    }
}

ошибка C2400: ошибка синтаксиса встроенного ассемблера в 'код операции'; найдена "константа" Ошибка выполнения cl.exe.

Я не думаю, что я могу положить это в .data раздел, я прочитал, вот и все, что я могу сделать, чтобы включить байты, как это.

1 ответ

Решение

Это комментарий длиной в ответ, чтобы ответить на запрос SSpoke для примера. Давным-давно, когда эмуляция машин Тьюринга была крутой вещью, я написал программу-эмулятор машин Тьюринга для поиска занятых бобров на миникомпьютере DEC Vax. Когда программа решила, какую машину Тьюринга использовать дальше, она скомпилировала машинный код для машины Тьюринга в массив и вызвала массив, как если бы это была функция. (Все это было написано в C.)

Это самоизменяющийся код. Чтобы запустить его, вам нужна область памяти, которая может быть одновременно записана и выполнена.

Ваш код не является самоизменяющимся - вы вообще не пишете в него. Таким образом, вы можете запустить его в программном сегменте только для чтения.

Другие вопросы по тегам