如何将字符串混淆为c++二进制文件
How can I obfuscate a string into a C++ binary?
如果我有一个包含字符串的c++代码,可以是密码或任何东西,混淆它们以使逆向工程变得非常困难的最好方法是什么?我在网上找到了一些工具,但都不是开源的。
假设您的应用程序使用web服务"www.example.com"并使用密码"letmein"进行身份验证。编译程序并使用strings
、objdump
或其他参数检查:
这很简单。如果您混淆了它,在使用它之前,您仍然需要将纯文本放在内存的某个地方,因此攻击者会执行以下操作之一:
- 拦截网络数据包(简单,需要5分钟的Wireshark基础知识)
- 使用调试器(简单,只需10分钟的GDB基础知识)
- 逆向工程你的源代码(困难,需要几个小时或几天)
请注意,混淆工具只会使攻击者更加困难,因为攻击者已经采取了困难的方式。这有什么意义呢?你所做的就是让攻击者花15分钟而不是5分钟从你的可执行文件中获取密码。既然这是你能做的最好的事情,那就不要太努力了。只要用一些简单的模式对密码进行异或,并希望攻击者非常懒惰或愚蠢。
C-3PO:卢克主人,先生,请原谅我问一下,如果我们在这里被发现,R2和我该怎么办?
Luke:锁上门。
汉·索罗:希望他们没有爆能枪。
C-3PO:这不是很让人放心。
(你可能会比你的攻击者花费更多的时间)
另一方面:如果您试图阻止非root用户访问可信系统上的密码,您可以使用权限&setuid二进制文件。
脚注:混淆器的目的通常是隐藏程序代码,而不是数据。例如,如果您的应用程序使用的算法是商业机密,那么您就需要使用混淆器。
应该避免将密码作为常量放在二进制文件中。它应该是可配置的(例如,通过参数传递的配置文件)。
如果你真的需要把一些密码放在二进制文件中,加密这个密码,并把加密的形式作为一个常量放在你的可执行文件中。但这并不总是安全的(例如,对美国国家安全局不起作用)。
不要相信任何混淆技术,所以不要使用它们。
在Linux和POSIX系统上,一种常见的做法是内置默认的配置文件路径(以及通过程序参数设置该配置文件的方法)。然后配置文件使用系统权限隐藏敏感密码。由于配置文件有一个内置的默认值(通常在/etc
或$HOME
下),您可以在普通情况下启动程序而不需要任何参数。
注意,许多程序是安全的,即使它们的源代码是免费提供的(一个很好的例子是ssh
)。
阅读可信计算基础
需要多安全?
如果你只是想隐藏一个密码(小妹妹的日记安全),那么你可以用一些随机数据进行异或。一个有决心的攻击者可以逆向工程代码并发现这一点,但无论你的解决方案多么复杂,他们都可以做到
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作