今天所用到的示例程序仍然是《Shark恒零基础百集VIP破解教程》中的示例程序:
打开软件发现需要注册,点击试用,发现有“(未注册)”的提示字符串:
载入OD前先查壳:
发现无壳,接着载入OD,搜索字符串“注册”:
所以先转到该处看一看:
向上溯源,查找是否有跳转跳过这一段,在较远处发现一个很大的跳转刚好能够跳过这一段,先下断:
将程序断在此处,发现跳转实现:
修改标志位,使其不实现,运行程序,证一下猜想:
运行程序后,发现猜想正确。
接下来就是对这一跳转进行处理了,处理前先看一看OD反汇编窗口各个板块表示的内容:其中hex数据表示的是反汇编列中指令对应得机器码(两位hex数据代表一个指令长度)
制作内存补丁用到的工具是:
依次点击:其他-制作内存补丁。
进入一下界面:
其中,程序名称项需要导入需要修改的程序,消息标题和启动提示可自行设置。
点击添加按钮,添加内存信息:
1、修改地址:需要对程序进行修改代码段的首地址(十六进制数)
2、修改长度:指令对应机器码的长度(两位十六进制数算一个长度)
3、原始指令:要修改部分指令对应hex数据中的机器码
4、修改指令:修改后的指令对应hex数据中的机器码
添加内容如下:
对于修改后的指令,由于此处需要将跳转nop掉,所以先修改一下,查看对应的机器码:
发现修改后是909090909090,填入数据,生成内存补丁:
打开生成的文件,出现提示框(这里需要注意的是生成的文件需要和原文件放在同一目录下):
点击确定,发现软件提示已注册。
总结:内存补丁其实就是对相应地址的指令进行修改,进而达到想要的结果,和直接在OD的反汇编窗口修改相应的指令是一样的效果。
对于该程序,也可以通过堆栈找到关键跳。
将原程序载入OD,运行程序,输入假码,点击确定后不关闭窗口:
接着回到OD,暂停程序:
转到堆栈窗口:
发先函数mvsbvm60.rtcMsgBox,该函数是来自程序(天泽医院.0046E741)的调用,而不是系统模块(user32,msvbvm60)的调用。显示该函数调用,来到反汇编窗口:
在上方发现“序列号错误”的字符串,向上溯源,看看是否有跳转跳过这一段:
在0x0046E6D8处发现跳转,下断,重新载入程序,输入假码,让程序在这里断下:
发现此处跳转不实现,先修改标志位让其实现验证猜想:
猜想正确,接下来就是修改该处跳转,这里尝试用内存补丁:
双击保存的补丁:
输入假码注册后提示注册成功: