【文章标题】: QQ聊天记录察看器 5.2算法分析
【文章作者】: 网游难民
【作者主页】: www.chinapyg.com
【软件名称】: QQ聊天记录察看器 5.2
【软件大小】: 648K
【下载地址】: 华军
【加壳方式】: 无
【保护方式】: 注册码,重启验证
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: PEID,OD
【操作平台】: XP SP2
【软件介绍】: 这个东西就不用偶介绍了吧??
--------------------------------------------------------------------------------
【详细过程】
  用OD载入,查找字符串,下断,偶就不多说了~
  
  0046EF04  /.  55            PUSH EBP
  0046EF05  |.  8BEC          MOV EBP,ESP
  0046EF07  |.  83C4 F4       ADD ESP,-0C
  0046EF0A  |.  33C9          XOR ECX,ECX
  0046EF0C  |.  894D F4       MOV DWORD PTR SS:[EBP-C],ECX
  0046EF0F  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX
  0046EF12  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
  0046EF15  |.  33C0          XOR EAX,EAX
  0046EF17  |.  55            PUSH EBP
  0046EF18  |.  68 C3EF4600   PUSH QQ聊天记.0046EFC3
  0046EF1D  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
  0046EF20  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
  0046EF23  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
  0046EF26  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046EF29  |.  8B80 F0020000 MOV EAX,DWORD PTR DS:[EAX+2F0]
  0046EF2F  |.  E8 2096FCFF   CALL QQ聊天记.00438554
  0046EF34  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]             ;  注册码放入EDX~
  0046EF37  |.  B8 E89C4800   MOV EAX,QQ聊天记.00489CE8
  0046EF3C  |.  E8 8F53F9FF   CALL QQ聊天记.004042D0
  0046EF41  |.  A1 E89C4800   MOV EAX,DWORD PTR DS:[489CE8]
  0046EF46  |.  E8 19FDFFFF   CALL QQ聊天记.0046EC64                      ;  算法CALL,跟进~~
  0046EF4B      A3 EC9C4800   MOV DWORD PTR DS:[489CEC],EAX
  0046EF50      833D EC9C4800>CMP DWORD PTR DS:[489CEC],0
  0046EF57  |.  74 34         JE SHORT QQ聊天记.0046EF8D                  ;  关键跳转~
  0046EF59  |.  6A 00         PUSH 0
  0046EF5B  |.  A1 E89C4800   MOV EAX,DWORD PTR DS:[489CE8]
  0046EF60  |.  E8 C757F9FF   CALL QQ聊天记.0040472C
  0046EF65  |.  50            PUSH EAX
  0046EF66  |.  68 D0EF4600   PUSH QQ聊天记.0046EFD0                      ;  注册成功
  0046EF6B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046EF6E  |.  E8 61FCFCFF   CALL QQ聊天记.0043EBD4
  0046EF73  |.  50            PUSH EAX                                 ; |hOwner
  0046EF74  |.  E8 2F80F9FF   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
  0046EF79  |.  A1 E89C4800   MOV EAX,DWORD PTR DS:[489CE8]
  0046EF7E  |.  E8 A1FEFFFF   CALL QQ聊天记.0046EE24
  0046EF83  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046EF86  |.  E8 615DFEFF   CALL QQ聊天记.00454CEC
  0046EF8B  |.  EB 20         JMP SHORT QQ聊天记.0046EFAD
  0046EF8D  |>  6A 00         PUSH 0
  0046EF8F  |.  A1 E89C4800   MOV EAX,DWORD PTR DS:[489CE8]
  0046EF94  |.  E8 9357F9FF   CALL QQ聊天记.0040472C
  0046EF99  |.  50            PUSH EAX
  0046EF9A  |.  68 DCEF4600   PUSH QQ聊天记.0046EFDC                      ;  注册号无效
  0046EF9F  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046EFA2  |.  E8 2DFCFCFF   CALL QQ聊天记.0043EBD4
  0046EFA7  |.  50            PUSH EAX                                 ; |hOwner
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  跟进上面的算法CALL:
  0046EC64  /$  55            PUSH EBP
  0046EC65  |.  8BEC          MOV EBP,ESP
  0046EC67  |.  83C4 C8       ADD ESP,-38
  0046EC6A  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
  0046EC6D  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046EC70  |.  E8 A75AF9FF   CALL QQ聊天记.0040471C
  0046EC75  |.  33C0          XOR EAX,EAX
  0046EC77  |.  55            PUSH EBP
  0046EC78  |.  68 A3ED4600   PUSH QQ聊天记.0046EDA3
  0046EC7D  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
  0046EC80  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
  0046EC83  |.  33C0          XOR EAX,EAX
  0046EC85  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
  0046EC88  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046EC8B  |.  E8 A458F9FF   CALL QQ聊天记.00404534
  0046EC90  |.  83F8 10       CMP EAX,10                               ;  注册码位数和10h比较,小于就跳向失败~
  0046EC93  |.  0F8C F4000000 JL QQ聊天记.0046ED8D
  0046EC99  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  注册码放入EAX~~
  0046EC9C  |.  E8 9358F9FF   CALL QQ聊天记.00404534
  0046ECA1  |.  83F8 10       CMP EAX,10                               ;  注册码位数和10h比较,大于就跳向失败~
  0046ECA4  |.  0F8F E3000000 JG QQ聊天记.0046ED8D
  0046ECAA  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  注册码放入EAX~~
  0046ECAD  |.  BA BCED4600   MOV EDX,QQ聊天记.0046EDBC                   ;  1163659294813585
  0046ECB2  |.  E8 C159F9FF   CALL QQ聊天记.00404678
  0046ECB7  |.  0F84 D0000000 JE QQ聊天记.0046ED8D
  0046ECBD  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046ECC0  |.  BA D8ED4600   MOV EDX,QQ聊天记.0046EDD8                   ;  0386848021608060
  0046ECC5  |.  E8 AE59F9FF   CALL QQ聊天记.00404678
  0046ECCA  |.  0F84 BD000000 JE QQ聊天记.0046ED8D
  0046ECD0  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046ECD3  |.  BA F4ED4600   MOV EDX,QQ聊天记.0046EDF4                   ;  8319e4005f00pyg0
  0046ECD8  |.  E8 9B59F9FF   CALL QQ聊天记.00404678
  0046ECDD  |.  0F84 AA000000 JE QQ聊天记.0046ED8D
  0046ECE3  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0046ECE6  |.  BA 10EE4600   MOV EDX,QQ聊天记.0046EE10                   ;  0566838690673180
  0046ECEB  |.  E8 8859F9FF   CALL QQ聊天记.00404678
  0046ECF0  |.  0F84 97000000 JE QQ聊天记.0046ED8D                        ;  上面四个黑名单啊,跟着跳过去就完蛋拉~~
  0046ECF6  |.  33C0          XOR EAX,EAX
  0046ECF8  |.  8945 DC       MOV DWORD PTR SS:[EBP-24],EAX
  0046ECFB  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]
  0046ECFE  |.  8B55 DC       |MOV EDX,DWORD PTR SS:[EBP-24]
  0046ED01  |.  8A0410        |MOV AL,BYTE PTR DS:[EAX+EDX]
  0046ED04  |.  E8 13FFFFFF   |CALL QQ聊天记.0046EC1C                     ;  算法CALL(1)
  0046ED09  |.  8B55 DC       |MOV EDX,DWORD PTR SS:[EBP-24]
  0046ED0C  |.  884415 CB     |MOV BYTE PTR SS:[EBP+EDX-35],AL
  0046ED10  |.  FF45 DC       |INC DWORD PTR SS:[EBP-24]
  0046ED13  |.  837D DC 10    |CMP DWORD PTR SS:[EBP-24],10
  0046ED17  |.^ 75 E2         \JNZ SHORT QQ聊天记.0046ECFB                ;  循环(1),得到注册码加密后的字符串
  0046ED19  |.  33C0          XOR EAX,EAX
  0046ED1B  |.  8945 E0       MOV DWORD PTR SS:[EBP-20],EAX
  0046ED1E  |>  8B45 E0       /MOV EAX,DWORD PTR SS:[EBP-20]
  0046ED21  |.  03C0          |ADD EAX,EAX
  0046ED23  |.  8A4405 CC     |MOV AL,BYTE PTR SS:[EBP+EAX-34]
  0046ED27  |.  C1E0 04       |SHL EAX,4
  0046ED2A  |.  8B55 E0       |MOV EDX,DWORD PTR SS:[EBP-20]
  0046ED2D  |.  03D2          |ADD EDX,EDX
  0046ED2F  |.  024415 CB     |ADD AL,BYTE PTR SS:[EBP+EDX-35]
  0046ED33  |.  8B55 E0       |MOV EDX,DWORD PTR SS:[EBP-20]
  0046ED36  |.  884415 EF     |MOV BYTE PTR SS:[EBP+EDX-11],AL
  0046ED3A  |.  FF45 E0       |INC DWORD PTR SS:[EBP-20]
  0046ED3D  |.  837D E0 09    |CMP DWORD PTR SS:[EBP-20],9
  0046ED41  |.^ 75 DB         \JNZ SHORT QQ聊天记.0046ED1E                ;  循环(2),把循环(1)中的字符串分为8组
  0046ED43  |.  8A45 F2       MOV AL,BYTE PTR SS:[EBP-E]
  0046ED46  |.  3245 EF       XOR AL,BYTE PTR SS:[EBP-11]
  0046ED49  |.  8845 E6       MOV BYTE PTR SS:[EBP-1A],AL              ;  第一组和第二组逻辑异或运算,结果放在SS:[EBP-1A]中~~
  0046ED4C  |.  8A45 F0       MOV AL,BYTE PTR SS:[EBP-10]
  0046ED4F  |.  3245 F6       XOR AL,BYTE PTR SS:[EBP-A]
  0046ED52  |.  8845 E7       MOV BYTE PTR SS:[EBP-19],AL              ;  第二组和第八组逻辑异或运算,结果放在SS:[EBP-19]中~~
  0046ED55  |.  8A45 F1       MOV AL,BYTE PTR SS:[EBP-F]
  0046ED58  |.  3245 F4       XOR AL,BYTE PTR SS:[EBP-C]
  0046ED5B  |.  8845 E8       MOV BYTE PTR SS:[EBP-18],AL              ;  第三组和第六组逻辑异或运算,结果放在SS:[EBP-18]中~~
  0046ED5E  |.  8A45 F5       MOV AL,BYTE PTR SS:[EBP-B]
  0046ED61  |.  3245 F3       XOR AL,BYTE PTR SS:[EBP-D]
  0046ED64  |.  8845 E9       MOV BYTE PTR SS:[EBP-17],AL              ;  第五组和第七组逻辑异或运算,结果放在SS:[EBP-17]中~~
  0046ED67  |.  807D E6 38    CMP BYTE PTR SS:[EBP-1A],38
  0046ED6B  |.  75 1B         JNZ SHORT QQ聊天记.0046ED88                 ;  检测SS:[EBP-1A]中的数据是不是38,不是则注册失败
  0046ED6D  |.  807D E7 6E    CMP BYTE PTR SS:[EBP-19],6E
  0046ED71  |.  75 15         JNZ SHORT QQ聊天记.0046ED88                 ;  检测SS:[EBP-19]中的数据是不是6E,不是则注册失败
  0046ED73  |.  807D E8 4E    CMP BYTE PTR SS:[EBP-18],4E
  0046ED77  |.  75 0F         JNZ SHORT QQ聊天记.0046ED88                 ;  检测SS:[EBP-18]中的数据是不是4E,不是则注册失败
  0046ED79  |.  807D E9 1A    CMP BYTE PTR SS:[EBP-17],1A
  0046ED7D  |.  75 09         JNZ SHORT QQ聊天记.0046ED88                 ;  检测SS:[EBP-17]中的数据是不是1A,不是则注册失败
  0046ED7F  |.  C745 F8 FFFFF>MOV DWORD PTR SS:[EBP-8],-1
  0046ED86  |.  EB 05         JMP SHORT QQ聊天记.0046ED8D
  0046ED88  |>  33C0          XOR EAX,EAX
  0046ED8A  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
  0046ED8D  |>  33C0          XOR EAX,EAX
  0046ED8F  |.  5A            POP EDX
  0046ED90  |.  59            POP ECX
  0046ED91  |.  59            POP ECX
  0046ED92  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
  0046ED95  |.  68 AAED4600   PUSH QQ聊天记.0046EDAA
  0046ED9A  |>  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
  0046ED9D  |.  E8 DA54F9FF   CALL QQ聊天记.0040427C
  0046EDA2  \.  C3            RETN
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  上面循环(1)是取得注册码经过算法CALL(1)加密后的字符串;
  循环CALL(2)是将经过循环(1)加密后的字符串两两分组,然后倒排,例如字符串12345678经过循环(2)后就变为:21 43 65 87
  算法CALL(1):
  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                                ;  如果是数字就减去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                  ;  上面检查注册码是否A-F
  0046EC45  |.  8A45 FF       MOV AL,BYTE PTR SS:[EBP-1]
  0046EC48  |.  2C 41         SUB AL,41                                ;  减去41
  0046EC4A  |.  04 0A         ADD AL,0A                                ;  加上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
  
  这里对输入的注册码加密;
  注册码如果是0-9,则注册码的ASCII码减30;如果是A-F,则注册码的ASCII码减41再加0A;如果是其他字符,则为FF。
  
