...因此浏览反汇编不会立即暴露密码(声明为静态变量)。例如,想象一个附加了一个 zip 文件的程序,它必须为资产打开,但不容易被窥探访问。
我知道完全隐藏或保护那个拉链是不可能的,但我很好奇有什么方法可以至少阻止一个随便的窥探者。
谢谢!
...因此浏览反汇编不会立即暴露密码(声明为静态变量)。例如,想象一个附加了一个 zip 文件的程序,它必须为资产打开,但不容易被窥探访问。
我知道完全隐藏或保护那个拉链是不可能的,但我很好奇有什么方法可以至少阻止一个随便的窥探者。
谢谢!
如果您的程序是 Windows 程序,只需使用“此程序不能在 DOS 模式下运行”即可。作为密码。该字符串几乎存在于每个 Windows 可执行文件中。
我只是在开玩笑,因为它可能几乎与使用程序中其他地方的密钥对密码进行异或操作一样安全,并且维护它几乎为零。
简而言之,不,任何破解者都会在打开 zip 文件的函数上设置一个断点,然后从那里的 RAM 中获取密码。
不,但你可以做一些事情来让它变得更难。
将密码存储为一系列数字,对其进行一些计算以生成实际密码,将部分密码存储在图标等资源中。
将密码的 XOR 加密版本存储为静态变量,而不是实际密码。当您需要使用它时,您只需应用简单的 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 的人。)
您可以将密码与从程序的某些数据派生的另一个密码进行异或,例如字段(在打包的结构/类中)相对于结构/类的开头的相对位置,或者可能使用一些“常量”数据(在接下来的 89 年里,当前世纪和千年是相当稳定的 :-)),或者将某些字符从一个代码页转换为另一个代码页,或者将某些数字转换为浮点数或双精度数(甚至可能是一些简单的除法,例如2/3, 3/5, 5/7 in double 用作密码。一定要“强制”编译器不要优化它们(可能是从其他“可测量”的东西中得出数字,比如一些字符串的长度)) . 尤其是第一个可能是最容易隐藏的:“测量”字段的相对位置是很常见的。
那么为什么要存储它呢?为什么不拥有第二个打包应用程序,您的第一个基于异或算法加密的应用程序?这样就根本不需要存储密码了!
当然,这种方法有点困难,但我想说,您不仅可以从使用这种方法中受益匪浅,而且还可以学习使其工作所需的必要知识。
向用户显示带有另一个斜体代码的图片,并插入一个文本框,用户可以在其中输入写在图片中的代码。将 ZIP 文件的密码与图片中的代码异或。结果可以硬编码实现。该程序必须将硬编码的代码与用户的输入进行异或,以获取 ZIP 文件的代码。或者,您可以使用另一个单向代码验证输入的代码。
使用 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;";
}
}
}