从最简单的程序开始教你怎么破解(二)

2130 字
6 分钟

从最简单的程序开始教你怎么破解(二)

发布于

今天,我们还讲Hopper反编译,不过用的还是昨天的CM。我今天准备告诉大家,怎样替换程序里的字符串,这样就可以为所欲为了。

目标:把程序修改成,只有使用自己规定的注册码,才能激活成功。

开始分析

首先,程序拖入 Hopper 解析。完成后,在左边的搜索视图中选择Str,查看程序里的字符串。因为程序比较小,所以字符串只有5个。

查看字符串
查看字符串

这五个字符串,前面一个是激活码(怎么判断出来的上篇文章讲过),中间四个其实是中文的十六进制编码(对应的是“说明”“要求”和“输入错误”几个字符串),最后一个是定义用来处理换行的。既然要修改第一个,我们就点进去。

修改程序

修改字符串有两种方法。

方法一:修改十六进制

  1. 把视图切换为Hex Mode,这个模式已经自动给你高亮了对应激活码的16进制码。

    16进制码
    16进制码
  2. 例如,你要把激活码改成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 显示得有些让人迷糊,看不懂。我开始也用的这个方法,感觉错了,后来才知道这是最简单的方法。如果你用的是修改十六进制的方法,不妨撤回,然后用这个方法试试。

  1. 把视图切换回汇编代码,确保在激活码的地方。汇编代码应该长这样:
                  		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
  1. 鼠标选中第一行。我的第一行是指: 0000000100000e80 db "82mal9-29anyw-9msfz6", 0 ; DATA XREF=_main+8 如果你不是这一行,会发生不好的结果。
  2. option+A修改,输入指令:db “你想要的激活码”, 0
  3. 之后,你的那行代码就会改成这样:
    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

很奇怪吧!这就是一个坑:这段代码看起来怪怪的。为什么呢? 我提醒一下大家:

  1. db命令是定义字节,基本上常量和变量的定义都会出现,不必纠结。
  2. dup是复制的意思,对应英文单词duplicate。那么6 dup (...)是什么意思,就可想而知了。
  3. 0x31和0x2d都是刚才说过的十六进制。 现在你就会明白,这段代码是没有问题的。

注意事项

提醒大家注意几点:

  • 十六进制码不区分大小写;
  • 汉字也可以转化为十六进制。如果你在程序中看到类似x98\xH7\x2B\x..\x..这样的东西,是中文的十六进制编码,不是乱码。你可以到相关解码网站解码成中文。
  • 如果你需要十六进制的加解密,可以试试BeJson等工具。
  • 在HDA里输入命令时,用不着纠结汇编指令与参数之间的空格,空一个格就好, Hopper 会自动给你补充的。