--------------------------------------------------------------------------------
【经验总结】
  先对注册码加密:
  注册码如果是0-9,则注册码的ASCII码减30;如果是A-F,则注册码的ASCII码减41再加0A;如果是其他字符,则为FF。
  加密后的字符串两两分组,然后倒排,例如字符串12345678经过循环(2)后就变为:21 43 65 87
  第一组和第二组逻辑异或运算,结果必须是38;
  第二组和第八组逻辑异或运算,结果必须是6E;
  第三组和第六组逻辑异或运算,结果必须是4E;
  第五组和第七组逻辑异或运算,结果必须是1A。
  另外排除四个作者排除的黑名单:
  1163659294813585
  0386848021608060
  8319e4005f00pyg0
  0566838690673180
  
  下面给大家个超级注册码:
  ******7D**1A5*18
  
  其中的*号可以换成除0-9,A-F之外的任何字符,
  而且其中的第一位和第七位,第二位和第八位,第三位和第十五位,第四位和第十六位,第五位和第十一位,第六位和第十
  二位,第九位和第十三位可以互换。
  这次这么多的注册码够大家用一段时间了吧~~呵呵~~
  
--------------------------------------------------------------------------------
【版权声明】: 菜鸟初学算法, 失误之处敬请诸位大侠赐教,转载请注明作者并保持文章的完整, 谢谢!