MDB ACCDB Viewer 2.2.7 授权机制纯静态分析
# MDB ACCDB Viewer 2.2.7 授权机制纯静态分析0x00 目标介绍
MDB ACCDB Viewer使您可以在macOS上打开Microsoft Access数据库。官方网站:<https://eggerapps.at/mdbviewer/>
前几天顺便看了下论坛有个求助帖需要分析mdb的加密方式,顺便找到了这个App,由于授权比较简单,所以采用纯静态方式做个教程。
0x01 寻找切入点
打开App,在界面左上角出现了“Free Trial”的友好提示。如下图所示。
通过查看各项菜单,均未发现有输入注册码的地方,由此可得出两个结论:
1.该App为纯Demo版本,购买后会提供另外一个完整版。
2.该App采用了keyfile(授权文件)方式授权。
为了尽快的弄清楚到底是上面哪一种情况,笔者先打开该App的官方,发现了一段信息,如下图所示。
这里很明显的说明了,该App提供了完整的功能,只是导出数据有限制。顺手测试一下如下图所示。
接下来只要分析出keyfile格式就可以破解它了。
搜索字符串“Free Trial”,很顺利找到两处交叉引用,如下图所示。
很显然第一处引用就是显示授权信息的地方,进去一眼看出“Free Trial”字符串由``-``方法控制,如下图所示。
切入点已经找到,接下来由此方法展开深入分析。
0x02 分析试用版控制逻辑
查看``-``伪代码很简短,先判断了``licenseData``是否有数据,无数据的话直接返回``true``进入试用状态。返回值保存在v5变量中,如下图所示。
这里出现的``licenseData``是关键,而且是个字典类型(第五行有类型提示),需要有一个``ProductBundleId``字段,其内容为应用的BundleIdentifier,然后调用``-``方法校验数据来控制最终的返回结果。
到这里试用版控制逻辑就分析完毕了,如果仅仅爆破的话,直接将v5改为``false``即可,本文目的显然不是爆破。现在的任务是先找到``licenseData``的赋值点,才能进行授权机制分析。
0x03 分析licenseData来源
由``self->licenseData;``一句可知,``licenseData``是``MDBAppDelegate``的成员,那么在该类中必定存在某个方法会对该成员进行赋值。在IDA的函数列表中,按照类名``MDBAppDelegate``过滤,找到一些看似有关联的方法,其中``-``方法有很大嫌疑,如下图所示。
进入该方法查看伪代码,依然很简短,首先读取了一个特定的文件,然后判断文件是否存在,存在的话就调用``sub_1000223E3``函数,它的返回值就是``licenseData``,如下图所示。
接着按照该逻辑逐个分析,现在确定授权文件路径。
授权文件URL由``-``方法获取,进入查看伪代码如下图所示。
这里虽然是一些常规的操作,但第一眼看过去,只能确定文件名为``license.mdbviewer-license``,且上一级路径取自App自身的BundleIdentifier,打开Info.plist查看可知为``at.eggerapps.mdbviewer``,如下图所示。
因此路径格式``xxxx/at.eggerapps.mdbviewer/license.mdbviewer-license``,``xxxx``来源于``NSFileManager``类的``"URLsForDirectory:inDomains:``方法,也就是应用的沙盒相关的路径,传入的两个参数分别为14和1。该方法原型如下:
- (NSArray<NSURL *> *)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask
第一个参数类型为NSSearchPathDirectory,第二个参数类型为NSSearchPathDomainMask。在Xcode里面查看一下宏定义,分别如下图所示。
因此可以知道授权文件位于沙盒的``Library/Application Support``子目录中。沙盒主目录固定为:`` /Users/{你的用户名}/Library/Containers/{应用的BundleIdentifier}/Data/``,所以在笔者机子上得到的授权完整路径为:
/Users/piao/Library/Containers/at.eggerapps.mdbviewer/Data/Library/Application Support/at.eggerapps.mdbviewer
0x04 授权文件结构
前面分析过了licenseData是个字典类型,那么``at.eggerapps.mdbviewer``文件自然就是个plist文件。先结合之前的分析伪造一点数据作为本节的分析。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ProductBundleId</key>
<string>at.eggerapps.mdbviewer</string>
<key>Unknow</key>
<string>88888888</string>
</dict>
</plist>
4.1 必要字段
进入``sub_1000223E3``函数,先调用``CFURLCreateDataAndPropertiesFromResource``函数校验了文件,接着继续调用``sub_100022343``函数处理数据,如下图所示。
进入``sub_100022343``函数,可以看到授权文件里面如果存在``Signature``字段,则把剩下的内容传出去(没有对Signature字段做任何校验,仅仅是个摆设,因此可以随便乱输入一些东西),否则传出空字典,如下图所示。
因此修正``at.eggerapps.mdbviewer``文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Signature</key>
<string>Cracked By PiaoYun/P.Y.G</string>
<key>ProductBundleId</key>
<string>at.eggerapps.mdbviewer</string>
<key>Unknow</key>
<string>88888888</string>
</dict>
</plist>
4.2 数据验证
``licenseData``里面已经有数据,现在是时候回过头来看看``-``方法了,这是最后的堡垒,如下图所示。
这里很明显,只要有个``Order``字段,且不是黑名单中的``EGG130624-6895-78104``、``EGG130805-1334-17112`` 即可,除此之外无任何其他校验。
继续修正``at.eggerapps.mdbviewer``文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Signature</key>
<string>Cracked By PiaoYun/P.Y.G</string>
<key>ProductBundleId</key>
<string>at.eggerapps.mdbviewer</string>
<key>Order</key>
<string>123454</string>
</dict>
</plist>
0x05 光明之巅
按照逻辑来说此时应该是授权状态了。运行App测试一下功能正常,但是授权信息后面没有显示具体用户名,而是显示匿名用户(``Anonymous User``),如下图。
虽然这个显示无伤大雅,但不留个大名在上面,总觉得欠缺点什么,继续分析。字符串查找``Anonymous User``交叉引用,找到``-``方法,伪代码如下图所示。
这里已经非常清楚了,如果存在``Company``或者``Name``字段,才会显示具体的用户名,否则显示``Anonymous User``,那么还等什么,继续修正``at.eggerapps.mdbviewer``文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Signature</key>
<string>123454</string>
<key>ProductBundleId</key>
<string>at.eggerapps.mdbviewer</string>
<key>Order</key>
<string>88888888</string>
<key>Company</key>
<string>www.chinapyg.com</string>
</dict>
</plist>
再次运行,飞向光明之巅,如下图所示。
0x06 本文小结
本例子采用经典的keyfile校验的方式,且无任何加密算法,非常适合练手和熟悉macOS应用的一些常规文件目录操作流程。 感谢R版纠正细节~~{:lol:} 好贴收藏有机会实践,浪里个浪 学习使我快乐,爱学习爱运动 跟随大神的步伐,征战macOS 好贴收藏有机会实践,浪里个浪 感谢飘大的分享,mark一下 以后学习研究 来跟着大佬学习了,😁 谢谢 飘哥,你这篇文章写的太棒了,能不能对我那个mdb文件解密需求出个教学贴呀 [url=forum.php?mod=redirect
等哪天我有心情玩Windows了再说
页:
[1]
2