C-如何基本上将文本加密到精灵二进制中



我已经看到了一些二进制文件,其中开发人员似乎有点偏执,并使二进制中的所有文本混淆了。我以前从未见过类似的东西,也没有找到任何明显的选择来用隐藏的文字编译小精灵。甚至标准的OS API字符串也被隐藏了,鉴于通常可见。

这些程序运行时不会完全没有任何文本。除了未知文本。但是隐藏了整个地段,只是危险信号,它看起来很可疑。

是否有简单的方法将被编译成精灵的文本隐藏?无论是简单的编译器/链接选项。我想可以在main((上插入一个解码器,但是如何轻松编码文本部分?

我可以想象一种自定义方法是用密钥在代码中使用隐式解码器。然后使用该键来编码精灵的文本。使其很容易编码。

您必须一直在查看压缩可执行文件。

有多种工具可压缩可执行文件并在加载时间解压缩它们,例如for Linux的upx。二进制文件中的大多数文本都无法读取肉眼,但是请注意,隐藏敏感数据是一种非常无效的方法,因为黑客毫无困难地将可执行文件解压缩以访问实际数据。

> 。

使用可执行文件中的加密字符串,其内容将在构建过程中由脚本生成是一种更好的方法,但是解密它们的代码仍必须在可执行文件中的某个地方可用,很难找到。如果数据足够有价值(数据库密码,比特币密钥...(,黑客将获得它。

我猜想,"文本"是指人类可读文本(而不是代码段又称文本段(。

您只能对其进行加密或将其混淆为仅读取

const char encrypted_text[] = {
  // a lot of encrypted bytes like 0x01, 0x43, etc
  // the C file containing that would be generated by some script
};

然后,您将使用De-Obfuscation或解密程序来获取真实的(未脱落(文本。

我不确定是否值得麻烦。生活太短了。

在分析恶意软件时,我通常会看到这一点。作者这样做是为了防止静态分析工具(例如strings(工作。此外,此类作者可能会使用dlopendlsym加载功能来获得所需的功能。

例如,在下面的代码段中;

printf("Hello World");

我会在strings的输出中看到字符串" Hello World",并且通过查看Elf文件的导入部分,我会看到该程序正在使用printf。因此,如果不运行程序,就有可能了解其正在做的事情。

现在假设作者写了一个函数char* decrypt(int)。此功能将索引输入刺痛表中(每个字符串是加密的(,并返回解密的字符串。上面的一行代码现在概念上看起来像

void* pfile = dlopen(decrypt(3));
void* pfunct = dlsym(pfile, decrypt(15));
pfunct(decrypt(5));

再次,请记住,以上内容更接近伪代码,然后实际上可编译代码。现在,在这种情况下,使用静态分析工具,我们将看不到字符串或函数名称(在"导入部分"中(。

此外,如果我们试图对代码进行反向工程,则需要花费一些时间来解密字符串并通过逻辑进行工作以确定调用哪些功能。这并不是说这不能做到,而是会放慢分析师的速度,这意味着在创建恶意软件的缓解措施之前会更长。

现在是您的问题;

是否有简单的方法将被编译成精灵的文本隐藏?是 带有简单的编译器/链接选项。我想一个解码器可能是 在main((中插入,但是如何轻松编码文本部分?

没有编译器/链接器选项可以执行此操作。其中的作者需要选择这样做,在上面编写适当的功能(即解密(,并编写一个实用程序来产生字符串的加密形式。此外,正如其他人所建议的那样,一旦完成,整个应用程序都可以加密/压缩(想想自提取的zip文件(,因此,您最初使用静态分析工具的唯一一件事就是解密文件解密的存储。

请参阅https://www.ioactive.com/pdfs/zeusspyeyebankingtrojananalysis.pdf。(授予这是基于Windows的,但是加密和动态加载功能的技术是相同的。请查看API呼叫的部分(

如果有兴趣,您也可以看到;

最新更新