我已经看到了一些二进制文件,开发人员看起来有点偏执,并且混淆了二进制文件中的所有文本。我之前没有看到类似的东西,也没有找到任何明显的选项来编译隐藏文本的ELF。甚至标准的OS API字符串都被隐藏了,因为它们通常是可见的,所以很奇怪。
这些程序在运行时不会完全暴露任何文本。除了未知文本。但隐藏整个地段只是红旗,这让它看起来很可疑。
是否有简单的方法可以隐藏编译成ELF的文本?使用简单的编译器/链接选项。我想可以在main()处插入一个解码器,但文本部分怎么可以轻松编码?
我可以想象一种自定义的方法是在代码中使用密钥隐式解码器。然后使用该键来编码ELF的文本。这样很容易编码。
答案 0 :(得分:2)
您一定在查看压缩的可执行文件。
有许多工具可用于压缩可执行文件并在加载时解压缩它们,例如Linux的.wim
。二进制文件中的大多数文本将变得难以理解,但请注意,隐藏敏感数据是一种非常无效的方法,因为黑客可以毫不费力地解压缩可执行文件以获取对实际数据的访问权。
在可执行文件中使用加密字符串,其内容将在构建过程中由脚本生成,这是一种更好的方法,但解密它们的代码仍必须在可执行文件的某个位置可用,更难以找到。如果数据足够有价值(数据库密码,比特币密钥......),黑客就会得到它。
答案 1 :(得分:1)
我想通过" text"你的意思是人类可读的文字(而不是code segment a.k.a.文本片段)。
您可以将其加密或混淆为只读
const char encrypted_text[] = {
// a lot of encrypted bytes like 0x01, 0x43, etc
// the C file containing that would be generated by some script
};
然后,您将使用您的去混淆或解密例程来获取真实的(未加密的)文本。
我不确定这是值得的。生命太短暂了。
答案 2 :(得分:1)
我在分析恶意软件时通常会看到这一点。作者这样做是为了防止像strings
这样的静态分析工具工作。此外,此类作者可能会使用dlopen
和dlsym
来加载函数,以获取所需的函数。
例如,在下面的代码段中;
printf("Hello World");
我会在strings
的输出中看到字符串“Hello World”,通过查看elf文件的import部分,我会看到该程序正在使用printf
。因此,如果不运行该程序,就可以了解它正在做什么。
现在假设作者写了一个函数char* decrypt(int)
。此函数将索引转换为sting表(每个字符串都加密)并返回解密的字符串。上面一行代码现在概念看起来像
void* pfile = dlopen(decrypt(3));
void* pfunct = dlsym(pfile, decrypt(15));
pfunct(decrypt(5));
同样,请记住上面的内容更接近于伪代码,然后是实际可编译的代码。现在在这种情况下使用静态分析工具,我们不会看到字符串或函数名称(在导入部分中)。
此外,如果我们试图对代码进行反向工程,我们需要花时间来解密字符串并通过逻辑来确定调用哪些函数。并不是说这不可能做到,但它会减慢分析师的速度,这意味着在恶意软件的缓解创建之前它会更长。
现在问你的问题;
是否有简单的方法可以隐藏编译成ELF的文本?是的 简单的编译/链接选项。我想解码器可能是 插入main()但文本部分如何轻松编码?
没有编译器/链接器选项可以执行此操作。作者需要选择这样做,在上面编写适当的函数(即解密)并编写一个实用程序来生成字符串的加密形式。另外,正如其他人建议的那样,整个应用程序可以加密/压缩(想想一个自解压zip文件),因此你最初用静态分析工具看到的唯一的东西就是解密文件解压缩的存根
请参阅https://www.ioactive.com/pdfs/ZeusSpyEyeBankingTrojanAnalysis.pdf以获取此示例。 (授予这是基于Windows的,但加密和动态加载函数的技术是相同的。查看API调用部分)
如果有兴趣你也可以看到; https://www.researchgate.net/publication/224180021_On_the_analysis_of_the_Zeus_botnet_crimeware_toolkit和https://arxiv.org/pdf/1406.5569.pdf