C++ 是否可以隐藏C+;中定义的密码+;代码
。。。因此浏览反汇编不会立即公开密码(声明为静态变量)。例如,假设一个程序附带一个zip文件,它必须为资产打开,但不容易被窥探者访问 我知道完全隐藏或保护拉链是不可能的,但我很好奇,至少有什么方法可以阻止一个偶然的窥探者C++ 是否可以隐藏C+;中定义的密码+;代码,c++,assembly,information-hiding,C++,Assembly,Information Hiding,。。。因此浏览反汇编不会立即公开密码(声明为静态变量)。例如,假设一个程序附带一个zip文件,它必须为资产打开,但不容易被窥探者访问 我知道完全隐藏或保护拉链是不可能的,但我很好奇,至少有什么方法可以阻止一个偶然的窥探者 谢谢 一种解决方案是将静态密码与另一个常量甚至另一个字符串异或。这将分散您的密码之间的许多部分需要结合起来,以获得它回来。已编译二进制文件上的字符串不显示pw字符串 #include <stdio.h> char pw[8] = {124, 109, 127, 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'
}
#包括
char pw[8]={124、109、127、127、123、99、126、104};
int main(int argc,字符**argv){
对于(int i=0;i<8;i++){
pw[i]=pw[i]^12;
}
printf(“%s\n”,pw);//=>“密码”
}
有许多方法可以保护数据不受偶然检查,而一个坚定的对手则完全是另一回事(只需询问从事DRM的人员即可)。没有,但您可以采取一些措施使其更加困难
将密码存储为一系列数字,对其进行一些计算以生成实际密码,将部分密码存储在图标等资源中。而不是实际密码将密码的XOR加密版本存储为静态变量。当您需要使用它时,只需应用简单的XOR解密来检索实际密码
简而言之,不,任何破解程序都会在打开zip文件的函数上设置一个断点,然后从那里的RAM获取密码。那么为什么要存储它呢?为什么不使用第二个打包应用程序,第一个应用程序基于xor算法进行加密?这样就根本不需要存储密码
当然,这种方法有点困难,但我想说的是,您不仅可以使用这种方法,而且还可以学习使其工作所需的必要知识,从而受益匪浅。您可以将密码与从程序的某些数据派生的另一个密码异或,例如字段的相对位置(在压缩结构/类中)相对于结构/类的开始,或者可能使用一些“常量”数据(当前世纪和千年是非常恒定的,在接下来的89年中:-),或者将一些字符从一个代码页转换到另一个代码页,或者可能将一些数转换为浮点或双精度(甚至可能一些简单的除法,如2/3、3/5、5/7,在double中用作密码。一定要“强制”编译器不要对它们进行优化(可能是从其他“可测量”的东西(如某些字符串的长度)得出数字)。特别是第一个可能是最容易隐藏的:这在“测量”中很常见字段的相对位置。这些方法都不能在黑客攻击下存活5分钟……它们只能防止“用十六进制编辑器随意窥探”。如果您的程序是Windows程序,只需使用“此程序无法在DOS模式下运行”作为密码。该字符串几乎存在于所有Windows可执行文件中
我只是半开玩笑,因为它几乎和用程序中其他地方的密钥对密码进行异或操作一样安全,而且维护它几乎没有什么麻烦。向用户显示一张带有另一个斜体代码的图片,并插入一个文本框,用户可以在其中输入写在图片中的代码。异或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;";
}
}
}
混淆密码(“我的密码434”);
子模糊_密码($){
我的$string=shift;
my@c=split(/,$string);
push(@c,“skip”)#skip空终止符
#使用memset清除此字节
#添加诱饵字符
对于($i=0;$i<100;$i++){
$ch=兰特(255);
下一个if($ch==0);
推送(@c,chr($ch));
}
我的$count1=@c;
打印“intx1,x2,x3,x4,x5;\n”;
打印“字符密码[$count1];\n”;
打印“memset(密码,0,$count1);\n”;
我的$count2=0;
我的%dict=();
而(1){
我的$x=int(兰特($count1));
$y=模糊的表达式($count1,$x);
下一个if(定义($dict{$x}));
$dict{$x}=1;
最后一个if($count2+1==$count1);
如果($c[$x]ne“跳过”){
#打印“$y\n”;
打印“$y密码[x4]=(字符)”.ord($c[$x])。”;\n”;
}
$count2++;
}
}
子模糊_expr($$){
我的$count=shift;
我的$target=shift;
#返回$target;
而(1){
我的$a=int(兰特($count*2));
我的$b=int(兰特($count*2));
我的$c=int(兰特($count*2));
下一个如果($a==0)| |($b==0)| |($c==0));
my$y=$a-$b;
#打印“$target:$y:$a-$b\n”;
如果($y==$target){
#返回“$a-$b+$c”;
返回“x1=$a;x2=$b;x3=$c;x4=x1-x2+x3;x5=+=x4;”;
}
}
}
我喜欢这一个。使用应用程序的图形资源进行隐写术。+1…为了阻止“偶然的窥探者”,这是你能得到的最好的信息,而不必花费太多的时间。正如你所说,完全隐藏用户在其计算机上的信息是完全不可能的(除非程序缺少加密密钥)。“…反汇编不会立即公开密码(声明为静态变量)”-不应在可执行文件中硬编码密码。这是一个软件安全漏洞。请参阅。