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

新手上路,请多包涵

我发现可以从二进制文件中提取硬编码字符串。

例如, 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;
}

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

替代文字

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

我的问题是:

  1. 如何在可执行文件中 简单地 隐藏 hiddenString1hiddenString2
  2. 有没有比使用一些晦涩的隐藏输入更安全的方法来使用“作弊码”?

原文由 Winz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 852
1 个回答

欢迎来到更广阔的防御性编程世界。

有几种选择,但我相信它们都依赖于某种形式的混淆;这虽然不完美,但至少是一些东西。

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

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

  3. 您可以将它们拆分到代码中的各个点,然后再重新组合。

或者它们的某种组合。

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

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

原文由 NotMe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题