从最简单的程序开始教你怎么破解(二)
发布于
今天,我们还讲Hopper反编译,不过用的还是昨天的CM。我今天准备告诉大家,怎样替换程序里的字符串,这样就可以为所欲为了。
目标:把程序修改成,只有使用自己规定的注册码,才能激活成功。
开始分析
首先,程序拖入 Hopper 解析。完成后,在左边的搜索视图中选择Str,查看程序里的字符串。因为程序比较小,所以字符串只有5个。

这五个字符串,前面一个是激活码(怎么判断出来的上篇文章讲过),中间四个其实是中文的十六进制编码(对应的是“说明”“要求”和“输入错误”几个字符串),最后一个是定义用来处理换行的。既然要修改第一个,我们就点进去。
修改程序
修改字符串有两种方法。
方法一:修改十六进制
-
把视图切换为
Hex Mode,这个模式已经自动给你高亮了对应激活码的16进制码。
16进制码 -
例如,你要把激活码改成
111111-111111-111111,那么,十六进制里,1对应31,而连字符-对应着2D,所以你就要把对应的十六进制改成:
31 31 31 31 31 31 2D 31 31 31 31 31 31 2D 31 31 31 31 31 31
这里我要说明一点,如果你的激活码比以前的激活码要短,那么你就尽管从头开始修改,最后剩下几位,你就在相应的位置上填写00即可。如果激活码比以前的长,那么会出现一个修改文件偏移量的问题,比较复杂,再次不阐述。
例如,你的激活码是:helloworld!,对应下来就是:68 65 6c 6c 6f 77 6f 72 6c 64 21
2. 如果你嫌麻烦,可以在右边对应的字符串一个个修改成1和-, Hopper 会自动为你生成十六进制填在左边。
3. command+shift+E,导出,完工!
方法二:修改汇编代码
这个方法要比修改十六进制简单得多,我把它放在后面,是因为修改出来, Hopper 显示得有些让人迷糊,看不懂。我开始也用的这个方法,感觉错了,后来才知道这是最简单的方法。如果你用的是修改十六进制的方法,不妨撤回,然后用这个方法试试。
- 把视图切换回汇编代码,确保在激活码的地方。汇编代码应该长这样:
a82mal929anyw9m:
0000000100000e80 db "82mal9-29anyw-9msfz6", 0 ; DATA XREF=_main+8
0000000100000e95 db "", 0
0000000100000e96 db "", 0
0000000100000e97 db "", 0
0000000100000e98 db "", 0 ; DATA XREF=_$s10Crackme__16verifyyyF+118, _$s10Crackme__16verifyyyF+653
0000000100000e99 db "", 0
0000000100000e9a db "", 0
0000000100000e9b db "", 0
0000000100000e9c db "", 0
0000000100000e9d db "", 0
0000000100000e9e db "", 0
0000000100000e9f db "", 0
- 鼠标选中第一行。我的第一行是指:
0000000100000e80 db "82mal9-29anyw-9msfz6", 0 ; DATA XREF=_main+8如果你不是这一行,会发生不好的结果。 - option+A修改,输入指令:
db “你想要的激活码”, 0 - 之后,你的那行代码就会改成这样:
0000000100000e80 db 6 dup (0x31), 0x2d, 0x31 ; DATA XREF=_main+8
0000000100000e88 db 5 dup (0x31), 0x2d, 2 dup (0x31)
0000000100000e90 db 4 dup (0x31), 0x00
很奇怪吧!这就是一个坑:这段代码看起来怪怪的。为什么呢? 我提醒一下大家:
db命令是定义字节,基本上常量和变量的定义都会出现,不必纠结。dup是复制的意思,对应英文单词duplicate。那么6 dup (...)是什么意思,就可想而知了。0x31和0x2d都是刚才说过的十六进制。 现在你就会明白,这段代码是没有问题的。
注意事项
提醒大家注意几点: