Как встроить в C ++ самоизменяющийся ассемблерный код? - PullRequest
0 голосов
/ 22 октября 2011

Как бы я встроил это в функцию 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 B8 DB 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 Ответ

2 голосов
/ 24 октября 2011

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

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

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

...