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

How can I obfuscate a string into a C++ binary?

本文关键字:c++ 二进制文件 字符串      更新时间:2023-10-16

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

假设您的应用程序使用web服务"www.example.com"并使用密码"letmein"进行身份验证。编译程序并使用stringsobjdump或其他参数检查:

<>之前让美元$ objdump -j .rodota -s程序A.out:文件格式elf64-x86-64rodata节的内容:4005f8 01000200 7777772e 6578616d 706c652e ....www.example。400608 636f6d00 6c65746d 65696e00 com.letmein。$ strings程序/lib64/ld - linux - x86 - 64. - so.2__gmon_start__…www.example.comletmein之前

这很简单。如果您混淆了它,在使用它之前,您仍然需要将纯文本放在内存的某个地方,因此攻击者会执行以下操作之一:

  • 拦截网络数据包(简单,需要5分钟的Wireshark基础知识)
  • 使用调试器(简单,只需10分钟的GDB基础知识)
  • 逆向工程你的源代码(困难,需要几个小时或几天)

请注意,混淆工具只会使攻击者更加困难,因为攻击者已经采取了困难的方式。这有什么意义呢?你所做的就是让攻击者花15分钟而不是5分钟从你的可执行文件中获取密码。既然这是你能做的最好的事情,那就不要太努力了。只要用一些简单的模式对密码进行异或,并希望攻击者非常懒惰或愚蠢。

C-3PO:卢克主人,先生,请原谅我问一下,如果我们在这里被发现,R2和我该怎么办?
Luke:锁上门。
汉·索罗:希望他们没有爆能枪。
C-3PO:这不是很让人放心。

(你可能会比你的攻击者花费更多的时间)

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

脚注:混淆器的目的通常是隐藏程序代码,而不是数据。例如,如果您的应用程序使用的算法是商业机密,那么您就需要使用混淆器。

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

如果你真的需要把一些密码放在二进制文件中,加密这个密码,并把加密的形式作为一个常量放在你的可执行文件中。但这并不总是安全的(例如,对美国国家安全局不起作用)。

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

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

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

阅读可信计算基础

需要多安全?

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