这次为大家分享一篇关于动态跟踪破解的心得体会文章。先来说一下动态跟踪破解的必要性,由于软件的开发人员对于程序保护意识的不断加强,人们针对反编译想出了各种各样的防反技术。比如花指令,数据加密,代码加壳,多线程监控等等。用了这些保护手段的程序,使用静态方式已经无法分析程序的逻辑结构。代码化的结构会使静态反编译陷入困境,例如call eax这句代码如果出现在反编译代码的第一千几百行,如果想分析出这时exe中的值,想必是十分困难的,这时候就需要使用动态跟踪了,其实这种方法很像程序调试。
先介绍一下今天的破解目标TC for win4.5,这是一个可以在windows操作系统下进行c语言程序开发的工具,下载安装后运行程序,这个时候还是习惯性地进行检测,看看是否加壳。
程序是使用VC++6.0开发的没有加壳。这个时候就请出我们今天的主角OIIydbg,载入主程序teforwin.exe。大家可以通过查找所有参考文本字串,来查看新书的内容,没有任何我们刚才看到的过期提示的内容。所以我们现在需要开始动态跟踪看看TC for win什么时候进行过期检查提示了。其实OD最强大的功能就是它的动态跟踪和分析功能,在这次的破解中,最主要的就是这就案件分别是,F2,F7,F8,F9。它们的功能分别是F2-设置断点。F7-单步步入,在遇到call语句的时候,OD会跟到call的子程序中去。F8-单步步过,在遇到call语句时,OD会把call当成一句话执行。F9-程序运行,在遇到断点时,OD会把程序停下来。
解释一下断点的概念,打个比方,里打车时跟司机说到目的地之前,在A地点临时停一下,这个A地点对于你的行程来说就是一个断点,也就相当于在OD中让程序在运行中停下来的地方,在什么地方设置断点,是动态跟踪分析中的一个关键问题。接下来大家请跟我一起拆解这个程序,使用OD载入tcforwin.exe后,开始使用F8单步运行,程序的开发是由粗到细的,因此在跟踪时,我们也应遵循这样的规则,使用F8键我们很容易发现到底是哪一步使提示窗口出现的。这样就想联系他吧,尽量打中靶心。在使用F8后没多久我相信就会再一句call语句处显示出过期提示窗口。
这就是我们找到的第一个关键call语句,通过它,我们开始走向破解的靶心,在这里我们下第一个断点,在这行上按F2键。大家会看到地址列表栏该行处变成了红色,因为这个窗口已经被调出来了,第一次跟终于完毕了,我们需要重新载入程序。这次我们可以直接使用F9,OD会把程序运行到下一个断点处停下来,这使我们不能再用F8了,需要使用F7进入该函数里,然后再使用F8进行定位,当出现提示窗口时,在重复上面的过程下断点-F9-F7-F8(在这里需要提醒一下大家,现在我们是在定位爆破点,至于如何报复,那是后话)。此过程之后,我们会陆续发现各个关键call。
直到目前破解过程都是一致的,没有什么问题出现。但是接下来进入call 1004F860这部分函数过程之后,可能会遇到一些麻烦,主要的问题是出现在一个大段循环上,当大家一下下 按F7就会发现程序一直在同一大段代码处循环运行。这时候就需要大家耐心仔细了,我们会发现循环的关键跳转在这里jmp 1004FA56。
而且在这大段循环运行若干次后,过期提示的窗口就会在循环体内被调出来执行,在这里,我建议大家在关键跳转着就上下断点,然后开始F9,并观察OD界面中右侧寄存器中值的变化规律,一般都是会有一定规律的,有些时候规律不太容易看出来,也可以通过计算循环次数的方法来定位最终调用窗口的位置,比如发现执行到第十五次循环过期窗口出现了,那么再次跟踪时,在这里按下F9后就要F7了,最终,我们会来到004A5604的代码处。
我们将这句话改为nop也就完成了爆破工作,这样的爆破其实还算是粗放型的爆破,也许人家要问,钱没有那么多关键的call为什么单单改这句呢?windows操作系统下开发的程序是需要调用许多dll文件的,这些被主程序调用的模块在内存中都有自己的地盘--模块领空。前面的关键call除了第一个和最后一个在tcforwin的领空中,其他的关键call都在knrln中,如果改了这个模块中的过程,很有可能会破坏模块的原有功能!因此新手们如果没有十足的把握不要再dll中乱动手脚,否则可能会把程序甚至windows彻底的摧毀掉!这个程序用OD改过之后,不允许复制保存。原因可能和多线程有关。至此,顺利地破解了目标程序。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。