使用OllyDbg破解CrackMe程序
环境
Windows10家庭版 & OllyDbg1.10看雪增强版 & CrackMe3
实操
- 打开CrackMe程序,输入错误的激活码会报错
- 退出程序,打开OllyDbg,并载入此程序
- 在左上角窗口右键,选择查找所有相关字符串
- 接着,在弹出的窗口中选择查找文本
- 输入Wrong,区分大小写,查找刚刚的报错位置
- 结果如图
- 选中,右键,在反汇编窗口跟随
- 跳转到下图所示
- 看到上图的指令,分析一下程序流程:输入ID和注册码后,call调用子函数来判断注册码是否正确(00440F51处,call 00403B2C处的子函数),如果不正确,一个jnz跳到00440F72,弹出“Wrong Serial ,try again!”
- 在call的前面的00440F2C处按F2下个断点
- 然后F9让程序跑起来,输入假的ID “nju”,按下“注册”。此时程序自然要去call子函数来验证我们的注册码是否正确。
- 按下几次F8单步步过,直到00440F34 call指令,改为F7单步步入,跟踪到所call的函数。下图为F7跳转的验证激活码的程序。
- 可以看到,程序将输入的注册码与内置的注册码用cmp指令做了比较。(cmp指令执行后,将对标志寄存器ZF产生影响。比如 CMP AX , BX ,当AX=BX时,ZF=1;AX!=BX时,ZF=0。)如果注册码与输入的字符串不相等,ZF=0。此时子程序返回,执行00440F39处的JNZ指令。因为输入的注册码不对,ZF=0,开始执行JNZ,跳转到00440F8C,弹出“Wrong Serial”对话框提示注册码错误。
- 如果将JNZ(ZF=0时就跳转)改为JE(ZF=1时就跳转),得到的结果就会正好相反,即错误的注册码反而会提示注册成功,对的注册码反而会提示错误。
- 在输入ID时call了一下,然后一个jnz。在输入注册码时又call了一下,再一个jnz。
- 双击对应的JNZ指令,将“jnz”改为“je”,点击“汇编”即可。右键,复制到可执行文件,全部修改,然后全部复制
- 在新弹窗中,保存文件,打开保存的程序,随便输入