-
-
菜鸟玩破解~高手就不要来笑话偶了[原创]
-
发表于:
2006-8-15 18:43
5337
-
我是一只小小小菜鸟,这是我第一次找出了算法,写出了注册机(虽然算法很简单,但是好有成就感啊,呵呵),各位见笑了
【软件名称】 AD_CM#2.exe
【下载地址】 新手博物馆(好象是)
【保护方式】 注册码
【调试环境】 OllyICE v1.10 修改版,PEiD、Visual Basic 6.0
【破解日期】 2006-08-15
【破解目的】 研究算法分析
【破文作者】 zhangyonf
【作者声明】 初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【破解内容】
用PEID查没有加壳,MASM32 / TASM32编写
首先载入然后运行程序,弹出主窗体,然后查找-》当前模块中的名称用GetDlgItemTextA下断(不知道为什么用字符串参考总是找不出该有的注册码,不是乱码就是什么也没有,我自己用vb写了一个简单的载入依然如此,望高手指导),输入name:zhangzi;serial:123456来到这里:
0040110E |. E8 77000000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA这里应该是取name的值
00401113 |. 8BF0 mov esi, eax ;
00401115 |. 8D01 lea eax, [ecx]
00401117 |. 83FE 05 cmp esi, 5
0040111A |. 7D 18 jge short 00401134
0040111C |. 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040111E |. 68 12304000 push 00403012 ; |Title = "ArturDents CrackMe#2"
00401123 |. 68 44304000 push 00403044 ; |Text = "Your name must be at least five characters long!"
00401128 |. FF75 08 push dword ptr [ebp+8] ; |hOwner
0040112B |. E8 60000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401130 |. 33C0 xor eax, eax
00401132 |. EB 40 jmp short 00401174
00401134 |> 6A 14 push 14 ; /Count = 14 (20.)
00401136 |. 68 80324000 push 00403280 ; |Buffer = AD_CM#2.00403280
0040113B |. 68 B90B0000 push 0BB9 ; |ControlID = BB9 (3001.)
00401140 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
00401143 |. E8 42000000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
;从这里开始才是真正有用的地方
00401148 |. B8 80304000 mov eax, 00403080 ; ASCII "zhangzi"
0040114D |. BB 80324000 mov ebx, 00403280 ; ASCII "123456"
00401152 |. 8BCE mov ecx, esi ; 用户名的长度
00401154 |> 8A10 /mov dl, [eax] ; 用户名的第一个字符放入dl
00401156 |. 2AD1 |sub dl, cl ; 第一个字符减去用户名的长度
00401158 |. 3813 |cmp [ebx], dl ; serial 的第一位与减后的值比较
0040115A 75 18 jnz short 00401174 ; 不等就over,注册失败
0040115C |. 40 |inc eax ; 取下一个字符
0040115D |. 43 |inc ebx ; 取serial的下一位
0040115E |.^ E2 F4 \loopd short 00401154 ; 循环
00401160 |. 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401162 |. 68 12304000 push 00403012 ; |Title = "ArturDents CrackMe#2"
00401167 |. 68 27304000 push 00403027 ; |Text = "Yeah, you did it!"
0040116C |. FF75 08 push dword ptr [ebp+8] ; |hOwner
0040116F |. E8 1C000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401174 |> C9 leave
00401175 \. C2 0400 retn 4
我们不能看出这个crackme的算法就在00401154 处的循环,起算法是分别将name和serial放入eax,ebx,将name的长度放入ecx,然后取出name放入dl,用dl减去ecx的值与serial中的第一个字符比较,不等就跳走,否则继续循环(不要忘记ecx是循环计数器哦),从算法我们可以分析出我们输入的serial只要前n位是正确的serial后面在多数几个字符也无所谓,不知道注册码是不是都这样。应该不是吧。
vb注册机如下:
Private Sub Command1_Click()
Dim length As Integer
Dim serial As String
Dim name As String
Dim i As Integer
i = 1
name = Text1.Text
length = Len(name)
Do While length > 0
serial = serial & Chr(Asc(Mid(name, i, i)) - length)
i = i + 1
length = length - 1
Loop
Text2.Text = serial
End Sub
破解完成,非常简单的算法,高手见笑了,希望能让象我这样的菜鸟入个门,有失误的地方请高手指正。。
感谢看雪提供了这么好的一个平台,让我有机会在这里学习,谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课