不管是Web安全还是逆向分析,在我看来,没有任何一项工具是值得你投入大量精力去熟悉和学习的,我的本意就是你不应该在学习工具上浪费大量时间。因为是最重要的是你得懂得原理,熟悉手法,了解思路,而有些工具你又必须得去熟知,最好学习使用工具的办法就是在实操中掌握手法,实战中熟悉工具。
前提得是你了解汇编语言,win32程序你也大致得了解,我是把王爽的那本《汇编语言》给过一遍了,顺便敲一敲。至于win32编程我是看不进去了,反正遇到不知道的再查嘛。
这一系列我准备主要使用IDA和Ollydbg这两种工具(当然不止它们),一方面是记录我探索《加密与解密》的足迹,另一方面也是与大家分享我的学习方法,从最简单的开始,再到复杂,好了,不墨迹,开始。
将我们的程序CrackMe拖进IDA中,选择默认步骤,点击ok即可。点击菜单栏OPTIONS-General,勾选Line prefixes(grApph),展示反汇编代码地址。
打开我们的程序,输入任意值,点击Check,会提示“序列号不对,重新再试一次!”
可以看到IDA这里函数窗口就3个函数(简单嘛!),查找一下哪个地方出现“序列号不对,重新再试一次!”这种字符串,这里可以看到第三个函数底部出现该字符串,图形模式非常可观,我最喜欢IDA这点了!(点击空格键可以进行代码模式和图形模式的切换),在4010c9这个位置进行跳转,而跳转的位置4010e8这个位置就是提示你注册失败的位置,换一种说法就是如果你的程序正常走下去说明你的程序注册成功,但是现在因为跳转了,所以不能注册成功。
所以这里要想成功破解程序就两种方法,一个是将jnz这个跳转指令用nop空指令填充,让程序正常走下去,成功注册;另一个就是,jnz这个指令是因为我们输入的序列号与其要求的序列号不相等跳转,我们将jnz改为jz,即相等才会跳转,所以我们任意输入错误的序列号到这里都不会跳转而是直接走下去成功注册。
将我们的程序拖进Ollydbg,快捷键Ctrl+g搜索定位到跳转地址4010c9,点击该汇编指令点击右键选择汇编,将je改为jne(另一种方法就是不用改汇编指令,勾选用nop指令填充也可以)
然后点击复制到可执行文件,选择所有修改-选择全部复制
在新跳转的窗口选择右键(不是原来的汇编代码C窗口),点击保存文件即可
这个时候我们点击新破解的程序,输入任意数值,提示:恭喜你