吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6825|回复: 42
收起左侧

[原创] 学破解第90天,《分析OD下中文字符的表现形式及应用》

  [复制链接]
小菜鸟一枚 发表于 2020-2-22 12:12
本帖最后由 小菜鸟一枚 于 2020-2-22 12:15 编辑

学破解第90天,《分析OD下中文字符的表现形式及应用》

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

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

0x1初识OD下的中文字符

  1.首先,我还是写一个简单的C语言输出中文字符串的程序。

int main()
{
        char str1[100] = "小菜鸟一枚";

        printf("中文字符串:%s\n",str1);
        system("pause");
        return 1;
}

  2.然后我用OD打开这个程序,然后智能搜索中文字符串,看到“小菜鸟一枚”的字符串,回车进去,来到了013D1010

013D1010  |.  A1 F4203D01   mov eax,dword ptr ds:[0x13D20F4]         ;  小菜鸟一枚
013D1015  |.  8B0D F8203D01 mov ecx,dword ptr ds:[0x13D20F8]         ;  鸟一枚
013D101B  |.  66:8B15 FC203>mov dx,word ptr ds:[0x13D20FC]           ;  枚

  3.  013D1010这一行右键,数据窗口中跟随,看到:

013D20F4  D0 A1 B2 CB C4 F1 D2 BB C3 B6                    小菜鸟一枚..中文

  4.鼠标选中D0,发现“小”字只选中了一半,选中D0 A1,发现整个”小“字都被选中了,说明一个汉字在OD中是以两个16进制数据展示的,联想一下昨天的学习,是不是在vs 2010编译的时候,汉字也是占两个数值呢?

0x2中文字符的表现形式

  1.思考一下,在前面我-48,-95表示小字,转化为16进制是FFFFFFD0 , FFFFFFA1 ,我又产生了一个疑问,难道FFFFFFD0 = D0?

        printf("%d %d\n",0xD0,0xA1);
        printf("%d %d\n",0xFFFFFFD0,0xFFFFFFA1);

输出结果:
208 161
-48 -95

  2.可以看到,两个数明明不相等,为什么输出D0,A1也能出现“小”字???

        printf("%c%c\n",208,161);
        printf("%c%c\n",-48,-95);

输出结果:

  3.那我再来将两个数转化为16进制,看看他们又有什么区别?
208+48 = 256
161+95 = 256
两位16进制数最大能表示的范围是16*16=256。
一个byet能表示的范围是-128~127。

        printf("%c%c\n",208+256,161+256);
        printf("%c%c\n",-48+256,-95+256);

输出结果:

  4.看到这的朋友可能就会说什么原码、补码、反码,反正我是没学过,不懂那玩意。继续看上面的代码,我们可以发现一个数字如果不在-128~127之间,那么将它加或减n个256之后,得到的数值一定会在这个范围内。

        printf("%c%c\n",600,601);
        printf("%c%c\n",-400,-401);

输出结果:
XY
po

  5.查ASCII码表600-256*2=88==》X,601-256*2=89==》Y,-400+256*2=112==》p,-401+256*2=111==》o,说明我猜想是正确的,OD中显示的数字D1可以在vs2010由一个很大的数加减256得到的,一样能输出汉字。

0x3中文字符在OD中的隐藏方式

  1.既然数字也能通过%C输出字符串,那我们试试这样编写代码!

        int tInt[20] = {0xD0,0xA1,0xB2,0xCB,0xC4,0xF1,0xD2,0xBB,0xC3,0xB6};

        for(int i = 0;tInt[i];i++)
        {
                printf("%c",tInt[i]);
        }

        printf("\n");

输出结果:
小菜鸟一枚

  2.此时我们把这个程序丢进OD,搜索字符串,发现搜索不到小菜鸟一枚这个字符串,然后F4到最下面一个赋值语句,看数据窗口。
1.png

000C1021  |.  894D AC       mov [local.21],ecx
000C1024  |.  C745 B0 A1000>mov [local.20],0xA1
000C102B  |.  C745 B4 B2000>mov [local.19],0xB2
000C1032  |.  C745 B8 CB000>mov [local.18],0xCB
000C1039  |.  C745 BC C4000>mov [local.17],0xC4
000C1040  |.  C745 C0 F1000>mov [local.16],0xF1
000C1047  |.  C745 C4 D2000>mov [local.15],0xD2
000C104E  |.  C745 C8 BB000>mov [local.14],0xBB
000C1055  |.  C745 CC C3000>mov [local.13],0xC3
000C105C  |.  C745 D0 B6000>mov [local.12],0xB6
000C1063  |.  8945 D4       mov [local.11],eax
000C1066  |.  8945 D8       mov [local.10],eax
000C1069  |.  8945 DC       mov [local.9],eax
000C106C  |.  8945 E0       mov [local.8],eax
000C106F  |.  8945 E4       mov [local.7],eax
000C1072  |.  8945 E8       mov [local.6],eax
000C1075  |.  8945 EC       mov [local.5],eax
000C1078  |.  8945 F0       mov [local.4],eax
000C107B  |.  8945 F4       mov [local.3],eax
000C107E  |.  8945 F8       mov [local.2],eax
000C1081  |.  85C9          test ecx,ecx

