第40个CM程序,解压后两个文件,CM程序DaNiEl-RJ.1.exe,说明文件readme.txt。先查看readme:
再按照说明打开DaNiEl-RJ.1.exe,不输入任何内容点击“Check it”按钮或任一文本编辑框不输入内容,弹出第一个错误信息框,随意输入name/serial,再点击按钮,弹出第二个错误信息框:
第一步、查壳:
无壳,Delphi 3.0编程。
第二步、爆破:
OD载入CM程序,用中文搜索里面的智能搜索,拉到最下方:
从中看到0042D29F到0042D685这6条指令均是将文本内容导入eax中,应该是弹出信息框的相关内容了。所以选择0042D57D这一行显示错误信息的指令双击进入CPU窗口查看:
向上查看,很容易就判断出0042D56A的指令是关键call,可能是一个简单的比较,也可能是对name/key进行一定的运算验证得出一个值,不等则跳向失败,相等则成功。所以先在0042D56F这一行的指令nop掉,生成一个DaNiEl-RJ.1_nop.exe文件,试运行一下,随意输入name/key,点击“Check it”按钮,弹出正确信息框,说明爆破成功。
另外对name/key还要求不能为空,否则要弹出第一个错误信息框。如果要去掉这个信息框,可以将判断后的跳转改为jmp 0042D571即可。
第三步、追码:
将0042D56F处的修改撤消,继续上下查看代码,很容易发现0042D4A8到0042D5B1处是一个代码段,猜测很大可能是“Check it”按钮事件,所以在0042D4A8这个段首处下断,F9运行,占“File”-“about”,使能“Damn!Where’s the whole things???”后点击这个子菜单,输入name/key=“52pojie/1234567890”,点击“Check it”按钮,程序中断:
F8单步向下,很快就分析出了注册算法:
从0042D4C1至0042D4F6处,大致是两个相同作用的代码段,取name/key编辑框的指针,调用得到文本函数,将文本存入[local.2]/[local.3](局部变量2和3,其实是堆栈自底部向上的第2和第3个)中,再判断是否为空,空则弹出第一个错误提示框,两个均不空则继续向下执行:
从0042D4FB至0042D554处,生成注册码,取name的字符串长度作为循环总次数进行循环,循环时从name字符串的第一位开始先取ASC值,再加上5,将得到的值再转换成文本并依次连接成新的字符串,即为注册码。
从0042D556至0042D587处,关键判断关键跳在爆破时已经明白了,注释中也标明了。运行0042D564处和0042D567处后,在信息栏中很清楚地看到了“”和“”这两个字符串,将“52pojie/:7utonj”输入CM窗口的name/key文本编辑框中,点击按钮,弹出正确信息框来。
注册机编写如下(VB代码):
[Visual Basic] 纯文本查看 复制代码 Option Explicit
Private Sub Command1_Click()
Dim Name, Key, Sname() As String
Dim i, NameNum As Integer
Name = Text1.Text
If Name = "" Then
MsgBox ("请输入Name,如不输入,默认用户名为“52pojie”,注册码为“:7utonj”!")
Text1.Text = "52pojie"
Text2.Text = ":7utonj"
Exit Sub
End If
For i = 1 To Len(Name)
NameNum = Asc(Mid(Name, i, 1)) + 5
Key = Key & Chr(NameNum)
Next
Text1.Text = Name
Text2.Text = Trim(Key)
End Sub
总之这个CM是比较简单的程序,对其中的一些子程序如得到文本的函数、对真假注册码比较的call等没有进行具体分析。也未使用DarkDe4与OD进行对照。
附件
040.rar
(733.64 KB, 下载次数: 2)
,含CM原程序、爆破后的程序、注册机、OD的调试文件等。160个CM、我已练习过的前40个crackme程序(不含012)都在里面。
百度链接是:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ,提取码:p8dk。 |