【问题标题】:XOR BYTE Array (Shellcode)XOR BYTE 数组(Shellcode)
【发布时间】:2017-10-18 13:17:12
【问题描述】:

我试图通过尝试将 BYTE(无符号字符)直接传递给函数而不先定义它来对 BYTE(无符号字符)执行 XOR 加密。

异或函数:

void xor(BYTE input[], BYTE output[]) {
BYTE key[] = { 'T', 'A', 'M' }; //Can be any chars, and any size array

int i;
for (i = 0; i < sizeof(input); i++) {
    output[i] = input[i] ^ key[i % (sizeof(key) / sizeof(BYTE))];
}

BYTE 数组示例:

BYTE Shellcode[] =
{
    0x48, 0x83, 0xEC, 0x08,                                     
};

问题是我不想在不加密的情况下保存 BYTE 数组,因为它会暴露在内存中。

如何不先定义就直接将 BYTE 数组传递给函数?

使用包含字符串的简单 char 数组当然很容易,但我不知道如何使用整数值而不是字符串文字来传递字节数组。

【问题讨论】:

  • 如果你可以将它作为输入传递给函数,它必须暴露在内存中。如果你使用字符串文字,它也会暴露在内存中(和可执行文件中)。
  • sizeof(input) 是指针的大小,而不是数组的大小。
  • 您的函数已损坏:您不能在函数内部使用sizeof 来确定作为参数传递给该函数的数组的长度。这主要是因为你不能传递一个数组——无论你认为这是你在做什么,实际上你是在传递一个指向第一个数组元素的指针。这样的指针不携带有关数组中元素数量的信息。
  • 有道理,谢谢!猜猜我会硬编码输入长度!
  • 对我来说这还不清楚。您是否在问如何避免数据存储在内存中但仍然可以进入 CPU 并被处理?如果是这样......没有一般的方法可以做到这一点。但在某些系统上,这可能取决于硬件架构。此外,您可能必须编写汇编代码而不是 C。顺便说一句 - 您从哪里获得输入?

标签: c windows encryption xor


【解决方案1】:

问题是我不想在不加密的情况下保存 BYTE 数组,因为它会暴露在内存中。

如何不先定义就直接将 BYTE 数组传递给函数?

你不能这样做。这甚至没有意义。 传递字节取决于它们已经在内存中,对它们执行加密操作也是如此。

此外,如果程序本身应该提供明文,则无法避免明文以某种形式存储在程序图像中。另一方面,如果明文字节是从外部来源获得的,那么您可以考虑在输入它们的位置对其进行加密。根据详细信息,这可能会避免将所有明文同时保存在内存中。

您还可以考虑在加密其内容后擦除输入数组,而不是一开始就避免使用这样的数组。只需用 0 或随机字节覆盖它。但是,这实际上仅对来自外部源的明文有用;程序本身提供的数据无需运行程序即可访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多