Zaas KeygenMe #2[VB] MD5算法简析+ASM注册机源码
【破文标题】Zaas KeygenMe #2 MD5算法简析+ASM注册机源码【破文作者】飘云/P.Y.G
【官方主页】https://www.chinapyg.com
【作者博客】http://blog.piaoyunsoft.com
【破解平台】WinXp SP3
【破解工具】PEiD0.94、OD
【作者邮箱】[email protected]
【软件名称】Zaas KeygenMe #2
【软件大小】10.41KB
【原版下载】https://www.chinapyg.com/viewthread.php?tid=52514&extra=page%3D1
看到坛友把这个CrackMe顶上来了~有不少人玩,但是没个过程,所以又做教程讲解了~~ 感谢Zaas朋友带来的试题~~~
至于怎么来到关键地方,就不多说了~ 如果找不到下面的代码,那么您还不适合看本文~
补习基础断点先~~
算法函数:
00406200push ebp
00406201mov ebp, esp
00406203sub esp, 0C
00406206push <jmp.&MSVBVM60.__vbaExceptHandl>;SE 处理程序安装
0040620Bmov eax, dword ptr fs:
00406211push eax
00406212mov dword ptr fs:, esp
00406219sub esp, 110
0040621Fpush ebx
00406220push esi
00406221push edi
.
.
.
.
.
.
.
00406390add esp, 0C
00406393lea ecx, dword ptr
00406396call dword ptr [<&MSVBVM60.__vbaFree>;MSVBVM60.__vbaFreeObj
0040639Cmov edx, 00402550 ;上面生成机器码的过程,不必分析的,~有兴趣的下断 bp GetVolumeInformationA
004063A1lea ecx, dword ptr
004063A4call dword ptr [<&MSVBVM60.__vbaStrC>;MSVBVM60.__vbaStrCopy
004063AAmov ecx, dword ptr
004063AClea edx, dword ptr
004063B2lea eax, dword ptr
004063B5push edx
004063B6push eax
004063B7push esi
004063B8call dword ptr ;反序
004063BEcmp eax, edi
004063C0jge short 004063D4
004063C2push 734
004063C7push 00402240
004063CCpush esi
004063CDpush eax
004063CEcall dword ptr [<&MSVBVM60.__vbaHres>;MSVBVM60.__vbaHresultCheckObj
004063D4mov ecx, dword ptr ;机器码
004063DAcall dword ptr [<&MSVBVM60.__vbaI4Ab>;MSVBVM60.__vbaI4Abs
004063E0lea ecx, dword ptr
004063E3lea edx, dword ptr
004063E6push ecx
004063E7push edx
004063E8mov dword ptr , eax
004063EBmov dword ptr , 3
004063F2call dword ptr [<&MSVBVM60.#573>] ;16进制转换
004063F8lea eax, dword ptr
004063FBpush eax
004063FCcall dword ptr [<&MSVBVM60.__vbaStrV>;MSVBVM60.__vbaStrVarMove
00406402mov ebx, dword ptr [<&MSVBVM60.__vb>;这里看到明文~ 机器码16进制
00406408mov edx, eax
0040640Alea ecx, dword ptr
0040640Dcall ebx ;<&MSVBVM60.__vbaStrMove>
0040640Fmov ecx, dword ptr
00406411lea edx, dword ptr
00406414lea eax, dword ptr
00406417push edx
00406418push eax
00406419push esi
0040641Acall dword ptr ;反序上面的16进制
00406420cmp eax, edi
00406422jge short 00406436
00406424push 738
00406429push 00402240
0040642Epush esi
0040642Fpush eax
00406430call dword ptr [<&MSVBVM60.__vbaHres>;MSVBVM60.__vbaHresultCheckObj
00406436mov edx, dword ptr ;反序之后的结果
00406439lea ecx, dword ptr
0040643Cmov dword ptr , edi
0040643Fcall ebx
00406441mov ecx, dword ptr
00406443lea edx, dword ptr
00406446lea eax, dword ptr
00406449push edx
0040644Apush eax
0040644Bpush esi
0040644Ccall dword ptr ;MD5(反序之后的结果)
00406452cmp eax, edi
00406454jge short 00406468
00406456push 718
0040645Bpush 00402240
00406460push esi
00406461push eax
00406462call dword ptr [<&MSVBVM60.__vbaHres>;MSVBVM60.__vbaHresultCheckObj
00406468mov edx, dword ptr ;返回的MD5字符串
.
.
.
.
下面乱七八糟的省略~~ 是KeyGen Me 就只看核心了~~~
OK,现在输入看看~~
断到这里:
00405D20push ebp
00405D21mov ebp, esp
00405D23sub esp, 0C
00405D26push <jmp.&MSVBVM60.__vbaExceptHandl>;SE 处理程序安装
00405D2Bmov eax, dword ptr fs:
00405D31push eax
00405D32mov dword ptr fs:, esp
00405D39sub esp, 0F8
00405D3Fpush ebx
00405D40push esi
00405D41push edi
.
.
.
.
.
00405E93call dword ptr [<&MSVBVM60.#528>] ;MSVBVM60.rtcUpperCaseVar //大写
00405E99lea eax, dword ptr
00405E9Cpush eax
00405E9Dcall edi
00405E9Fmov edx, eax
00405EA1lea ecx, dword ptr
00405EA4call ebx
00405EA6lea ecx, dword ptr
00405EA9call dword ptr [<&MSVBVM60.__vbaFree>;MSVBVM60.__vbaFreeVar
00405EAFmov ecx, dword ptr
00405EB2mov edi, dword ptr [<&MSVBVM60.__vb>;MSVBVM60.__vbaLenBstr
00405EB8push ecx ; /String
00405EB9call edi ; \__vbaLenBstr
00405EBBcmp eax, 0F ;15位 //注册码长度
00405EBEjnz 00406161
.
.
.
.
.004060BAmov edx, dword ptr
004060BDlea ecx, dword ptr
004060C0mov dword ptr , 0
004060C7call ebx
004060C9mov ecx, dword ptr
004060CCmov edx, dword ptr
004060CFpush ecx
004060D0push edx
004060D1call dword ptr [<&MSVBVM60.__vbaStrC>;MSVBVM60.__vbaStrCmp //关键比较
004060D7test eax, eax
004060D9jnz 0040615F //关键跳转,,爆破点~~
上面一段对比注册码了~~ 其实就是开始那个机器码的MD5值得前15位~
【算法总结】
注册码(15位) = 机器码-->16进制-->反序-->MD5-->前15位~~
开始KeyGen:
.const
szFormatHex db '%X',0
szFormatSn db '%s',0
.code
;=================================================
;Zaas KeygenMe #2 注册算法函数
;For ASM
;Code By PiaoYun/P.Y.G
;https://www.chinapyg.com
;=================================================
KeyGen proc dwID:DWORD
LOCAL @szTemp:BYTE
LOCAL @szHex:BYTE
LOCAL @szMD5:BYTE
;LOCAL @szKey:BYTE
invoke RtlZeroMemory,addr @szTemp,sizeof @szTemp
invoke RtlZeroMemory,addr @szHex,sizeof @szHex
invoke RtlZeroMemory,addr @szMD5,sizeof @szMD5
;invoke RtlZeroMemory,addr @szKey,sizeof @szKey
;转换机器码为16进制
invoke wsprintf,addr @szHex,addr szFormatHex,dwID
;获取ID长度
invoke lstrlen,addr @szHex
mov edx,eax
;传入ID地址
lea ecx,@szHex
;倒序字符串
@@:
cmp edx,0
je @F
movzx ebx, byte ptr
mov byte ptr[@szTemp+edx-1],bl
inc ecx
dec edx
jmp @B
@@:
invoke lstrlen,addr @szTemp
;MD5计算
invoke _MD5,addr @szTemp,eax ;MD5计算
;转换成大写
invoke CharUpper,eax
;截取前15位字符
;方法1:采用简便方法~~在16位的位置截断字符串~
mov byte ptr,0
; ;======================================
; ;方法2:当然你可以使用传统的方法截取
; mov ecx,15
; xor esi,esi
; @@:
; movzx ebx,byte ptr
; mov byte ptr[@szKey+esi],bl
; inc esi
; loop @B
; lea eax,@szKey
; ;=======================================
ret
KeyGen endp
按钮事件代码:
LOCAL @szBufferOutPut:byte
invoke GetDlgItemInt,hWnd,IDC_EDT_INPUT,NULL,FALSE ;IDC_EDT_INPUT 机器码框
invoke KeyGen,eax ;调用算法函数
invoke wsprintf,addr @szBufferOutPut,addr szFormatSn,eax ;格式化输出
【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢! 前排学习 学习一下。。。 学习了,谢谢飘云老大 看不懂,进来负责顶贴 /:L /:L
看不懂,纯围观!!爆破就浪费作者的用心了! 支持一下楼主! 学习了.. 飘云老大出手。。。嘿嘿。。。汗颜了哈。。 支持飘云大哥,偶只会爆破!
页:
[1]