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

时间:2011-11-26 20:34:23

标签: c++ string passwords obfuscation

如果我有一个包含字符串的C ++代码,可以是密码或任何东西,那么混淆它们以使逆向工程变得非常困难的最佳方法是什么? 我在网上找到了一些工具,但都不是开源的。

3 个答案:

答案 0 :(得分:7)

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

不要相信任何混淆技术,所以不要使用它们。

在Linux和POSIX系统上,常见的做法是为配置文件的路径设置内置默认值(以及通过程序参数设置该配置文件的方法)。然后配置文件使用系统权限隐藏敏感密码。由于配置文件具有内置默认值(通常在/etc$HOME下),因此可以启动程序而不需要任何常见情况的参数。

请注意,许多程序都是安全的,即使它们的源代码是免费提供的(一个很好的例子是ssh)。

了解trusted computing base

答案 1 :(得分:7)

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

$ make
$ objdump -j .rodota -s program
a.out:     file format elf64-x86-64

Contents of section .rodata:
 4005f8 01000200 7777772e 6578616d 706c652e  ....www.example.
 400608 636f6d00 6c65746d 65696e00           com.letmein.  

$ strings program
/lib64/ld-linux-x86-64.so.2
__gmon_start__
...
www.example.com
letmein

这很简单。如果你对它进行模糊处理,你仍然需要在使用它之前将纯文本放在内存中,所以反过来攻击者会执行以下操作之一:

  • 拦截网络数据包(简单,基本知识需要5分钟Wireshark)
  • 使用调试器(使用GDB基础知识,简单,需要10分钟)
  • 反向设计您的源代码(很难,需要数小时或数天)

请注意,混淆工具只会让那些已经很难做到的攻击者变得更难。那是什么意思?你所做的就是让攻击者从你的可执行文件中获取密码需要15分钟,而不是说5分钟。因为这是你能做的最好的事情,所以不要太努力。只需将密码与一些简单的模式进行异或,并希望攻击者非常懒惰或愚蠢。

  

C-3PO:卢克大师,先生。请原谅我,但如果我们在这里被发现,R2和我应该怎么做?   卢克:锁上门    Han Solo:希望他们没有爆破    C-3PO:这不是很让人放心。

(你最终可能会花费更多的时间来攻击这个攻击者。)

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

脚注:混淆器的目的一般是隐藏程序代码,而不是数据。例如,如果您的应用程序使用的是商业秘密算法,那就是您希望使用混淆器的时候。

答案 2 :(得分:3)

它需要多安全?

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

相关问题