题目:菜鸟分析MiniQQ V1.4 免费版 2006.01.01 字符串加密算法
软件名称:MiniQQ V1.4 免费版 2006.01.01
软件来源:Http://www.PrettySky.Com
软件平台: Win9x/Me/NT4/2000
软件简介:
请相信自己的眼睛,你没有看错,虽然70K的QQ客户端确实令人不可思议。迷你QQ(MiniQQ)是一个超级小的QQ客户端,他采用命令行方式工作,字符界面+声音带来的效果的确非常Cool,用它就可以和自己QQ上的好友交流,它使用一种精简版的TCP/QQ通讯协议,这种协议流量极小,在你网速不快,或者流量需要收费的时候(比如笔记本链接手机用GPRS上网)你将会获得更快的速度,和更少的费用(GPRS接入点cwwap时请使用第三方HTTP代理软件即可)。
迷你QQ(MiniQQ)具备了所有常用的功能的功能有,显示好友列表、文字聊天、添加好友、删除好友、查看资料、修改登录状态等,语音和视频聊天功能我们目前不打算加入。迷你QQ(MiniQQ)直接连接腾讯官方的TCP服务器,密码传送采用MD5不可逆加密法,请放心您的账号安全。
破解目的:练手
破解难度:简单
工具:ollydbg,PEID, ida
在skycn闲逛看到此软件觉得好奇就下了,用的的确是TCP协议,应该是和qq的手机接口通讯。软件免费版本第一次和好友通讯会带一些提示信息,用peid查了一下是upx的壳,手脱了一下。搜索提示字符串没有结果,用od载入,搜索引用字符串也没有。看样部分字符串资源是加密了。
怎么找到加密字符串的地方,我的思路是封包一定要发出去,先看看封包。用commview查看了一次封包,是明码查看发送消息的命令字符串中包含"cltmsg"。
用od装载程序,查看字符串引用,下断点到所有引用包含"cltmsg"的地方启动软件,登陆后发送一个消息给任意好友 很快断下在 00417AFB 处
00417ABF B8 B8934100 MOV EAX,2_.004193B8 ; 请输入信息内容:
00417AC4 E8 F7C5FFFF CALL 2_.004140C0
00417AC9 B8 E8C84100 MOV EAX,2_.0041C8E8
00417ACE E8 39C1FFFF CALL 2_.00413C0C
00417AD3 833D E8C84100 0>CMP DWORD PTR DS:[41C8E8],0
00417ADA 0F84 94010000 JE 2_.00417C74
00417AE0 833D F0C84100 F>CMP DWORD PTR DS:[41C8F0],-1
00417AE7 0F84 BE000000 JE 2_.00417BAB
00417AED 807B 0C 00 CMP BYTE PTR DS:[EBX+C],0
00417AF1 0F85 B4000000 JNZ 2_.00417BAB
00417AF7 C643 0C 01 MOV BYTE PTR DS:[EBX+C],1
00417AFB 68 D0934100 PUSH 2_.004193D0 ; ver=1.3&con=1&cmd=cltmsg&seq=
00417B00 8D85 30FFFFFF LEA EAX,DWORD PTR SS:[EBP-D0]
00417B06 50 PUSH EAX
00417B07 B8 3F420F00 MOV EAX,0F423F
00417B0C E8 F3B2FEFF CALL 2_.00402E04
00417B11 8945 BC MOV DWORD PTR SS:[EBP-44],EAX
00417B14 C645 C0 00 MOV BYTE PTR SS:[EBP-40],0
00417B18 8D55 BC LEA EDX,DWORD PTR SS:[EBP-44]
00417B1B 33C9 XOR ECX,ECX
经过几次跟踪很快发现了这里
00417B48 8D95 24FFFFFF LEA EDX,DWORD PTR SS:[EBP-DC]
00417B4E B8 18944100 MOV EAX,2_.00419418
00417B53 E8 7CBFFFFF CALL 2_.00413AD4
00417B58 8B8D 24FFFFFF MOV ECX,DWORD PTR SS:[EBP-DC]
00413AD4是用来完成字符串编码的
413AD4的代码如下
00413AD4 55 PUSH EBP
00413AD5 8BEC MOV EBP,ESP
00413AD7 83C4 F8 ADD ESP,-8
00413ADA 53 PUSH EBX
00413ADB 56 PUSH ESI
00413ADC 57 PUSH EDI
00413ADD 8BFA MOV EDI,EDX
00413ADF 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00413AE2 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00413AE5 E8 4A0BFFFF CALL 2_.00404634
00413AEA 33C0 XOR EAX,EAX
00413AEC 55 PUSH EBP
00413AED 68 793B4100 PUSH 2_.00413B79
00413AF2 64:FF30 PUSH DWORD PTR FS:[EAX]
00413AF5 64:8920 MOV DWORD PTR FS:[EAX],ESP
00413AF8 8BC7 MOV EAX,EDI
00413AFA 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00413AFD E8 FA06FFFF CALL 2_.004041FC
00413B02 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00413B05 E8 3A09FFFF CALL 2_.00404444
00413B0A 8BF0 MOV ESI,EAX
00413B0C D1FE SAR ESI,1
00413B0E 79 03 JNS SHORT 2_.00413B13
00413B10 83D6 00 ADC ESI,0
00413B13 85F6 TEST ESI,ESI
00413B15 7E 4C JLE SHORT 2_.00413B63
00413B17 BB 01000000 MOV EBX,1
00413B1C 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 得到密文数据结构指针
00413B1F E8 2009FFFF CALL 2_.00404444 ; 获得密文数据长度
00413B24 2BC3 SUB EAX,EBX ; 从后向前取数据
00413B26 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 得到密文数据结构指针
00413B29 8A0402 MOV AL,BYTE PTR DS:[EDX+EAX] ; 取得一BYTE密文数据
00413B2C 34 01 XOR AL,1
00413B2E 8845 FB MOV BYTE PTR SS:[EBP-5],AL ; 保存到临时变量2
00413B31 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 得到密文数据结构指针
00413B34 E8 0B09FFFF CALL 2_.00404444 ; 获得密文数据长度
00413B39 2BC3 SUB EAX,EBX
00413B3B 50 PUSH EAX
00413B3C 8BC7 MOV EAX,EDI
00413B3E E8 510BFFFF CALL 2_.00404694
00413B43 5A POP EDX ; 从前向后取数据
00413B44 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; 得到密文数据结构指针
00413B47 8A4C19 FF MOV CL,BYTE PTR DS:[ECX+EBX-1] ; 取得一BYTE密文数据
00413B4B 80F1 01 XOR CL,1
00413B4E 880C10 MOV BYTE PTR DS:[EAX+EDX],CL
00413B51 8BC7 MOV EAX,EDI
00413B53 E8 3C0BFFFF CALL 2_.00404694
00413B58 8A55 FB MOV DL,BYTE PTR SS:[EBP-5]
00413B5B 885418 FF MOV BYTE PTR DS:[EAX+EBX-1],DL
00413B5F 43 INC EBX
00413B60 4E DEC ESI
00413B61 ^ 75 B9 JNZ SHORT 2_.00413B1C
00413B63 33C0 XOR EAX,EAX
00413B65 5A POP EDX
00413B66 59 POP ECX
00413B67 59 POP ECX
00413B68 64:8910 MOV DWORD PTR FS:[EAX],EDX
00413B6B 68 803B4100 PUSH 2_.00413B80
00413B70 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00413B73 E8 3006FFFF CALL 2_.004041A8
00413B78 C3 RETN
C函数
void EnCode(const char* Src, int Len, char* Dest)
{
BYTE al, cl;
DWORD ebx, esi;
esi = Len;
esi = esi >> 1;
ebx = 1;
while(esi > 0)
{
al = Src[Len-ebx];
al = al ^ 1;
cl = Src[ebx-1];
cl = cl ^1;
Dest[Len-ebx] = cl;
Dest[ebx-1] = al;
ebx++;
esi--;
}
Dest[Len] = 0;
}
后记:
作者真的很聪明,连手机接口都能用上, 程序用delphi写的,占用的内存还是不少的 呵呵。用命令行聊qq满好玩的。第一次写这方面文章,写的不好之处还请大家包含。
2006年1月2日
gameres:pk2000 pediy:goodcode