学破解第89天,《C++之分析VS2010编译器下C语言中文字符的表现形式及应用》
前言:
一直对黑客充满了好奇,觉得黑客神秘,强大,无所不能,来论坛两年多了,天天看各位大佬发帖,自己只能做一个伸手党。也看了官方的入门视频教程,奈何自己基础太差,看不懂。自我反思之下,决定从今天(2019年6月17日)开始定下心来,从简单的基础教程开始学习,希望能从照抄照搬,到能独立分析,能独立破解。
不知不觉学习了好几个月,发现自己离了教程什么都不会,不懂算法,不懂编程。随着破解学习的深入,楼主这个半吊子迷失了自我,日渐沉迷水贴装X,不能自拔。
==========申明:从第71天楼主开始水贴装X,帖子不再具有连续性,仅供参考,后续帖子为楼主YY专用贴!!!==========
立帖为证!--------记录学习的点点滴滴
0x1初识C语言中文字符
1.自从学习C语言以来,一直有一个疑问,计算机都是以二进制01来存储数据的,我知道ASCII码表,所以能表示各种字符。来看下面一段代码:
int main()
{
char str1[100] = "小菜鸟一枚";
char str2[100] = "XCNYM";
int i;
int j;
for(i = 0;str1[i];i++)
{
printf("%c",str1[i]);
}
cout << endl;
for(j = 0;str2[j];j++)
{
printf("%c",str2[j]);
}
cout << endl;
printf("小菜鸟一枚:%d\n",i);
printf("XCNYM:%d\n",j);
system("pause");
return 1;
}
输出结果:
小菜鸟一枚
XCNYM
小菜鸟一枚:10
XCNYM:5
请按任意键继续
2.看着输出貌似没什么不对,字符串是汉字,所以它输出汉字,字符串是字母,输出字母。
1)我们仔细看一下:
小菜鸟一枚的for循环执行了10次,打印了5个字???
2)打印两次打出一个字符?那第一次打印的是什么,第二次打印的又是什么???
小结:通过这串代码认识到1个中文占2字符长度。
0x2C语言中文字符的解析
1.前面的分析我产生了疑问,那我写这样一段代码来看看:
char str1[100] = "小菜鸟一枚";
char str2[100] = "XCNYM";
int i = 0;
int j = 0;
printf("%c\n",str1[0]);//如果这里不加\n输出“小”字
printf("%c\n",str1[1]);
输出结果:
?
?
2.看到这里我猜测一个汉字是两个问号组成的?
1)两个问号显然不能组成汉字的
2)ASCII码表中每个字符都有一个对应的数值表示
那么我将“小“字用数字输出看看是多少!
-48
-95
printf("%c%c\n",-48,-95);
输出结果:
小
3.我再来验证一下,换成16进制看看,看代码:
char str1[100] = "小菜鸟一枚";
int i = 0;
int j = 0;
for(i = 0; str1[i];i++)
{
printf("%X\t",str1[i]);
}
printf("%c%c%c%c%c%c%c%c%c%c\n",0xFFFFFFD0,0xFFFFFFA1,0xFFFFFFB2,0xFFFFFFCB,0xFFFFFFC4,0xFFFFFFF1,0xFFFFFFD2,0xFFFFFFBB,0xFFFFFFC3,0xFFFFFFB6);
system("pause");
输出结果:
FFFFFFD0 FFFFFFA1 FFFFFFB2 FFFFFFCB FFFFFFC4
FFFFFFF1 FFFFFFD2 FFFFFFBB FFFFFFC3 FFFFFFB6
小菜鸟一枚
请按任意键继续. . .
小结:说明两组数字能过转化为汉字输出。
0x3汉字转数值在加解密方向的应用
1.想想我们是不是最常见的置换算法,a,+1换成b,b+1换成c,我们汉字是不是也可以这样操作呢?
char str1[100] = "小菜鸟一枚";
int i = 0;
int j = 0;
//加密
for(i = 0; str1[i];i++)
{
str1[i] += 100;
printf("%c",str1[i]);
}
cout << "加密完成!" << endl;
//解密
for(j = 0;str1[j];j++)
{
str1[j] -= 100;
printf("%c",str1[j]);
}
cout << "解密完成!" << endl;
输出结果:
4/(U6'加密完成!
小菜鸟一枚解密完成!
2.汉字转化为字母,转化为数字加密,因为汉字可以拆分成两个字符,所以我们可以逐个加密,只要范围在字母和数字的范围内即可。
-48
-95
例如上面两个数字分别加密成a和b,即使你还原成了这两个数字,也不一定能立马想到他是一个汉字吧。
0x4总结
1.一直好奇那些算法能把中文文本加密成字母和数字,原来是因为中文在计算机内就是二进制表示,可以直接转化为数字表示。
2.C语言中的数据类型是可以相互转化的。