1

警告:C++ 菜鸟

我在 StackOverflow 上阅读了多篇关于字符串加密的文章。顺便说一句,他们没有回答我的疑问。我必须在我的代码中插入一两个硬编码字符串,但我希望在调试/逆向工程时难以以纯文本形式阅读。这还不是全部:我的字符串是 URL,所以一个简单的数据包分析器 (Wireshark) 可以读取它。我说过很难,因为我知道,当代码运行时,字符串在某个地方(在 RAM 中?)被解密为纯文本并且有人可以读取它。那么,假设不可能完全保护我的字符串,那么在 C++ 中加密/解密它的最佳方法是什么?我在想这样的事情:

//I've omitted all the #include and main stuff of course...
string encryptedUrl = "Ajdu67gGHhbh34590Hb6vfu6gu" //Encrypted url with some known algorithm
URLDownloadToFile(NULL, encryptedUrl.decrypt(), C:\temp.txt, 0, NULL);

数据包分析呢?我确定没有办法隐藏 URL,但也许我遗漏了什么?谢谢你,对不起我最糟糕的英语!

编辑1:我的应用程序做什么?

这是一个简单的登录脚本。我的应用程序从 URL 下载文本文件。此文件包含使用 fstream 库读取的加密字符串。然后该字符串被解密并用于登录另一个站点。它非常弱,因为没有数据库,没有盐,没有散列。我的成就是确保从二进制的静态分析中读取 url 和登录字符串都不是“容易”的,并且可能通过动态分析(调试、逆向工程等)尽可能难。

4

2 回答 2

5

如果您想阻止数据包检查器,最低要求是使用带有硬编码服务器证书的 https,该证书已嵌入您的应用程序。

加密应用内内容没有灵丹妙药。无论您做什么,具有正确技能的坚定黑客都会获得简单的网址。你所能期望的最好的就是让它变得足够困难,以至于大多数人都会放弃。实现这一点的方法是实现多种不同的混淆和绊线技术。包括但不仅限于:

  1. 将部分加密的 url 和密码(最好是一次性密钥)存储在不同的位置,并在代码中将它们组合在一起。
  2. 将加密的部分隐藏在看起来与这些部分无法区分的大随机字符串中。
  3. 将零件零碎地放在一起。例如,将加密 url 的第一个和第二个三分之一从一个初始化函数连接到一个缓冲区中,将此缓冲区与最后三分之一连接到另一个不相关的 init 函数中,并在另一个函数中使用最终连接,所有这些都从不同的随机调用在你的代码中的地方。
  4. 检测应用程序何时在调试器下运行,并具有不同的功能在不同的时间丢弃加密的内容。
    • 应该使用不同的技术在不同的调用站点进行检测,而不是通过调用单个“DetectDebug”函数或测试全局布尔值,这两者都会产生单点攻击。
  5. 不要为相关函数使用明显的名称,例如“DecryptUrl”。
  6. 从看似无关但一致的来源中获取部分密钥。例如,读取时钟并仅使用几个高位(足够高以至于它们在可预见的未来不会改变,但足够低以至于它们不全为零),或者使用非易失性的随机采样初始化代码的结果。

这只是冰山一角,只会让新手远离气味。这一切都不会阻止,甚至显着减慢熟练的攻击者,他们只会使用隐形调试器拦截对 SSL 库的调用。因此,您必须问自己:

  1. 保护这个 url 对我有多大价值,以及免受什么样的攻击者的攻击?
  2. 我可以以某种方式更改系统设计,以便我不需要保护 url 吗?
于 2013-10-01T11:13:24.943 回答
0

试试 XorSTR [ 1 , 2 ]。这是我试图阻碍静态分析时使用的方法。大多数结果将来自游戏作弊论坛,也有一个 html 生成器。

然而,正如其他人所提到的,对于在 URLDownloadToFile 上放置断点的任何人来说,获取字符串仍然很容易。但是,如果他们尝试进行静态分析,您会让他们的生活变得更加艰难。

我不确定你的 URL 是做什么的,你的目标是什么,但是 XorStr + 反调试 + 打包二进制文件会阻止大多数业余爱好者对你的应用程序进行逆向工程。

于 2013-10-01T11:38:00.110 回答