GGLHY 发表于 2014-3-18 17:04:16

天涯思君不可忘,不识张郎是张郎 --- EmEditor v12.0.4的注册算法分析

天涯思君不可忘,不识张郎是张郎 --- EmEditor v12.0.4的注册算法分析

“EmEditor is a fast, lightweight, yet extendable, easy-to-use text editor for Windows. Both native 64-bit and 32-bit builds are available!ZDnet.com’s Ed Burnette called EmEditor the “World’s fastest text editor.” Read full review.The text editor supports powerful macros, Unicode, and very large files. Emurasoft’s timeless mission is to achieve our clients’ needs and wants by listening to them with empathy and expertise. We value timely customer support, and are honored to have distinguished users, including major corporations, educational institutions, institutions of the European Union, ministries of Japan, and governments from all over the world.”
                                                                                                                                                                --------------摘自其官网

    EmEditor一直是我喜欢的文本编辑器之一。近日看到官网升至V14.XXX了,顺手做了这个V12.0.4的算法分析,想必不会影响到最新版吧?(为毛不是最新版的破文?呵呵,你懂的,不解释哈)。

闲话少叙,我们直接来到:
一、太极初传柔克刚
6DC1634B    FF75 08         push    dword ptr
6DC1634E    FF15 A030C26D   call    dword ptr [<&KERNEL32.lstrlenW>] ; kernel32.lstrlenW
6DC16354    83F8 1D         cmp   eax, 1D                        ; 输入的注册码为29位吗?
6DC16357    74 0A         je      short 6DC16363
6DC16359    B8 02000000   mov   eax, 2                           ; 当道时见中山狼
6DC1635E    E9 5F0C0000   jmp   6DC16FC2
6DC16363    83A5 18FDFFFF 0>and   dword ptr , 0
6DC1636A    EB 0D         jmp   short 6DC16379
6DC1636C    8B85 18FDFFFF   mov   eax, dword ptr
6DC16372    40            inc   eax
6DC16373    8985 18FDFFFF   mov   dword ptr , eax
6DC16379    83BD 18FDFFFF 1>cmp   dword ptr , 1D          ; 29位注册码的初级检测完毕了吗?
6DC16380    0F8D BB000000   jge   6DC16441
6DC16386    8B85 18FDFFFF   mov   eax, dword ptr
6DC1638C    40            inc   eax
6DC1638D    99            cdq
6DC1638E    B9 06000000   mov   ecx, 6                           ; 排难解纷当六强
6DC16393    F7F9            idiv    ecx
6DC16395    85D2            test    edx, edx
6DC16397    75 21         jnz   short 6DC163BA
6DC16399    8B85 18FDFFFF   mov   eax, dword ptr
6DC1639F    8B4D 08         mov   ecx, dword ptr
6DC163A2    0FB70441      movzx   eax, word ptr       ; 很显然,注册码中的6的倍数位上应该为“-”
6DC163A6    83F8 2D         cmp   eax, 2D                        ; 是"-" 吗?
6DC163A9    74 0A         je      short 6DC163B5
6DC163AB    B8 02000000   mov   eax, 2
6DC163B0    E9 0D0C0000   jmp   6DC16FC2
6DC163B5    E9 82000000   jmp   6DC1643C
6DC163BA    8B85 18FDFFFF   mov   eax, dword ptr
6DC163C0    8B4D 08         mov   ecx, dword ptr          ; 输入的注册码!
6DC163C3    66:8B0441       mov   ax, word ptr          ; 依次每一位!
6DC163C7    66:8985 FAFCFFF>mov   word ptr , ax
6DC163CE    0FB785 FAFCFFFF movzx   eax, word ptr
6DC163D5    83F8 41         cmp   eax, 41                        ; 合法的注册码必须是大写字母,不能是小写的字母
6DC163D8    7C 0C         jl      short 6DC163E6
6DC163DA    0FB785 FAFCFFFF movzx   eax, word ptr
6DC163E1    83F8 5A         cmp   eax, 5A
6DC163E4    7E 18         jle   short 6DC163FE
6DC163E6    0FB785 FAFCFFFF movzx   eax, word ptr
6DC163ED    83F8 32         cmp   eax, 32
6DC163F0    7C 30         jl      short 6DC16422                   ; 若是数字则不得小于2
6DC163F2    0FB785 FAFCFFFF movzx   eax, word ptr
6DC163F9    83F8 39         cmp   eax, 39
6DC163FC    7F 24         jg      short 6DC16422
6DC163FE    0FB785 FAFCFFFF movzx   eax, word ptr
6DC16405    83F8 4F         cmp   eax, 4F                        ; 不能为大写字母O
6DC16408    74 18         je      short 6DC16422
6DC1640A    0FB785 FAFCFFFF movzx   eax, word ptr
6DC16411    83F8 49         cmp   eax, 49                        ; 不能为大写字母 I
6DC16414    74 0C         je      short 6DC16422
6DC16416    C785 F4FCFFFF 0>mov   dword ptr , 1         ; 初步检测合格的标志
6DC16420    EB 07         jmp   short 6DC16429
6DC16422    83A5 F4FCFFFF 0>and   dword ptr , 0
6DC16429    83BD F4FCFFFF 0>cmp   dword ptr , 0            
6DC16430    75 0A         jnz   short 6DC1643C
6DC16432    B8 02000000   mov   eax, 2                           ; 恩断义绝紫衫王!
6DC16437    E9 860B0000   jmp   6DC16FC2
6DC1643C^ E9 2BFFFFFF   jmp   6DC1636C
6DC16441    837D 0C 0C      cmp   dword ptr , 0C
6DC16445    75 15         jnz   short 6DC1645C
6DC16447    8B45 08         mov   eax, dword ptr
6DC1644A    0FB700          movzx   eax, word ptr
6DC1644D    83F8 42         cmp   eax, 42                        ; 第一位是 "B" 吗?
6DC16450    74 0A         je      short 6DC1645C                   ; 君子可欺之以方
6DC16452    B8 02000000   mov   eax, 2
6DC16457    E9 660B0000   jmp   6DC16FC2
6DC1645C    837D 0C 0A      cmp   dword ptr , 0A
6DC16460    75 15         jnz   short 6DC16477
6DC16462    8B45 08         mov   eax, dword ptr
6DC16465    0FB700          movzx   eax, word ptr
6DC16468    83F8 41         cmp   eax, 41
6DC1646B    74 0A         je      short 6DC16477
6DC1646D    B8 02000000   mov   eax, 2
6DC16472    E9 4B0B0000   jmp   6DC16FC2
6DC16477    837D 0C 0C      cmp   dword ptr , 0C
6DC1647B    75 26         jnz   short 6DC164A3
6DC1647D    8D85 70FFFFFF   lea   eax, dword ptr           ; 表1: 《九阳神功》
6DC16483    8985 C0FDFFFF   mov   dword ptr , eax
6DC16489    8D85 F0FDFFFF   lea   eax, dword ptr          ; 表2:《九阴真经》
6DC1648F    8985 00FFFFFF   mov   dword ptr , eax
6DC16495    8D85 20FFFFFF   lea   eax, dword ptr           ; 表3:《武穆遗书》
6DC1649B    8985 A8FEFFFF   mov   dword ptr , eax
6DC164A1    EB 24         jmp   short 6DC164C7
6DC164A3    8D85 78FDFFFF   lea   eax, dword ptr
6DC164A9    8985 C0FDFFFF   mov   dword ptr , eax
6DC164AF    8D85 C0FEFFFF   lea   eax, dword ptr
6DC164B5    8985 00FFFFFF   mov   dword ptr , eax
6DC164BB    8D85 30FEFFFF   lea   eax, dword ptr
6DC164C1    8985 A8FEFFFF   mov   dword ptr , eax
6DC164C7    83A5 14FDFFFF 0>and   dword ptr , 0
6DC164CE    EB 0D         jmp   short 6DC164DD
6DC164D0    8B85 14FDFFFF   mov   eax, dword ptr
6DC164D6    40            inc   eax
6DC164D7    8985 14FDFFFF   mov   dword ptr , eax
6DC164DD    83BD 14FDFFFF 0>cmp   dword ptr , 0B
6DC164E4    7D 24         jge   short 6DC1650A
6DC164E6    8B85 14FDFFFF   mov   eax, dword ptr 附取输入的注册码的特定的11位字符的顺序为:
00CFD17409 00 00 00 03 00 00 00 00 00 00 00 04 00 00 00..............
00CFD1840A 00 00 00 05 00 00 00 01 00 00 00 06 00 00 00.............
00CFD19402 00 00 00 08 00 00 00 07 00 00 00            .........即第10、4、1、5、11、6、2、7、3、9、8位。

