如何在exe或dll中隐藏字符串?

Win*_*inz 31 c++ security obfuscation defensive-programming reverse-engineering

我发现可以从二进制文件中提取硬编码字符串.
例如,Process Explorer的属性视图显示超过3个字符的所有字符串.

这是我编写的简单可执行文件的代码,只是为了测试它:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
    for (int i= 0; i<argc; i++) {
        if (0 == _tcscmp(argv[i],hiddenString1)) {
            _tprintf (_T("The guid argument is correct.\n")); }
        else if (0 == _tcscmp(argv[i],hiddenString2)) {
            _tprintf (_T("Do something here.\n")); }
    }

    _tprintf (_T("This is a visible string.\n"));
    //Keep Running
    Sleep(60000);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

字符串可以清楚地从相应的可执行文件中提取:
替代文字

我认为找到字符串有点太容易了.

我的问题是:

  1. 如何简单地隐藏hiddenString1hiddenString2在可执行文件?
  2. 是否有一种更安全的方式来使用"作弊码"而不是一些模糊的隐藏输入?

Not*_*tMe 29

欢迎来到更广阔的防御性节目世界.

有几个选项,但我相信所有这些选项都依赖于某种形式的混淆; 虽然不完美,但至少是某种东西.

  1. 您可以将文本存储为其他二进制形式(十六进制?),而不是直字符串值.

  2. 您可以加密存储在应用程序中的字符串,然后在运行时解密它们.

  3. 您可以在代码中的各个点上拆分它们,然后重新构建.

或者它们的一些组合.

请记住,有些攻击比看实际的二进制文件更进一步.有时他们会在程序运行时调查程序的内存地址空间.MS 在.Net 2.0中提出了一个名为SecureString的东西.目的是在应用程序运行时保持字符串加密.

第四个想法是不将字符串存储在应用程序本身中,而是依赖于将验证代码提交给您控制的服务器.在服务器上,您可以验证它是否是合法的"作弊代码".

  • 不错的选择.由于提问者特别关注隐藏Windows GUID字符串 - 这只是一个十六进制数字 - 该数据也可以存储为几个整数. (2认同)

Eur*_*lli 19

有许多方法可以隐藏可执行文件中的数据.这里的其他人发布了很好的解决方案 - 有些比其他更强 我不会添加到该列表中.

要知道:这一切都猫捉老鼠的游戏:这是不可能的,以保证没人会发现你的"秘密".

无论你使用多少加密或其他技巧; 无论你付出多少努力或金钱.无论有多少"NASA/MIT/CIA/NSA"类型都涉及隐藏它.

这一切都归结为简单的物理学:
如果任何用户都无法从可执行文件中提取你的秘密并"取消隐藏"它,那么计算机也无法取消隐藏它,并且你的程序将无法用它.任何有足够激励的中等熟练的开发人员都会找到取消隐藏秘密的方法.

您将可执行文件交给用户的那一刻,他们拥有了解秘密所需的一切.

你可以期待的最好的事情就是让你很难发现一个秘密,即你知道这个秘密可以获得的任何好处变得不值得麻烦.

因此,如果数据仅仅是"不好"而无法公开,或者如果它变为公共的后果只是"不方便",那么可以试图模糊数据.但是,甚至不要想在程序中隐藏"主客户端数据库的密码",私钥或其他一些关键秘密.你不能.

如果你有一个真正关键的秘密信息,你的程序将以某种方式需要但不应该成为公共信息(如私钥),那么你需要让你的程序与你控制的远程服务器通信,应用适当的身份验证和授权控制(也就是说,确保只有经批准的人员或计算机能够向服务器发出请求),并让该服务器保守秘密并使用它.


Rob*_*b K 9

最简单的方法是使用像xor或rot-13这样简单的东西加密它们,然后在使用时动态解密它们.这将消除对它们的随意观察,但它不会阻止任何有逆转经验的人.

  • 没有什么能真正阻止任何有逆转经验的人,就此而言;) (6认同)
  • 由于它们必须在内存中具有解密密钥才能运行程序,因此AES也不会阻止它们. (2认同)

And*_*ler 6

除了这些方法,Chris还提到你也可以使用散列算法.如果您只想检查是否指定了正确的ID,则实际上并不需要将整个ID存储在程序中.

  • 创建要比较的字符串/密码/ id的哈希值(MD5,SHA等),也可以为其添加"salt"值.将其存储在您的程序中
  • 运行程序时,对输入字符串/密码/ id执行相同的算法,并比较两个哈希值以查看它们是否匹配.

这样,实际文本永远不会存储在您的程序中,并且他们无法对您的程序进行反向工程以找出原始文本的内容,因为哈希算法只是单向的.


Caf*_*eek 5

还有我想隐藏的http请求的URL.

如果您的应用程序正在发出请求,则无法隐藏此信息.运行像fiddler,http分析器或许多其他免费且随时可用的方法之一的应用程序将显示您的应用正在创建的所有流量.