У меня проблема со школьным заданием. Задача — написать метаморфическую программу Hello World. Эта программа выдаст 10 .com файлов с надписью «Hello World!» когда выполнено. Каждый из 10 .com файлов должен отличаться от других. Я понимаю концепцию метаморфизма против олигоморфизма против полиморфизма. Моя программа в настоящее время создает 10 .com файлов, а затем записывает машинный код в файлы. Я начал с простого написания только машинного кода, чтобы напечатать привет, и протестировал его. Работало просто отлично. Затем я попытался добавить процедуру расшифровки в начало машинного кода. Вот мой текущий байтовый массив:
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))
BYTE pushCS = 0x0E;
BYTE popDS = 0x1F;
BYTE movDX = 0xBA;
BYTE helloAddr1 = 0x1A;
BYTE helloAddr2 = 0x01;
BYTE movAH = 0xB4;
BYTE nine = 0x09;
BYTE Int = 0xCD;
BYTE tOne = 0x21;
BYTE movAX = 0xB8;
BYTE ret1 = 0x01;
BYTE ret2 = 0x4C;
BYTE movBL = 0xB3;
BYTE keyVal = 0x03; // Encrypt/Decrypt key
typedef unsigned char BYTE;
BYTE data[] = { 0x8D, 0x0E, 0x01, 0xB7, 0x1D, 0xB3, keyVal, 0x30, 0x1C, 0x46, 0xFE, 0xCF, 0x75, 0xF9,
movDX, helloAddr1, helloAddr2, movAH, nine, Int, tOne, movAX, ret1, ret2, Int, tOne,
0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0D, 0x0D, 0x0A, 0x24 };
Часть дешифрования машинного кода представляет собой первые 14 байтов «данных». Эта процедура дешифрования будет принимать зашифрованные байты машинного кода и расшифровывать их, записывая байты с тем же ключом, который использовался для их шифрования. Я шифрую байты в моем коде C ++ с помощью этого:
for (int i = 15; i < ARRAY_SIZE(data); i++)
{
data[i] ^= keyVal;
}
Я снова и снова проверял, что моя адресация правильная, учитывая, что код начинается со смещения 100. Я заметил, что когда keyVal равен 0x00, мой код работает нормально, и я получаю 10 .com файлов, которые печатают Hello World !. Тем не менее, это не приносит мне пользы, так как 0x00 оставляет все без изменений. Когда я предоставляю фактический ключ, такой как 0x02, моя программа больше не работает. Он просто зависает, пока я не закрою DosBox. Любые подсказки относительно причины этого были бы большой помощью. У меня есть некоторые интересные планы по вставке мусора (фактическая метаморфическая часть), но я не хочу переходить к этому, пока не выясню эту проблему шифрования / дешифрования.
Часть дешифрования машинного кода представляет собой первые 14 байтов «данных».
а также
для (int i = 15; i < ARRAY_SIZE (данные); я ++)
не совпадают, так как в C ++ индексы массива начинаются с 0.
В вашем массиве data[15] == helloAddr1
Это означает, что вы не шифруете data[14] == movDX
элемент. Дважды проверьте, какие элементы должны быть зашифрованы, и начните с i = 14
если необходимо.