如何将字符串混淆为C ++二进制文件?

问题描述 投票:5回答:3

如果我有一个包含字符串的C ++代码,该字符串可以是密码,也可以是其他任何东西,最好的方法是对它们进行模糊处理,使反向工程非常困难?我在线上找到了一些工具,但是它们都不是开源的。

c++ string passwords obfuscation
3个回答
7
投票

假设您的应用程序使用Web服务“ www.example.com”并使用密码“ letmein”进行身份验证。编译程序,然后使用stringsobjdump或其他方法进行检查:

$使$ objdump -j .rodota -s程序a.out:文件格式elf64-x86-64.rodata节的内容:4005f8 01000200 7777772e 6578616d 706c652e .... www.example。400608 636f6d00 6c65746d 65696e00 com.letmein。$字符串程序/lib64/ld-linux-x86-64.so.2__gmon_start__...www.example.com让我进去

这很容易。如果混淆了它,则仍需要将纯文本放入内存中,然后才能使用它,因此攻击者将执行以下操作之一:

  • 拦截网络数据包(使用基础知识Wireshark容易,只需5分钟)
  • 使用调试器(简单,只需10分钟就可以掌握GDB的基本知识)
  • 对您的源代码进行反向工程(困难,需要花费数小时或数天的时间]

请注意,混淆工具使仅对于已经采用困难方式进行攻击的攻击者更加困难。那是什么意思?您要做的就是让攻击者从可执行文件中获取密码只需15分钟,而不是5分钟。由于这几乎是您可以做的最好的事情,所以不要为此而努力。只需使用一些简单的模式对密码进行异或操作,并希望攻击者非常懒惰或愚蠢。

C-3PO:卢克大师,先生。请原谅我,但是如果我们在这里被发现,R2和我应该怎么办?卢克:锁好门。[汉·索罗(Han Solo):希望他们没有爆炸者。C-3PO:不太令人放心。

((您可能最终会花比攻击者更多的时间。)

另一方面:如果您试图阻止非root用户访问受信任系统上的密码,则可以使用权限和setuid二进制文件来进行。

脚注:

混淆器的目的通常是隐藏程序code,而不是数据。例如,如果您的应用程序使用的算法是商业秘密,那就是您希望使用混淆器的时间。

6
投票

您应避免将密码作为常量放入二进制文件中。它应该是可配置的(例如,通过传入参数的配置文件)。


3
投票

它需要有多安全?

如果您只想隐藏密码(小妹妹的日记安全性),则可以将它与一些随机数据进行异或。坚定的攻击者可以对代码进行反向工程并发现它,但是无论您的解决方案多么复杂,他们都可以这样做。

© www.soinside.com 2019 - 2024. All rights reserved.