打开软件, 要填注册码, 提示注册码要 32 位长

那我们输入 32 个 1 : 11111 11111 11111 11111 11111 11111 11
, 弹出错误提示

关掉这个错误提示, 软件提示是否进入试用版, 我们点 是
进去看看

进去之后我们注册看看, 还是那个注册框

查壳, 有壳, 区段很乱, 我们 OD 载入

直接运行 OD 会卡死, 我们用 OD 附加上去, 然后我尝试用 F12 暂停大法, 进程直接终止
换了个 OD, F9 运行弹出提示, 所以这是一个 Themida 壳程序

换回吾爱 OD, 发现可以运行, 我们 Alt+E 然后点击程序代码段来到 00401000
, 然
后查找字符串, 搜索 SN
, 然后发现没有注册验证的字符串
我们再次 Alt+E, 发现在它同一个目录下, 它加载了 3 个 dll 文件

然后这个 dll 文件很有意思, 写着 Login

我们从最下面开始往上看, 点进去 dhavdll 查看代码


我们右键搜索字符串, 发现并没有我们想要的
我们换一个 libcurldll 进去查看, 也是没有我们想要的字符串

我们再看一下 Logindll

这下就有我们想要的了, 跟进去看, 不难发现两个跳转以及关键 call
, 我们在关键 call
下断

同理, 我们把所有 SN异常
的报错提示都给下断
我们发现它们都是调用同一个关键 call
, 这样其实我们可以只留一个断点, 因为我们要进去这个 call
看一看, 我们直接右键 跟随
, 到它里面第一行下断


我们回到软件再点 确定
程序断下来了, 其实我们没有必要 F8 单步, 因为它就是在里面算, 也不知道算什么, 然后把返回值给 EAX 寄存器, 我们直接 Ctrl+F9 执行到函数最后一行
我们可以看到段尾是 retn 4
, 然后 EAX 被清零了

我们 F8 向下, EAX 为 0, 判断为假, 所以跳转未实现
我们再次让程序断在函数开头, 这回我们把函数开头改了, 直接 mov eax,1
然后 retn 4

第一期第 5 课讲过这个方法, retn 后面的数字, 要看段尾
我们运行程序, 又报错了, 我们先取消刚才的断点

直接 F12 Alt+F9 返回到用户, 找关键 call
如法炮制, 不过这次是 retn 14
, 当然 EAX 还是清零状态

我们把这个 call
给 retn
掉

再运行, 又提示 无效的SN !
, 我们 F12 回去
分析一下, 下面有两个 jmp
无条件跳转, 它跳过了成功提示, 所以我们不能让它跳, 也就是说我们需要另外找一个跳转, 从而把这个 jmp
越过去


我们在这里下几个断, F9 运行, 然后我们 F8 单步, 因为我们发现下面好多跳转可以跳过成功的提示, 所以我们单步看一下

好的, F8 跟踪之后, 我已经把相关的跳转都打上了注释




现在我们需要做的就是该 nop
掉的 nop
掉, 该让它跳的全部 jmp
这个软件刚才看了的, 是有壳的, 所以我们要打补丁
我们点上面的 p
, 有的 OD 可能是一个杠, 反正就是 显示补丁
选项, 就是我们修改了哪些地方, 它都在这里显示出来

我们现在打补丁, 注意我们这里是给 Dll 打补丁, 所以不能用樱花之类的工具, 因为樱花是针对 exe 的
由于我不会用那个补丁工具 orz, 所以就到这里吧

