【问题标题】:Is it possible to hide a password defined within C++ code是否可以隐藏在 C++ 代码中定义的密码
【发布时间】:2011-07-16 01:14:34
【问题描述】:

... 这样浏览反汇编就不会立即暴露密码(声明为静态变量)。举个例子,想象一个附加了一个 zip 文件的程序,它必须为资产打开,但不容易被窥探访问。

我知道完全隐藏或保护那个拉链是不可能的,但我很好奇有什么方法可以至少阻止一个随便的窥探者。

谢谢!

【问题讨论】:

  • "...反汇编不会立即公开密码(声明为静态变量)" - 您不应该在可执行文件中硬编码密码。这是一个软件安全漏洞。见CWE-798: Use of Hard-coded Credentials

标签: c++ assembly information-hiding


【解决方案1】:

一种解决方案是将静态密码与另一个常量甚至另一个字符串进行异或。这会将您的密码分散在需要组合的许多部分之间才能取回密码。编译后的二进制文件中的字符串不显示 pw 字符串。

#include <stdio.h>

char pw[8] = {124, 109, 127, 127, 123, 99, 126, 104};

int main(int argc, char** argv) {
  for (int i = 0; i < 8; i++) {
    pw[i] = pw[i] ^ 12;
  }
  printf("%s\n", pw);  // => 'password'
}

有很多方法可以保护数据不被随意检查,一个坚定的对手完全是另一回事(问问从事 DRM 的人就知道了。)

【讨论】:

    【解决方案2】:

    不,但你可以做一些事情来让它变得更难。

    将密码存储为一系列数字,对其进行一些计算以生成实际密码,将部分密码存储在图标等资源中。

    【讨论】:

    • 我喜欢这个。使用应用程序的图形资源进行隐写术。
    【解决方案3】:

    将密码的 XOR 加密版本存储为静态变量,而不是实际密码。当您需要使用它时,您只需应用简单的 XOR 解密来检索实际密码。

    http://en.wikipedia.org/wiki/XOR_cipher

    【讨论】:

    • +1 ... 推迟“随便的窥探者”,这是你可以得到的最好的,而不需要花费更多的时间而不是它的价值。正如您所说,完全隐藏用户在其计算机上的信息是完全不可能的(除非程序缺少加密密钥)。
    【解决方案4】:

    简而言之,不,任何破解者都会在打开 zip 文件的函数上设置一个断点,然后从那里的 RAM 中获取密码。

    【讨论】:

      【解决方案5】:

      那么为什么要存储它呢?为什么不拥有第二个打包的应用程序,您的第一个基于异或算法加密的应用程序?这样就完全不用保存密码了!

      当然,这种方法有点困难,但我想说,你不仅可以从使用这种方法中受益匪浅,还可以学习使其工作所需的必要知识。

      【讨论】:

        【解决方案6】:

        您可以将密码与从程序的某些数据派生的另一个密码进行异或,例如字段(在打包的结构/类中)相对于结构/类的开头的相对位置,或者可能使用一些“常量”数据(当前世纪和千年在接下来的 89 年中是相当稳定的 :-)),或者将某些字符从一个代码页转换到另一个代码页,或者将某些数字转换为浮点数或双精度数(甚至可能是一些像 2/3, 3/5, 5/7 这样的简单除法,双倍用作密码。一定要“强制”编译器不要优化它们(可能是从其他“可测量”的东西中得出的数字,比如一些字符串))。尤其是第一个可能是最容易隐藏的:“测量”字段的相对位置是很常见的。这些方法都无法在黑客攻击 5 分钟后存活……它们只能防止“使用十六进制编辑器进行随意窥探”。

        【讨论】:

          【解决方案7】:

          如果您的程序是 Windows 程序,只需使用“此程序不能在 DOS 模式下运行”即可。作为密码。该字符串几乎存在于每个 Windows 可执行文件中。

          我只是在开玩笑,因为它可能几乎与使用程序中其他地方的密钥对密码进行异或操作一样安全,而且维护它几乎为零麻烦。

          【讨论】:

            【解决方案8】:

            斜体向用户显示带有另一个代码的图片,并插入一个文本框,用户可以在其中输入图片中写入的代码。将 ZIP 文件的密码与图片中的代码异或。结果可以硬编码实现。该程序必须将硬编码的代码与用户的输入进行异或,以获取 ZIP 文件的代码。 或者,您可以使用另一个单向代码验证输入的代码。

            【讨论】:

              【解决方案9】:

              使用 perl 脚本混淆密码。黑客仍然可以对您的机器代码进行逆向工程……但至少您的密码在十六进制编辑器中并不明显。

              obfuscate_password("my_password434");
              
              sub obfuscate_password($) {
              
                my $string = shift;
                my @c = split(//, $string);
                push(@c, "skip"); # Skip Null Terminator
                                  # using memset to clear this byte
                # Add Decoy Characters
                for($i=0; $i < 100; $i++) {
                  $ch = rand(255);
                  next if ($ch == 0);
                  push(@c, chr($ch));
                }                     
                my $count1 = @c;
                print "  int x1, x2, x3, x4, x5;\n";
                print "  char password[$count1];\n";
                print "  memset(password, 0, $count1);\n";
                my $count2 = 0;
                my %dict  = ();
                while(1) {
                  my $x = int(rand($count1));
                  $y = obfuscate_expr($count1, $x);
                  next if (defined($dict{$x}));
                  $dict{$x} = 1;
                  last if ($count2+1 == $count1);
                  if ($c[$x] ne "skip") {
                    #print "  $y\n";
                    print "  $y password[x4] = (char)" . ord($c[$x]) . ";\n";
                  }
                  $count2++;
                }
              }
              
              sub obfuscate_expr($$) {
                  my $count  = shift;
                  my $target = shift;
                  #return $target;
              
                  while(1) {
              
                     my $a = int(rand($count*2));
                     my $b = int(rand($count*2));
                     my $c = int(rand($count*2));
                     next if (($a == 0) || ($b == 0) || ($c == 0));
                     my $y = $a - $b;
                     #print "$target: $y : $a - $b\n";
                     if ($y == $target) {
                        #return "$a - $b + $c";
                        return "x1=$a; x2=$b; x3=$c; x4=x1-x2+x3; x5= +=x4;";
                     }
                  } 
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-02-26
                • 1970-01-01
                • 2013-08-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多