首页
社区
课程
招聘
[原创]qq密码加密原理
发表于: 2011-7-15 20:02 40444

[原创]qq密码加密原理

2011-7-15 20:02
40444

QQ是大家喜欢的品牌,是众多腾讯高手的智慧结晶,它的安全性值得大家关注。昨天借助QQ联系上了一位十年前的好友,在此对腾讯深表感谢。利用了2天时间搞出了这个小程序,现奉上和大家共同学习。由于编写仓促,问题在所难免,请大家批评指正,谢谢!原理异常简单,稍后公布!

附件为:演示程序,不断更新中。

鉴于大家对程序的原理比较感兴趣,特贴出如下:

   概括的讲qq的密码输入纯粹是一个加密解密的过程,其他都是一些辅助的反调试策略。我们
只有深入探究事物的本质,才能体会到无穷的乐趣,那就是逆向的魅力。

OD调试方法:
1、用OD打开qq2011Beta3;并运行出现登录窗口,如图1


2、在内存搜索FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 如图2,找到地址如图3




3、在内存搜索8B 5B 04 03 5D 10 定位到如图5,并且下个断点,该处代码如下,:
022F63C0    8BCB            MOV ECX,EBX
022F63C2    FF15 AC802F02   CALL DWORD PTR DS:[22F80AC]         
022F63C8    8B5B 04         MOV EBX,DWORD PTR DS:[EBX+4]  
022F63CB    035D 10         ADD EBX,DWORD PTR SS:[EBP+10]  //下个断点
022F63CE    EB 06           JMP SHORT TSSafeEd.022F63D6
022F63D0    8B1D A0802F02   MOV EBX,DWORD PTR DS:[22F80A0]         
022F63D6    8A03            MOV AL,BYTE PTR DS:[EBX]





4、输入密码'123456',并点击登录,断下后在命令栏输入命令:d [esi+48]+4,显示内存信息如图6



00498B7C  01 E8 2D 02 04 01 00 00 1F 01 00 00 00 00 00 00  
00498B8C  81 2B 30 02 04 01 00 00 1F 01 00 00 00 00 00 00   
00498B9C  B4 2C 30 02 04 01 00 00 1F 01 00 00 00 00 00 00   
00498BAC  44 31 30 02 04 01 00 00 1F 01 00 00 06 00 00 00  
00498BBC  06 00 00 00 0A 00 00 00 03 00 00 00 12 00 0B 00  
00498BCC  4C 01 0C 00 52 03 01 00 7B 1D 80 7C C2 F3 D2 77  

解释如下:
0x022de801为输入密码时临时生成的加密字符串00首地址,0x104为长度;
0x02302b81为对照表的首地址,长度与上表一样。作用是该表中00字节对应位置的上表中的字符为按shift方式输入的,不需要再转换了,而01表明得到的字符还要查表转换一下。
06为你输入的密码长度;
0A为解密该串的算法所需的关键参数设为stepLength;

