我发现它可以提取的硬编码的字符串从一个二进制的。
例如性视图的 处理资源管理器 显示所有串超过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;
}

琴弦可以清楚地从中提取相应的可执行:
alt text

我认为这是有点太容易找到。

我的问题是:

  1. 如何 只是 隐藏 hiddenString1hiddenString2 在 可执行的?
  2. 是否有一个更安全 的方式来使用"作弊码"比 一些不起眼的隐藏的输入?
有帮助吗?

解决方案

欢迎来更广泛的世界的防御程序。

有几个选择,但我相信他们都依赖于某种形式的模糊;这虽然不完善,至少是一些东西。

  1. 而不是一直串值可以储存的文本中一些其他的二进制形式(hex?).

  2. 你可以密串存储在你的程序,然后解他们在运行时间。

  3. 你可以将它们分各个点在代码中,重组后。

或者一些的组合。

铭记,这些攻击进一步不是看实际的二进制的。有时他们会调查的存储空间的地址的程序,同时它的运行。MS出了一些所谓的 SecureString。网2.0.目的是要保持串加密应用程序时运行。

第四个想法是不存在的应用程序本身,而是依赖于一种验证码是提交给一个服务器的控制。在服务器可以验证,如果它是一个合法的"作弊码"或没有。

其他提示

有很多方法 晦涩的 数据可执行的。其他人在这里已经发布良好的解决方案--一些强于其他人。我不会添加到名单。

只是知道:这是所有的猫和老鼠的游戏:它是 不可能的保证 没有人会发现你的"秘密的"。

无论多大的加密或其他的技巧,你使用;无论多大的努力或金钱,你把它。无论如何,许多"美国航空航天局/麻省理工学院/中央情报局/美国国家安全局"类型,是涉及隐藏它.

这一切都归结为一个简单的物理:
如果它是不可能的 任何 用户拔出你的秘密从可执行而"取消"了,然后计算机,将不能隐藏它的任,程序就不能使用它。任何适度的技术开发人员有足够的激励机会找到隐藏的秘密。

那一刻你们交给你的可执行一个用户,他们有他们所需要的一切要找出这个秘密。

最好你可以希望,为的是使它 这么辛苦 揭露什么秘密,任何好处可以获得从知道的秘密变得不值得的麻烦。

因此,它的确试图掩盖数据,如果这仅仅是"不好",它是公开的,或者如果它的后果成为公共就是"不方便".但甚至不想想藏在你的节目"密码给你的主人客户数据库"、私人钥匙或一些其他重要的秘密。你就是不能。

如果你有真正的严格信息的秘密,你的节目将会以某种方式需要,但永远不应该成为公众信息(如私人钥匙),然后你会需要有你的计划跟一个远程服务器在你的控制,适用相应的认证和授权的控制(那就是,确保只有经批准的人民或计算机都能够出请求到服务器),并有,服务器保守秘密并加以利用。

最简单的方式来加密他们与一些琐碎的就像异或rot-13,然后解它们的飞行时,他们使用。这将消除随意观看他们,但这不会阻止任何人都有很多经验是在逆转。

除了这些方法的克里斯提到你也可以使用的散列算法。如果你想要做的就是检查是否正确ID指定其实你不需要储存的整个ID在您的节目。

  • 创建一个哈希(MD5、沙,等等)的串密码//id你想进行比较,或许添加一个'盐的价值。储存这在你的节目
  • 当程序运行,做同样的算法对所输入的串密码//id和比较这两个哈希看看他们是否匹配。

这种方法的实际文本是不存在你的节目,他们不能逆向工程师,你的计划,以找出是什么原文是因为散列算法的一种方式只。

有网址为http请求,我想要隐藏。

如果你的程序出请求,有没有点隐藏这一点。运行一个应用程序,如小提琴手,http分析,或一个其他几十个免费的和容易获得的方法将显示所有的业务应用是创造。

将你所有的秘密码是Guid或者是那只是一个例子吗?

也许储存你的秘密作为一个binary guid:

const GUID SecretGuid =
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

然后把你送guid串的二元格式比较两binary guid。

如果有一个特定的串你不希望别人能看见,然后对其进行加密和解密。

如果你不想让别人看到你GUID,那么建造它从字节,而不是建造一串:

const GUID SecretGuid = 
      { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

最好你可以做的是代码的密码或其他你想要隐藏为char阵列。例如:

std::string s1 = "Hello";   // This will show up in exe in hex editor
char* s2 = "World";   // this will show up in exe in hex editor
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor.

这方法我用用于这一目的。第一,我使用的 字符串 工具 微软 来显示的串在一个EXE或DLL。然后我用的 下面的小工具 (见 文章)替换这些字符串与炒列字储存作为一个算术的表达:例如:而不是string:"这是一个测试" 我将会把下列代码:(它是自动产生的 这个工具)

WCHAR T1[28];
 T1[22] = 69;
 T1[15] = 121 - 17;
 T1[9] = L':' + -26;
 T1[12] = L't' - 1;
 T1[6] = 116 - 1;
 T1[17] = 117 - 12;
 T1[3] = 116 - 1;
 T1[14] = L'' - 3;
 T1[13] = L'w' - 3;
 T1[23] = 69;
 T1[26] = L'Y' + 3;
 T1[19] = 111 + 0;
 T1[21] = L'k' - 34;
 T1[27] = L'\\' - 8;
 T1[20] = L'B' + 32;
 T1[4] = 42 + -10;
 T1[25] = L'm' - 17;
 T1[16] = L'H' + 18;
 T1[18] = L'A' + 56;
 T1[24] = 68;
 T1[1] = 105 - 1;
 T1[11] = L'k' - 6;
 T1[10] = 66 + 50;
 T1[2] = 105;
 T1[0] = 117 - 1;
 T1[5] = L'k' - 2;
 T1[8] = 89 + 8;
 T1[7] = 32;

有很多办法解决这一问题,并没有人(包括地雷)是完美的,但是有办法,以争夺,掩盖和隐藏敏感的弦。你当然可以对它们进行加密和解密运行期间(见本文),但是我找到更重要的是要使这些字符串中消失的中间位字节的执行文件和它的工作。运行之后我的工具,你不会找到"this is a test"在可执行的文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top