飘云 发表于 2010-4-10 13:33:52

as3852711的超小KeyGenMe算法简析+ASM注册机源码

【破文标题】as3852711的超小KeyGenMe算法简析+ASM注册机源码
【破文作者】飘云/P.Y.G
【官方主页】https://www.chinapyg.com
【作者博客】http://blog.piaoyunsoft.com
【破解平台】WinXp SP3
【破解工具】PEiD0.94、OD
【作者邮箱】[email protected]
【软件名称】as3852711的超小KeyGenMe
【软件大小】4.7KB
【原版下载】https://www.chinapyg.com/viewthread.php?tid=54955&extra=page%3D1

感谢as3852711为我们带来了这个好东西,麻雀虽小五脏俱全啊~~ 这个KeyGenMe很有代表性~
我就作为教程来讲解下~


至于怎么来到关键地方,就不多说了~ 如果找不到下面的代码,那么您还不适合看本文~
补习基础断点先~~

算法函数:004013C8push    ebp
004013C9mov   ebp, esp
004013CBsub   esp, 50
004013CEpush    esi
004013CFpush    ebx
004013D0mov   dword ptr , 1      ;初始值j
004013D7add   esp, -0C
004013DAmov   eax, dword ptr
004013DDpush    eax                        ; /s
004013DEcall    <jmp.&msvcrt.strlen>         ; \strlen
004013E3add   esp, 10
004013E6mov   dword ptr , eax
004013E9add   esp, -0C
004013ECmov   eax, dword ptr
004013EFpush    eax                        ; /s
004013F0call    <jmp.&msvcrt.strlen>         ; \strlen
004013F5add   esp, 10
004013F8mov   dword ptr , eax
004013FBmov   dword ptr , 1
00401402cmp   dword ptr , 5         ;用户名必须5位
00401406jnz   00401520
0040140Cmov   eax, dword ptr        ;5
0040140Fmov   edx, eax
00401411lea   eax, dword ptr    ;5 + 5这里就是注册码的程度10位
00401414cmp   dword ptr , eax
00401417jnz   00401520
0040141Dmov   eax, dword ptr
00401420add   eax, -3
00401423mov   dword ptr , eax
00401426mov   dword ptr , 0         ;赋值0
0040142Dlea   esi, dword ptr
00401430cmp   dword ptr , 6         ;i=0    while(i <= 6)
00401434jle   short 00401440
00401436jmp   00401500
0040143Bnop
0040143Clea   esi, dword ptr
00401440mov   eax, dword ptr        ;载入用户名
00401443mov   edx, dword ptr
00401446add   eax, edx
00401448cmp   byte ptr , 7A         ;z
0040144Bjg      004014F0
00401451mov   eax, dword ptr
00401454mov   edx, dword ptr
00401457add   eax, edx
00401459cmp   byte ptr , 60
0040145Cjle   004014F0
00401462mov   eax, dword ptr       ;载入注册码
00401465mov   edx, dword ptr
00401468add   eax, edx
0040146Acmp   byte ptr , 5A         ;Z
0040146Djg      004014F0
00401473mov   eax, dword ptr
00401476mov   edx, dword ptr
00401479add   eax, edx
0040147Bcmp   byte ptr , 40         ;上面一截都是对输入做限制~ 用户名:5位小写字符/注册码10位大写字符~~ 所以可以推断并不是所有用户名都能注册成功的!
0040147Ejle   short 004014F0
00401480mov   eax, dword ptr
00401483mov   ecx, dword ptr       ;j
00401486lea   edx, dword ptr    ;修正注册码位置
00401489movsx   eax, byte ptr           ;Sn
0040148Cmov   edx, dword ptr       ;j
0040148Fmov   ecx, dword ptr
00401492add   edx, ecx
00401494lea   ecx, dword ptr        ;修正注册码位置
00401497movsx   edx, byte ptr           ;Sn
0040149Asub   eax, edx                     ;Sn - Sn
0040149Ccmp   eax, dword ptr        ;if Sn - Sn = i
0040149Fjnz   short 004014F0
004014A1mov   eax, dword ptr        ;name
004014A4mov   ecx, dword ptr        ;i
004014A7lea   edx, dword ptr    ;修正用户名位置
004014AAmovsx   eax, byte ptr           ;name
004014ADmov   edx, dword ptr       ;j
004014B0mov   ecx, dword ptr
004014B3add   edx, ecx
004014B5lea   ecx, dword ptr
004014B8movsx   edx, byte ptr           ;Sn
004014BBmov   ecx, eax
004014BDsub   ecx, edx                     ;name - Sn
004014BFmov   dword ptr , ecx      ;计算结果A
004014C2mov   edx, dword ptr       ;j
004014C5add   edx, 2                     ;k = j + 2
004014C8mov   ebx, 1D                      ;0x1D(29)
004014CDmov   eax, ebx
004014CFmov   esi, edx
004014D1cdq
004014D2idiv    esi                        ;N = 0x1D(29)/k
004014D4mov   ecx, eax
004014D6lea   ebx, dword ptr       ;N + 0x1E(30)
004014D9cmp   dword ptr , ebx      ;if A = N
004014DCjnz   short 004014ED
004014DEadd   dword ptr , 2      ;j = j + 2
004014E2mov   eax, dword ptr
004014E5mov   edx, eax
004014E7lea   eax, dword ptr
004014EAmov   dword ptr , eax
004014EDjmp   short 004014F4
004014EFnop
004014F0add   dword ptr , -19
004014F4inc   dword ptr             ;i = i + 1
004014F7jmp   00401430
004014FClea   esi, dword ptr          ;到这就够了,下面我们整理公式
00401500add   esp, -8
00401503mov   eax, dword ptr
00401506add   eax, -9
00401509lea   edx, dword ptr
0040150Cpush    edx
0040150Dmov   eax, dword ptr
00401510push    eax
00401511call    00401548
00401516add   esp, 10
00401519jmp   short 0040153A
0040151Bnop
0040151Clea   esi, dword ptr
00401520add   esp, -0C
00401523push    4                            ; /LanguageID = 4 (LANG_CHINESE)
00401525push    10                           ; |Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00401527push    0                            ; |Title = NULL
00401529push    00401308                     ; |Text = ""
0040152Emov   eax, dword ptr        ; |
00401531push    eax                        ; |hOwner
00401532call    <jmp.&USER32.MessageBoxExA>; \MessageBoxExA
00401537add   esp, 0C
0040153Ajmp   short 00401540
0040153Cjmp   short 00401540
0040153Emov   esi, esi
00401540lea   esp, dword ptr
00401543pop   ebx
00401544pop   esi
00401545leave
00401546retn

