Uninstall Tool 破解手记

0x0 简述

Uninstall Tool 破解手记_第1张图片

Uninstall Tool是目前我所用过的最强的傻瓜化卸载工具了【专业手段除外】,软件本身很小巧,但是涉及卸载相关的功能却很全面,如下图介绍所示:

Uninstall Tool 破解手记_第2张图片

此工具有两种形态,一种是安装包版,一种是便携版也是我们常说的绿色版。本次破解以安装版为基础(PS:已验证便携版原理上与之一致)。

0x1 思路及方法

          拿到软件,首先看下软件有无什么保护,结果发现仅仅有一个注册机制,并没有特别的保护。找到需要输入注册码的地方,试试看,发现当时并不能立马获取注册成功与否的结果,软件提示要重启验证

Uninstall Tool 破解手记_第3张图片

鉴于弹出就是个MessageBox,那么咱们先断这个MessageBox来回溯下,很容易就找到了第一个重要的函数:sub_14000c2e4.其实这个函数就是输入好密钥后确认按钮的响应函数。

Uninstall Tool 破解手记_第4张图片

顺着分析,先看下输入进去的用户名、密钥去哪儿了?很容易地,发现原来输入的用户名、密钥被加密处理后存储在注册表里面了

Uninstall Tool 破解手记_第5张图片

具体位置如下图所示:

Uninstall Tool 破解手记_第6张图片

对如何加密(or编码)感兴趣的朋友可以研究下函数sub_140216D80,目测就是个类Base64编码而已,在IDA中F5一下就跟看源码没啥区别。接下来,很容易想到要设置一个RegQueryValueExW断点用于重启时候跟踪加密后的数据是如何被验证的。然而,断点并没有被触发,赶紧看下它重启程序的时候做了什么于是下断:CreateProcessW,发现带了个/restart的参数,于是乎,咱们也在x64dbg命令行里面加入这个参数试试看,然而依旧没有触发,难道写入的注册表键值重启不验证吗?显然这是不可能的,问题出在哪儿呢?这个时候,赶紧拿出另外一个辅助利器:Procmon,设置好过滤参数后,启动程序,看下有无注册表指定位置的访问。

Uninstall Tool 破解手记_第7张图片

很明显,程序确实访问了重启前设置的键值,于是咱们点开这个堆栈看下:

Uninstall Tool 破解手记_第8张图片

在上面标记处,咱们下个断点看看。启动程序正常断入,单步跟踪下来到了这里:

Uninstall Tool 破解手记_第9张图片

是目标函数啊,难道之前API断点,断了个假的API?!,看下之前设置的发现,原来系统默认断的是kernel32.RegQueryValueEx,难怪没有出来!

Okay,继续往下跟,注意先回溯到主要函数,这个是咱们分析的主干所在,可以清晰地了解程序的运行轨迹!在这里发现了一个很重要的函数sub_140013450,如下图,这个时候打开IDA,F5偷个懒,看下程序主干逻辑是咋样的。

Uninstall Tool 破解手记_第10张图片

Uninstall Tool 破解手记_第11张图片

然后继续跟,读出用户名、序列号后,调用sub_140013E0C函数,跟进去发现了一个有意思的字符串:license.dat,大概率这里是有个文件程序需要去Check下,这个时候,为了快速确认此行为,可以继续使用ProcMon,发现如下:

Uninstall Tool 破解手记_第12张图片

果然,程序一方面去读取在注册表里面既有存储的用户名、序列号,也去尝试在程序所在路径寻找是否有既有生成的已注册文件。接下来就到了判断注册的过程。。。。

Uninstall Tool 破解手记_第13张图片

让这个返回值为3???,Check下效果先。

Uninstall Tool 破解手记_第14张图片

这个保护也太弱了吧。。。。。

0x2 解决方案及成果

方案一:最简单的解决方案,让IsRegistered这个函数的返回值一直为3即可,修改下OpCode问题就解决了(这里略过)。

方案二:研究下注册算法,写个通用的注册机看看。【不能写、不能写、不能写。。。】

你可能感兴趣的:(逆向C++)