小菜鸟一枚 发表于 2020-2-21 17:26

学破解第89天,《C++之分析VS2010编译器下C语言中文字符的表现形式及应用》

# 学破解第89天,《C++之分析VS2010编译器下C语言中文字符的表现形式及应用》
前言:
  一直对黑客充满了好奇,觉得黑客神秘,强大,无所不能,来论坛两年多了,天天看各位大佬发帖,自己只能做一个伸手党。也看了官方的入门视频教程,奈何自己基础太差,看不懂。自我反思之下,决定从今天(2019年6月17日)开始定下心来,从简单的基础教程开始学习,希望能从照抄照搬,到能独立分析,能独立破解。
  不知不觉学习了好几个月,发现自己离了教程什么都不会,不懂算法,不懂编程。随着破解学习的深入,楼主这个半吊子迷失了自我,日渐沉迷水贴装X,不能自拔。
** ==========申明:从第71天楼主开始水贴装X,帖子不再具有连续性,仅供参考,后续帖子为楼主YY专用贴!!!========== **

立帖为证!--------记录学习的点点滴滴

## 0x1初识C语言中文字符
  1.自从学习C语言以来,一直有一个疑问,计算机都是以二进制01来存储数据的,我知道ASCII码表,所以能表示各种字符。来看下面一段代码:
```C
int main()
{
      char str1 = "小菜鸟一枚";
      char str2 = "XCNYM";
      int i;
      int j;

      for(i = 0;str1;i++)
      {
                printf("%c",str1);
      }
      cout << endl;

      for(j = 0;str2;j++)
      {
                printf("%c",str2);
      }
      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.前面的分析我产生了疑问,那我写这样一段代码来看看:
```C
char str1 = "小菜鸟一枚";
      char str2 = "XCNYM";

      int i = 0;
      int j = 0;

      printf("%c\n",str1);//如果这里不加\n输出“小”字
      printf("%c\n",str1);
```
输出结果:
?
?

  2.看到这里我猜测一个汉字是两个问号组成的?
1)两个问号显然不能组成汉字的
2)ASCII码表中每个字符都有一个对应的数值表示
那么我将“小“字用数字输出看看是多少!
-48
-95
```C
      printf("%c%c\n",-48,-95);
```
输出结果:


  3.我再来验证一下,换成16进制看看,看代码:
```C
char str1 = "小菜鸟一枚";

      int i = 0;
      int j = 0;

      for(i = 0; str1;i++)
      {
                printf("%X\t",str1);
      }
      
      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 = "小菜鸟一枚";

      int i = 0;
      int j = 0;
      
      //加密
      for(i = 0; str1;i++)
      {
                str1 += 100;
                printf("%c",str1);
      }
      cout << "加密完成!" << endl;

      //解密
      for(j = 0;str1;j++)
      {
                str1 -= 100;
                printf("%c",str1);
      }
      cout << "解密完成!" << endl;
```
输出结果:
4/(U6'加密完成!
小菜鸟一枚解密完成!

  2.汉字转化为字母,转化为数字加密,因为汉字可以拆分成两个字符,所以我们可以逐个加密,只要范围在字母和数字的范围内即可。
-48
-95
例如上面两个数字分别加密成a和b,即使你还原成了这两个数字,也不一定能立马想到他是一个汉字吧。

## 0x4总结
  1.一直好奇那些算法能把中文文本加密成字母和数字,原来是因为中文在计算机内就是二进制表示,可以直接转化为数字表示。
  2.C语言中的数据类型是可以相互转化的。

PS:以上为我自己学破解过程中自己的总结,一字一字敲上去的,转载请注明出处,谢谢!

alittlebear 发表于 2020-2-21 17:56

小菜鸟一枚 发表于 2020-2-21 17:54
没有没有,你都会汉化软件了,我还在这刚开始学点编程知识
{:301_1009:}不瞒你说,汉化全靠机翻,而且我从2018年就想学python,说到现在,只会基本的if, print,吾爱的入门教程,看了两天就不碰了。。。

狮子歌歌 发表于 2020-2-21 17:33

不管怎么说,你学了!

alittlebear 发表于 2020-2-21 17:51

666,菜鸟还在坚持呀。

比我厉害多了,看了几分钟教程就继续来水帖了{:301_1008:}

杰克-鬼蝶 发表于 2020-2-21 17:51

感谢楼主的分享!

小菜鸟一枚 发表于 2020-2-21 17:54

alittlebear 发表于 2020-2-21 17:51
666,菜鸟还在坚持呀。

比我厉害多了,看了几分钟教程就继续来水帖了

没有没有,你都会汉化软件了,我还在这刚开始学点编程知识:handshake
页: [1]
查看完整版本: 学破解第89天,《C++之分析VS2010编译器下C语言中文字符的表现形式及应用》