输入密码时临时生成的加密字符串找到如下:
022DE801  62 69 65 6C 68 79 74 71 68 30 68 72 6E 65 61 6C  bielhytqh0hrneal
022DE811  6C 79 7A 32 6F 79 7A 76 68 64 6F 7A 67 36 78 75  lyz2oyzvhdozg6xu
022DE821  78 61 79 71 75 63 61 38 67 65 66 66 76 6C 72 77  xayquca8geffvlrw
022DE831  6E 31 79 79 65 74 6F 6F 72 6E 78 37 68 74 78 71  n1yyetoornx7htxq
022DE841  66 7A 6F 6D 62 43 63 6A 68 61 69 71 79 67 74 55  fzombCcjhaiqygtU
022DE851  73 62 64 6B 77 6A 71 68 64 4C 72 6C 62 63 64 6F  sbdkwjqhdLrlbcdo
022DE861  75 61 6B 41 64 6F 6E 74 73 77 6C 70 75 34 6D 6D  uakAdontswlpu4mm
022DE871  75 79 6D 66 73 76 65 38 6B 79 76 6D 6F 6C 68 6F  uymfsve8kyvmolho
022DE881  77 56 73 77 78 69 6A 7A 71 77 72 4E 63 69 73 62  wVswxijzqwrNcisb
022DE891  6C 61 70 6A 74 57 79 6C 65 63 6C 6A 73 67 6A 48  lapjtWylecljsgjH
022DE8A1  6B 6C 74 61 68 65 73 7A 67 32 6D 63 79 65 75 66  kltaheszg2mcyeuf
022DE8B1  77 72 6A 32 73 6B 76 6B 6B 75 6A 74 65 4C 64 68  wrj2skvkkujteLdh
022DE8C1  77 65 78 71 6F 72 6A 41 6C 68 6B 78 61 71 73 70  wexqorjAlhkxaqsp
022DE8D1  67 4F 65 64 70 62 6A 6D 64 7A 76 4B 6F 72 6F 73  gOedpbjmdzvKoros
022DE8E1  65 6C 6D 71 62 54 67 6A 61 6C 78 73 78 6D 78 52  elmqbTgjalxsxmxR
022DE8F1  72 76 71 6C 68 6D 68 77 61 49 72 6B 69 73 67 79  rvqlhmhwaIrkisgy
022DE901  77 66 73 47 00 00 00 00 00 00 00 00 00 00 00 00  wfsG............

