飘云 发表于 2010-4-14 19:21:31

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官方论坛, 转载请注明作者并保持文章的完整, 谢谢!

月之精灵 发表于 2010-4-14 19:46:12

前排学习

挂挂 发表于 2010-4-14 20:04:34

学习一下。。。

老万 发表于 2010-4-14 20:40:28

学习了,谢谢飘云老大

lgjxj 发表于 2010-4-14 23:06:13

看不懂,进来负责顶贴

yanhuohua999 发表于 2010-4-15 11:26:40

/:L /:L
看不懂,纯围观!!爆破就浪费作者的用心了!

wb2008 发表于 2010-4-15 23:55:04

支持一下楼主!

shenaset 发表于 2010-4-18 13:36:21

学习了..

zaas 发表于 2010-4-18 15:50:42

飘云老大出手。。。嘿嘿。。。汗颜了哈。。

pao 发表于 2010-4-25 20:32:58

支持飘云大哥,偶只会爆破!
页: [1]
查看完整版本: Zaas KeygenMe #2[VB] MD5算法简析+ASM注册机源码