暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++入门:自己的程序被破解了~

酷教 2020-05-15
1004

还记得前面写过的那个猜数字游戏吗?小明(为什么又是我?)现在想给他加一个密码验证,密码验证通过就可以开始游戏,不通过就退出游戏。我们首先想到了if选择语句,看下面例子:

#include <iostream>
#include <cstdlib>
#include<ctime>
#include <string>
using namespace std;
int main()
{
int num,m,i;
string pass ;
srand(time(0)); //设置种子
num=rand()%100; //100以内的数字
cout << "请输入密码:" ;
cin>>pass;
if(pass=="pass"){
cout <<"密码正确,开始游戏!" << endl;
cout<<"*********************" << endl;
cout<<"请输入猜测的数值:";
cin>>m;
i=1;
while(num!=m&&i<10) {
if(num<m)
{
cout<<"你猜大了!"<<endl<<"请再次输入预测值:";
cin>>m;
}
else
{
cout<<"你猜小了!"<<endl<<"请再次输入预测值";
cin>>m;
}
i++;
}
if(i==10&&num!=m){
      cout<<"十次你都没猜中,Game over!"<<endl
      cout<<"****************************" << endl;    
    }    
else{
cout<<"恭喜你猜对了!"<<' '<<"一共猜了"<<i<<"次"<<endl;
cout<<"****************************" << endl;
    }     
}
else{
cout <<"密码错误,游戏退出!"<< endl;
}
return 0;
}
运行结果:


01


小明把程序分享给同学玩,但很快有同学就把密码给破解了,破解方法超级变态,那个同学把这个程序后缀改成txt然后用记事本打开,搜索“请输入密码”,看下图:

因为程序编译时编译器会将字符串常量直接存储在可执行文件结构中,所以搜索关键字很容易就能找到这些密码明码,当然我不建议用记事本去搞这些事情,如果你的机器慢或者文件大,会卡的你怀疑人生。

那么文本编辑器给大家推荐两款,也是我常用的:

1、EditPlus

EditPlus是一款由韩国 Sangil Kim (ES-Computing)出品的小巧但是功能强大的可处理文本、HTML和程序语言的Windows编辑器,你甚至可以通过设置用户工具将其作为C,Java,Php等等语言的一个简单的IDE。

2、UltraEdit

UltraEdit是一款全球功能一流的文本编辑软件,支持配置高亮语法和几乎所有编程语言的代码结构。是极具价值的文本编辑器、十六进制编辑器、HTML编辑器、PHP编辑器、Javascript编辑器、Perl 编辑器和程序编辑器。内建英文单字检查,可同时编辑多个文件,编辑功能强大,具有代码提示、折叠、列操作等人性化功能。


02


既然明码容易被人简单的“破解”,我们可以将存储需要比对的密码进行加工变化一下,我们知道计算机中ASCII是常用的字符编码,是用8位的二进制数来代表大小写英文、数字、标点符号、控制符等。

ASCII的对应关系可以去网上找一下,这里我们将输入字母a~z,A~Z的对应编码值+1,来实现字符的变化达到加密功能,当然你可以设计更好的算法,这里只是举例,注意比如下面这样:

#include <iostream>
#include <string>
using namespace std;
string Encryption_String(string s)
{
string pass;
for(int i=0;i<s.length();i++)
{
char b=s[i];
if((b>='a'&&b<='y')||(b>='A'&&b<='Y'))
{
b=b+1;
pass=pass+b;
}
else if(b=='z'||b=='Z')
{
b=b-25;
pass=pass+b;
}
else
pass=pass+b;
}
return pass;
}


int main()
{
string pass ;
cout << "请输入密码:" ;
cin>>pass;
if(Encryption_String(pass)=="qbtt"){
cout <<"密码正确,开始游戏!" << endl;
}
else{
cout <<"密码错误,游戏退出!"<< endl;
}
return 0;
}

这时候如果通过前面方法,利用查找到的字符串“qdtt”来验证,会收到错误的提示了,因为密码被加密了。然而很快那个同学给小明发回他的程序,并给他截了个图,小明发现随便输入个字符串就可以进入游戏了,没有王法啊~

同学说只修改了一个字节,修改了什么字节呢?用什么工具修改的?

这里透露下几个十六进制编辑工具:Hex Workshop、UltraEdit、WinHex。这些都不是重点,重点是你能将上面字符加密函数写一个反过来的吗?

赶紧操刀试试吧!

    「您的每一个  对我们都是鼓励」

文章转载自酷教,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论