X86逆向4:VMP壳内寻找注册码

本节课将讲解一下重启验证,重启验证在软件中也是非常的常见的,重启验证的原理很简单,用户在注册界面输入注册码以后程序会自动将输入的注册信息保存到配置文件中,这里可能保存到注册表,也可能使用INI文件来保存数据,然后程序会强制重启,在程序的启动环节读入文件或注册表,然后完成整个验证的过程,最后决定是否注册完成,下面作者编写了一个重启验证的小程序,并使用VMP加密了整个软件,本节课我们将在不脱壳的情况下寻找程序的注册码,最后完成注册。

 

有些新手认为,壳是必须要脱掉的,其实不然,我们完全可以在不脱壳的情况下寻找注册码,因为程序运行后程序会在内存中被解码,只是我们无法直接修改源程序,当然如果真的需要修改的话可以直接给内存打一个补丁,API Hook 下,同样的可以完成破解任务,没有必要在壳上纠结。

------------------------------------------------------------
本章难度:★★☆☆☆☆☆☆☆☆
课程课件:CM_04.zip
------------------------------------------------------------

 

1.直接将程序载入OD,并运行起来看下反汇编窗口,可以看到代码已经被VM了,而且很乱单看这些根本无从下手。

这里我们需要想一下,既然是重启验证,那么在程序开始运行时就应该来判断用户注册码是否正确,这里我们的的程序是通过INI文件来验证的,INI文件的读写流程是什么?肯定是先打开文件,然后读入文件,然后才会判断是否合法,这就是正常的流程。

 

2.流程有了,接下来我们就得想办法让程序停在读取INI文件的代码位置,这里我们将学习一个新的API断点GetPrivateProfileStringA,这个断点就是专门用来读取ini配置文件的。

这里需要重新载入程序【不要运行】,因为运行后程序就已经判断完成了,直接点击【ini文件】,点击【GetPrivateProfileStringA】,下好断点。

 

3.下完断点之后,我们直接【F9】运行程序,如我们所料,程序断下了看右下角的堆栈窗口,注册项:key:section都出现了,这里段下的是第一次读取配置文件,这里读取到的是文件中的第一个字段的内容也就是,config.ini文件里的user字段的内容,这个字段默认就是lyshark,我们不用管直接跳过。

 

4.回到OD中,再次按下【F9】,程序在一次被断下,老样子看堆栈,这次读取到的就是注册码的字段了,也是我们最关心的字段。

为了让新手明白,程序编写的很简单只有两个字段的内容,所以只会断下两次,再按一次运行程序就跑起来了,以后如果在你破解的其他程序时遇到断下十几次或几十次的情况不要慌,慢慢跟看看有没有自己需要用到的字段内容,这说明程序在读取config.ini这样的配置文件,而配置文件中的字段较多,需要一个一个读取,所以会不停地被断下。

 

5.回到OD,单步【F8】直接出这个CALL,第一张图为进入CALL的断首,第二张为出CALL.

 

6.出CALL后,会发现一堆DB数据,这是OD自动的帮我们分析了代码,所以留下了一堆DB。

 

7.直接打开【右键】菜单,选择【分析】,然后【从模块中删除分析】,原始的代码就会出现了。

 

8.删除分析代码后发现,会看到下面的代码片段,左下角是我们输入的假的注册码,网上找并没有能跳过的CALL,所以果断出这个CALL.

 

9. 出CALL后,观察这一层代码太短了,直接无需考虑,直接出CALL.

 

10.这次出CALL发现了一些意想不到的收获,看到了配置文件名称,已经开始读取了。

 

12.上图我们看到了,程序应该是已经读取了config.ini这个配置文件,接下来应该就是对比了,我们单步【F8】尾随一下。

如上看到了一段特殊代码,然后后面就是注册成功的提示,我们直接把这个注册码记下来。

00482CC4=00482CC4 (ASCII "1E32S-14ES5-2KT84-EM6LS")

 

13.关闭OD吧,我们直接去试一下看能不能激活这个程序,上方的大跳转虽然是关键跳但我们无法直接修改程序代码,因为有壳。

                 

重启程序后发现注册完成,说明我们找的没错,这个小程序并没有通过机器码计算出注册码是为了让新手能够清晰的找到,我们主要学习的是INI断点的用法。

这个案例中虽然程序加了VMP强壳,但是我们在没有动壳的情况下依然顺利的找到了注册码。

 

 写教程不容易,转载请加出处,您添加出处,是我创作的动力!