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