数据窗口
0042F774  D0 00 00 00 A1 00 00 00 B2 00 00 00 CB 00 00 00  ?..?..?..?..
0042F784  C4 00 00 00 F1 00 00 00 D2 00 00 00 BB 00 00 00  ?..?..?..?..
0042F794  C3 00 00 00 B6 00 00 00                          ?..?....

看到这些问号的时候,你能联想到它就是中文字符串“小菜鸟一枚”吗?

  3.而且这还是原始的数据,如果我对他进行加减乘除运算呢?一个中文汉字我都可以变化为两个字母或数字。

用户名:小菜鸟一枚
密    码:a3 b4 d5 g6 f7
熟悉了这些原理,为我们是不是就可以自由写出加密字符串算法呢,保护我们的字符串不被OD搜索引擎直接检索到!

0x4总结

  1.中文字符加密能防止字符串被OD搜索到,增加破解难度。
  2.任何数据都能转化为char类型处理,在-128~127的范围内运算。

上一篇帖子地址:
学破解第89天,《C++之分析VS2010编译器下C语言中文字符的表现形式及应用》https://www.52pojie.cn/thread-1112217-1-1.html



PS:以上内容为我一点一点总结写出来的,转载请注明出处!
另外:因为我自学,没有系统的计算机知识,不懂补码,以上分析不一定准确,欢迎坛友们交流指正,谢谢!

免费评分

参与人数 23吾爱币 +25 热心值 +21 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
念壹 + 1 给你鼓励
kidicc + 1 + 1 我很赞同!
wxfhf520 + 1 + 1 我很赞同!
clevey + 1 我很赞同!
青霄 + 2 + 1 为楼主坚持探索的精神点赞
风单云星 + 1 我很赞同!
snatch2null + 1 用心讨论,共获提升!
majiaxuan + 1 + 1 我很赞同!
614779460 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
自在小鱼 + 1 + 1 太有毅力了,佩服
夏南离 + 1 + 1 用心讨论,共获提升!
54老男孩 + 1 + 1 热心回复!
静默森林 + 1 + 1 谢谢楼主分享
17856687381 + 1 + 1 很有用 非常棒
growuphappily + 1 嗯,看见标题的前半部分就知道这是谁写的帖子了
BY210 + 1 我很赞同!
空条承太郎 + 1 + 1 用心讨论,共获提升!
maxon + 1 热心回复!
yzlovew + 1 + 1 学习了,给力
Pholhx + 1 + 1 我很赞同!
caicai116990 + 1 + 1 我很赞同!
lhtzty + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

无闻无问 发表于 2020-2-22 17:19
本帖最后由 无闻无问 于 2020-2-22 17:24 编辑

不是只汉字占两个字节,这得看什么编码,如果是unicode,统统都是两字节了…int的占4字节,用%c逐个打印,多余被舍,当然能打印出来,用%s就不行了…od为什么搜不到和%s打印一样,见00就结束了,后面直接就不搜索了…
楼上兄弟建议对的,还是正规渠道学起,免费教程很多,你这样自我摸索,不仅速度慢,还容易走弯路,欲学逆向,先会正向…正向基础不过关,永远学的都是皮毛…破解这东西,研究越深,你会发现最终还是要回归正向…
就像我,学了一段时间,发现编程基础知识不扎实,还是开始静下心查缺补漏,学习基础,任何强大的技术都是靠基础堆积起来的,基础不过关,高手随便玩个技术手段,就让你云里雾里…
Jack-lee 发表于 2020-2-22 12:31
Phantom可 发表于 2020-2-22 13:00
老哥 你得帖子 真的 给人挺正能量得 坚持下去
Snprszy 发表于 2020-2-22 13:05
老哥 你得帖子 真的 给人挺正能量得 坚持下去
carmenchenchao 发表于 2020-2-22 13:06
教学详细,谢谢老哥!!!
罗罗诺亚na 发表于 2020-2-22 13:12
之前心血来潮在B站学了几天python,html,最后都无果而终。看到楼主还能坚持几个月,钦佩,坚持下去,奥利给
shallies 发表于 2020-2-22 13:49
收藏了,谢谢分享
arialyy 发表于 2020-2-22 13:58
坐看楼主能坚持多久
frsoce 发表于 2020-2-22 14:14
加油兄弟
天清地浊 发表于 2020-2-22 14:23
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 16:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表