GGLHY 发表于 2014-7-11 07:45:15

EmEditor v14.x.x的注册码验证简析

                                              EmEditor v14.x.x的注册码验证简析(非算法篇)

算法部分与v12.x 、13.x有了一些改变,这里不做分析。


                                                                               一、注册的关键返回值与注册信息的保存

注册时,我们可以很轻松到达这里:
6DBD40D3    E8 CD1C0000   call emeddlgs.6DBD5DA5                //算法验证的核心CALL~~~
6DBD40D8    8BF0            mov esi,eax
6DBD40DA    8975 78         mov dword ptr ss:,esi
6DBD40DD    83FE 01         cmp esi,0x1
6DBD40E0    0F84 C4010000   je emeddlgs.6DBD42AA
6DBD40E6    83FE 06         cmp esi,0x6
6DBD40E9    0F84 BB010000   je emeddlgs.6DBD42AA
6DBD40EF    83FE 03         cmp esi,0x3
6DBD40F2    0F84 B2010000   je emeddlgs.6DBD42AA
6DBD40F8    83FE 05         cmp esi,0x5
6DBD40FB    75 15         jnz short emeddlgs.6DBD4112
6DBD40FD    6A 10         push 0x10
6DBD40FF    68 E3000000   push 0xE3
那个核心CALL被特殊处理了,所以直接跟进去追踪算法的话,O(∩_∩)O~,会吐血的~~~~

但是,我们关注下,它下面的显然是返回值进行了几个比较。(PS:在分析v12.x和v13.x的基础上我们知道,真正合法的返回值应该是1)
返回1--------》真正注册成功
返回2--------》注册失败
返回3--------》注册成功                                             <------伪注册!
返回4--------》使用注册码出现注册错误
返回5--------》本程序没有正确安装
返回6--------》已过期,需要更新维护计划,输入新的注册码

所以,注册时候的KO点已经很明朗了~~~。(呵呵,你懂得!)

6DBD42AA    803D F4C5BF6D 0>cmp byte ptr ds:,0x0             //这里可以引导我们定位到重启验证附近
6DBD42B1    74 0D         je short emeddlgs.6DBD42C0                   //跳的话,就是注册表保存。不跳就是便携版,ini文件保存         
6DBD42B3    53            push ebx
6DBD42B4    8D45 28         lea eax,dword ptr ss:
6DBD42B7    50            push eax
6DBD42B8    57            push edi
6DBD42B9    E8 BAE1FEFF   call emeddlgs.6DBC2478                     //加密,ini文件保存注册信息
6DBD42BE   /EB 63         jmp short emeddlgs.6DBD4323
6DBD42C0   |68 E467BE6D   push emeddlgs.6DBE67E4                   ; UNICODE "eeadmin.exe"
6DBD42C5   |8DBD 84F9FFFF   lea edi,dword ptr ss:
6DBD42CB   |E8 7505FFFF   call emeddlgs.6DBC4845
6DBD42D0   |B9 26020000   mov ecx,0x226
6DBD42D5   |8DBD 8CFBFFFF   lea edi,dword ptr ss:
6DBD42DB   |85DB            test ebx,ebx
6DBD42DD   |74 1A         je short emeddlgs.6DBD42F9
6DBD42DF   |8D45 D8         lea eax,dword ptr ss:
6DBD42E2   |50            push eax
6DBD42E3   |8D45 28         lea eax,dword ptr ss:
6DBD42E6   |50            push eax                                 ; 输入的KEY(UNICODE "D???D-GGLHY-S???8-E???X-J???N")
6DBD42E7   |FF75 70         push dword ptr ss:
6DBD42EA   |68 A48FBE6D   push emeddlgs.6DBE8FA4                   ; UNICODE "/r %Iu "%s" "%s""
6DBD42EF   |E8 6DCDFEFF   call emeddlgs.6DBC1061                   ; 注册表里保存
6DBD42F4   |83C4 10         add esp,0x10
6DBD42F7   |EB 14         jmp short emeddlgs.6DBD430D
注册成功,程序会将注册信息(包含用户名与注册码)一起加密,保存到注册表里。(便携版在文件夹下的eeLM.ini)

