今天看完鱼c论坛的OD教程之后,尝试用自己的思路做一做。
目标: ①去除使用次数限制。
②去除退出时的广告。
思路:①先让使用次数达到上限,打开时出现注册对话框。这时在OD里暂停,通过查看堆栈调用,可以大致定位到判断节点。
②对照未达到使用上限的软件,观察①中节点附近的运行状况,并进行修改。
具体步骤:
1、 首先将软件反复运行,直至出现次数限制提示,如下:
2、 载入可执行文件,F9运行,出现上面的对话框之后暂停。
这时程序停在系统领空,等待接受消息。Ctrl+K查看堆栈内的函数调用,如下图:
从“调用来自”窗口可以看到,程序领域内的VisualSi.004899B3处调用了系统领空的MFC43模块,双击查看该位置。并按下F2设置下断点。对于使用次数是否为0的检测大概就在这之前。
往前观察,发现以下函数被调用:
RegQeurtValueExA()
RegCloseKey()
到这里猜到程序应该是根据注册表来判断是否达到使用限制,这也就将判断点定位到了一个区间内(从读注册表到出现提示注册对话框)。
下面对未到达使用上限的程序进行调试。定位到该区间内,并留意具体的每个跳转语句是否实现跳转,并在对应语句后面写下注释(Y代表跳转实现,N代表跳转未实现)。
这里我是在另外一台主机上进行的,因为在原先主机上,即使打开新的软件依然会提醒使用限制,因为注册表内容已经被修改。
然后返回已经被限制的程序,单步执行,对比上述区间内差异,同时修改。
应该跳转的时候未跳转,可以用无条件跳转指令jmp替换条件跳转指令;
不应该跳转的地方跳转了,可以用nop将跳转指令填充掉。
实际上修改的只有下面这一处。
修改完成保存上述修改,并在修改处作注释。运行结果ok。
二、去除退出时的烦人广告。
1、重新载入可执行文件,F9运行,退出程序,出现广告。暂停执行,这时程序应该停在系统领空,等待接受消息。与之前一样,Ctrl+K呼出堆栈,查看函数调用,如下图:
观察到在用户领空00480c24处调用了MFC24,双击跟进。
F2下断点。Ctrl+F2重新载入,执行到断点,单步执行,显示广告,关闭广告后,程序停在下一条语句。所以可以把整条语句用nop填掉,不影响程序退出。保存修改之后可以发现广告已经去除。