解密算法大家自己看吧,对照前面找到的一张映射表如下,举例如下:
0049F07A  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  .....
0049F08A  10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  
0049F09A  20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./
0049F0AA  39 30 32 36 38 31 37 35 34 33 3A 3B 3C 3D 3E 3F  9026817543:;<=>?
0049F0BA  40 4C 4D 42 4E 5A 52 49 57 47 59 4F 50 44 56 55  @LMBNZRIWGYOPDVU
0049F0CA  48 41 54 58 53 43 45 4B 4A 51 46 5B 5C 5D 5E 5F  HATXSCEKJQF[\]^_
0049F0DA  69 60 62 66 68 61 67 65 64 63 6A 6B 6C 6D 6E 6F  i`bfhagedcjklmno
0049F0EA  70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F  pqrstuvwxyz{|}~

根据stepLength为解密该串的算法所需的关键参数,那么首字符相对于地址022DE801的偏移量为:
stepLength-1=0x0a-1=9,对应的字符是'0',在映射表中的偏移值为0x31,该值转换为字符就是'1';所以第一个密码字符就是'1';
那么第二个字符的位置只要向后移动一个stepLength即可定位得到,显然是字符'2',在映射表中
的偏移值为0x32,转换为字符就是'2';
依此类推根据密码长度6就可以找到伪密码串'026817',映射转换一下就是'123456',很奇怪吧?
这就是我们的密码。

原理就是这样,大家可以调试看看演示程序不能正常运行的原因,我定位如下数据,
使用了最后8个字节7B 1D 80 7C C2 F3 D2 77,如果在你的机子上无效可能是没有定位到
该处数据,或者是给其他保护程序拦截了吧!如果你能找到原因,请回帖告知。我只打算在
qq的问题上花2天时间。
00498B7C  01 E8 2D 02 04 01 00 00 1F 01 00 00 00 00 00 00  
00498B8C  81 2B 30 02 04 01 00 00 1F 01 00 00 00 00 00 00   
00498B9C  B4 2C 30 02 04 01 00 00 1F 01 00 00 00 00 00 00   
00498BAC  44 31 30 02 04 01 00 00 1F 01 00 00 06 00 00 00  
00498BBC  06 00 00 00 0A 00 00 00 03 00 00 00 12 00 0B 00  
00498BCC  4C 01 0C 00 52 03 01 00 7B 1D 80 7C C2 F3 D2 77


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (63)
雪    币: 1847
活跃值: (1816)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
2
用不来,开了没反应。我是beta3。
2011-7-15 20:07
0
雪    币: 107
活跃值: (172)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
不给源码,也期待尽量多的公布相关信息
2011-7-15 20:08
0
雪    币: 7024
活跃值: (4237)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
擦, 竟然不知道怎么用
2011-7-15 20:13
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
5
怎么用...没反应
2011-7-15 20:30
0
雪    币: 34
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
此程序失效 对2011B3没用
2011-7-15 20:30
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
7
嗅探肯定要先开在那里等你打开qq输入密码吧?再不会用我也没办法了。我也没在别人电脑上试过,但原理上是没有问题的。
2011-7-15 21:24
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
还是等源码吧
2011-7-15 21:36
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
9
天易大牛又出现了,顶起,等待源码
2011-7-15 21:38
0
雪    币: 41
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
终于又见到天易LOVE前辈了,特来顶贴。
2011-7-15 22:03
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
11
如果有人能大致说出我的嗅探原理,立马放出源代码。这个原理对至今所有qq版本适用,我只是拿最新版本做了下实验。
2011-7-15 22:15
0
雪    币: 319
活跃值: (1101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
额,同楼上一样,先开程序,再开QQ,输入密码,登录成功,程序上什么都没显示啊
QQ是2011Beta3
2011-7-15 23:27
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
我的也没成功
2011-7-16 00:10
0
雪    币: 357
活跃值: (3468)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
14
打开qq.exe进程,循环读之后的内存,大量比较 FF 00 01 02 03 04 05 06  07 08 09 0A 0B 0C 0D 0E

还硬编码
7C801D7B LoadLibraryA
77D2F3C2 SendMessageA

问题是这两个都没找到东西,通用性怎么来的?

硬编码API地址用一个GetProcAddress很难吗?

找窗口那个FindWindowA("TXGuiFoundation", "QQ2011") 没运行,不知道如何触发
2011-7-16 00:59
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
15
call hook?memsniffer?

话说这些玩意真的不给力了~~自从咱有了X类化劫持QQ窗口~~
2011-7-16 02:10
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
16
谢谢高手的建议,晚辈会认真听取,不敢哗众取宠,做人要低调。
2011-7-16 07:38
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
支持下。
2011-7-16 08:19
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
18
硬编码的话通用性就会大打折扣了。
2011-7-16 09:51
0
雪    币: 357
活跃值: (3468)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
19
使用了最后8个字节7B 1D 80 7C C2 F3 D2 77,如果在你的机子上无效可能是没有定位到


7C801D7B LoadLibraryA
77D2F3C2 SendMessageA

其实就是API地址,

FF 00 01 02 03 04 05 06  07 08 09 0A 0B 0C 0D 0E

在我的QQ2010 上搜索不到, 无法再现...
2011-7-16 10:41
0
雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
果然厉害,研究了QQ密码框保护几天,只发现其输入相同数据每次都会变化,在变异的MD5算法之前传进去的明明不是输入的密码,却能得到输入密码的MD5,所以对其变异MD5算法的处理很是疑惑。最终整了个折中的方案,直接取密码的一次MD5值。
2011-7-16 10:58
0
雪    币: 321
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
严格按照嗅探器说明操作了几次(QQ版本为刚更新的beta3),但是
1、字体没有变蓝
2、没有显示输入的密码,而且没有出现其他什么乱七八糟的窗口
3、关闭QQ,字体颜色也没有变化。
我等小菜,不懂其他的了,就只能给点反馈意见咯。

更新说明:下了新的附件程序,运行了一下,可以识别到密码了,强大呀。
2011-7-16 14:05
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我是个小白  问一下 为什么要搜索 FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E  ?
让各位高手见笑了
2011-7-16 14:05
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
23
找映射表的首地址
2011-7-16 14:35
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
24

看明白这里了
上传的附件:
2011-7-16 14:46
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
[QUOTE=快雪时晴;981381]
看明白这里了[/QUOTE]

谢谢 看明白了!
2011-7-16 14:59
0
游客
登录 | 注册 方可回帖
返回
//