A、注册表保存:

"EmEditor-14"=hex:0e,31,58,c3,94,aa,78,33,5b,..........(具体数值省略大部分)
貌似安装版会有下面一些内容。因为我是用便携版来分析的。所以安装版的注册信息的验证与写入大家有空了可以看看。

比如:
6DBD42EF    E8 6DCDFEFF   call emeddlgs.6DBC1061                   ; 猜测上面/r是 注册码类型的注册码标志
6DBD42F4    83C4 10         add esp,0x10
6DBD42F7    EB 14         jmp short emeddlgs.6DBD430D比如:
0137CF28|6DBD91C5返回到 emeddlgs.6DBD91C5 来自 emeddlgs.6DBD90DC
0137CF2C|0137D1D8UNICODE "/r 395614 ""D???D-GGLHY-S???8-E???X-J???N" "gg""
0137CF30|00000225
0137CF34|6DBE8FA4UNICODE "/r %Iu "%s" "%s""比如:
6DBD4300    68 C88FBE6D   push emeddlgs.6DBE8FC8                   ; UNICODE "/m %Iu "%s""
6DBD4305    E8 57CDFEFF   call emeddlgs.6DBC1061                   ; 猜测上面/m是 维护类型的注册码标志
6DBD430A    83C4 0C         add esp,0xC
6DBD430D    8D85 8CFBFFFF   lea eax,dword ptr ss:         ;(UNICODE "/r 395614 "D???D-GGLHY-S???8-E???X-J???N" "gg"")
6DBD4313    50            push eax
6DBD4314    8D85 84F9FFFF   lea eax,dword ptr ss:
6DBD431A    50            push eax                                 ; (UNICODE "E:\办公软件\EmEditor\14\eeadmin.exe")比如:
6DBCDB4D    8B45 10         mov eax,dword ptr ss:          ; (UNICODE "/r 395614 "D???D-GGLHY-S???8-E???X-J???N" "gg"")
6DBCDB50    8945 D4         mov dword ptr ss:,eax
6DBCDB53    83C4 0C         add esp,0xC
6DBCDB56    8D45 C0         lea eax,dword ptr ss:
6DBCDB59    50            push eax
6DBCDB5A    C745 C0 3C00000>mov dword ptr ss:,0x3C
6DBCDB61    C745 C4 4000000>mov dword ptr ss:,0x40
6DBCDB68    C745 DC 0100000>mov dword ptr ss:,0x1
6DBCDB6F    FF15 8832BE6D   call dword ptr ds:[<&SHELL32.ShellExecut>; shell32.ShellExecuteExW
6DBCDB75    85C0            test eax,eax                           ; 楼上的,你要干什么?

B、便携版ini文件保存:
"

EmEditor-14=E1BC511E94AA7833C5AA16C195AA7833FF13237388AA78(这里省略很多字符)C31C"

这里顺便以便携版为例,看看:
6DC044E1    50            push eax                                 ; (UNICODE "D???D-GGLHY-S???8-E???X-J???N")
6DC044E2    57            push edi
6DC044E3    E8 AADFFEFF   call emeddlgs.6DBF2492                   ; F7瞅瞅?F7进去后,可以看到算法中的MD5后的某些字符: UNICODE "445c9d29df059213b7"
注册码的某11位 "E???X-J???N"
固定字符串 UNICODE "EmEditor-14"
用户名:gg
等等。。。。。具体怎么连接的,大家有兴趣可以自己跟一下。


而下面这里就是注册信息加密的地方了。
6DBF22E6    55            push ebp
6DBF22E7    8D6C24 90       lea ebp,dword ptr ss:
6DBF22EB    81EC A0000000   sub esp,0xA0
6DBF22F1    53            push ebx
6DBF22F2    56            push esi
6DBF22F3    57            push edi
6DBF22F4    BE A0000000   mov esi,0xA0
6DBF22F9    56            push esi
6DBF22FA    8BD8            mov ebx,eax
6DBF22FC    8D45 D0         lea eax,dword ptr ss:
6DBF22FF    6A 00         push 0x0
6DBF2301    50            push eax
6DBF2302    E8 19790100   call emeddlgs.6DC09C20
6DBF2307    8B55 78         mov edx,dword ptr ss:
6DBF230A    83C4 0C         add esp,0xC
6DBF230D    8D45 D0         lea eax,dword ptr ss:
6DBF2310    50            push eax
6DBF2311    6A 50         push 0x50
6DBF2313    59            pop ecx
6DBF2314    E8 E7ECFFFF   call emeddlgs.6DBF1000
6DBF2319    FF75 7C         push dword ptr ss:
6DBF231C    8D4D D0         lea ecx,dword ptr ss:
6DBF231F    6A 50         push 0x50
6DBF2321    58            pop eax
6DBF2322    E8 D1FEFFFF   call emeddlgs.6DBF21F8
6DBF2327    8D45 D0         lea eax,dword ptr ss:
6DBF232A    50            push eax
6DBF232B    FF15 AC30C16D   call dword ptr ds:[<&KERNEL32.lstrlenW>] ; kernel32.lstrlenW
6DBF2331    8D7C00 02       lea edi,dword ptr ds:
6DBF2335    FF15 A830C16D   call dword ptr ds:[<&KERNEL32.GetTickCou>; kernel32.GetTickCount
6DBF233B    50            push eax
6DBF233C    E8 34710100   call emeddlgs.6DC09475
6DBF2341    59            pop ecx
6DBF2342    EB 18         jmp short emeddlgs.6DBF235C
6DBF2344    E8 3E710100   call emeddlgs.6DC09487
6DBF2349    25 FF000080   and eax,0x800000FF
6DBF234E    79 07         jns short emeddlgs.6DBF2357
6DBF2350    48            dec eax
6DBF2351    0D 00FFFFFF   or eax,0xFFFFFF00
6DBF2356    40            inc eax
6DBF2357    88443D D0       mov byte ptr ss:,al
6DBF235B    47            inc edi
6DBF235C    3BFE            cmp edi,esi
6DBF235E^ 72 E4         jb short emeddlgs.6DBF2344
6DBF2360    56            push esi
6DBF2361    33F6            xor esi,esi
6DBF2363    56            push esi
6DBF2364    53            push ebx
6DBF2365    E8 B6780100   call emeddlgs.6DC09C20
6DBF236A    83C4 0C         add esp,0xC
6DBF236D    6A 28         push 0x28
6DBF236F    33C0            xor eax,eax
6DBF2371    5F            pop edi
6DBF2372    0FB688 0C6DC26D movzx ecx,byte ptr ds:
6DBF2379    8A4C8D D0       mov cl,byte ptr ss:
6DBF237D    80F1 CC         xor cl,0xCC
6DBF2380    880C83          mov byte ptr ds:,cl
6DBF2383    40            inc eax
6DBF2384    3BC7            cmp eax,edi
6DBF2386^ 7C EA         jl short emeddlgs.6DBF2372
6DBF2388    8D43 01         lea eax,dword ptr ds:
6DBF238B    0FB68E 0C6DC26D movzx ecx,byte ptr ds:
6DBF2392    8A4C8D D1       mov cl,byte ptr ss:
6DBF2396    80F1 AA         xor cl,0xAA
6DBF2399    8808            mov byte ptr ds:,cl
6DBF239B    46            inc esi
6DBF239C    83C0 04         add eax,0x4
6DBF239F    3BF7            cmp esi,edi
6DBF23A1^ 7C E8         jl short emeddlgs.6DBF238B
6DBF23A3    33F6            xor esi,esi
6DBF23A5    8D43 02         lea eax,dword ptr ds:
6DBF23A8    0FB68E 0C6DC26D movzx ecx,byte ptr ds:
6DBF23AF    8A4C8D D2       mov cl,byte ptr ss:
6DBF23B3    80F1 55         xor cl,0x55
6DBF23B6    8808            mov byte ptr ds:,cl
6DBF23B8    46            inc esi
6DBF23B9    83C0 04         add eax,0x4
6DBF23BC    3BF7            cmp esi,edi
6DBF23BE^ 7C E8         jl short emeddlgs.6DBF23A8
6DBF23C0    33C0            xor eax,eax
6DBF23C2    83C3 03         add ebx,0x3
6DBF23C5    0FB688 0C6DC26D movzx ecx,byte ptr ds:
6DBF23CC    8A4C8D D3       mov cl,byte ptr ss:
6DBF23D0    80F1 33         xor cl,0x33
6DBF23D3    880B            mov byte ptr ds:,cl
6DBF23D5    40            inc eax
6DBF23D6    83C3 04         add ebx,0x4
6DBF23D9    3BC7            cmp eax,edi
6DBF23DB^ 7C E8         jl short emeddlgs.6DBF23C5
6DBF23DD    5F            pop edi
6DBF23DE    5E            pop esi
6DBF23DF    5B            pop ebx
6DBF23E0    83C5 70         add ebp,0x70
6DBF23E3    C9            leave这段代码我们在点击关于按钮的时候也会见到它对注册信息解密过程的。这里就不在赘述~~。


另外:
6DBF5ACA    E8 405B0000   call emeddlgs.6DBFB60F
6DBF5ACF    83F8 06         cmp eax,0x6
6DBF5AD2    0F85 1A030000   jnz emeddlgs.6DBF5DF2
6DBF5AD8    68 5C67C16D   push emeddlgs.6DC1675C                   ; eeadmin.exe
6DBF5ADD    8DBD B8FDFFFF   lea edi,dword ptr ss:还有
6DBF9598    E8 72200000   call emeddlgs.6DBFB60F
6DBF959D    83F8 06         cmp eax,0x6
6DBF95A0    0F85 CF010000   jnz emeddlgs.6DBF9775
6DBF95A6    68 5C67C16D   push emeddlgs.6DC1675C                   ; eeadmin.exe看起来这个"eeadmin.exe"文件极有可能是与维护密钥有关~~。(猜测,未经验证。哈哈)
参见(返回6--------》已过期,需要更新维护计划,输入新的注册码)


同时,在通过注册码的算法校验后,还会对某3位进行计算~~~(这里卖个关子,后面第三部分会讲到)而这个计算会决定是否真正注册成功~~~




                                                                                          二、点击关于的验证

       因为跟踪过便携版的注册信息保存。所以,很好定位到重启验证的关键地方。利用例如字符串professional、PromptRegExpired或者利用加密的代码(查找命令序列)。都能定位到关键地方。。。

比如:
0044370E   > \E9 FA020000   jmp   00443A0D
<a href="tel:00443713">00443713</a>   >833D 4C514D00>cmp   dword ptr , 1            ;==1      !!!
0044371A   .74 0D         je      short <a href="tel:00443729">00443729</a>
0044371C   .833D 4C514D00>cmp   dword ptr , 6            ;==6
<a href="tel:00443723">00443723</a>   .0F85 59010000 jnz   <a href="tel:00443882">00443882</a>
<a href="tel:00443729">00443729</a>   >FF35 14304C00 push    dword ptr                ;PromptRegExpired
0044372F   .33C0          xor   eax, eax
<a href="tel:00443731">00443731</a>   .40            inc   eax
<a href="tel:00443732">00443732</a>   .E8 517D0000   call    0044B488
<a href="tel:00443737">00443737</a>   .85C0          test    eax, eax
<a href="tel:00443739">00443739</a>   .0F84 43010000 je      <a href="tel:00443882">00443882</a>
0044373F   .8365 E8 00    and   dword ptr , 0
<a href="tel:00443743">00443743</a>   .833D 4C514D00>cmp   dword ptr , 1            ;==1
0044374A   .75 73         jnz   short 004437BF很显然是全局变量的值应该=1。也就是注册验证的返回值必须=1~~

接着往下看:
<a href="tel:00443760">00443760</a>   .8D85 48FFFFFF lea   eax, dword ptr
<a href="tel:00443766">00443766</a>   .50            push    eax                            ; /pLocaltime
<a href="tel:00443767">00443767</a>   .FF15 94F34B00 call    dword ptr [<&KERNEL32.GetLocal>; \GetLocalTime
0044376D   .FFB5 4EFFFFFF push    dword ptr
<a href="tel:00443773">00443773</a>   .FFB5 4AFFFFFF push    dword ptr
<a href="tel:00443779">00443779</a>   .FFB5 48FFFFFF push    dword ptr 哎,它也要问“时间都去哪儿啦”?



                                                                                  三、三种不同类型的KEY

通过KeyGen生成的KEY注册后,会发现有2大类情况,即只有注册给XXX的字样和带有附加信息字样两种。而附加信息又和时间有关。
仔细分一下,又可分成3类:

A.独行侠:这样的KEY在关于的对话框里,只有注册给XXX的信息。

B.有固定期限的合同工:这样的KEY注册后在关于的对话框里,除了注册给XXX外,下面还有一行信息(维护计划结束于XXXX年XX月XX日)的字样

C.永结同心的情深伉俪:这样的KEY注册后在关于的对话框里,除了注册给XXX外,下面还有一行信息(终身授权)的字样


附PS的图如下:
类型A:



类型B:


类型C:



OK,这三种类型的KEY,只有后面2种才是真正合法的~~~~~~{:biggrin:}

原因如下:
程序在注册及重启验证的时候,会校验软件的特定3位,而这3位经过某种计算,得到的结果会通过某个函数转换为形如XXXX-XX-XX的日期。

因此,如果无法转换成时间的KEY,那只能说Sorry。你能注册成功,但是,但是,但是,只要超过30天,你会收到弹窗的礼物。。。。

反之,如果能转换成时间的KEY,则会缔结合同,约定到XXXX年XX月XX日之前,你的地盘你做主!到期后,咱再谈谈“续约”或重新签订“维护条款”。

好吧,不是说还有永结同心的(终身授权)吗?

是的,如果这3位为特定的数字2的话,呵呵~~~直接就是一见倾情,永结同心了。

口说无凭,where `s your evidence?

好吧,有请代码兄弟们出场:(出场费等下再说)
6DBF2B43    E8 B8E4FFFF   call    6DBF1000
6DBF2B48    8B43 48         mov   eax, dword ptr       ; 在哪里,在哪里见过你?
6DBF2B4B    83F8 01         cmp   eax, 1                         ; 你的笑容这样熟悉!
6DBF2B4E    74 23         je      short 6DBF2B73
6DBF2B50    83F8 03         cmp   eax, 3                         ; 类型为A的key返回值就是3!
6DBF2B53    74 1E         je      short 6DBF2B73
6DBF2B55    83F8 06         cmp   eax, 6
6DBF2B58    74 19         je      short 6DBF2B73
(省略部分代码)
6DBF2BFB    50            push    eax
6DBF2BFC    E8 AD320100   call    6DC05EAE                     ; 检测是否能转换成合法到期日
6DBF2C01    84C0            test    al, al                     ; 不能则是伪注册~~~(即类型为A的KEY)
6DBF2C03    0F84 D3000000   je      6DBF2CDC                     ; 伪注册则跳
6DBF2C09    68 7063C16D   push    6DC16370                     ; UNICODE "\n("
6DBF2C0E    8BC7            mov   eax, edi

进CALL后,可以看到一些内容。。。比如:

A、      注册码的特定3位的运算:
6DC05DB2    83F8 1D         cmp   eax, 1D                      ; 注册码长度为29位吗?
6DC05DB5    74 08         je      short 6DC05DBF
6DC05DB7    83C8 FF         or      eax, FFFFFFFF
6DC05DBA    E9 EB000000   jmp   6DC05EAA
6DC05DBF    8B45 08         mov   eax, dword ptr
6DC05DC2    83C0 1C         add   eax, 1C
6DC05DC5    8945 E8         mov   dword ptr , eax
6DC05DC8    FF75 E8         push    dword ptr
6DC05DCB    FF15 AC30C16D   call    dword ptr [<&KERNEL32.lstrle>; kernel32.lstrlenW
6DC05DD1    83F8 03         cmp   eax, 3                     ; 特定位置的字符长度大于3吗?
6DC05DD4    7D 09         jge   short 6DC05DDF
6DC05DD6    834D FC FF      or      dword ptr , FFFFFFFF
6DC05DDA    E9 C8000000   jmp   6DC05EA7
6DC05DDF    8365 F8 00      and   dword ptr , 0
6DC05DE3    8365 F4 00      and   dword ptr , 0
6DC05DE7    EB 07         jmp   short 6DC05DF0
6DC05DE9    8B45 F4         mov   eax, dword ptr
6DC05DEC    40            inc   eax
6DC05DED    8945 F4         mov   dword ptr , eax
6DC05DF0    837D F4 03      cmp   dword ptr , 3
6DC05DF4    0F8D A7000000   jge   6DC05EA1
6DC05DFA    8B45 F8         mov   eax, dword ptr        ; 累加结果(初始=0)
6DC05DFD    C1E0 05         shl   eax, 5                     ; *32
6DC05E00    8945 F8         mov   dword ptr , eax
6DC05E03    8365 F0 00      and   dword ptr , 0
6DC05E07    8B45 F4         mov   eax, dword ptr
6DC05E0A    8B4D E8         mov   ecx, dword ptr
6DC05E0D    66:8B0441       mov   ax, word ptr
6DC05E11    66:8945 EC      mov   word ptr , ax
6DC05E15    0FB745 EC       movzx   eax, word ptr
6DC05E19    83F8 32         cmp   eax, 32                      ; 这个是终身授权的关键
6DC05E1C    7C 15         jl      short 6DC05E33
6DC05E1E    0FB745 EC       movzx   eax, word ptr
6DC05E22    83F8 39         cmp   eax, 39
6DC05E25    7F 0C         jg      short 6DC05E33
6DC05E27    0FB745 EC       movzx   eax, word ptr
6DC05E2B    83E8 32         sub   eax, 32                      ; 数字则-32
6DC05E2E    8945 F0         mov   dword ptr , eax
6DC05E31    EB 60         jmp   short 6DC05E93
6DC05E33    0FB745 EC       movzx   eax, word ptr
6DC05E37    83F8 41         cmp   eax, 41
6DC05E3A    7C 15         jl      short 6DC05E51
6DC05E3C    0FB745 EC       movzx   eax, word ptr
6DC05E40    83F8 48         cmp   eax, 48
6DC05E43    7F 0C         jg      short 6DC05E51
6DC05E45    0FB745 EC       movzx   eax, word ptr
6DC05E49    83E8 39         sub   eax, 39                      ; 大写字母A~H则-39
6DC05E4C    8945 F0         mov   dword ptr , eax
6DC05E4F    EB 42         jmp   short 6DC05E93
6DC05E51    0FB745 EC       movzx   eax, word ptr
6DC05E55    83F8 4A         cmp   eax, 4A
6DC05E58    7C 15         jl      short 6DC05E6F
6DC05E5A    0FB745 EC       movzx   eax, word ptr
6DC05E5E    83F8 4E         cmp   eax, 4E
6DC05E61    7F 0C         jg      short 6DC05E6F
6DC05E63    0FB745 EC       movzx   eax, word ptr
6DC05E67    83E8 3A         sub   eax, 3A                      ; 大写字母J~N则-3A
6DC05E6A    8945 F0         mov   dword ptr , eax
6DC05E6D    EB 24         jmp   short 6DC05E93
6DC05E6F    0FB745 EC       movzx   eax, word ptr
6DC05E73    83F8 50         cmp   eax, 50                      ; 大写字母P~Z则-3B
6DC05E76    7C 15         jl      short 6DC05E8D
6DC05E78    0FB745 EC       movzx   eax, word ptr
6DC05E7C    83F8 5A         cmp   eax, 5A
6DC05E7F    7F 0C         jg      short 6DC05E8D
6DC05E81    0FB745 EC       movzx   eax, word ptr
6DC05E85    83E8 3B         sub   eax, 3B
6DC05E88    8945 F0         mov   dword ptr , eax
6DC05E8B    EB 06         jmp   short 6DC05E93
6DC05E8D    834D FC FF      or      dword ptr , FFFFFFFF
6DC05E91    EB 14         jmp   short 6DC05EA7
6DC05E93    8B45 F8         mov   eax, dword ptr
6DC05E96    0345 F0         add   eax, dword ptr       ; 累加。初始0 + 差(差值很关键哦!)
6DC05E99    8945 F8         mov   dword ptr , eax
6DC05E9C^ E9 48FFFFFF   jmp   6DC05DE9
6DC05EA1    8B45 F8         mov   eax, dword ptr
6DC05EA4    8945 FC         mov   dword ptr , eax       ; 累加计算的的结果保存起来
6DC05EA7    8B45 FC         mov   eax, dword ptr        ; 最终累加和=0则为终身授权版
6DC05EAA    C9            leave
6DC05EAB    C2 0400         retn    4
运算结果再来计算:
6DC05ED2    E8 CCFEFFFF   call    6DC05DA3                     ; 运算特定3位
6DC05ED7    8945 FC         mov   dword ptr , eax       ; 3位的运算结果
6DC05EDA    837D FC 00      cmp   dword ptr , 0
6DC05EDE    7D 0C         jge   short 6DC05EEC
6DC05EE0    32C0            xor   al, al
6DC05EE2    E9 B4000000   jmp   6DC05F9B
(省略部分代码)
6DC05F05    AB            stos    dword ptr es:
6DC05F06    B8 DD070000   mov   eax, 7DD                     ; 呵呵~~~
6DC05F0B    66:8945 E4      mov   word ptr , ax
(省略部分代码)
6DC05F24    50            push    eax
6DC05F25    FF15 8031C16D   call    dword ptr [<&KERNEL32.System>; kernel32.SystemTimeToFileTime
6DC05F2B    8B45 D4         mov   eax, dword ptr
(省略部分代码)
6DC05F3A    99            cdq
6DC05F3B    6A 00         push    0
6DC05F3D    <a href="tel:68 80969800">68 80969800</a>   push    989680
6DC05F42    52            push    edx
6DC05F43    50            push    eax
6DC05F44    E8 17A10000   call    6DC10060                     ; 具体运算1
6DC05F49    6A 00         push    0
6DC05F4B    6A 3C         push    3C
6DC05F4D    52            push    edx
6DC05F4E    50            push    eax
6DC05F4F    E8 0CA10000   call    6DC10060                     ; 具体运算2
6DC05F54    6A 00         push    0
6DC05F56    6A 3C         push    3C
6DC05F58    52            push    edx
6DC05F59    50            push    eax
6DC05F5A    E8 01A10000   call    6DC10060                     ; 具体运算3
(省略部分代码)
6DC05F92    50            push    eax
6DC05F93    FF15 8831C16D   call    dword ptr [<&KERNEL32.FileTi>; kernel32.FileTimeToSystemTime
6DC05F99    B0 01         mov   al, 1
6DC05F9B    5F            pop   edi
6DC05F9C    C9            leave
6DC05F9D    C2 0800         retn    8限于篇幅,这里面的3个具体运算就不列出来了~~~很简单的东东~~~

运算后的结果看能否转换成合法的时间。如果不能,呵呵~~~,只能为爱说抱歉了!
类型为A的这种注册码在验证时的返回值是3,也就是那种伪注册。所以说,爱是要付出真心的,只能从1而终,岂可3心2意?{:tongue:}


接着看:
6DBF2BFB    50            push    eax
6DBF2BFC    E8 AD320100   call    6DC05EAE                     ; 检测是否能转换成合法到期日
6DBF2C01    84C0            test    al, al                         ; 不能则是伪注册~~~(即类型为A的KEY)
6DBF2C03    0F84 D3000000   je      6DBF2CDC                     ; 伪注册则跳
6DBF2C09    68 7063C16D   push    6DC16370                     ; UNICODE "\n("
6DBF2C0E    8BC7            mov   eax, edi
6DBF2C10    8D8D 0CFDFFFF   lea   ecx, dword ptr        ; (UNICODE "注册至:\ngg")
6DBF2C16    E8 DDF5FFFF   call    6DBF21F8
6DBF2C1B    B8 DD070000   mov   eax, 7DD
6DBF2C20    66:3945 F0      cmp   word ptr , ax          ; 计算后得到的年份数:7DD
6DBF2C24    75 22         jnz   short 6DBF2C48               ; 不等则失去(终身授权条件1)
6DBF2C26    66:837D F2 01   cmp   word ptr , 1            ; 计算后得到的月份数:1
6DBF2C2B    75 1B         jnz   short 6DBF2C48               ; 不等则失去(终身授权条件2)
6DBF2C2D    66:837D F6 01   cmp   word ptr , 1            ; 计算后得到的日期数:1
6DBF2C32    75 14         jnz   short 6DBF2C48               ; 不等则失去(终身授权条件3)
6DBF2C34    56            push    esi
6DBF2C35    8D85 04FBFFFF   lea   eax, dword ptr
好吧~~~我能说优雅点已暴露吗?{:shutup:}



PS:感谢Pentium450兄弟的友情测试~~~{:handshake:}
















暗算

GGLHY 发表于 2016-4-25 12:06:37

g6649 发表于 2016-4-24 02:27
楼主好厉害。
我也是喜欢用emeditor这个编辑器
现在网上找到的版本(包括最新的15.9)大部分都是像楼主说 ...

欢迎兄弟来到飘云阁论坛。。。。

这款编辑器,我也非常喜欢,所以才会花点时间和精力来分析它。。。

至于16.X,目前还没出来。。。出来后如果有可能的话,或许我会跟进。


g6649 发表于 2016-4-24 02:27:31

楼主好厉害。
我也是喜欢用emeditor这个编辑器
现在网上找到的版本(包括最新的15.9)大部分都是像楼主说的类型A,是假注册。
找了好久才找到楼主的贴子,专门注册了帐号来感谢楼主(正在使用楼主于3楼提供的终身授权KEY)。
目前的版本已经到15.9了,不知道啥时候会更新成16.X,也不知道楼主能不能看到我这个回帖。
可以不要脸的求楼主如果出了16.X的话能看看16.X的验证机制有没有变嘛?
总之谢谢楼主啦。

small-q 发表于 2014-7-11 08:16:30

GG,大强了。。。。{:funk:}

pentium450 发表于 2014-7-11 10:24:21

沙发没抢到,板凳也不错,膜拜!!!{:victory:}

GGLHY 发表于 2014-7-14 11:03:04

本帖最后由 GGLHY 于 2014-7-15 20:31 编辑

为方便兄弟们调试,这里用KG生成3组不同类型的KEY:

类型A:DABZS-Y5TCJ-HF22A-UZK8P-QS2MM

类型B:DMBZD-GGLHY-SJW28-EWS9X-J66ZN                  <2091-7-9到期>                  

类型C:DMEZD-GGPYG-UZ222-XATBS-J3CHD                  (终身授权)


大家有兴趣的话可以去看看

tree_fly 发表于 2014-10-18 10:39:05

好文章啊! 学习。

GGLHY 发表于 2015-11-6 08:09:46

鉴于V15.x系列取消了CV,此帖从内版移至外版,取消阅读权限!有兴趣的兄弟们可以对照着最新版分析下{:soso_e113:}

GGLHY 发表于 2015-11-6 08:14:51

V15.x系列算法与V14.x一样,未变{:soso_e113:}Key可通用

lucky_789 发表于 2016-10-4 03:13:03

16.x继续裸奔
页: [1] 2
查看完整版本: EmEditor v14.x.x的注册码验证简析