【破解日期】 2006年11月19日
【破解作者】 冷血书生
【作者邮箱】 meiyou
【作者主页】 hxxp://www.126sohu.com/
【使用工具】 OD
【破解平台】 Win9x/NT/2000/XP
【软件名称】 CrackMe.happytown.VC.0018
【下载地址】 http://bbs.pediy.com/showthread.php?s=&threadid=35157
【软件大小】 56k
【加壳方式】 无
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
------------------------------------------------------------------------
--------
【破解内容】
00401073 call dword ptr ds:[<&USER32.GetDlgIte>; USER32.GetDlgItem
00401079 push eax
0040107A call dword ptr ds:[<&USER32.SetFocus>>; USER32.SetFocus
00401080 push esi
00401081 call CrackMe_.00401130 ; 算法Call
00401086 add esp,4
00401089 test eax,eax
0040108B pop esi
0040108C je CrackMe_.0040111F ; 爆破点
00401092 push 40
00401094 push CrackMe_.004060C4 ; Congratulations
00401099 push CrackMe_.004060B4 ; Good job, man!
0040109E push 0
004010A0 call dword ptr ds:[<&USER32.MessageBo>; USER32.MessageBoxA
004010A6 xor eax,eax
004010A8 retn 10
/////////////////////////////////////////////////////////////////////////
跟进算法Call
/////////////////////////////////////////////////////////////////////////
0040118C mov esi,eax
0040118E cmp esi,4 ; 与4比较
00401191 jl CrackMe_.00401261 ; 小于就跳
00401197 mov ecx,esi
00401199 and ecx,80000001
0040119F jns short CrackMe_.004011A6
004011A1 dec ecx
004011A2 or ecx,FFFFFFFE
004011A5 inc ecx
004011A6 jnz CrackMe_.00401261 ; 不相等就跳
004011AC lea edx,dword ptr ss:[esp+D8]
004011B3 push esi
004011B4 push edx
004011B5 call CrackMe_.00401270 ; 将用户名和注册码小写转大写
004011BA add esp,8
004011BD test eax,eax
004011BF je CrackMe_.00401261
004011C5 lea eax,dword ptr ss:[esp+10]
004011C9 push 0C9
004011CE push eax
004011CF push 3E9
004011D4 push edi
004011D5 call ebp
004011D7 cmp eax,esi ; 用户名长度要与注册码长度相等
004011D9 jnz CrackMe_.00401261 ; 否则OVER
004011DF lea ecx,dword ptr ss:[esp+10]
004011E3 push eax
004011E4 push ecx
004011E5 call CrackMe_.00401270
004011EA add esp,8
004011ED test eax,eax
004011EF je short CrackMe_.00401261
004011F1 mov eax,esi
004011F3 xor edi,edi
004011F5 cdq
004011F6 sub eax,edx
004011F8 mov ebp,eax
004011FA sar ebp,1
004011FC cmp ebp,ebx
004011FE jle short CrackMe_.00401251
00401200 mov cl,byte ptr ss:[esp+edi*2+11] ; 取注册码第二位,取注册码第四位
00401204 mov al,byte ptr ss:[esp+edi*2+10] ; 取注册码第一位,取注册码第三位
00401208 sub cl,41 ; 注册码第二位 - 41
0040120B sub al,41 ; 注册码第一位 - 41
0040120D movsx esi,cl ; 保存结果
00401210 movsx ecx,al ; 保存结果
00401213 mov ebx,1A ; EBX=1A
00401218 lea edx,dword ptr ds:[ecx+ecx*8] ; ecx+ecx*8
0040121B lea eax,dword ptr ds:[edx+esi*2] ; edx+esi*2
0040121E cdq
0040121F idiv ebx ; /1A
00401221 movsx eax,byte ptr ss:[esp+edi*2+D8] ; 取用户名第一位 ,取用户名第三位
00401229 sub eax,41 ; eax - 41
0040122C cmp edx,eax ; 比较
0040122E jnz short CrackMe_.00401261 ; 不相等就OVER
00401230 lea eax,dword ptr ds:[esi+esi*2] ; esi+esi*2
00401233 lea ecx,dword ptr ds:[ecx+eax*4] ; ecx+eax*4
00401236 add eax,ecx ; eax+ecx
00401238 mov ecx,ebx
0040123A cdq
0040123B idiv ecx ; /1A
0040123D movsx eax,byte ptr ss:[esp+edi*2+D9] ; 取用户名第二位,取用户名第四位
00401245 sub eax,41 ; eax-41
00401248 cmp edx,eax ; 比较
0040124A jnz short CrackMe_.00401261 ; 不相等就OVER
0040124C inc edi
0040124D cmp edi,ebp ; 比较是否计算完?
0040124F jl short CrackMe_.00401200 ; 计算下一次
00401251 pop edi
00401252 pop esi
00401253 pop ebp
00401254 mov eax,1
00401259 pop ebx
0040125A add esp,190
00401260 retn
00401261 pop edi
00401262 pop esi
00401263 pop ebp
00401264 xor eax,eax
00401266 pop ebx
00401267 add esp,190
0040126D retn
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
算法总结:
1) 用户名和注册码必须为4位,注册码应该不能为数字吧?
2) (注册码第一位-41)*8+(注册码第一位-41),记为A
(注册码第二位 - 41)*2+A ,记为B
B%1A = 用户名第一位 - 41 ==> 成功25%了
(注册码第二位 - 41)*2 + (注册码第二位 - 41) ,记为C
A*4 + (注册码第一位 - 41), 记为D
(C+D)%1A = 用户名第二位 - 41 ===> 成功50%啦
接下来的不写了,累死啦`~自己看上面分析吧
不会编程,无法做出注册信息,其实我太菜了,不足之处,还请多多指点
------------------------------------------------------------------------
--------
【破解总结】
分析不太难,但就是一个字,累
------------------------------------------------------------------------
--------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法