飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5787|回复: 15

[macOS] MDB ACCDB Viewer 2.2.7 授权机制纯静态分析

  [复制链接]
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2020-4-20 15:37:48 | 显示全部楼层 |阅读模式
    # MDB ACCDB Viewer 2.2.7 授权机制纯静态分析

    0x00 目标介绍

    MDB ACCDB Viewer使您可以在macOS上打开Microsoft Access数据库。官方网站:<https://eggerapps.at/mdbviewer/>

    前几天顺便看了下论坛有个求助帖需要分析mdb的加密方式,顺便找到了这个App,由于授权比较简单,所以采用纯静态方式做个教程。

    0x01 寻找切入点

    打开App,在界面左上角出现了“Free Trial”的友好提示。如下图所示。

    15873493248080.jpg

    通过查看各项菜单,均未发现有输入注册码的地方,由此可得出两个结论:

    1.该App为纯Demo版本,购买后会提供另外一个完整版。
    2.该App采用了keyfile(授权文件)方式授权。

    为了尽快的弄清楚到底是上面哪一种情况,笔者先打开该App的官方,发现了一段信息,如下图所示。
    15873496305224.jpg


    这里很明显的说明了,该App提供了完整的功能,只是导出数据有限制。顺手测试一下如下图所示。

    15873514358567.jpg

    接下来只要分析出keyfile格式就可以破解它了。

    搜索字符串“Free Trial”,很顺利找到两处交叉引用,如下图所示。
    15873500113787.jpg


    很显然第一处引用就是显示授权信息的地方,进去一眼看出“Free Trial”字符串由``-[MDBAppDelegate isTrial]``方法控制,如下图所示。


    15873501478903.jpg


    切入点已经找到,接下来由此方法展开深入分析。

    0x02 分析试用版控制逻辑

    查看``-[MDBAppDelegate isTrial]``伪代码很简短,先判断了``licenseData``是否有数据,无数据的话直接返回``true``进入试用状态。返回值保存在v5变量中,如下图所示。

    15873503585559.jpg

    这里出现的``licenseData``是关键,而且是个字典类型(第五行有类型提示),需要有一个``ProductBundleId``字段,其内容为应用的BundleIdentifier,然后调用``-[MDBAppDelegate isLicenseInvalidated:]``方法校验数据来控制最终的返回结果。

    到这里试用版控制逻辑就分析完毕了,如果仅仅爆破的话,直接将v5改为``false``即可,本文目的显然不是爆破。现在的任务是先找到``licenseData``的赋值点,才能进行授权机制分析。

    0x03 分析licenseData来源

    由``self->licenseData;``一句可知,``licenseData``是``MDBAppDelegate``的成员,那么在该类中必定存在某个方法会对该成员进行赋值。在IDA的函数列表中,按照类名``MDBAppDelegate``过滤,找到一些看似有关联的方法,其中``-[MDBAppDelegate readLicense]``方法有很大嫌疑,如下图所示。
    15873509774267.jpg

    进入该方法查看伪代码,依然很简短,首先读取了一个特定的文件,然后判断文件是否存在,存在的话就调用``sub_1000223E3``函数,它的返回值就是``licenseData``,如下图所示。

    15873517156333.jpg

    接着按照该逻辑逐个分析,现在确定授权文件路径。

    授权文件URL由``-[MDBAppDelegate licenseFileURL]``方法获取,进入查看伪代码如下图所示。

    15873522916597.jpg

    这里虽然是一些常规的操作,但第一眼看过去,只能确定文件名为``license.mdbviewer-license``,且上一级路径取自App自身的BundleIdentifier,打开Info.plist查看可知为``at.eggerapps.mdbviewer``,如下图所示。

    15873524865613.jpg

    因此路径格式``xxxx/at.eggerapps.mdbviewer/license.mdbviewer-license``,``xxxx``来源于``NSFileManager``类的``"URLsForDirectory:inDomains:``方法,也就是应用的沙盒相关的路径,传入的两个参数分别为14和1。该方法原型如下:

    [Objective-C] 纯文本查看 复制代码
    - (NSArray<NSURL *> *)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask
    


    第一个参数类型为NSSearchPathDirectory,第二个参数类型为NSSearchPathDomainMask。在Xcode里面查看一下宏定义,分别如下图所示。

    15873527653493.jpg

    15873529857348.jpg

    因此可以知道授权文件位于沙盒的``Library/Application Support``子目录中。沙盒主目录固定为:`` /Users/{你的用户名}/Library/Containers/{应用的BundleIdentifier}/Data/``,所以在笔者机子上得到的授权完整路径为:

    [Bash shell] 纯文本查看 复制代码
    /Users/piao/Library/Containers/at.eggerapps.mdbviewer/Data/Library/Application Support/at.eggerapps.mdbviewer
    


    0x04 授权文件结构

    前面分析过了licenseData是个字典类型,那么``at.eggerapps.mdbviewer``文件自然就是个plist文件。先结合之前的分析伪造一点数据作为本节的分析。


    [XML] 纯文本查看 复制代码
    <?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``函数处理数据,如下图所示。

    15873625322372.jpg

    进入``sub_100022343``函数,可以看到授权文件里面如果存在``Signature``字段,则把剩下的内容传出去(没有对Signature字段做任何校验,仅仅是个摆设,因此可以随便乱输入一些东西),否则传出空字典,如下图所示。

    15873628017290.jpg

    因此修正``at.eggerapps.mdbviewer``文件内容:

    [XML] 纯文本查看 复制代码
    <?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``里面已经有数据,现在是时候回过头来看看``-[MDBAppDelegate isLicenseInvalidated:]``方法了,这是最后的堡垒,如下图所示。

    15873632516116.jpg

    这里很明显,只要有个``Order``字段,且不是黑名单中的``EGG130624-6895-78104``、``EGG130805-1334-17112`` 即可,除此之外无任何其他校验。

    继续修正``at.eggerapps.mdbviewer``文件:

    [XML] 纯文本查看 复制代码
    <?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``),如下图。

    15873644230399.jpg

    虽然这个显示无伤大雅,但不留个大名在上面,总觉得欠缺点什么,继续分析。字符串查找``Anonymous User``交叉引用,找到``-[MDBAppDelegate licenseeName]``方法,伪代码如下图所示。

    15873647225988.jpg

    这里已经非常清楚了,如果存在``Company``或者``Name``字段,才会显示具体的用户名,否则显示``Anonymous User``,那么还等什么,继续修正``at.eggerapps.mdbviewer``文件:

    [XML] 纯文本查看 复制代码
    <?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>[url=http://www.chinapyg.com]www.chinapyg.com[/url]</string>
    </dict>
    </plist>
    


    再次运行,飞向光明之巅,如下图所示。

    15873651008734.jpg

    0x06 本文小结

    本例子采用经典的keyfile校验的方式,且无任何加密算法,非常适合练手和熟悉macOS应用的一些常规文件目录操作流程。

    评分

    参与人数 3威望 +7 飘云币 +12 收起 理由
    Arsage + 1 + 1 PYG有你更精彩!
    Rooking + 5 + 10 学习使我快乐,爱学习爱运动
    不破不立 + 1 + 1 感谢发布原创作品,PYG有你更精彩!浪里个.

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-4-20 16:02:08 | 显示全部楼层
    感谢R版纠正细节~~

    点评

    LCC
    真想不出还有什么平台能阻挡住飘云大大的脚步!!!  详情 回复 发表于 2020-4-22 09:06
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:32
  • 签到天数: 2178 天

    [LV.Master]伴坛终老

    发表于 2020-4-20 17:30:31 | 显示全部楼层
    好贴收藏有机会实践,浪里个浪
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-25 15:21
  • 签到天数: 487 天

    [LV.9]以坛为家II

    发表于 2020-4-20 17:38:48 | 显示全部楼层
    学习使我快乐,爱学习爱运动
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    前天 08:24
  • 签到天数: 847 天

    [LV.10]以坛为家III

    发表于 2020-4-20 19:54:55 | 显示全部楼层
    跟随大神的步伐,征战macOS
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-28 11:05
  • 签到天数: 82 天

    [LV.6]常住居民II

    发表于 2020-4-21 00:15:33 | 显示全部楼层
    好贴收藏有机会实践,浪里个浪
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-6 22:40
  • 签到天数: 499 天

    [LV.9]以坛为家II

    发表于 2020-4-21 09:54:21 | 显示全部楼层
    感谢飘大的分享,mark一下 以后学习研究
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-22 22:00
  • 签到天数: 326 天

    [LV.8]以坛为家I

    发表于 2020-4-21 13:26:49 | 显示全部楼层
    来跟着大佬学习了,&#128513; 谢谢
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-8-10 19:18
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2020-4-21 19:22:58 | 显示全部楼层
    飘哥,你这篇文章写的太棒了,能不能对我那个mdb文件解密需求出个教学贴呀

    点评

    等哪天我有心情玩Windows了再说  详情 回复 发表于 2020-4-21 21:55
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-4-21 21:55:45 | 显示全部楼层
    [quote][url=forum.php?mod=redirect

    等哪天我有心情玩Windows了再说
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表