【文章标题】: [破]KeyGenMe.UTW.vb
【文章作者】: HappyTown
【作者邮箱】: [email]wxr277@163.com[/email]
【作者主页】: www.pediy.com
【软件名称】: UTW KeyGenMe
【软件大小】: 7.04KB
【下载地址】: 附件内
【加壳方式】: FSG2.0
【保护方式】: SN
【编写语言】: VB
【使用工具】: OD,PEiD,Calc,FSG2Dumper
【破解难度】: 0/10
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一、基本信息
1. 用PEiD查看为FSG2.0的壳,用FSG2Dumper轻松脱去;
2. 当两个编辑框均为空时,会导致运行时错误;
3. 输入name和错误的sn并未有任何提示。
二、分析
1. OD载入,输入试炼码happy和7654321;
2. 找个VB的断点来下,比如bpx __vbaVarTstEq,关于VB函数的断点,我推荐参考kanxue的《加密与解密II》第7章。
00402B74 >mov edi, [<&MSVBVM60.__vbaStrVarVal>>; MSVBVM60.__vbaStrVarVal
00402B7A >lea eax, [ebp-64]
00402B7D >lea ecx, [ebp-38]
00402B80 >push eax
00402B81 >push ecx
00402B82 >call edi ; <&MSVBVM60.__vbaStrVarVal>
00402B84 >push eax
00402B85 >call [<&MSVBVM60.#516>] ; MSVBVM60.rtcAnsiValueBstr
00402B8B >mov dx, ax ; 68('h')
00402B8E >lea eax, [ebp-74]
00402B91 >imul dx, dx, 2 ; dx=dx*2=68*2=D0
00402B95 >lea ecx, [ebp-3C]
00402B98 >push eax
00402B99 >jo 00402EAF
00402B9F >push ecx
00402BA0 >mov [ebp-1B6], dx ; D0
00402BA7 >call edi
00402BA9 >push eax ; "ha"
00402BAA >call [<&MSVBVM60.#516>] ; MSVBVM60.rtcAnsiValueBstr
00402BB0 >mov dx, [ebp-1B6] ; D0
00402BB7 >mov edi, [<&MSVBVM60.__vbaLenVar>] ; MSVBVM60.__vbaLenVar
00402BBD >imul dx, ax ; eax=ax*dx=68*D0=5480
00402BC1 >lea eax, [ebp-34]
00402BC4 >lea ecx, [ebp-54]
00402BC7 >push eax
00402BC8 >push ecx
00402BC9 >jo 00402EAF
00402BCF >mov [ebp-15C], dx ; 5480
00402BD6 >mov dword ptr [ebp-164], 2
00402BE0 >call edi ; <&MSVBVM60.__vbaLenVar>
00402BE2 >push eax
00402BE3 >lea edx, [ebp-164]
00402BE9 >lea eax, [ebp-84]
00402BEF >push edx
00402BF0 >push eax
00402BF1 >call [<&MSVBVM60.__vbaVarAdd>] ; MSVBVM60.__vbaVarAdd
00402BF7 >push eax
00402BF8 >call [<&MSVBVM60.__vbaI2Var>] ; MSVBVM60.__vbaI2Var
00402BFE >lea ecx, [ebp-3C] ; 5485=5480+nameLen
00402C01 >lea edx, [ebp-38]
00402C04 >push ecx
00402C05 >push edx
00402C06 >push 2
00402C08 >mov [ebx+3C], ax
00402C0C >call [<&MSVBVM60.__vbaFreeStrList>] ; MSVBVM60.__vbaFreeStrList
00402C12 >lea eax, [ebp-84]
00402C18 >lea ecx, [ebp-74]
00402C1B >push eax
00402C1C >lea edx, [ebp-64]
00402C1F >push ecx
00402C20 >push edx
00402C21 >push 3
00402C23 >call [<&MSVBVM60.__vbaFreeVarList>] ; MSVBVM60.__vbaFreeVarList
00402C29 >add esp, 1C
00402C2C >lea eax, [ebp-34]
00402C2F >lea ecx, [ebp-54]
00402C32 >mov dword ptr [ebp-15C], 64
00402C3C >push eax
00402C3D >push ecx
00402C3E >mov dword ptr [ebp-164], 2
00402C48 >call edi
00402C4A >push eax
00402C4B >lea edx, [ebp-164]
00402C51 >lea eax, [ebp-64]
00402C54 >push edx
00402C55 >push eax
00402C56 >call [<&MSVBVM60.__vbaVarMul>] ; MSVBVM60.__vbaVarMul
00402C5C >push eax
00402C5D >call [<&MSVBVM60.__vbaI2Var>] ; MSVBVM60.__vbaI2Var
00402C63 >mov cx, [ebx+3C] ; 5485
00402C67 >mov [ebx+3E], ax
00402C6B >push ecx
00402C6C >lea edi, [ebx+40]
00402C6F >call [<&MSVBVM60.__vbaStrI2>] ; MSVBVM60.__vbaStrI2
00402C75 >mov edx, eax ; 5485(hex)=21637(十进制)
00402C77 >lea ecx, [ebp-38]
00402C7A >call esi
00402C7C >mov dx, [ebx+3E]
00402C80 >push eax
00402C81 >push edx
00402C82 >call [<&MSVBVM60.__vbaStrI2>] ; MSVBVM60.__vbaStrI2
00402C88 >mov edx, eax ; 500=nameLen*100
00402C8A >lea ecx, [ebp-3C]
00402C8D >call esi
00402C8F >push eax
00402C90 >call [<&MSVBVM60.__vbaStrCat>] ; MSVBVM60.__vbaStrCat
00402C96 >mov edx, eax ; 21637500,这就是真注册码
00402C98 >lea ecx, [ebp-40]
00402C9B >call esi
00402C9D >mov edx, eax
00402C9F >mov ecx, edi
00402CA1 >call [<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
00402CA7 >lea eax, [ebp-40]
00402CAA >lea ecx, [ebp-3C]
00402CAD >push eax
00402CAE >lea edx, [ebp-38]
00402CB1 >push ecx
00402CB2 >push edx
00402CB3 >push 3
00402CB5 >call [<&MSVBVM60.__vbaFreeStrList>] ; MSVBVM60.__vbaFreeStrList
00402CBB >mov eax, [edi]
00402CBD >add esp, 10
00402CC0 >lea ecx, [ebp-24]
00402CC3 >lea edx, [ebp-164]
00402CC9 >push ecx
00402CCA >push edx
00402CCB >mov [ebp-15C], eax
00402CD1 >mov dword ptr [ebp-164], 8008
00402CDB >call [<&MSVBVM60.__vbaVarTstEq>] ; MSVBVM60.__vbaVarTstEq(经典的VB比较,我的建议是你还是跟进去看一下,特别是VarBstrCmp的参数,你会有所收获的)
/////这是我抓出来的一段
7716B67A >call VarCyCmp
7716B67F >jmp 7716B959
7716B684 >mov eax, [ebp+14]
7716B687 >push eax
7716B688 >mov ecx, [ebp+10]
7716B68B >push ecx
7716B68C >mov edx, [ebp+C]
7716B68F >mov eax, [edx+8]
7716B692 >push eax ; 21637500,真正的注册码
7716B693 >mov ecx, [ebp+8]
7716B696 >mov edx, [ecx+8]
7716B699 >push edx ; 7654321,输入的假码
7716B69A >call VarBstrCmp
7716B69F >mov [ebp-44], eax
7716B6A2 >jmp 7716B930
\\\\\
00402CE1 >test ax, ax
00402CE4 >je 00402DD4
00402CEA >mov eax, [404338]
00402CEF >test eax, eax
00402CF1 >jnz short 00402D03
聪明的你已经看出来了,注册码只与name的第一个字符以及name的长度有关,也就是说happy和hrtow的注册码是相同的,注册机就不写了。
注册码的计算过程:
1. (name[1])^2 * 2 + name长度;
2. 把上一步的结果转化为10进制字符串sn_1;
3. 把 name长度 * 100 的结果转化为10进制字符串sn_2;
4. 级联sn_1和sn_2即可。
我的注册名和注册码:
happy
21637500
--------------------------------------------------------------------------------
【经验总结】
本破文主要是为了刚跨进crack大门的初学者而写,所以还是推荐一下这个keygenme。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年11月07日 15:27:21
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)