在x86中用C ++ / Decrypt加密

时间:2014-10-30 16:22:07

标签: c++ encryption x86-16

我的学校作业有问题。作业是编写一个变形的Hello World程序。该程序将生成10个.com文件,打印" Hello World!"执行时每个10 .com文件必须与其他文件不同。我理解变质与寡形对多态的概念。我的程序当前创建10个.com文件,然后将机器代码写入文件。我开始只是简单地编写机器代码来打印hello world并进行测试。它运作得很好。然后我尝试在机器代码的开头添加解密例程。这是我当前的字节数组:

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

1 个答案:

答案 0 :(得分:0)

  

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

  

for(int i = 15; i&lt; ARRAY_SIZE(data); i ++)

不匹配,因为在C ++数组索引中从0开始。

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