吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7403|回复: 39
收起左侧

[MacOS逆向] 学习AppleStore版本的 Bandzip365 v7.19 版本

  [复制链接]
QiuChenly 发表于 2023-1-3 16:35

学习AppleStore版本的 Bandzip365 版本

下载

16712060568227.jpg
点击恢复购买项目,提示无购买内容。

破解分析

  1. 首先找到本土化语言"无购买内容"文件:/Applications/Bandizip365.app/Contents/Resources/Localizable.cn.strings
    16712062737919.jpg
    拿到TEXT.ERROR_NO_PURCHASES去搜一下字符串

  2. 你会发现没修改文件 第二次直接打不开了 只是重新签了个名 因为要修改代码
    16712066860397.jpg

但是用一个空的_MASReceipt授权文件替换掉原来的5KB大小的文件即可绕过
16712075858032.jpg

  1. 现在app已经可以正常运行了,进入下一步 绕过这个登录窗口
    ida搜索入口NSApplicationMain
    进入发现start函数有一个exit(173) 查看Apple官方文档得知173是告诉系统授权验证失败,要求登录
    16712077754638.jpg

16712076619337.jpg

所以我们直接十六进制修改函数入口代码为6A 01 58 C3让这个函数一直返回1
16712078398391.jpg
保存
16712078932727.jpg

16712079088416.jpg

即可。
替换进原文件重新签名:
16712079717239.jpg

可以看到直接弹出了窗口 说明绕过登录成功。

  1. 现在又弹出了
    16712080160532.jpg
    开头的画面 如果搜索无购买内容则很难搜索到有效的数据
    16712083512860.jpg
    我这里用成功恢复购买来搜索 发现这里有一个嫌疑很大的判断:

    __int64 sub_100079070()
    {
    void *v0; // rax
    id v1; // rax
    id v2; // rax
    void *v3; // rbx
    unsigned __int8 v4; // r14
    
    v0 = (void *)objc_opt_self(&OBJC_CLASS___LicenseManager);
    v1 = objc_msgSend(v0, "shared");
    v2 = objc_retainAutoreleasedReturnValue(v1);
    if ( !v2 )
    BUG();
    v3 = v2;
    v4 = (unsigned __int8)objc_msgSend(v2, "isSubscriptionEdition");
    objc_release(v3);
    if ( v4 )
    return sub_100076CC0(v3);
    else
    return sub_100077040(0xD000000000000010LL, "TEXT.COMPLETE_RESTORE_PURCHASES" + 0x8000000000000000LL);
    }

用Hopper Disassembler看一下代码
16712085110598.jpg

v2 = objc_retainAutoreleasedReturnValue(v1)
objc_retainAutoreleasedReturnValue函数它的作用是检视稍后执行的代码是否会执行retain方法,如果有,会把某个专用于检测的变量,或者说数据结构的标志位置位,并直接返回对象(上例array),不执行autorelease方法;否则,对对象(上例array)执行autorelease方法。简单来说 应该是获取v1的值 如果对象存在则自动释放内存指针,如果不存在则直接得到对象 也就是OBJC_CLASS___LicenseManager的实例。由于我从未开发过MacOS X应用 也不知道理解的对不对。先对付着看吧。

那么v2就等价于OBJC_CLASS_LicenseManager实例, objc_msgSend好像是发消息 其实不是:
objc_class(Class对象)结构简介
熟悉OC语言的Runtime(运行时)机制以及对象方法调用机制的开发者都知道,所有OC方法调用在编译时都会转化为对C函数objc_msgSend的调用。
所以我们可以理解为v4 = ((&OBJCCLASS
LicenseManager)v2).isSubscriptionEdition,如果为0则表示恢复购买成功,否则直接进入下一步(直接绕过购买页面 实现内购)。

搜一下
16712090825304.jpg
我们返回1(也就是True 因为非0即True)即可成功破解。
返回0因为根本走不到这一步 所以返回0没有意义。如果需要走恢复购买完成 需要去无购买内容的判断分支修改跳转到这里 没有太大意义。
16712094487544.jpg

总结

macOS的入口函数是NSApplicationMain,搜索之。

if (!validateReceiptAtPath(pathToReceipt))
        exit(173); //receipt did not validate 无授权直接终止应用程序
  1. AppleStore商店下载的app有_MASReceipt目录保存了购买信息,不一致的话会被拒绝执行。
  2. 通过用空的_MASReceipt文件来让app继续执行让用户登录重新获取购买信息。
  3. nop掉检查购买信息的函数让app跳过系统登录用户界面继续执行。
  4. 在内购页面查找入口修改关键函数isSubscriptionEdition让他一直返回True即可破解。
16712060219936.jpg

免费评分

参与人数 8威望 +1 吾爱币 +28 热心值 +6 收起 理由
gangligegang + 1 + 1 我很赞同!
527900417 + 2 我很赞同!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Thefirst1 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yxh19 + 1 + 1 谢谢@Thanks!
xiangbaba + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
muchenxi + 1 热心回复!
debug_cat + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| QiuChenly 发表于 2023-1-4 01:26
版禁破果,然同区皆附,故同浅贴于此。众助正版为宜!
Bandizip365.zip (2.3 MB, 下载次数: 212)
拷之换原也,然codesign之即成。
wen704 发表于 2023-1-3 18:47
mac下好像keka的压缩率会比这个高
windows下这个软件的压缩率会比7-Zip高
还是习惯用keka
另外 空的_MASReceipt文件 具体是啥,还没实操过,是包内容里的一个文件么
zgdtianya 发表于 2023-1-3 16:37
tanzhijun8 发表于 2023-1-3 16:39
谢谢分享
Sen 发表于 2023-1-3 17:02
厉害了, 这就去试试
yun520530 发表于 2023-1-3 17:07
不错不错
frx178 发表于 2023-1-3 17:14
和Windows版本相比,这家公司的mac版好简单……
Lucas丶 发表于 2023-1-3 22:10
感谢分享,论坛因你而精彩!
shelly1314 发表于 2023-1-3 22:15
非常不错
debug_cat 发表于 2023-1-3 22:18
感谢分享,先收藏啦
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 12:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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