吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12772|回复: 15
收起左侧

[分享] QQ聊天记录查看器 注册算法分析

  [复制链接]
异袭狂封 发表于 2008-12-8 21:19
【破文标题】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.。到段首一直跟踪会发现一个关键跳,上面就是关键CALL
0046EFA2  |.  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 编辑 ]

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

fuma255 发表于 2009-6-9 18:02
它认识我,我不认识它,我汗
鬼手 发表于 2008-12-9 02:37
它认识我,我不认识它,我汗。谢谢发布,研究下!
maizai 发表于 2010-5-11 01:26
beckhanm001 发表于 2010-5-10 23:15
貌似不错
mymhaha 发表于 2010-5-11 16:30
支持09么?
cccyxb2 发表于 2010-5-11 16:36
謝謝樓主的分享,我的電腦說實在的,真的慢
tank8800 发表于 2010-5-12 01:58
看看行不行。
liangzi 发表于 2010-8-14 11:33
謝謝樓主的分享
77978986 发表于 2010-8-25 02:00
云里雾里的感觉
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-22 22:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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