2014-10-30 113 views
0

我在学校任务时遇到问题。这个任务是编写一个变形的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。任何关于这个原因的提示都会有很大的帮助。我有一些有趣的垃圾插入计划(实际的变形部分),但我不想继续讨论,直到我找出这个加密/解密问题。

+0

我只是将程序编译为'.EXE' 10次。 PE头包含链接器设置的日期/时间字段,因此它们中的每一个都将是“不同的”程序。 ;) – Damon 2014-10-30 19:06:27

回答

0

机器码的解密部分是“数据”的前14个字节。

的for(int i = 15;我< ARRAY_SIZE(数据);我++)

不匹配,因为在C++数组索引为0

开始

在你的数组data[15] == helloAddr1这意味着你没有加密data[14] == movDX元素。仔细检查哪些元素应该加密,并在需要时从i = 14开始。

+0

我对这种混乱表示歉意,我已经意识到“我”在我的职位后不久就改变了。虽然当我= 14,结果仍然是相同的。 – Topgun122104 2014-10-30 16:45:58

+0

我会确认你的加密和解密如你所愿。首先从外部(创建一个C文件来解密10个文件),确认14个字节的代码,然后在内部。最后一部分是棘手的......几十年前,我只是使用DOS的“调试”,但你可能会看到DOSBox调试器是否可以做同样的事情。 – uesp 2014-10-30 16:55:09