好吧,我们现在基本上已了解了注册码最基本的信息了吧!



二、青翼出没一笑扬

我们接着往下走,直到这里。嗯?这是什么的节奏?
6DC1655A    8985 88FCFFFF   mov   dword ptr , eax
6DC16560    83A5 90FCFFFF 0>and   dword ptr , 0
6DC16567    83A5 8CFCFFFF 0>and   dword ptr , 0
6DC1656E    C785 94FCFFFF 0>mov   dword ptr , 67452301    ; 倚天长剑飞寒铓
6DC16578    C785 98FCFFFF 8>mov   dword ptr , EFCDAB89
6DC16582    C785 9CFCFFFF F>mov   dword ptr , 98BADCFE
6DC1658C    C785 A0FCFFFF 7>mov   dword ptr , 10325476
6DC16596    8B85 88FCFFFF   mov   eax, dword ptr
(省略部分代码)
6DC16A0E    C1E8 10         shr   eax, 10
6DC16A11    25 FF000000   and   eax, 0FF
6DC16A16    8B8D B4FBFFFF   mov   ecx, dword ptr
6DC16A1C    88840D E6FCFFFF mov   byte ptr , al
6DC16A23    8B85 F8FBFFFF   mov   eax, dword ptr
6DC16A29    8B8485 94FCFFFF mov   eax, dword ptr [ebp+eax*4-36C>
6DC16A30    C1E8 18         shr   eax, 18
6DC16A33    25 FF000000   and   eax, 0FF
(省略部分代码)
6DC16AEF    EB 10         jmp   short 6DC16B01浮槎北溟海茫茫,谁送冰舸来仙乡?MD5情意深~~~,不悔仲子逾我墙!



三、群雄归心约三章

好吧,前面的青翼蝠王带给我们MD5后的结果了,接下来呢?奇谋秘计梦一场,针其膏兮药其肓。我们接着看程序会干些什么事?

章一剥极而复参九阳
6DC16B41    8B85 10FDFFFF   mov   eax, dword ptr
6DC16B47    40            inc   eax
6DC16B48    8985 10FDFFFF   mov   dword ptr , eax
6DC16B4E    83BD 10FDFFFF 0>cmp   dword ptr , 7         ; 参数7
6DC16B55    7D 22         jge   short 6DC16B79
6DC16B57    8B85 10FDFFFF   mov   eax, dword ptr
6DC16B5D    8B8485 04FFFFFF mov   eax, dword ptr     ; 查表A,决定取MD5结果的哪7位字符
6DC16B64    8B8D 10FDFFFF   mov   ecx, dword ptr
6DC16B6A    66:8B4445 B0    mov   ax, word ptr
6DC16B6F    66:89844D 4CFDF>mov   word ptr , ax
6DC16B77^ EB C8         jmp   short 6DC16B41附取7位字符串的表A:
00CFD2B403 00 00 00 0A 00 00 00 01 00 00 00 15 00 00 00.............
00CFD2C406 00 00 00 1F 00 00 00 1C 00 00 00            .........即取MD5字符串的第4、11、2、22、7、32、29位,得到一个7位字符组成的数值....

6DC16B84    6A 00         push    0
6DC16B86    8D85 4CFDFFFF   lea   eax, dword ptr          ; 七侠聚会乐未央
6DC16B8C    50            push    eax
6DC16B8D    E8 15140000   call    6DC17FA7                         ; 转化为16进制的数值形式
(省略部分代码)
6DC16BB7    83BD 54FBFFFF 0>cmp   dword ptr , 5
6DC16BBE    0F8D DB000000   jge   6DC16C9F
6DC16BC4    B8 05000000   mov   eax, 5                           ; 循环5次哦!
6DC16BC9    2B85 54FBFFFF   sub   eax, dword ptr
6DC16BCF    48            dec   eax
6DC16BD0    8985 40FBFFFF   mov   dword ptr , eax
6DC16BD6    B8 20000000   mov   eax, 20
6DC16BDB    85C0            test    eax, eax
6DC16BDD    75 09         jnz   short 6DC16BE8
6DC16BDF    83A5 50FBFFFF 0>and   dword ptr , 0
6DC16BE6    EB 63         jmp   short 6DC16C4B
6DC16BE8    83BD 40FBFFFF 0>cmp   dword ptr , 0
6DC16BEF    75 0C         jnz   short 6DC16BFD
6DC16BF1    C785 50FBFFFF 0>mov   dword ptr , 1
6DC16BFB    EB 4E         jmp   short 6DC16C4B
6DC16BFD    C785 44FBFFFF 2>mov   dword ptr , 20
6DC16C07    C785 48FBFFFF 0>mov   dword ptr , 1
6DC16C11    EB 0D         jmp   short 6DC16C20
6DC16C13    8B85 48FBFFFF   mov   eax, dword ptr
6DC16C19    40            inc   eax
6DC16C1A    8985 48FBFFFF   mov   dword ptr , eax
6DC16C20    8B85 48FBFFFF   mov   eax, dword ptr
6DC16C26    3B85 40FBFFFF   cmp   eax, dword ptr
6DC16C2C    73 11         jnb   short 6DC16C3F
6DC16C2E    8B85 44FBFFFF   mov   eax, dword ptr
6DC16C34    C1E0 05         shl   eax, 5
6DC16C37    8985 44FBFFFF   mov   dword ptr , eax
6DC16C3D^ EB D4         jmp   short 6DC16C13
6DC16C3F    8B85 44FBFFFF   mov   eax, dword ptr          ; 5次循环,每次的值不同(基本上就是5个常数)
6DC16C45    8985 50FBFFFF   mov   dword ptr , eax
6DC16C4B    8B85 3CFBFFFF   mov   eax, dword ptr          ; 16进制的数值形式
6DC16C51    31D2            xor   edx, edx
6DC16C53    F7B5 50FBFFFF   div   dword ptr             ; 每循环一次结果(初始为转化的数值)除以不同的常数
6DC16C59    8985 4CFBFFFF   mov   dword ptr , eax         ; 商
6DC16C5F    8B85 3CFBFFFF   mov   eax, dword ptr
6DC16C65    31D2            xor   edx, edx
6DC16C67    F7B5 50FBFFFF   div   dword ptr             ;余数(初始为转化的数值)对常数取余
6DC16C6D    8995 3CFBFFFF   mov   dword ptr , edx         ; 结果保存起来 ,进行下一轮运算
6DC16C73    8B85 4CFBFFFF   mov   eax, dword ptr
6DC16C79    31D2            xor   edx, edx
6DC16C7B    B9 20000000   mov   ecx, 20
6DC16C80    F7F1            div   ecx                              ; 商 mod 20H
6DC16C82    8B85 54FBFFFF   mov   eax, dword ptr
6DC16C88    8B8D C0FDFFFF   mov   ecx, dword ptr          ; 表1
6DC16C8E    66:8B0C51       mov   cx, word ptr          ; 根据 mod 20H的余数来查表
6DC16C92    66:898C45 9CFEF>mov   word ptr , cx   ; 结果保存起来
6DC16C9A^ E9 0BFFFFFF   jmp   6DC16BAA查表得到的5个字符相连的字符串,下面重新排序
6DC16CCE    8B85 0CFDFFFF   mov   eax, dword ptr
6DC16CD4    8B8485 1CFDFFFF mov   eax, dword ptr    ; 重新排序的表A-1
6DC16CDB    8B8D 0CFDFFFF   mov   ecx, dword ptr
6DC16CE1    66:8B8445 9CFEF>mov   ax, word ptr
6DC16CE9    66:89844D 64FFF>mov   word ptr , ax附:重新排序的表A-1:
00CFD0CC03 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00.............
00CFD0DC02 00 00 00                                    ...即取第4、11、2、22、7、32、29位重新排序。
6DC16CFE    8D85 64FFFFFF   lea   eax, dword ptr           ; 重新排序后的5位字符串
6DC16D04    50            push    eax
6DC16D05    8B45 08         mov   eax, dword ptr          ; 输入的注册码第3-4-5部分
6DC16D08    83C0 18         add   eax, 18
6DC16D0B    50            push    eax
6DC16D0C    E8 C1170000   call    6DC184D2                         ; 显然排序后的5位与输入的注册码第3部分进行比较
6DC16D11    83C4 0C         add   esp, 0C
6DC16D14    85C0            test    eax, eax
6DC16D16    74 0A         je      short 6DC16D22                  
6DC16D18    B8 02000000   mov   eax, 2                           ; 祸起萧墙破金汤
6DC16D1D    E9 A0020000   jmp   6DC16FC2
章二:百尺高塔任回翔
6DC16D38    83BD 08FDFFFF 0>cmp   dword ptr , 7         ; 第二次也是取7位
6DC16D3F    7D 22         jge   short 6DC16D63
6DC16D41    8B85 08FDFFFF   mov   eax, dword ptr
6DC16D47    8B8485 30FDFFFF mov   eax, dword ptr    ; 第二次取7位顺序表B
(省略部分代码)
6DC16D6C    6A 10         push    10
6DC16D6E    6A 00         push    0
6DC16D70    8D85 4CFDFFFF   lea   eax, dword ptr          ; 取的7位的字符串附:再取7位的顺序表B
00CFD0E008 00 00 00 02 00 00 00 1E 00 00 00 12 00 00 00............
00CFD0F01D 00 00 00 09 00 00 00 1A 00 00 00            .......32...即取第9、3、31、19、30、10、27位。
6DC16E27^\EB D4         jmp   short 6DC16DFD
6DC16E29    8B85 28FBFFFF   mov   eax, dword ptr          ; 又是那5个常数依次出现
6DC16E2F    8985 34FBFFFF   mov   dword ptr , eax
6DC16E35    8B85 20FBFFFF   mov   eax, dword ptr          ; 流程与前面的相同,这里不再赘述。
6DC16E3B    31D2            xor   edx, edx
6DC16E3D    F7B5 34FBFFFF   div   dword ptr
(省略部分代码)
6DC16E78    66:8B0C51       mov   cx, word ptr          ; 注意这里的表不同了。表2(不公开)
6DC16E7C    66:898C45 9CFEF>mov   word ptr , cx
6DC16E84^ E9 0BFFFFFF   jmp   6DC16D94
(省略部分代码)
6DC16EBE    8B8485 ACFEFFFF mov   eax, dword ptr    ; 得到的5位字符串重新排序的表B-1
6DC16EC5    8B8D 04FDFFFF   mov   ecx, dword ptr
6DC16ECB    66:8B8445 9CFEF>mov   ax, word ptr    ; 重新排序,保存
6DC16ED3    66:89844D 64FFF>mov   word ptr , ax附:5位字符串重新排序的表B-1:
00CFD25C01 00 00 00 04 00 00 00 02 00 00 00 03 00 00 00............
00CFD26C00 00 00 00                                    ....即按第2、5、3、4、1位重新排序。
6DC16EE8    8D85 64FFFFFF   lea   eax, dword ptr           ; 重新排序后的5位字符串
6DC16EEE    50            push    eax
6DC16EEF    8B45 08         mov   eax, dword ptr          ; 输入的注册码
6DC16EF2    83C0 24         add   eax, 24
6DC16EF5    50            push    eax                              ; 注册码第4部分
6DC16EF6    E8 D7150000   call    6DC184D2
6DC16EFB    83C4 0C         add   esp, 0C
6DC16EFE    85C0            test    eax, eax
6DC16F00    74 05         je      short 6DC16F07                   ; 四女同舟何所望
6DC16F02    B8 02000000   mov   eax, 2
章三:夭矫三松郁青苍
6DC16F1D    83BD 00FDFFFF 0>cmp   dword ptr , 7         ; 第三次取7位
6DC16F24    7D 22         jge   short 6DC16F48
6DC16F26    8B85 00FDFFFF   mov   eax, dword ptr
6DC16F2C    8B8485 5CFDFFFF mov   eax, dword ptr    ; 第三次取7位时的表
6DC16F33    8B8D 00FDFFFF   mov   ecx, dword ptr
6DC16F39    66:8B4445 B0    mov   ax, word ptr
6DC16F3E    66:89844D 4CFDF>mov   word ptr , ax
6DC16F46^ EB C8         jmp   short 6DC16F10附 第三次取7位顺序的表C
00CFD10C17 00 00 00 0E 00 00 00 05 00 00 00 19 00 00 00............
00CFD11C14 00 00 00 07 00 00 00 16 00 00 00            .........6DC16F55    8D85 4CFDFFFF   lea   eax, dword ptr
6DC16F5B    50            push    eax
6DC16F5C    E8 46100000   call    6DC17FA7                         ; 转为16进制数值
(省略部分代码)
6DC16F8D    0F8D DB000000   jge   6DC1706E
6DC16F93    B8 05000000   mov   eax, 5                           ; 循环5次
6DC16F98    2B85 1CFBFFFF   sub   eax, dword ptr
6DC16F9E    48            dec   eax
(省略部分代码)
6DC1700C^ EB D4         jmp   short 6DC16FE2
6DC1700E    8B85 0CFBFFFF   mov   eax, dword ptr          ; 同样是这5个常数依次出现
(省略部分代码)
6DC1705D    66:8B0C51       mov   cx, word ptr          ; 表3 查表3
6DC17061    66:898C45 9CFEF>mov   word ptr , cx   ; 结果保存起来
6DC17069^ E9 0BFFFFFF   jmp   6DC16F79
6DC1706E    31C0            xor   eax, eax附 5位重新排序的表C-1:
00CFD22004 00 00 00 00 00 00 00 02 00 00 00 03 00 00 00.............
00CFD23001 00 00 00                                    ...即按照5、1、3、4、2的顺序重新排序。
6DC170DB    E8 F2130000   call    6DC184D2                      ; 重新排序的5位字符串:输入的注册码的第5部分
6DC170E0    83C4 0C         add   esp, 0C
6DC170E3    85C0            test    eax, eax
6DC170E5    74 0A         je      short 6DC170F1                ; 穷发十载泛归航
6DC170E7    B8 02000000   mov   eax, 2                        ; 爱你恨你,问君知否?
6DC170EC^ E9 D1FEFFFF   jmp   6DC16FC2
6DC170F1    8B45 08         mov   eax, dword ptr 这里看起来篇幅较长,但实际上就是3次取值运算,查表,重新排序,得到3组各5位字符的字符串。详情可参见下面的第五部分。



四、箫长琴短衣流黄
6DC170F4    0FB740 06       movzx   eax, word ptr          ; 输入的注册码的第4位
6DC170F8    83F8 5A         cmp   eax, 5A                     ; 是大写字母“Z”吗?
6DC170FB    74 0A         je      short 6DC17107
6DC170FD    B8 03000000   mov   eax, 3                        ; 猜猜不是会咋样?
6DC17102^ E9 BBFEFFFF   jmp   6DC16FC2
6DC17107    8B45 08         mov   eax, dword ptr
6DC1710A    66:8B40 04      mov   ax, word ptr           ; 输入的注册码的第3位
6DC1710E    66:8985 BCFDFFF>mov   word ptr , ax
6DC17115    0FB785 BCFDFFFF movzx   eax, word ptr
6DC1711C    83F8 4D         cmp   eax, 4D                     ; 是 "M"吗?
6DC1711F    74 46         je      short 6DC17167
6DC17121    0FB785 BCFDFFFF movzx   eax, word ptr
6DC17128    83F8 45         cmp   eax, 45                     ; 是 "E"吗?
6DC1712B    74 3A         je      short 6DC17167
6DC1712D    0FB785 BCFDFFFF movzx   eax, word ptr
6DC17134    83F8 48         cmp   eax, 48                     ; 是 "H"吗?
6DC17137    74 2E         je      short 6DC17167
6DC17139    0FB785 BCFDFFFF movzx   eax, word ptr
6DC17140    83F8 4E         cmp   eax, 4E                     ; 是 "N"吗?
6DC17143    74 22         je      short 6DC17167
6DC17145    0FB785 BCFDFFFF movzx   eax, word ptr
6DC1714C    83F8 41         cmp   eax, 41                     ; 是 "A"吗?
6DC1714F    74 16         je      short 6DC17167
6DC17151    0FB785 BCFDFFFF movzx   eax, word ptr
6DC17158    83F8 42         cmp   eax, 42                     ; 是 "B"吗?
6DC1715B    74 0A         je      short 6DC17167                ; 天下英雄莫能当
6DC1715D    B8 03000000   mov   eax, 3                        ;东西永隔如参商
6DC17162^ E9 5BFEFFFF   jmp   6DC16FC2
6DC17167^ E9 53FEFFFF   jmp   6DC16FBF
6DC1716C    C3            retn这么明显,没啥可说的了~~



五、不识张郎是张郎
对于7位的数值是如何运算的,我们举个例子来演示。
首先我们介绍下每次5个循环中出现的5个常数,分别是:
第一次循环中为100000H;
第二次循环中为8000H;
第三次循环中为400H;
第四次循环中为20H;
第五次循环中为1H;

我们就以计算第3部分注册码为例(第4、第5部分流程一样,具体参数不同而已)。
比如注册码前11位 BUNZZ-GGLHY --》换序---》得到HZBZY-UGNLG,进行MD5。
MD5(HZBZY-UGNLG)=b183c28176a3a48342b7010a9bbe369b
取MD5后的第 4、11、2、22、7、32、29位,得到字符串“3a118b3”,转化为16进制数值为3a118b3

第一次循环中:
3a118b3 / 100000H=3a                                          
                  3a % 20H...1A(=26) 查表,第27位-(A)   
3a118b3% 100000H=118b3 (余数进行下一循环)
第二次循环中:
118B3(第一次循环中的余数) / 8000H = 2
                                 2 % 20H =2 查表,第3位(W)
118B3   % 8000H    = 18B3(余数进行下一循环)
第三次循环中:
18b3 (第二次循环中的余数)/400H=6   
                               6 %20H =6 ,查表第7位(2)
18b3   % 400H      =   b3(余数进行下一循环)
第四次循环中:
B3 (第三次循环中的余数)/20h=5
                              5 %20H =5 ,查表第6位(S)
B3   % 20h       =   13H (余数进行下一循环)
第五次循环中:
13H(第四次循环中的余数) /1    =13h
                              13h % 20H =13h,查表第20位(C)
13%1    =0,不再进行计算
因此得到一个5位的字符串:AW2SC
按照第4、2、5、1、3的顺序重新排序,成为:SWCA2   ------------》即为注册码的第3部分。


简言之,按照不同顺序取MD5中的7位字符,作为一个7位数的16进制数值进行运算,商的结果查表,余数继续循环运算~~,直至5次运算完毕



六、秘笈兵书此中藏

好吧,行文至此,小结下算法:
0.注册码与用户名无关。
1.注册码的形式为:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX,长度为29位。字母为大写,且不能有数字0、1,也不能有大写字母I、O。(4个“-”将注册码分为5部分。)
2.注册码第1位为"B";
             第3位可以是大写字母“A”、“B”、“E”、“H”、“M”、“N”中的任意1位;
             第4位固定为“Z”;
3.注册码的前11位按照第10、4、1、5、11、6、2、7、3、9、8位的顺序组成新的字符串,进行标准MD5运算。
4.分别计算剩余的3组Key:
    a。取MD5后的第 4、11、2、22、7、32、29位,得到一个7位的数值,运算、查表1,结果按照第4、2、5、1、3的顺序重新排序。---》注册码的第3部分
    b。取MD5后的第9、3、31、19、30、10、27位,得到一个7位的数值,运算、查表2,结果按照第2、5、3、4、1的顺序重新排序。---》注册码的第4部分
    c。取MD5后的第24、15、6、26、21、8、23位,得到一个7位的数值,运算、查表3,结果按照第5、1、3、4、2的顺序重新排序。---》注册码的第5部分

(7位数值的运算参见前面第五部分“不识张郎是张郎”。)


附表1,用于生成注册码第3部分时的查表: 《九阳神功》!
4BWEPS2D5T3Y8NFQJLUCVHZ6RMAK7G9X

附表2(用于生成注册码第4部分时的查表):《九阴真经》!
请原谅,为某种原因,我不在这里公开表2

附表3(用于生成注册码第5部分时的查表):《武穆遗书》!
请原谅,同样我也不在这里公开表3,不解释~~


顺便附Key一组:
**** Hidden Message *****


KG源码就不放了~~~{:2_153:},你懂的!
不是流行有图有 真-相 吗?传图,立照为证~~哈哈




**** Hidden Message *****

PS:本文首发于飘云阁论坛,转载请注明。谢谢!










暗算

zxy20014 发表于 2014-3-22 21:10:56

好东西,支持一下~
em很好用

GGLHY 发表于 2014-3-18 17:14:35

依照国际惯例,自己的沙发自己坐!

theend 发表于 2014-3-18 17:25:00

{:lol:}{:shy:}G大分析好精彩,章节题目有创意~~!

GGLHY 发表于 2014-3-18 17:29:08

本帖最后由 GGLHY 于 2014-3-18 17:39 编辑

theend 发表于 2014-3-18 17:25
G大分析好精彩,章节题目有创意~~!
哈哈!{:handshake:}前段时间刚看完《天龙八部》,近日又重看《倚天屠龙记》。暂借其章回目一用而已~~
希望金老不会找我要版权哈{:titter:}

月之精灵 发表于 2014-3-18 18:03:14

写得很精彩,就是没附件,哈哈

fywy 发表于 2014-3-18 18:22:19

G大分析好精彩!!!膜拜!!!!

小试锋芒 发表于 2014-3-18 18:35:25

好文章!膜拜GG大神!

Nisy 发表于 2014-3-18 18:39:00

强悍 {:victory:}

my1229 发表于 2014-3-18 23:11:24

来膜拜G大了,支持!!!

wkxq 发表于 2014-3-19 08:55:47

{:victory:}分析好精彩
页: [1] 2 3 4 5 6 7
查看完整版本: 天涯思君不可忘,不识张郎是张郎 --- EmEditor v12.0.4的注册算法分析