【问题标题】:Encrypt in C++ / Decrypt in x86在 C++ 中加密/在 x86 中解密
【发布时间】:2014-10-31 00:29:51
【问题描述】:

我的学校作业有问题。任务是编写一个变形的 Hello World 程序。该程序将生成 10 个打印“Hello World!”的 .com 文件。执行时。 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。任何有关其原因的提示都会有很大帮助。我有一些有趣的垃圾插入计划(实际的变形部分),但我不想继续讨论,直到我弄清楚这个加密/解密问题。

【问题讨论】:

  • 我将程序编译 10 次为.EXE。 PE 头包含链接器设置的日期/时间字段,因此它们中的每一个都是“不同的”程序。 ;)

标签: c++ encryption x86-16


【解决方案1】:

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

for (int i = 15; i

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

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

【讨论】:

  • 我为造成的混乱道歉,我已经意识到“i”被取消了一个,并在我发布后不久改变了它。当 i = 14 时,结果仍然相同。
  • 我会确认您的加密和解密工作如您所愿。首先在外部(创建一个 C 文件来解密这 10 个文件),确认您的 14 字节代码,然后在内部。最后一部分很棘手……几十年前,我只使用 DOS 的 debug,但您可能会看到 DOSBox 调试器是否可以做同样的事情。
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多