2017-10-18 160 views
-2

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

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数组到函数中而不先定义它?

用一个简单的字符数组包含字符串它当然会很容易,但我无法找出如何传递字节数组与整数值,而不是字符串文字。

+0

如果您可以将其作为输入传递给函数,则必须将其显示在内存中。如果使用字符串文字,它也会在内存中(和可执行文件中)公开。 – interjay

+2

'sizeof(input)'是指针的大小,而不是数组的大小。 – mch

+0

你的函数被破坏了:你不能在函数中使用'sizeof'来确定传递给该函数的数组的长度作为参数。这主要是因为你*不能传递一个数组 - 无论你认为你在做什么,你实际上是在传递一个指向第一个数组元素的指针。这样的指针不会携带有关数组中元素数量的信息。 –

回答

0

问题是我不想保存字节数组而不加密它,因为它会在内存中显示。

我怎么能直接传递BYTE数组到函数中而不先定义它?

你不能这样做。它甚至没有意义。 传递这些字节取决于是否已将它们存储在内存中,并且对它们执行加密操作也是如此。另外,如果程序应该提供明文本身,那么就不能避免以某种形式将明文存储在程序映像中。另一方面,如果明文字节是从外部源获得的,那么你可以考虑在你输入它们的地方对它们进行加密。根据具体情况,这可能会避免同时在内存中存储所有明文。

您也可以考虑在加密内容后擦除输入数组,而不是首先避免使用这样的数组。用0或随机字节覆盖它。然而,这对于来自外部来源的明文的情况确实是有用的。由程序本身提供的数据甚至不需要运行该程序即可访问。