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官方论坛, 转载请注明作者并保持文章的完整, 谢谢! 分就不加了哈,/:018 飘老大浮出了啊,顶 学习一下飘老大的分析 /:good 能看出是很深奥的东西,很精简,值得学习 呵呵!真是有点脸红,连飘云兄也来看我这个程序!:loveliness: :loveliness: 大牛分析的小菜怎么看的懂,真心不懂。
支持飘云版主,支持飘云阁
谢谢分享,学习了!!! 支持飘云版主,支持飘云阁
页:
[1]
2