【破文标题】QQ聊天记录查看器 5.3注册算法分析
【破文作者】异袭狂封
【破解工具】PEiD,OD
【破解平台】Windows XP SP2
【软件名称】QQ聊天记录查看器 5.3
【软件授权】共享版
【软件语言】中文
【原版下载】http://www.newhua.com/soft/47456.htm
【保护方式】注册码
【软件简介】不需要密码来查看曾经在本机上登陆过的QQ聊天记录
【破解声明】一点心得,愿与大家分享o(∩_∩)o 版权所有,转载注明作者!
【破解内容】
可能这种算法对有些人来说太容易了,可我第一次分析算法,分析了好久!有不对请多多指教o(∩_∩)o
VC++编译,无壳,软件可试用两次。胡乱注册谈注册提示,暂停OD,ALT+K 查看调用堆栈可快速定位到弹注册失败的MessageBox.。到段首一直跟踪会发现一个关键跳,上面就是关键CALL0046EFA2 |. E8 BDFCFFFF CALL QQ聊天记.0046EC64 关键CALL
0046EFA7 |. A3 EC9C4800 MOV DWORD PTR DS:[489CEC],EAX
0046EFAC |. 833D EC9C4800> CMP DWORD PTR DS:[489CEC],0
0046EFB3 |. 74 34 JE SHORT QQ聊天记.0046EFE9
0046EFB5 |. 6A 00 PUSH 0
0046EFB7 |. A1 E89C4800 MOV EAX,DWORD PTR DS:[489CE8]
跟进关键CALL 我们来到0046EC8B |. E8 A458F9FF CALL QQ聊天记.00404534 ; 取注册码的位数
0046EC90 |. 83F8 10 CMP EAX,10
0046EC93 |. 0F8C 1A010000 JL QQ聊天记.0046EDB3 ; 不能小于
0046EC99 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0046EC9C |. E8 9358F9FF CALL QQ聊天记.00404534
0046ECA1 |. 83F8 10 CMP EAX,10
0046ECA4 |. 0F8F 09010000 JG QQ聊天记.0046EDB3 ; 不能大于
这里判断注册码的位数,小于、大于都跳死,那注册码肯定得为16位。好,我们继续往下来到0046ECAA |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 取假码
0046ECAD |. BA E0ED4600 MOV EDX,.0046EDE0 ; 1163659294813585
0046ECB2 |. E8 C159F9FF CALL 00404678
0046ECB7 |. 0F84 F6000000 JE 0046EDB3
0046ECBD |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 取假码
0046ECC0 |. BA FCED4600 MOV EDX,.0046EDFC ; 0386848021608060
0046ECC5 |. E8 AE59F9FF CALL 00404678
0046ECCA |. 0F84 E3000000 JE 0046EDB3
0046ECD0 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 取假码
0046ECD3 |. BA 18EE4600 MOV EDX,.0046EE18 ; 8319E4005F00PYG0
0046ECD8 |. E8 9B59F9FF CALL 00404678
0046ECDD |. 0F84 D0000000 JE 0046EDB3
0046ECE3 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 取假码
0046ECE6 |. BA 34EE4600 MOV EDX, 0046EE34 ; 0566838690673180
0046ECEB |. E8 8859F9FF CALL 00404678
0046ECF0 |. 0F84 BD000000 JE 0046EDB3
0046ECF6 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 取假码
0046ECF9 |. BA 50EE4600 MOV EDX, 0046EE50 ; 0386748036909760
0046ECFE |. E8 7559F9FF CALL 00404678
0046ED03 |. 0F84 AA000000 JE 0046EDB3
0046ED09 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 取假码
0046ED0C |. BA 6CEE4600 MOV EDX,.0046EE6C ; sflsky7Dgh1A5i18
0046ED11 |. E8 6259F9FF CALL 00404678
是不是很象注册码,而且正好是十六位,呵呵,随便拿一个试了下,注册失败!在这不知道作者为什么要写进这几个与注册码很像的序列号,其实这已经给了我们很大的帮助,后面就知道为什么了,上面是分别比较注册码与上面几个序列号是否一样,注册码与其中一个一样就跳死。继续往下0046ED21 |> /8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4]
0046ED24 |. |8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24]
0046ED27 |. |8A0410 |MOV AL,BYTE PTR DS:[EAX+EDX] 取每一位的ASCII码
0046ED2A |. |E8 EDFEFFFF |CALL QQ聊天记.0046EC1C
0046ED2F |. |8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24]
0046ED32 |. |884415 CB |MOV BYTE PTR SS:[EBP+EDX-35],AL
0046ED36 |. |FF45 DC |INC DWORD PTR SS:[EBP-24]
0046ED39 |. |837D DC 10 |CMP DWORD PTR SS:[EBP-24],10
0046ED3D |.^\75 E2 \JNZ SHORT QQ聊天记.0046ED21
这里是个循环,一共循环16次,猜下就知道是对注册码的每一位做某种操作。我们观察0046ED2A |. |E8 EDFEFFFF |CALL QQ聊天记.0046EC1C
0046ED2F |. |8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24]
0046ED32 |. |884415 CB |MOV BYTE PTR SS:[EBP+EDX-35],AL
注意第3行的AL,这个AL从哪儿来?是上面的一个CALL的返回值,好,跟进这个CALL来到0046EC1C /$ 55 PUSH EBP
0046EC1D |. 8BEC MOV EBP,ESP
0046EC1F |. 51 PUSH ECX
0046EC20 |. 8845 FF MOV BYTE PTR SS:[EBP-1],AL
0046EC23 |. 807D FF 30 CMP BYTE PTR SS:[EBP-1],30
0046EC27 |. 72 10 JB SHORT QQ聊天记.0046EC39
0046EC29 |. 807D FF 39 CMP BYTE PTR SS:[EBP-1],39
0046EC2D |. 77 0A JA SHORT QQ聊天记.0046EC39
0046EC2F |. 8A45 FF MOV AL,BYTE PTR SS:[EBP-1]
0046EC32 |. 2C 30 SUB AL,30
0046EC34 |. 8845 FD MOV BYTE PTR SS:[EBP-3],AL
0046EC37 |. EB 1C JMP SHORT QQ聊天记.0046EC55
0046EC39 |> 807D FF 41 CMP BYTE PTR SS:[EBP-1],41
0046EC3D |. 72 12 JB SHORT QQ聊天记.0046EC51
0046EC3F |. 807D FF 46 CMP BYTE PTR SS:[EBP-1],46
0046EC43 |. 77 0C JA SHORT QQ聊天记.0046EC51
0046EC45 |. 8A45 FF MOV AL,BYTE PTR SS:[EBP-1]
0046EC48 |. 2C 41 SUB AL,41
0046EC4A |. 04 0A ADD AL,0A
0046EC4C |. 8845 FD MOV BYTE PTR SS:[EBP-3],AL
0046EC4F |. EB 04 JMP SHORT QQ聊天记.0046EC55
0046EC51 |> C645 FD FF MOV BYTE PTR SS:[EBP-3],0FF
0046EC55 |> 8A45 FD MOV AL,BYTE PTR SS:[EBP-3]
0046EC58 |. 8845 FE MOV BYTE PTR SS:[EBP-2],AL
0046EC5B |. 8A45 FE MOV AL,BYTE PTR SS:[EBP-2]
0046EC5E |. 59 POP ECX
0046EC5F |. 5D POP EBP
0046EC60 \. C3 RETN
这段什么意思?在这个CALL之前已经传入了每一位的ASCII码,对每一位的注册码的ASCII 进行检测,试着输入几个16位的假码跟下就知道了。
检测结果是什么?我们得到 注册码如果是0123456789ABCDEF其中一个那返回AL=这一位的数字,假设某一位是1那返回AL=01,假设某一位是F那返回AL=0F。注册码除了上面字符还有其他 G-Z,a-z,这些我们可以得到返回值AL=FF,也就是说只要注册码是G-Z,a-z其中的一个那么AL返回值都是FF
好,我们走出这个CALL,来到干才的那个疑问
0046ED2A |. |E8 EDFEFFFF |CALL QQ聊天记.0046EC1C
0046ED2F |. |8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24]
0046ED32 |. |884415 CB |MOV BYTE PTR SS: [EBP+EDX-35],AL EDX随着循环变化
现在我们可以得出对注册码每一位检测得出的结果存入[EBP+EDX-35],EDX是变化的,我们可以理解为一个数组A,数组里面有9个元素
[EBP-35]=01
[EBP-34]=01
[EBP-33]=06
[EBP-32]=03
[EBP-31]=06
[EBP-30]=05
[EBP-2F]=09
[EBP-2E]=02
[EBP-2D]=09
[EBP-2C]=04
[EBP-2B]=08
[EBP-2A]=01
[EBP-20]=03
[EBP-1F]=05
[EBP-1E]=08
[EBP-1D]=05
我们继续往下来到0046ED44 |> /8B45 E0 /MOV EAX,DWORD PTR SS:[EBP-20]
0046ED47 |. |03C0 |ADD EAX,EAX
0046ED49 |. |8A4405 CC |MOV AL,BYTE PTR SS:[EBP+EAX-34]数组A里面的某一个给AL
0046ED4D |. |C1E0 04 |SHL EAX,4 EAX左移动4位
0046ED50 |. |8B55 E0 |MOV EDX,DWORD PTR SS:[EBP-20]
0046ED53 |. |03D2 |ADD EDX,EDX ; 0
0046ED55 |. |024415 CB |ADD AL,BYTE PTR SS:[EBP+EDX-35] 数组里面的某一个加上原来的AL 赋值给AL
0046ED5 |. |8B55 E0 |MOV EDX,DWORD PTR SS:[EBP-20]
0046ED5C |. |884415 EF |MOV BYTE PTR SS:[EBP+EDX-11],AL 这是关键,AL的值放入第二个数组B ;
0046ED60 |. |FF45 E0 |INC DWORD PTR SS:[EBP-20]
0046ED63 |. |837D E0 09 |CMP DWORD PTR SS:[EBP-20],9
0046ED67 |.^\75 DB \JNZ SHORT QQ聊天记.0046ED44
上面结果得出数组B
[EBP-11]=AL
[EBP-10]=AL
[EBP-F]=AL
[EBP-E]=AL
[EBP-D]=AL
[EBP-C]=AL
[EBP-B]=AL
[EBP-A]=AL
[EBP-9]=00
继续往下跟0046ED69 |. 8A45 F2 MOV AL,BYTE PTR SS:[EBP-E]
0046ED6C |. 3245 EF XOR AL,BYTE PTR SS:[EBP-11]
0046ED6F |. 8845 E6 MOV BYTE PTR SS:[EBP-1A],AL
0046ED72 |. 8A45 F0 MOV AL,BYTE PTR SS:[EBP-10]
0046ED75 |. 3245 F6 XOR AL,BYTE PTR SS:[EBP-A]
0046ED78 |. 8845 E7 MOV BYTE PTR SS:[EBP-19],AL
0046ED7B |. 8A45 F1 MOV AL,BYTE PTR SS:[EBP-F]
0046ED7E |. 3245 F4 XOR AL,BYTE PTR SS:[EBP-C]
0046ED81 |. 8845 E8 MOV BYTE PTR SS:[EBP-18],AL
0046ED84 |. 8A45 F5 MOV AL,BYTE PTR SS:[EBP-B]
0046ED87 |. 3245 F3 XOR AL,BYTE PTR SS:[EBP-D]
0046ED8A |. 8845 E9 MOV BYTE PTR SS:[EBP-17],AL
0046ED8D |. 807D E6 38 CMP BYTE PTR SS:[EBP-1A],38
0046ED91 |. 75 1B JNZ SHORT QQ聊天记.0046EDAE 跳了就完蛋
0046ED93 |. 807D E7 6E CMP BYTE PTR SS:[EBP-19],6E
0046ED97 |. 75 15 JNZ SHORT QQ聊天记.0046EDAE 跳了就完蛋
0046ED99 |. 807D E8 4E CMP BYTE PTR SS:[EBP-18],4E
0046ED9D |. 75 0F JNZ SHORT QQ聊天记.0046EDAE跳了就完蛋
0046ED9F |. 807D E9 1A CMP BYTE PTR SS:[EBP-17],1A
0046EDA3 |. 75 09 JNZ SHORT QQ聊天记.0046EDAE跳了就完蛋
上面这段代码可以简略下,方便理解就是对数组B里面的元素进行一些计算。进行什么计算?我们不难看出是对数组中某两个元素进行异或运算:
[EBP-E] xor [EBP-11]=38H
[EBP-10] xor [EBP-A]=6EH
[EBP-F] xor [EBP-C]=4EH
[EBP-B] xor [EBP-D]=1AH
好了,到这也差不多了,我们引用干才的数组A,[ ]里面的几就为注册码第几位,好看些。
I=0 AL= A[2 ] EAX左移4位 AL=AL+ A[1 ] [EBP-11]=AL
I=1 AL= A[4 ] EAX左移4位 AL=AL+ A[3 ] [EBP-10]=AL
I=2 AL= A[6 ] EAX左移4位 AL=AL+ A[5 ] [EBP-F]=AL
I=3 AL= A[8 ] EAX左移4位 AL=AL+ A[7 ] [EBP-E]=AL
I=4 AL= A[10 ] EAX左移4位 AL=AL+ A[9 ] [EBP-D]=AL
I=5 AL= A[12] EAX左移4位 AL=AL+ A[11] [EBP-C]=AL
I=6 AL= A[14] EAX左移4位 AL=AL+ A[13 ] [EBP-B]=AL
I=7 AL= A[16] EAX左移4位 AL=AL+ A[15 ] [EBP-A]=AL
I=8 AL=00 EAX左移4位 AL=00+00 [EBP-9]=00 最后一次循环,忽略不记,因为下面没有用到。
A[1]、A[2 ]与A[7 ]、A[8 ]必须满足一次变相异或
A[3]、A[4 ]与A[15 ]、A[16 ]必须满足一次变相异或
A[5]、A[6 ]与A[11 ]、A[12 ]必须满足一次变相异或
A[9]、A[10 ]与A[13 ]、A[14 ]必须满足一次变相异或
上面的几个序列号:
1163659294813585
0386848021608060
sflsky7Dgh1A5i18
都是满足真注册码条件的,可作者做了限制,如果注册码与他们其中一个相同就注册失败。
我们先不写注册机,可以试着构造一个真注册码。
就拿第一个1163659294813585 对他进行修改,我们知道第一位、第二位与第七位、第八位存在变相异或关系,我们取第二个数字0386848021608060 的第1、2、7、8,分别替换掉第一个数字的相对应的位数得到0363658094813585,看下是不是注册成功了。呵呵
!
[ 本帖最后由 异袭狂封 于 2008-12-8 21:32 编辑 ] |