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:}
暗算 g6649 发表于 2016-4-24 02:27
楼主好厉害。
我也是喜欢用emeditor这个编辑器
现在网上找到的版本(包括最新的15.9)大部分都是像楼主说 ...
欢迎兄弟来到飘云阁论坛。。。。
这款编辑器,我也非常喜欢,所以才会花点时间和精力来分析它。。。
至于16.X,目前还没出来。。。出来后如果有可能的话,或许我会跟进。
楼主好厉害。
我也是喜欢用emeditor这个编辑器
现在网上找到的版本(包括最新的15.9)大部分都是像楼主说的类型A,是假注册。
找了好久才找到楼主的贴子,专门注册了帐号来感谢楼主(正在使用楼主于3楼提供的终身授权KEY)。
目前的版本已经到15.9了,不知道啥时候会更新成16.X,也不知道楼主能不能看到我这个回帖。
可以不要脸的求楼主如果出了16.X的话能看看16.X的验证机制有没有变嘛?
总之谢谢楼主啦。 GG,大强了。。。。{:funk:} 沙发没抢到,板凳也不错,膜拜!!!{:victory:} 本帖最后由 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 (终身授权)
大家有兴趣的话可以去看看 好文章啊! 学习。 鉴于V15.x系列取消了CV,此帖从内版移至外版,取消阅读权限!有兴趣的兄弟们可以对照着最新版分析下{:soso_e113:} V15.x系列算法与V14.x一样,未变{:soso_e113:}Key可通用 16.x继续裸奔
页:
[1]
2