Crackme004-CKme(OD版本)
程序执行过程
输入正确的用户名以及注册码就会在下方的灰色区域显示出一张照片
第一步:进行查壳,判断是否存在壳
第二步:将程序加载到OllyDbg中
点击F9进行运行程序
第三步:查找中文引擎中的提示信息
在汇编窗口右键选择“中文搜索引擎—>智能搜索”
在弹出的窗口中,我们看到了很多的信息,其中一条就是“恭喜恭喜!注册成功”
第四步:选中执行的字符串右键鼠标,点击“在解释器中跟随”,或者直接进行双击,即可去往执行的汇编窗口
第五步:分析疑似的判断语句
在我们第四步跟踪之后,我们观察到有两个疑似的判断条件
根据观察指令之前的箭头跳转可以得知,jnz short CKme.004580B3转移的指令是直接跳过了“恭喜恭喜!注册成功”这个指令的,那么我们需要将这个判断的结果与之前的判断结果相反,这样的话就不会直接跳过注册成功这个函数的执行,所以我们需要修改这个判断指令
第五步:用NOP指令进行填充
右键选择“二进制—>用NOP填充”
或者右键点击汇编输入 NOP
修改之后我们运行,直接点击灰色区域,即可显示出图片
这样就实现了直接绕过
我们也可以通过分析去寻找这个注册码的算法,根据每次输入的用户名即可直接计算出注册码
寻找注册码的算法
在寻找注册码的过程中需要利用DelphiDecompiler软件
我们可以观察到chkcode中对应的地址,即为算法实现的地址
我们回到OD中在汇编指令中寻找这个地址对应的汇编指令
找到这个地址之后,我们添加断点,点击运行
此时程序断到了断点处
点击F8进行单步步过,重点关注ASCII码值的变化,乘法指令,除法指令,加法指令等运算指令
观察信息窗口以及寄存器窗口中的寄存器数据变化
一步一步执行,忽然我们观察到一个特殊的ASCII码,我们猜测这个就是我们的注册码
黑头Sun Bird11dseloffc-012-OK123456
根据这一步一步的操作我们可以总结出注册码的形式为
黑头Sun brid+(name长度+5)+dseloffc-012-OK+name
我们根据这个算法进行测试
我们可以发现,此时我们利用算法计算出了注册码,并且成功显示了照片