是否可以隐藏在C ++代码中定义的密码

时间:2011-03-15 18:55:33

标签: c++ assembly information-hiding

...以便浏览反汇编不会立即公开密码(声明为静态变量)。举个例子,想象一个附有zip文件的程序,它必须为资产打开,但不容易被窥探。

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

谢谢!

9 个答案:

答案 0 :(得分:24)

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

我只是半开玩笑,因为它可能几乎和使用程序中其他位置的密钥对密码进行异或修复一样安全,并且几乎没有任何令人头疼的问题。

答案 1 :(得分:12)

简而言之,不,任何破解者只会在打开zip文件的函数上设置断点,并从RAM获取密码。

答案 2 :(得分:11)

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

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:5)

一种解决方案是将静态密码与另一个常量或甚至另一个字符串进行xor。这会将密码传播到两者之间,但需要将许多部分组合起来才能恢复密码。已编译二进制文件上的字符串不显示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的人。)

答案 5 :(得分:1)

您可以使用从程序的某些数据派生的另一个密码xor密码,例如字段(在打包的struct / class中)相对于struct / class的开头的相对位置,或者可能使用一些“恒定的“数据(当前世纪和千禧年是相当稳定的,未来89年:-)),或者某些字符从一个代码页转换到另一个代码页,或者某些数字转换为浮点数或双倍数(或许甚至一些一些简单的分区,如2 / 3,3 / 5,5 / 7 in double用作密码。一定要“强制”编译器不要优化它们(可能从其他“可测量”的东西中得出数字,比如一些长度字符串))。特别是第一个可能是最容易隐藏的:“测量”场的相对位置是很常见的。这些方法都不会在黑客的5分钟内存活下来......他们只能防止“使用十六进制编辑器随意窥探”。

答案 6 :(得分:0)

为什么要存放它?为什么没有第二个打包的应用程序,你的第一个加密基于xor算法?这样就根本不需要存储密码了!

当然这种方法有点困难,但我会说你不仅可以从这种方法中获益,还可以学习使其工作所需的必要事项。

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

使用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;";
       }
    } 
}