1. 将其NAG窗口去除
2. 破解右边的Serial的验证。
3. 破解左边的Name和Serial验证
4. 做出左边的注册机。
简单使用PEiD分析目标文件,发现文件是32位文件,没有加壳,文件采用Borland Delphi。
3.1 去NAG
观察NAG窗口,该窗口很简单,可能使用MessageBox或者CreateDialog创建的。
1)手动跟踪法
使用OD载入,使用断点和F9配合,跟踪到位置0042F784,这里将标题和内容传到ecx和edx以及eax。跟进入唯一的call,发现内部调用确实是调用系统的MessageBox,可以判断0042A170是Delphi对MessageBox的一个封装。
2)加速分析
l 通过字符串查找目标代码
可以通过弹窗内容进行查找,可以快速找到目标代码位置。
l 通过关键API查找目标代码
通过MessageBox进行断点,然后弹出NAG时,朔源代码位置
3)去除处理
将CALL进行NOP处理即可,但需要注意堆栈平衡。
3.2 破解右边的Serial的验证
通过关键字符串快速定位到弹窗代码位置,然后朔源代码,这里明显是一个if else判断。通过观察堆栈发现正确的序列号 Hello Dude! 。
实际实验发现序列号正确。
3.3 破解左边的Name和Serial验证
随便输入测试数据:
Name:kkkkk
Serial:11111111111
用相同的方法跟踪到目标代码位置,同样一个if else判断,同样此时在堆栈中就能得到计算的正确序列号CW-8774-CRACKED.
测试发现,对应输入测试数据Name验证通过。
3.4 注册机算法分析
判断Name长度大于4
取第一个字符,乘以 0x29,再乘以2.
然后以10方式打印成字符串,然后使用-,头尾格拼接CW和CRACKED。
1. 暴力破解,显示图片
2. 获取序列号计算算法
使用PEiD分析目标文件,发现文件是32位文件,没有加壳,文件采用Borland Delphi。
查看界面,没有点击按钮,提示注册成功会出现图片。
猜测是通过键盘按下释放事件触发验证代码。
3.1 暴力破解
通过查看关键字符串,跳转目标代码位置,发现一个关键判断00458031。
将跳转部分nop掉,保证输入任意代码都可以注册成功,将修改后的代码另存到新文件。
测试输入,输入任意字符并不会触发成功提示,,移动鼠标发现可点击,点击发现注册成功。
3.2 注册算法
通过前面发现,设置鼠标断点能在00458031暂停,查看代码发现没有计算序列号的实现,判断结论由内存获取,猜测计算序列号实现在别处,这里仅获取结果将图片进行显示。再次设置键盘事件断点,得到序列号计算代码实现位置,此时堆栈数据。
序列号是直接通过拼接字符串合成的,这里测试注册码是:黑头Sun Bird10dseloffc-012-OKkkkkk,验证通过。
该程序将注册码计算和用户结果判断两部分逻辑拆分,前面通过键盘事件触发注册码计算这块猜对了,但没有想到还通过一个隐藏的面板点击逻辑进行触发显示。
1. 隐藏 cancella按钮,ok按钮变可用
2. 注册成功,隐藏ok按钮,底部logo完整展示
使用PEiD分析目标文件,发现文件是32位文件,没有加壳,文件采用Borland Delphi。
这道题难点在于和上次一样将按钮状态更改验证和序列号验证两个算法拆开,在破解过程中需要多次输入不同的账号密码进行验证,且存在一定的误导。
3.1 隐藏 cancella按钮,ok按钮变可用
如果不没注意到cancella按钮,会发现ok按钮的响应函数有一个关键比较是无法跳过的,因为该变量修改需要通过cancella的响应事件进行触发,且响应正确的序列号和验证码后,cancella按钮会隐藏,ok按钮会可用。
这里计算得到:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-11-16 12:16
被10ngvv编辑
,原因: