我在学校任务时遇到问题。这个任务是编写一个变形的Hello World程序。该程序将生成10个可打印“Hello World!”的.com文件。执行时。 10个.com文件中的每个文件都必须与其他文件不同。我理解变态vs寡态vs多态的概念。我的程序目前创建10个.com文件,然后将机器码写入文件。我开始时只写了机器代码来打印hello world并测试它。它工作得很好。然后我试着在机器码的开头添加一个解密程序。这里是我当前的字节数组:在C++中加密/解密在x86中
#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个打印Hello World!的.com文件。然而,这对我来说并不好,因为0x00将一切都保持不变。当我提供像0x02这样的实际密钥时,我的程序不再有效。它只是挂起,直到我关闭了DosBox。任何关于这个原因的提示都会有很大的帮助。我有一些有趣的垃圾插入计划(实际的变形部分),但我不想继续讨论,直到我找出这个加密/解密问题。
我只是将程序编译为'.EXE' 10次。 PE头包含链接器设置的日期/时间字段,因此它们中的每一个都将是“不同的”程序。 ;) – Damon 2014-10-30 19:06:27