首先运行软件,了解软件的基本功能。打开软件,只有两个按钮,点击file只有exit选项;点击help,显示与软件开发者相关的信息。 运行后没有发现有价值的东西,接下来使用OD进行分析。
使用OD打开程序,首先查看字符信息。初步确定运行软件时,会通过cmp eax,-1进行判断是否有名为CRACKME3.KEY的文件,若文件不存在,eax=-1,跳转不执行,不加载后续功能点代码。 那么我们在该程序目录下创建一个CRACKME3.KEY文件,并写入一些英文字符。 重新使用OD进行调试,发现eax值不为-1,跳转实现,继续向下运行。 读取文件内容,并与0x12(10进制为18)进行比较,这一步即为判断文件中字符串长度是否满足18位,小于18则跳转到之前,不继续向下运行。 文件中字符长度大于18位,跳转不实现,继续向下运行,读取出前18位,并调用了一个函数,按F7跟进查看。 首先执行了两个XOR操作,将EAX和ECX寄存器清空,往下走进入循环,将前14个字符分别与A-N进行异或,并将每个异或的结果相加放入[4020F9]地址中,循环结束返回ECX=E,也就是循环次数。 将[4020F9]与12345678进行异或,之后[4020F9]与EAX的值进行比较,相同则使用sete将EAX的低位设为1;比较前调用了一个函数,跟进去看看,发现EAX值为key文件中第15位到18位的四位字符。 将EAX的低位进行AND操作,al=1,结果为TURE,ZF不被置1,跳转不实现,继续向下运行。分析过程结束,接下来就是破解。
test用于将两个操作数按位AND运算,当AND结果为0时,ZF(zero flag)置1,既只有当两操作数AND结果为0,test将ZF置1;test不会写回到目的操作数。
将以下三个点进行修改,保存修改数据,重新打开程序,发现还是和之前一样,没有变化。 再次使用OD打开,往下走,发现还有一处判断点,判断al是否为1,修改此处,保存数据,打开程序,弹出破解成功的窗口。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!