2011-03-15 65 views
10

中定义的密码...使浏览拆卸不会马上暴露密码(声明为静态变量)。举个例子,想象一个附带zip文件的程序,它必须打开资源,但不易被窥探。是否有可能隐藏的C++代码

我知道这是不可能完全隐藏或保护这些拉链,但我很好奇,什么手段都可以至少推迟一个休闲窥探者。

谢谢!

+3

*“...反汇编不会立即公开密码(声明为静态变量)”* - 您不应该在可执行文件中硬编码密码。这是一个软件安全漏洞。参见[CWE-798:使用硬编码证书](http://cwe.mitre.org/data/definitions/798.html)。 – jww 2014-10-06 04:40:27

回答

11

没有,但有一些事情你可以做让它更难。

存储密码为一系列数字,做他们一些calcualtions产生实际的密码,在资源的密码储存部件如图标等等。

+0

我喜欢这个。使用应用程序的图形资源进行隐写。 – 2011-03-15 19:02:15

5

一个解决办法是,以异或的另一个不变甚至另一个字符串中的静态密码。这会将您的密码分散到多个部分之间,以便将其恢复。编译后的二进制文件中的字符串不显示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)

6

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

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

+2

+1 ...阻止“休闲窥探者”,这样做可以在不花费太多时间的情况下获得,而不是花得多。正如你所说,完全隐藏用户在他的计算机上的信息是完全不可能的(除非程序缺少加密密钥)。 – Damon 2011-03-15 19:07:07

12

总之,没有任何黑客将只设置打开zip文件功能的断点,并从RAM获取密码那里。

0

那么为什么存储它呢?为什么不用第一个基于xor算法进行加密的打包应用程序?这样就不需要存储密码了!

当然,这种方法是有点困难,但我会说你不仅使用这种方法,但学习,使其工作所必需的东西大大受益。

1

你可以异或的从你的程序的一些数据得出另一个密码的密码,例如现场的相对位置(在一个拥挤的结构/类)相对于结构/类的开头,或者使用一些“常量”的数据(当前世纪和千年都相当稳定,在未来89年:-)),或某些字符从一个代码页到另一个转换,或者一些数字的转换,甚至浮动或双(也许一些简单的部门,如2/3,3/5,5/7在double中用作密码。一定要“强制”编译器不要优化它们(可能从其他“可测量”的东西导出数字,一些字符串))。特别是第一个可能是最容易隐藏:这是很常见的“测量”字段的相对位置。这些方法都将生存5分钟的黑客......,他们只能防止“临时窥探用十六进制编辑器”。

24

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

我只有一半开玩笑,因为它可能是几乎一样安全的异或与其他地方的在节目中会有相当多的零头痛维护它的关键密码。

+3

+1让我大声笑。 – SuperJames 2011-03-15 20:02:01

+0

@SuperJames:最有趣的事情是它是如此真实... – ninjalj 2011-03-15 20:16:33

0

斜体用另一个代码向用户展示一张图片,并插入一个文本框,用户可以在其中输入写在图片中的代码。 XOR ZIP文件的密码与图片中的代码。结果可以实现硬编码。该程序必须将硬编码代码与用户的输入进行XOR以获得ZIP文件的代码。 (可选)您可以使用另一个单向代码验证输入的代码。

-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;"; 
     } 
    } 
} 
相关问题