在逆向分析过程中,由于操作系统都会提供完善的调试接口,所以利用各类调试工具可以非常方便灵活地观察和控制目标软件。通过使用各种调试工具,往往可以达到事半功倍的破解效果。下面,我们使用OD(OllyDbg)软件,融入一些破解技巧,层层深入破解典型的未注册版软件。
突破:获取未注册版通讯录软件的功能
首先,我们打开本次测试的软件:PixtopianBook.exe,对软件功能进行检测。打开界面后,我们发现这是一个未注册的通讯录软件,有很多功能限制。其中,最典型的限制是只能有三个分组,每组不能超过4个人。也就是说,你用未注册版,联系人只能有12个人!如图1所示。
现在的目标,就是要把这个通讯录给破解掉,多联系几个人!那么,在破解过程中,需要使用哪些技巧呢?
1)处理异常提醒
打开PixtopianBook.exe后,按F9直接运行,发现有异常提醒,用【shift+F9】忽略异常。或者如图2进行设置。
因为是32位操作系统,所以00000000-FFFFFFFF就是整个内存段了。在调试选项里添加这个异常范围后,即可解决这个问题。此时,再打开程序,就没有异常出现了。
【小提示】我们可以把异常当作是一种消息,应用程序发生异常时就触发了该消息并告知系统。系统接收后同样会找它的“回调函数”,也就是我们的异常处理例程。当然,如果我们在程序中没有做异常处理的话,系统也不会置之不理,它将弹出我们常见的应用程序错误框,然后结束该程序。
2)突破【限制人数】功能
在OD运行弹出的软件界面试图添加第5个人,出现错误提示box,如图3所示。
很多朋友看到有messagebox后,就直接去搜索API,通过API和字符串入手,观察上下,尝试爆破。但是,这个效率会很低。正所谓“魔高一尺,道高一丈”,现在的程序设计者也越来越聪明,比如,他们会使用间接调用:先调用一个自己的进程,在进程里再调用messagebox来混淆视听,避免破解。
怎么解决这个问题呢?
正确方法是:在OD中按下暂停(暂停后OD中的地址会跳至动态链接库,即系统领空处),然后按【ALT+F9】返回到用户界面,在用户界面点击“确定”后,OD中就返回到程序接管,地址跳转到如图4所示的位置。
图4中的MessageBoxA就应该是刚才的错误提示框了。按F8键回到retn指令,返回到函数中,如图5所示。
注意:使用ret指令返回后,在上方又有一个call指令,说明在此处是间接地调用messagebox。修改后保存。载入后,重新启动软件,已经可以突破人数添加的限制了。
3)突破【分组限制】功能
道理和突破人数限制一样,修改后如图6所示,可以添加无限制的分组了:
4)修改标题
接下来查找几处“unregisteredversion”字符,并将其修改。
方法1:直接点击【memory】,按下【Ctrl+B】查找“unregisteredversion”,修改后记住字符在内存中的地址,到CPU的数据窗口保存。【建议用这种方法】
方法2:查找所有参考文本字串,逐一查找文本“unregisteredversion”,然后跟随到代码处,找到在内存中的地址,在数据窗口中修改并保存。
注意:修改时记得【保持大小】,否则会出错。
修改之后,界面如图7所示。
到此,就完成了试验,主要的两个功能模块(人数添加和分组添加)得到了实现。
【小知识】关于SHE。SEH(StructuredExceptionHandling),即结构化异常处理。SEH是Windows操作系统提供的功能,跟开发工具无关。Windows程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(CALLBACK),传递的参数当然就是这个消息。当我们改变思维方式,以CALLBACK的思想来看待SEH,SEH将不再神秘。
出击:破除未注册版软件的使用次数限制
通过上面的破解,我们已经有了不少信心。下面,继续来破解另一款软件:VisualSiteDesigner.exe,这是一个类似Photoshop的软件。
1)破解的思路
仔细观察一个程序,我们会发现,无论怎么加密,无论在哪里加密,其目的就是要你掏腰包获得更多的功能或者解除限制。那么,我们就可以用逆向的思维来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等。也就是说,程序的代码执行流程也会跟未注册的时候截然不同。因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化。
2)认识OD的两种断点
OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点。也许会有朋友说那不是还有内存断点吗?严格来说,内存断点是属于一种特殊的软件断点。
(1)内存断点
内存断点每次只能设置一个,假如你设置了另一个内存断点,则上一个会被自动删除。
设置一个内存断点,会改变整块(4KB)内存的属性,哪怕你只设置一个字节的内存断点。
另外还需要提一下的是,内存断点会明显降低OD的性能,因为OD经常会校对内存。
(2)软件断点
当我们按下F2设置的断点就是软件断点。
设置该断点的原理是在断点处重写代码,插入一个int3中断指令,当CPU执行到int3指令的时候,OD就可以获得控制权。
(3)硬件断点
这个原理跟软件断点不同,硬件断点的可行性依赖于CPU的物理支持。传说中,有这么一些寄存器,它们只用于调试,我们称为调试寄存器:Dr0~Dr7。其中Dr0~Dr3四个寄存器用来存放中断地址,Dr4、Dr5保留不使用,Dr6、Dr7用来记录Dr0~Dr3的属性(如读,写还是执行,单位是字节,字还是双字)。
因此,这就解释了为什么硬件断点只有四个,其原因就在于天生不足。
要如何来区分何时使用何种断点呢?这两种断点在使用上都有它们自身的限制,只要搞清楚它们各自的特性就知道何时该用哪个了。首先来看看下面的例子吧!
运行软件后,会发现有使用次数的限制,如图8所示。
关闭程序后有广告弹出,如图9所示。
3)去除使用次数的限制
首先,找到诸如NAG窗口调用的方法。一路按F8,遇到停止的call处(或者说遇到NAG的call处)设置断点,再按F7键进入。直到找到最终call出NAG的地方,如图10所示。
图10
注意:在上述的过程中,设置断点的方式有两类:(1)程序领空处设置软件断点,(2)动态链接库,即系统领空处设置硬件断点。
图10即为最终调用NAG的call处,这句call语句执行的有两件事:(1)计数器减一,即剩余使用次数减一(2)弹出程序。
然后,将该处汇编为:moveax,1。保存修改,再执行,提示使用次数限制的NAG窗口便消失了。
4)去除广告
关闭软件主界面后,会弹出广告,如图11所示。
图11
在OD界面按下暂停键,按下【k】查看堆栈调用情况,如图12所示。
通过观察发现,只有一个是来自应用程序的堆栈,其他都是动态链接库的(系统),跟随到该处地址,如图13所示。
将图中的call直接nop掉,再保存修改载入,广告就没有了!
5)狡兔三窟:程序行为改变后的破解
以上是程序行为未发生改变时的破解,接下来讲程序行为发生改变后的破解。程序行为发生改变是指注册前和注册后的行为发生改变,或者说表现在程序可用和程序不可用时的行为有了不同。如本例程序中,如果把限制的使用次数用完会发生什么情况呢?很简单,程序就不给我们打开了!那程序不给我们打开了,它的代码走的路线就会不同,即代码行为发生了改变。可谓“狡兔三窟”!
判断代码走的路线有两种方案,一种是条件判断,一种是jump+变量(后一种以后再介绍)这里用第一种,OD载入原始程序(从未修改过的最初版)从开始一直F8走,碰到跳转(黄色的)进行注释,跳转实现的注释Y,未实现的注释N。就这样耐心地注释到最终调用nag窗口的地方。为什么要这么做呢?这可以说是破解程序的不二选择,或者说是最保守的方法。注释完成后,将软件使用次数用完,使程序行为发生改变。
【小提示】注释的作用。注释的目的是为了和行为发生改变后的代码做对比,通过对比,找出不一样的关键处,也就知道了程序行为改变的原因了。这种方法可以称为破解的绝对方案(也就是绝对行得通的方案)按照此方法,对比不同的地方,如图14所示。
图14中的jle是导致代码行为发生改变的“重要嫌疑犯”。该跳转在程序可用时(软件使用次数未用完)是未实现跳转,现在程序不可用时(软件使用次数用完了)变为了跳转实现,又是在最靠近NAG的地方,所以它引起了我们的注意!
于是,尝试修改这条jle指令,在它上方将“testeax,eax”修改为“moveax,1”。因为在“testeax,eax”处eax的值显示为0,将其改为1的话,应该就使其不跳转了。
修改完毕,保存程序。载入修改后的程序,运行之后,发现虽然NAG窗口提示剩余使用次数为0次,但依然可以进入使用软件了。同理,运用之前说过的方法再去除广告和NAG窗口之后,一个没有使用次数限制,没有广告,没有NAG的软件就呈现在我们面前了!在这个进阶破解的过程中,我们肯定有许多不一样的收获。尤其是通过上述步骤,结合逆向分析的思路,哪怕“狡兔三窟”,我们也可以轻松“拿下”许多未注册版软件了。
(完)
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。