160个Crackme之045学习笔记
本帖最后由 海天一色001 于 2020-8-16 16:24 编辑第45个CM程序,打开Dope2112.2.exe,点击Check按钮,弹出错误提示信息框;点击Info按钮,弹出About信息框。
第一步、查壳:
Delphi程序,无壳。
第二步、爆破:
几个专用的Delphi反编译工具无法正常加载,直接用OD载入:
和上一个程序一样,一大堆的call,不知道有什么用。
再用智能搜索字符串试一试,没找到错误提示框的内容;试试PE Explorer:
利用PE Explorer自带的反汇编器很轻松地找到了按钮事件及其地址,记下这个00421DC8。
回到OD中,Ctrl+G键来到00421DC8处下断,F9运行程序,输入Name/Serial=“52pojie/1234567890”,点击Check按钮,程序断下:
F8单步慢慢向下,注意信息栏、寄存器窗口和堆栈窗口的信息:
call 00411880应该是得到文本编辑框的内容,并存入栈中,将字符串长度存入eax中,
所以在00421DF2处的调用call 00411880后得到假码入栈中,此时eax=0xA;
在00421E00处调用call 00411880后得到Name入栈,此时eax=0x7;
call 00403364应该是单纯地得到文本长度,在00421E05处得到了Name字符串地址指针作为参数,在00421E08处调用这个call得到Name字符串的长度;
再向下,猜测00421E0D处判断Name字符串应不少于4个字符,少于则跳到00421E6B处失败,不少于则跳到00421E1E处得到Name字符串,
00421E21处再调用0043364处的call得到文本长度;
继续向下,如果Name为空,则跳过注册算法:
从00421E2A至00421E43处是具体的注册算法:
运行00421E43处的call 00405330后,将上面计算出的数值转换成10进制数值形式,压入栈中,此时可以看到栈窗口中情况:
严重怀疑这个数值就是真正的注册码,先试一试,弹出正确提示。
本想先爆破的,没想到先把注册码找到了。继续单步向下,
00421E48处得到真码,00421E4B处得到假码,
00421E4E处的call 00403474是关键call,作用是用来比较真假码;
00421E53处的跳是关键跳,如果关键call返回结果为零,继续向下弹出正确信息,如果不为零,则跳到错误信息框。
所以要爆破很简单了,将00421E53处指令nop掉,保存为Dope2112.2_nop.exe后打开,随意输入Name/Serial,点击Check按钮均弹出正确信息框来,说明爆破成功。
第三步、追码:
爆破时已知从00421E2A至00421E43处是具体的注册算法:
Name字符串长度加一作为循环次数,
分别取Name字符串前一位(通常为0)及Name字符串中每一位字符的ASC值,
逻辑左移9位(相当于乘以0x200),
累加后的值再加上0x37存入ebx中,
最后转换成10进制形式,即Name对应的注册码。
注册算法(VB)
Option Explicit
Private Sub Command1_Click()
Dim Name As String
Dim i As Integer
Dim Num, Serial As Double
Name = Text1.Text
If Len(Trim(Name)) < 4 Then
MsgBox ("Name必须超过4位,如不符合要求,默认Name为“52pojie”,Serial为“326711”!")
Text1.Text = "52pojie"
Text2.Text = "326711"
Exit Sub
End If
Serial = 55
For i = 1 To Len(Name)
Num = Asc(Mid(Name, i, 1))
Num = Num * 512
Serial = Serial + Num
Next i
Text2.Text = Serial
End Sub
附件,含CM原程序、爆破后的程序、注册机、OD的调试文件等。
百度链接:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ
提取码:p8dk。 感谢分享 谢谢楼主分享,先下载收藏了 技术贴,不错,非常感谢!!!! 谢谢楼主分享 不错的技术贴,谢谢分享。 很不错的的软件,值得分享 天天都没有你的段子好 感谢分享!已经开始做前边的实验了 谢谢大佬详细的解说步骤,比之前那个链接写的好!
页:
[1]
2