飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 17329|回复: 90

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

    [复制链接]
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2014-3-18 17:04:16 | 显示全部楼层 |阅读模式
    天涯思君不可忘,不识张郎是张郎 --- 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的算法分析,想必不会影响到最新版吧?(为毛不是最新版的破文?呵呵,你懂的,不解释哈)。

    闲话少叙,我们直接来到:
    一、太极初传柔克刚

    1. 6DC1634B    FF75 08         push    dword ptr [ebp+8]
    2. 6DC1634E    FF15 A030C26D   call    dword ptr [<&KERNEL32.lstrlenW>] ; kernel32.lstrlenW
    3. 6DC16354    83F8 1D         cmp     eax, 1D                          ; 输入的注册码为29位吗?
    4. 6DC16357    74 0A           je      short 6DC16363
    5. 6DC16359    B8 02000000     mov     eax, 2                           ; 当道时见中山狼
    6. 6DC1635E    E9 5F0C0000     jmp     6DC16FC2
    7. 6DC16363    83A5 18FDFFFF 0>and     dword ptr [ebp-2E8], 0
    8. 6DC1636A    EB 0D           jmp     short 6DC16379
    9. 6DC1636C    8B85 18FDFFFF   mov     eax, dword ptr [ebp-2E8]
    10. 6DC16372    40              inc     eax
    11. 6DC16373    8985 18FDFFFF   mov     dword ptr [ebp-2E8], eax
    12. 6DC16379    83BD 18FDFFFF 1>cmp     dword ptr [ebp-2E8], 1D          ; 29位注册码的初级检测完毕了吗?
    13. 6DC16380    0F8D BB000000   jge     6DC16441
    14. 6DC16386    8B85 18FDFFFF   mov     eax, dword ptr [ebp-2E8]
    15. 6DC1638C    40              inc     eax
    16. 6DC1638D    99              cdq
    17. 6DC1638E    B9 06000000     mov     ecx, 6                           ; 排难解纷当六强
    18. 6DC16393    F7F9            idiv    ecx
    19. 6DC16395    85D2            test    edx, edx
    20. 6DC16397    75 21           jnz     short 6DC163BA
    21. 6DC16399    8B85 18FDFFFF   mov     eax, dword ptr [ebp-2E8]
    22. 6DC1639F    8B4D 08         mov     ecx, dword ptr [ebp+8]
    23. 6DC163A2    0FB70441        movzx   eax, word ptr [ecx+eax*2]        ; 很显然,注册码中的6的倍数位上应该为“-”
    24. 6DC163A6    83F8 2D         cmp     eax, 2D                          ; 是"-" 吗?
    25. 6DC163A9    74 0A           je      short 6DC163B5
    26. 6DC163AB    B8 02000000     mov     eax, 2
    27. 6DC163B0    E9 0D0C0000     jmp     6DC16FC2
    28. 6DC163B5    E9 82000000     jmp     6DC1643C
    29. 6DC163BA    8B85 18FDFFFF   mov     eax, dword ptr [ebp-2E8]
    30. 6DC163C0    8B4D 08         mov     ecx, dword ptr [ebp+8]           ; 输入的注册码!
    31. 6DC163C3    66:8B0441       mov     ax, word ptr [ecx+eax*2]         ; 依次每一位!
    32. 6DC163C7    66:8985 FAFCFFF>mov     word ptr [ebp-306], ax
    33. 6DC163CE    0FB785 FAFCFFFF movzx   eax, word ptr [ebp-306]
    34. 6DC163D5    83F8 41         cmp     eax, 41                          ; 合法的注册码必须是大写字母,不能是小写的字母
    35. 6DC163D8    7C 0C           jl      short 6DC163E6
    36. 6DC163DA    0FB785 FAFCFFFF movzx   eax, word ptr [ebp-306]
    37. 6DC163E1    83F8 5A         cmp     eax, 5A
    38. 6DC163E4    7E 18           jle     short 6DC163FE
    39. 6DC163E6    0FB785 FAFCFFFF movzx   eax, word ptr [ebp-306]
    40. 6DC163ED    83F8 32         cmp     eax, 32
    41. 6DC163F0    7C 30           jl      short 6DC16422                   ; 若是数字则不得小于2
    42. 6DC163F2    0FB785 FAFCFFFF movzx   eax, word ptr [ebp-306]
    43. 6DC163F9    83F8 39         cmp     eax, 39
    44. 6DC163FC    7F 24           jg      short 6DC16422
    45. 6DC163FE    0FB785 FAFCFFFF movzx   eax, word ptr [ebp-306]
    46. 6DC16405    83F8 4F         cmp     eax, 4F                          ; 不能为大写字母O
    47. 6DC16408    74 18           je      short 6DC16422
    48. 6DC1640A    0FB785 FAFCFFFF movzx   eax, word ptr [ebp-306]
    49. 6DC16411    83F8 49         cmp     eax, 49                          ; 不能为大写字母 I
    50. 6DC16414    74 0C           je      short 6DC16422
    51. 6DC16416    C785 F4FCFFFF 0>mov     dword ptr [ebp-30C], 1           ; 初步检测合格的标志
    52. 6DC16420    EB 07           jmp     short 6DC16429
    53. 6DC16422    83A5 F4FCFFFF 0>and     dword ptr [ebp-30C], 0
    54. 6DC16429    83BD F4FCFFFF 0>cmp     dword ptr [ebp-30C], 0            
    55. 6DC16430    75 0A           jnz     short 6DC1643C
    56. 6DC16432    B8 02000000     mov     eax, 2                           ; 恩断义绝紫衫王!
    57. 6DC16437    E9 860B0000     jmp     6DC16FC2
    58. 6DC1643C  ^ E9 2BFFFFFF     jmp     6DC1636C
    59. 6DC16441    837D 0C 0C      cmp     dword ptr [ebp+C], 0C
    60. 6DC16445    75 15           jnz     short 6DC1645C
    61. 6DC16447    8B45 08         mov     eax, dword ptr [ebp+8]
    62. 6DC1644A    0FB700          movzx   eax, word ptr [eax]
    63. 6DC1644D    83F8 42         cmp     eax, 42                          ; 第一位是 "B" 吗?
    64. 6DC16450    74 0A           je      short 6DC1645C                   ; 君子可欺之以方
    65. 6DC16452    B8 02000000     mov     eax, 2
    66. 6DC16457    E9 660B0000     jmp     6DC16FC2
    67. 6DC1645C    837D 0C 0A      cmp     dword ptr [ebp+C], 0A
    68. 6DC16460    75 15           jnz     short 6DC16477
    69. 6DC16462    8B45 08         mov     eax, dword ptr [ebp+8]
    70. 6DC16465    0FB700          movzx   eax, word ptr [eax]
    71. 6DC16468    83F8 41         cmp     eax, 41
    72. 6DC1646B    74 0A           je      short 6DC16477
    73. 6DC1646D    B8 02000000     mov     eax, 2
    74. 6DC16472    E9 4B0B0000     jmp     6DC16FC2
    75. 6DC16477    837D 0C 0C      cmp     dword ptr [ebp+C], 0C
    76. 6DC1647B    75 26           jnz     short 6DC164A3
    77. 6DC1647D    8D85 70FFFFFF   lea     eax, dword ptr [ebp-90]          ; 表1: 《九阳神功》
    78. 6DC16483    8985 C0FDFFFF   mov     dword ptr [ebp-240], eax
    79. 6DC16489    8D85 F0FDFFFF   lea     eax, dword ptr [ebp-210]         ; 表2:《九阴真经》
    80. 6DC1648F    8985 00FFFFFF   mov     dword ptr [ebp-100], eax
    81. 6DC16495    8D85 20FFFFFF   lea     eax, dword ptr [ebp-E0]          ; 表3:《武穆遗书》
    82. 6DC1649B    8985 A8FEFFFF   mov     dword ptr [ebp-158], eax
    83. 6DC164A1    EB 24           jmp     short 6DC164C7
    84. 6DC164A3    8D85 78FDFFFF   lea     eax, dword ptr [ebp-288]
    85. 6DC164A9    8985 C0FDFFFF   mov     dword ptr [ebp-240], eax
    86. 6DC164AF    8D85 C0FEFFFF   lea     eax, dword ptr [ebp-140]
    87. 6DC164B5    8985 00FFFFFF   mov     dword ptr [ebp-100], eax
    88. 6DC164BB    8D85 30FEFFFF   lea     eax, dword ptr [ebp-1D0]
    89. 6DC164C1    8985 A8FEFFFF   mov     dword ptr [ebp-158], eax
    90. 6DC164C7    83A5 14FDFFFF 0>and     dword ptr [ebp-2EC], 0
    91. 6DC164CE    EB 0D           jmp     short 6DC164DD
    92. 6DC164D0    8B85 14FDFFFF   mov     eax, dword ptr [ebp-2EC]
    93. 6DC164D6    40              inc     eax
    94. 6DC164D7    8985 14FDFFFF   mov     dword ptr [ebp-2EC], eax
    95. 6DC164DD    83BD 14FDFFFF 0>cmp     dword ptr [ebp-2EC], 0B
    96. 6DC164E4    7D 24           jge     short 6DC1650A
    97. 6DC164E6    8B85 14FDFFFF   mov     eax, dword ptr [ebp-2EC]
    复制代码
    附  取输入的注册码的特定的11位字符的顺序为:
    1. 00CFD174  09 00 00 00 03 00 00 00 00 00 00 00 04 00 00 00  ..............
    2. 00CFD184  0A 00 00 00 05 00 00 00 01 00 00 00 06 00 00 00  .............
    3. 00CFD194  02 00 00 00 08 00 00 00 07 00 00 00              .........
    复制代码
    即第10、4、1、5、11、6、2、7、3、9、8位。

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



    二、青翼出没一笑扬


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



    三、群雄归心约三章


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

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

    1. 6DC16B84    6A 00           push    0
    2. 6DC16B86    8D85 4CFDFFFF   lea     eax, dword ptr [ebp-2B4]         ; 七侠聚会乐未央
    3. 6DC16B8C    50              push    eax
    4. 6DC16B8D    E8 15140000     call    6DC17FA7                         ; 转化为16进制的数值形式
    5. (省略部分代码)
    6. 6DC16BB7    83BD 54FBFFFF 0>cmp     dword ptr [ebp-4AC], 5
    7. 6DC16BBE    0F8D DB000000   jge     6DC16C9F
    8. 6DC16BC4    B8 05000000     mov     eax, 5                           ; 循环5次哦!
    9. 6DC16BC9    2B85 54FBFFFF   sub     eax, dword ptr [ebp-4AC]
    10. 6DC16BCF    48              dec     eax
    11. 6DC16BD0    8985 40FBFFFF   mov     dword ptr [ebp-4C0], eax
    12. 6DC16BD6    B8 20000000     mov     eax, 20
    13. 6DC16BDB    85C0            test    eax, eax
    14. 6DC16BDD    75 09           jnz     short 6DC16BE8
    15. 6DC16BDF    83A5 50FBFFFF 0>and     dword ptr [ebp-4B0], 0
    16. 6DC16BE6    EB 63           jmp     short 6DC16C4B
    17. 6DC16BE8    83BD 40FBFFFF 0>cmp     dword ptr [ebp-4C0], 0
    18. 6DC16BEF    75 0C           jnz     short 6DC16BFD
    19. 6DC16BF1    C785 50FBFFFF 0>mov     dword ptr [ebp-4B0], 1
    20. 6DC16BFB    EB 4E           jmp     short 6DC16C4B
    21. 6DC16BFD    C785 44FBFFFF 2>mov     dword ptr [ebp-4BC], 20
    22. 6DC16C07    C785 48FBFFFF 0>mov     dword ptr [ebp-4B8], 1
    23. 6DC16C11    EB 0D           jmp     short 6DC16C20
    24. 6DC16C13    8B85 48FBFFFF   mov     eax, dword ptr [ebp-4B8]
    25. 6DC16C19    40              inc     eax
    26. 6DC16C1A    8985 48FBFFFF   mov     dword ptr [ebp-4B8], eax
    27. 6DC16C20    8B85 48FBFFFF   mov     eax, dword ptr [ebp-4B8]
    28. 6DC16C26    3B85 40FBFFFF   cmp     eax, dword ptr [ebp-4C0]
    29. 6DC16C2C    73 11           jnb     short 6DC16C3F
    30. 6DC16C2E    8B85 44FBFFFF   mov     eax, dword ptr [ebp-4BC]
    31. 6DC16C34    C1E0 05         shl     eax, 5
    32. 6DC16C37    8985 44FBFFFF   mov     dword ptr [ebp-4BC], eax
    33. 6DC16C3D  ^ EB D4           jmp     short 6DC16C13
    34. 6DC16C3F    8B85 44FBFFFF   mov     eax, dword ptr [ebp-4BC]         ; 5次循环,每次的值不同(基本上就是5个常数)
    35. 6DC16C45    8985 50FBFFFF   mov     dword ptr [ebp-4B0], eax
    36. 6DC16C4B    8B85 3CFBFFFF   mov     eax, dword ptr [ebp-4C4]         ; 16进制的数值形式
    37. 6DC16C51    31D2            xor     edx, edx
    38. 6DC16C53    F7B5 50FBFFFF   div     dword ptr [ebp-4B0]              ; 每循环一次结果(初始为转化的数值)除以不同的常数
    39. 6DC16C59    8985 4CFBFFFF   mov     dword ptr [ebp-4B4], eax         ; 商
    40. 6DC16C5F    8B85 3CFBFFFF   mov     eax, dword ptr [ebp-4C4]
    41. 6DC16C65    31D2            xor     edx, edx
    42. 6DC16C67    F7B5 50FBFFFF   div     dword ptr [ebp-4B0]              ;  余数(初始为转化的数值)对常数取余
    43. 6DC16C6D    8995 3CFBFFFF   mov     dword ptr [ebp-4C4], edx         ; 结果保存起来 ,进行下一轮运算
    44. 6DC16C73    8B85 4CFBFFFF   mov     eax, dword ptr [ebp-4B4]
    45. 6DC16C79    31D2            xor     edx, edx
    46. 6DC16C7B    B9 20000000     mov     ecx, 20
    47. 6DC16C80    F7F1            div     ecx                              ; 商 mod 20H
    48. 6DC16C82    8B85 54FBFFFF   mov     eax, dword ptr [ebp-4AC]
    49. 6DC16C88    8B8D C0FDFFFF   mov     ecx, dword ptr [ebp-240]         ; 表1
    50. 6DC16C8E    66:8B0C51       mov     cx, word ptr [ecx+edx*2]         ; 根据 mod 20H的余数来查表
    51. 6DC16C92    66:898C45 9CFEF>mov     word ptr [ebp+eax*2-164], cx     ; 结果保存起来
    52. 6DC16C9A  ^ E9 0BFFFFFF     jmp     6DC16BAA
    复制代码
    查表得到的5个字符相连的字符串,下面重新排序
    1. 6DC16CCE    8B85 0CFDFFFF   mov     eax, dword ptr [ebp-2F4]
    2. 6DC16CD4    8B8485 1CFDFFFF mov     eax, dword ptr [ebp+eax*4-2E4]   ; 重新排序的表A-1
    3. 6DC16CDB    8B8D 0CFDFFFF   mov     ecx, dword ptr [ebp-2F4]
    4. 6DC16CE1    66:8B8445 9CFEF>mov     ax, word ptr [ebp+eax*2-164]
    5. 6DC16CE9    66:89844D 64FFF>mov     word ptr [ebp+ecx*2-9C], ax
    复制代码
    附:重新排序的表A-1:
    1. 00CFD0CC  03 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00  .............
    2. 00CFD0DC  02 00 00 00                                      ...
    复制代码
    即取第4、11、2、22、7、32、29位重新排序。
    1. 6DC16CFE    8D85 64FFFFFF   lea     eax, dword ptr [ebp-9C]          ; 重新排序后的5位字符串
    2. 6DC16D04    50              push    eax
    3. 6DC16D05    8B45 08         mov     eax, dword ptr [ebp+8]           ; 输入的注册码第3-4-5部分
    4. 6DC16D08    83C0 18         add     eax, 18
    5. 6DC16D0B    50              push    eax
    6. 6DC16D0C    E8 C1170000     call    6DC184D2                         ; 显然排序后的5位与输入的注册码第3部分进行比较
    7. 6DC16D11    83C4 0C         add     esp, 0C
    8. 6DC16D14    85C0            test    eax, eax
    9. 6DC16D16    74 0A           je      short 6DC16D22                  
    10. 6DC16D18    B8 02000000     mov     eax, 2                           ; 祸起萧墙破金汤
    11. 6DC16D1D    E9 A0020000     jmp     6DC16FC2
    复制代码

    章二:百尺高塔任回翔
    1. 6DC16D38    83BD 08FDFFFF 0>cmp     dword ptr [ebp-2F8], 7           ; 第二次也是取7位
    2. 6DC16D3F    7D 22           jge     short 6DC16D63
    3. 6DC16D41    8B85 08FDFFFF   mov     eax, dword ptr [ebp-2F8]
    4. 6DC16D47    8B8485 30FDFFFF mov     eax, dword ptr [ebp+eax*4-2D0]   ; 第二次取7位顺序表B
    5. (省略部分代码)
    6. 6DC16D6C    6A 10           push    10
    7. 6DC16D6E    6A 00           push    0
    8. 6DC16D70    8D85 4CFDFFFF   lea     eax, dword ptr [ebp-2B4]         ; 取的7位的字符串
    复制代码
    附:再取7位的顺序表B
    1. 00CFD0E0  08 00 00 00 02 00 00 00 1E 00 00 00 12 00 00 00  ............
    2. 00CFD0F0  1D 00 00 00 09 00 00 00 1A 00 00 00              .......32...
    复制代码
    即取第9、3、31、19、30、10、27位。
    1. 6DC16E27  ^\EB D4           jmp     short 6DC16DFD
    2. 6DC16E29    8B85 28FBFFFF   mov     eax, dword ptr [ebp-4D8]         ; 又是那5个常数依次出现
    3. 6DC16E2F    8985 34FBFFFF   mov     dword ptr [ebp-4CC], eax
    4. 6DC16E35    8B85 20FBFFFF   mov     eax, dword ptr [ebp-4E0]         ; 流程与前面的相同,这里不再赘述。
    5. 6DC16E3B    31D2            xor     edx, edx
    6. 6DC16E3D    F7B5 34FBFFFF   div     dword ptr [ebp-4CC]
    7. (省略部分代码)
    8. 6DC16E78    66:8B0C51       mov     cx, word ptr [ecx+edx*2]         ; 注意这里的表不同了。表2(不公开)
    9. 6DC16E7C    66:898C45 9CFEF>mov     word ptr [ebp+eax*2-164], cx
    10. 6DC16E84  ^ E9 0BFFFFFF     jmp     6DC16D94
    11. (省略部分代码)
    12. 6DC16EBE    8B8485 ACFEFFFF mov     eax, dword ptr [ebp+eax*4-154]   ; 得到的5位字符串重新排序的表B-1
    13. 6DC16EC5    8B8D 04FDFFFF   mov     ecx, dword ptr [ebp-2FC]
    14. 6DC16ECB    66:8B8445 9CFEF>mov     ax, word ptr [ebp+eax*2-164]     ; 重新排序,保存
    15. 6DC16ED3    66:89844D 64FFF>mov     word ptr [ebp+ecx*2-9C], ax
    复制代码
    附:5位字符串重新排序的表B-1:
    1. 00CFD25C  01 00 00 00 04 00 00 00 02 00 00 00 03 00 00 00  ............
    2. 00CFD26C  00 00 00 00                                      ....
    复制代码
    即按第2、5、3、4、1位重新排序。
    1. 6DC16EE8    8D85 64FFFFFF   lea     eax, dword ptr [ebp-9C]          ; 重新排序后的5位字符串
    2. 6DC16EEE    50              push    eax
    3. 6DC16EEF    8B45 08         mov     eax, dword ptr [ebp+8]           ; 输入的注册码
    4. 6DC16EF2    83C0 24         add     eax, 24
    5. 6DC16EF5    50              push    eax                              ; 注册码第4部分
    6. 6DC16EF6    E8 D7150000     call    6DC184D2
    7. 6DC16EFB    83C4 0C         add     esp, 0C
    8. 6DC16EFE    85C0            test    eax, eax
    9. 6DC16F00    74 05           je      short 6DC16F07                   ; 四女同舟何所望
    10. 6DC16F02    B8 02000000     mov     eax, 2
    复制代码

    章三:夭矫三松郁青苍
    1. 6DC16F1D    83BD 00FDFFFF 0>cmp     dword ptr [ebp-300], 7           ; 第三次取7位
    2. 6DC16F24    7D 22           jge     short 6DC16F48
    3. 6DC16F26    8B85 00FDFFFF   mov     eax, dword ptr [ebp-300]
    4. 6DC16F2C    8B8485 5CFDFFFF mov     eax, dword ptr [ebp+eax*4-2A4]   ; 第三次取7位时的表
    5. 6DC16F33    8B8D 00FDFFFF   mov     ecx, dword ptr [ebp-300]
    6. 6DC16F39    66:8B4445 B0    mov     ax, word ptr [ebp+eax*2-50]
    7. 6DC16F3E    66:89844D 4CFDF>mov     word ptr [ebp+ecx*2-2B4], ax
    8. 6DC16F46  ^ EB C8           jmp     short 6DC16F10
    复制代码
    附 第三次取7位顺序的表C
    1. 00CFD10C  17 00 00 00 0E 00 00 00 05 00 00 00 19 00 00 00  ............
    2. 00CFD11C  14 00 00 00 07 00 00 00 16 00 00 00              .........
    复制代码
    1. 6DC16F55    8D85 4CFDFFFF   lea     eax, dword ptr [ebp-2B4]
    2. 6DC16F5B    50              push    eax
    3. 6DC16F5C    E8 46100000     call    6DC17FA7                         ; 转为16进制数值
    4. (省略部分代码)
    5. 6DC16F8D    0F8D DB000000   jge     6DC1706E
    6. 6DC16F93    B8 05000000     mov     eax, 5                           ; 循环5次
    7. 6DC16F98    2B85 1CFBFFFF   sub     eax, dword ptr [ebp-4E4]
    8. 6DC16F9E    48              dec     eax
    9. (省略部分代码)
    10. 6DC1700C  ^ EB D4           jmp     short 6DC16FE2
    11. 6DC1700E    8B85 0CFBFFFF   mov     eax, dword ptr [ebp-4F4]         ; 同样是这5个常数依次出现
    12. (省略部分代码)
    13. 6DC1705D    66:8B0C51       mov     cx, word ptr [ecx+edx*2]         ; 表3 查表3
    14. 6DC17061    66:898C45 9CFEF>mov     word ptr [ebp+eax*2-164], cx     ; 结果保存起来
    15. 6DC17069  ^ E9 0BFFFFFF     jmp     6DC16F79
    16. 6DC1706E    31C0            xor     eax, eax
    复制代码
    附 5位重新排序的表C-1:
    1. 00CFD220  04 00 00 00 00 00 00 00 02 00 00 00 03 00 00 00  .............
    2. 00CFD230  01 00 00 00                                      ...
    复制代码
    即按照5、1、3、4、2的顺序重新排序。
    1. 6DC170DB    E8 F2130000     call    6DC184D2                      ; 重新排序的5位字符串:输入的注册码的第5部分
    2. 6DC170E0    83C4 0C         add     esp, 0C
    3. 6DC170E3    85C0            test    eax, eax
    4. 6DC170E5    74 0A           je      short 6DC170F1                ; 穷发十载泛归航
    5. 6DC170E7    B8 02000000     mov     eax, 2                        ; 爱你恨你,问君知否?
    6. 6DC170EC  ^ E9 D1FEFFFF     jmp     6DC16FC2
    7. 6DC170F1    8B45 08         mov     eax, dword ptr [ebp+8]
    复制代码
    这里看起来篇幅较长,但实际上就是3次取值运算,查表,重新排序,得到3组各5位字符的字符串。详情可参见下面的第五部分。



    四、箫长琴短衣流黄

    1. 6DC170F4    0FB740 06       movzx   eax, word ptr [eax+6]         ; 输入的注册码的第4位
    2. 6DC170F8    83F8 5A         cmp     eax, 5A                       ; 是大写字母“Z”吗?
    3. 6DC170FB    74 0A           je      short 6DC17107
    4. 6DC170FD    B8 03000000     mov     eax, 3                        ; 猜猜不是会咋样?
    5. 6DC17102  ^ E9 BBFEFFFF     jmp     6DC16FC2
    6. 6DC17107    8B45 08         mov     eax, dword ptr [ebp+8]
    7. 6DC1710A    66:8B40 04      mov     ax, word ptr [eax+4]          ; 输入的注册码的第3位
    8. 6DC1710E    66:8985 BCFDFFF>mov     word ptr [ebp-244], ax
    9. 6DC17115    0FB785 BCFDFFFF movzx   eax, word ptr [ebp-244]
    10. 6DC1711C    83F8 4D         cmp     eax, 4D                       ; 是 "M"吗?
    11. 6DC1711F    74 46           je      short 6DC17167
    12. 6DC17121    0FB785 BCFDFFFF movzx   eax, word ptr [ebp-244]
    13. 6DC17128    83F8 45         cmp     eax, 45                       ; 是 "E"吗?
    14. 6DC1712B    74 3A           je      short 6DC17167
    15. 6DC1712D    0FB785 BCFDFFFF movzx   eax, word ptr [ebp-244]
    16. 6DC17134    83F8 48         cmp     eax, 48                       ; 是 "H"吗?
    17. 6DC17137    74 2E           je      short 6DC17167
    18. 6DC17139    0FB785 BCFDFFFF movzx   eax, word ptr [ebp-244]
    19. 6DC17140    83F8 4E         cmp     eax, 4E                       ; 是 "N"吗?
    20. 6DC17143    74 22           je      short 6DC17167
    21. 6DC17145    0FB785 BCFDFFFF movzx   eax, word ptr [ebp-244]
    22. 6DC1714C    83F8 41         cmp     eax, 41                       ; 是 "A"吗?
    23. 6DC1714F    74 16           je      short 6DC17167
    24. 6DC17151    0FB785 BCFDFFFF movzx   eax, word ptr [ebp-244]
    25. 6DC17158    83F8 42         cmp     eax, 42                       ; 是 "B"吗?
    26. 6DC1715B    74 0A           je      short 6DC17167                ; 天下英雄莫能当
    27. 6DC1715D    B8 03000000     mov     eax, 3                        ;东西永隔如参商
    28. 6DC17162  ^ E9 5BFEFFFF     jmp     6DC16FC2
    29. 6DC17167  ^ E9 53FEFFFF     jmp     6DC16FBF
    30. 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

    第一次循环中:
    1. 3a118b3 / 100000H  =3a                                          
    2.                     3a % 20H  ...1A(=26) 查表,第27位-(A)   
    3. 3a118b3  % 100000H  =118b3 (余数进行下一循环)
    复制代码

    第二次循环中:
    1. 118B3(第一次循环中的余数) / 8000H = 2
    2.                                    2 % 20H =2 查表,第3位(W)
    3. 118B3   % 8000H    = 18B3  (余数进行下一循环)
    复制代码

    第三次循环中:
    1. 18b3 (第二次循环中的余数)/400H  =6   
    2.                                6 %20H =6 ,查表第7位(2)
    3. 18b3   % 400H      =   b3  (余数进行下一循环)
    复制代码

    第四次循环中:
    1. B3 (第三次循环中的余数)  /20h  =5
    2.                               5 %20H =5 ,查表第6位(S)
    3. B3     % 20h       =   13H (余数进行下一循环)
    复制代码

    第五次循环中:
    1. 13H(第四次循环中的余数) /1    =13h
    2.                               13h % 20H =13h,查表第20位(C)
    3. 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一组:
    游客,如果您要查看本帖隐藏内容请回复



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

    ZC.PNG
    ookk.PNG

    游客,如果您要查看本帖隐藏内容请回复


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










    来自群组: 暗算

    评分

    参与人数 8威望 +68 飘云币 +108 收起 理由
    yosen2001 + 8 + 8 神马都是浮云
    GeekCat + 4 很给力!
    cjteam + 8 很给力!
    yyjpcx + 20 + 40 赞一个! 算法精湛
    飞天 + 8 + 8 赞一个!
    kongking + 4 很给力啊,很详细
    MOV + 20 + 40 很给力!
    小试锋芒 + 4 + 4 哥,《射雕英雄传》你看的可是书?

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-5-9 10:29
  • 签到天数: 72 天

    [LV.6]常住居民II

    发表于 2014-3-22 21:10:56 | 显示全部楼层
    好东西,支持一下~
    em很好用
    PYG19周年生日快乐!
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-3-18 17:14:35 | 显示全部楼层
    依照国际惯例,自己的沙发自己坐!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-4-1 09:59
  • 签到天数: 76 天

    [LV.6]常住居民II

    发表于 2014-3-18 17:25:00 | 显示全部楼层
    G大分析好精彩,章节题目有创意~~!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-3-18 17:29:08 | 显示全部楼层
    本帖最后由 GGLHY 于 2014-3-18 17:39 编辑
    theend 发表于 2014-3-18 17:25
    G大分析好精彩,章节题目有创意~~!

    哈哈!前段时间刚看完《天龙八部》,近日又重看《倚天屠龙记》。暂借其章回目一用而已~~
    希望金老不会找我要版权哈

    点评

    金老还活着吗?  发表于 2014-3-22 10:58
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-3-18 18:03:14 | 显示全部楼层
    写得很精彩,就是没附件,哈哈

    点评

    哈哈,,昨天发完没注意看,附件的注册码居然没贴上~~~  详情 回复 发表于 2014-3-19 09:45
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-10-20 11:54
  • 签到天数: 352 天

    [LV.8]以坛为家I

    发表于 2014-3-18 18:22:19 | 显示全部楼层
    G大分析好精彩!!!膜拜!!!!

    点评

    兄弟来了,呵呵,合个影~~茄子~~~  发表于 2014-3-19 09:51
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-4-26 10:19
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2014-3-18 18:35:25 | 显示全部楼层
    好文章!膜拜GG大神!

    点评

    兄弟好啊~~在线看的http://ds.eywedu.com/jinyong/yttlj/。原先有一套书,搬家后也不知在哪儿了?  发表于 2014-3-19 09:58
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 08:32
  • 签到天数: 1661 天

    [LV.Master]伴坛终老

    发表于 2014-3-18 23:11:24 | 显示全部楼层
    来膜拜G大了,支持!!!

    点评

    谢谢支持~~~  发表于 2014-3-19 09:52
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 21:21
  • 签到天数: 1983 天

    [LV.Master]伴坛终老

    发表于 2014-3-19 08:55:47 | 显示全部楼层
    分析好精彩

    点评

    谢谢兄弟的支持~  发表于 2014-3-19 09:46
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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