首页
社区
课程
招聘
[原创]ProFactor IncludeManager 暴破
发表于: 2013-5-24 16:30 6984

[原创]ProFactor IncludeManager 暴破

2013-5-24 16:30
6984

标题:【原创】ProFactor IncludeManager
作者: supercolin
时间: 2013.5.24
链接: http://bbs.pediy.com/showthread.php?p=1180455

软件性质:代码管理
软件名:ProFactor IncludeManager
版本:1.04
官方网址:http://www.profactor.co.uk/products.php

使用工具:Windbg,IDA Pro, Reflector
破解性质:暴破

潜水多年,从未发过原创帖  还是要多与人交流才会进步。还请各位多多指教。

由于工作关系,重构项目的时候想整理一下头文件依赖关系,现在的太乱了。于是尝试找一个能够图形化显示依赖关系的工具。发现两个比较好的,一个就是这个ProFactor出的Include Manager。还有一个VS2010 feature pack 2提供的功能。相比之下,VS2010 FP2提供的功能更强大些。不过看到前者只能试用,总还是有点不爽的感觉,你懂的。网上没找到现成的破解,只能自己搞。

Include Manager以插件形式运行于VisualStudio,效果如下:


未注册时有28天试用期, 如果保存关系图还会有水印


到期后提示过期


插件主要是3个文件(对VS2010来说):
IMVSACore.dll
IncludeManager.dll
VSPlugin.dll

对不同的VS(7, 8, 9), IMVSACore.dll是相同的,只是和VS的接口不同,即IncludeManager.dll和VSPlugin.dll不同。

还好,没壳:




老规矩,先找字符串。
IDA分析IMVSACore.dll,找关键字符串,没找到。
Reflector分析IncludeManager.dll和VSPlugin.dll,发现字符串都在这里,比如:


大致看了一下以后发现,核心内容都在IMVSACore.dll中,毕竟尺寸也是最大的。而IncludeManager.dll和VSPlugin.dll只是作为VS和IMVSACore.dll的接口,以及要不要显示注册窗口。因此分析还是要从IMVSACore.dll入手。

看一下IMVSACore.dll的导出表:

选中的这个函数很有意思,显然是和License有关的。

再看一下导入表:
先是一堆注册表操作函数:


转到调用处sub_1003D970,前后看看,结果发现了GetSystemTime函数:


用Windbg跟一下,发现是在Query "SavedWindowState3172"这个键值:


看完这个函数sub_1003D970,大致是这样操作的:
- 读取当前系统时间。
- 读取注册表HKCU\Software\ProFactor\IncludeManager下的Binary Value "SavedWindowState3172",解析出安装时间(及其他信息)
- 若以上key不存在,则认为是全新安装,生成并写入该键值,剩余试用时间28天
- 若以上key存在,计算时间差,若超过28天则试用到期。

然后有一堆GDI函数:


从IMVSACore.dll本身看不出什么来。如果来到IncludeManager.dll,就能知道是在做什么了:

看到了吗?mIsTrial的话就会把水印填上去了,保存前先会生成DIB,再把水印信息blt上去。

还有一堆CRT标准函数:


来到调用处sub_1003DC10,因为参数都是从另外两个DLL里传来的,这里看不到文件名是什么。还是用Windbg跟一下,发现是在读license.bin。


把函数分析完,大致是这样的:
- 读取license.bin
- 若不存在,则是试用版,按照上面计算试用时间的方式继续。
- 若存在,按照算法读出其中信息,解析Username,Organization, Comments等其他信息,并更新注册表中的相应内容。

大致前期分析就是如此。另外做了几个实验:
- 改系统时间。往前改,立即过期;往后改,试用时间变长。
- 删除注册表键值"SavedWindowState3172",则试用重新恢复28天。
- 手工建立文件license.bin,会提示证书错误。
因此证实以上分析基本正确。

(图贴不下了,回贴中继续)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 1711
活跃值: (516)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
接下来想如何破。
1. 伪造license.bin。尚未分析证书的加密算法,仅从读取license.bin并判断证书是否有效来看,工作量不小,且算法不一定可逆。

2. 计算License ID。在界面输入ID,如果有效才能点OK

因此估计本地有验证License ID是否为有效格式的算法。这倒还好。


从这里可以看到证书文件的生成过程: 把LicenseID传到服务器,如果服务器验证通过,再通过SSL加密方式将License.bin下载到本地。假如服务器没有合法登记的LicenseID,估计就算格式有效也无法获取到LicenseID。

3. 绕过验证过程。即使证书无效,也在所有判断是否有效的地方bypass。

看起来只能采用方法3了。对于方法3,也找了很多地方,走了不少弯路。开始一直从IMVSACore.dll入手,觉得要搞的地方很多有点麻烦。退回到问题本身,又多分析了一下两个.NET DLL,总算找到了入手点。


IMVSACore.dll本身只提供验证License的功能,而本身并不会对结果进行进一步处理。可以看出,这里IncludeManager.dll调用IMVSACore!ExportGetLicenseInfo之后,把结果保存于类LicenseInfo中。

LicenseInfo类的结构:


回到IMVSACore.dll的导出函数ExportGetLicenseInfo中,用Windbg跟一下,分别断在该函数执行前及执行后:

从堆栈上找到参数指针


ExportGetLicenseInfo返回后,读取前3个参数。

这里的调用方式我们可以看到,前3个参数分别对应
LicenseInfo.isValid == 1,
LicenseInfo.isTrial == 1,
LicenseInfo.daysRemaining = 0x1C

再回头看看这里:

只要isValid == 1 && isTrial == 0,就认为是注册版了。再去查看其它检查isTrial的地方,结果发现它只检查这个成员值,比如前面图里打水印的地方。

因此决定就修改这里。问题是,在哪里改好呢?两个.NET dll有strong name验证和加密,比较麻烦,思来想去最后还是回到IMVSACore.dll里去改。下ba断点,找到填输出参数的地方:


isValid是这里填的:
mov     al, [esp+88h+var_70]
mov     [edx], al

isTrial是这里填的:
mov     dl, [esp+88h+var_6F]
mov     [ecx], dl

我直接改掉了:


然后修正一下checksum,完工。


PS. 不足之处还望指教
PPS. 有什么同类软件更好用的麻烦推荐
上传的附件:
2013-5-24 16:50
0
雪    币: 406
活跃值: (164)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
感谢分享。
2013-5-24 18:45
0
雪    币: 87
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,谢谢分享。
2013-5-27 08:26
0
雪    币: 437
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主推荐的软件很不错,谢谢分享
2013-5-27 11:20
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼主分享
2013-6-1 16:36
0
游客
登录 | 注册 方可回帖
返回
//