【算法总结】
整理一下:
最初:
j = 1
i = 0
公式:
1.name - sn = 29/(j+2) + 30
2.sn - sn = i

解个方程啊~~ 我们是要求出sn
那么公式变成如下了:
1.sn = name - (29/(j+2) + 30)
2.sn = i + sn

;=================================================
;用户名:5位小写字母
;注册码:10位大写字母
;所以可以推断并不是所有用户名都能注册成功的!
;=================================================;=================================================
;注册算法函数
;For ASM
;Code By PiaoYun/P.Y.G
;https://www.chinapyg.com
;=================================================
KeyGen proc dwName:DWORD

LOCAL @szTemp:BYTE
LOCAL @szSn:BYTE

invoke RtlZeroMemory,addr @szTemp,sizeof @szTemp
invoke RtlZeroMemory,addr @szSn,sizeof @szSn

xor esi,esi ;i
mov edx,1 ;j
mov edi,edx

@@:
cmp   esi, 5
jge @F
mov edx,edi
;29 div (j + 2) + 30
add   edx, 2
mov   ebx, 1Dh
mov   eax, ebx
mov   ecx, edx
cdq
idiv    ecx
mov   ecx, eax
lea   ebx, dword ptr
;name - (29 div (j + 2) + 30
mov eax,dwName
movzx eax,byte ptr
sub eax,ebx
;Sn
mov byte ptr[@szTemp + edi - 1],al
;Sn
add eax,esi
mov byte ptr[@szTemp + edi],al

inc esi
add edi,2
jmp @B
@@:

invoke lstrcpy,addr @szSn,addr @szTemp
lea eax,@szSn
ret

KeyGen endp【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢!

月之精灵 发表于 2010-4-10 16:46:46

分就不加了哈,/:018

fatwolf08 发表于 2010-4-10 20:08:08

飘老大浮出了啊,顶

老万 发表于 2010-4-10 20:57:29

学习一下飘老大的分析

zxc 发表于 2010-4-10 21:51:13

/:good 能看出是很深奥的东西,很精简,值得学习

as3852711 发表于 2010-4-12 12:15:31

呵呵!真是有点脸红,连飘云兄也来看我这个程序!:loveliness: :loveliness:

cxj98 发表于 2016-10-16 23:57:57

大牛分析的小菜怎么看的懂,真心不懂。

wok 发表于 2016-10-19 10:32:34

支持飘云版主,支持飘云阁

不一样的烟火 发表于 2016-10-23 21:45:42

谢谢分享,学习了!!!

海底捞123 发表于 2016-10-24 22:15:33

支持飘云版主,支持飘云阁
页: [1] 2
查看完整版本: as3852711的超小KeyGenMe算法简析+ASM注册机源码