crackme 一只老虎

环境

看雪论坛的附件,其中序列号的第二题
IDA PRO 破解版 Version 6.8.150423 (64-bit)

入口

首先输入任意字符串注册注册名 : qianhailong ; 注册码 : longlong

crackme一只老虎1.png

点击注册,显然因为输入有问题错误而没有任何弹窗
拖入IDA PRO,断点调试,首先需要找到入口

思路一,尝试寻找类似GetDlgItemTextA获取字符串的导入函数 ,并没有什么发现,只有可疑的GetWindowTextA、GetWindowTextW、GetKeyNameTextA
先此几处下断点,此时看到的现象是多种事件行为都会触发这几个函数,例如click、 focus等,难以调试

思路二,寻找关键字符串,view -> open subviews -> strings 或者 热键shift+F12,然而也没有什么线索,还有几处中文乱码不清楚是什么

思路三,点击事件,在Functions windows过滤click关键字,果然有所发现

如下图,其中有三个按钮点击事件函数,这时候双击左侧_TForm1_Button3Click,会发现右侧对应代码含有关键词Close,此时可以大胆猜测跟程序一一对应,Button3对应推出,那么Button1 对应注册

下完断点,点击注册,验证完毕

代码流程

有了上一次经验,代码大体流程看的非常快,上叙断点下完后,函数前面初始化比较繁琐,先直接跳过
到下图所示第一个分支

crackme一只老虎6.png

1处代码下面如果接左侧分支,直接到底就结束了,并不是我们期望的;
反推更期望进入右侧分支,继续反推期望倒数两行cmp eax 0Ah; jl loc——48c844,期望eax >= 0Ah
反推call unknown_libname_70执行结果eax满足eax >= 0Ah
call处下断点,鼠标查看先前的eax值为字符串qianhailong的地址;
执行结果后,eax的值变成了0B(h),很明显是返回了注册名的长度,要求注册名的长度 >= 0Ah

这里重命名一下unknown_libname_70getStrLenToEax,另外也可以发现改程序是delphi写的

类似上面的分析,下面几处流程都是注册名、注册码的长度要求,要求暂简记为0A(h) <= NLen <= 10(h) 11(h) <= MLen <= 16(h)
可知目前注册码的长度longlong不满足题意

重新输入

重新输入注册码longlonglonglonglong,继续断点重试
流程比较繁琐,点断继续一直找字符串比较的地方

crackme一只老虎7.png

上图3处代码中的函数签名含有关键词strcmp,并且往下有两个分支,一个是弹出MessageBox再结束,一个是直接结束

断点下在jnz short loc_48C803,在Hex View-1中右键选中Synchroize with ID View-RIP,可见该处代码的二进制字符,如下

crackme一只老虎9.png

jnz对应的机器码为75,按住F2进入编辑状态修改为74(对应机器码为jz)

修改完一定要再次按下F2保存!!!
修改完一定要再次按下F2保存!!!
修改完一定要再次按下F2保存!!!

当然也可以直接改ZF寄存器,如果可得到如下界面

crackme一只老虎12.png

注册机

这次我没有去认真单点调试去求加密的每一个步骤,采用直接改二进制的方式,所以这一次没有写注册机
上述方式只会保存在IDA pro数据库,不会改变程序本身
如果要求改程序本身,需要借助其他程序
nodepad++需要借助插件HexEditor.dll,插件 -> Hex-Editor -> View in Hex(另外也可以使用ultraedit)

crackme一只老虎13.png