因为CMM X的破解屡次被代{过}{滤}理商投诉,并且有被黑心网站挖掘文章的可能,故不能发布成品,设置阅读权限,文章经过脱敏处理。文章这么长,其实是就是几个frida-traceHopper,更多的是分析,再说论坛上的同志都不是白给的,肯定搞得定。

自从写了《一次意外的 CMM X 破解》后,在手的CMM X 4.5.3就一直没更新换代。笔者撰写此文,CMM X 已经发展到4.7.4了,于是便想着重新破解一遍。

Hopper分析

按照上一篇文章的思路,我们先找-[CMActivationManager isAppActivated]这个函数。竟然还在:

[macOS]再次挑战Mac某清理软件最新版暴破

但是,为了避免像我破解4.6.7时频繁输密码的问题,安装frida,我们使用frida-trace进行调试修改:

 复制代码 隐藏代码
frida-trace -m "-[* isAppActivated]" "CMM X"

这个命令我需要解释一下。-m是trace(跟踪)OBJC_METHOD的参数,后面第一个字符串参数是一个搜索关键词,其中*是通配符,不论是哪个class的isAppActivated都会被我们监视到。后面的"CMM X"是进程名称。

但是可惜的是在激活命令之前,我们需要把CMM打开,这样frida才能attach到进程。也就是说,CMM和命令几乎要同时打开。我在调试的过程中一直是把app和回车同时按下去,很麻烦,知道写文章才发觉自己好可爱,为什么不用下面的命令呢:

 复制代码 隐藏代码
open /Applications/CMM\ X.app && frida-trace -m "-[* isAppActivated]" "CMM X"

之后我们会看到下面的输出:

 复制代码 隐藏代码
Instrumenting...                                                        
-[CMActivationManager isAppActivated]: Auto-generated handler at "/Users/**/Developer.localized/CMMTweak/__handlers__/CMActivationManager/isAppActivated.js"
-[CMSubscriptionStatusManager isAppActivated]: Auto-generated handler at "/Users/**/Developer.localized/CMMTweak/__handlers__/CMSubscriptionStatusManager/isAppActivated.js"
-[CMSubscriptionRequestSchedule isAppActivated]: Auto-generated handler at "/Users/**/Developer.localized/CMMTweak/__handlers__/CMSubscriptionRequestSchedule/isAppActivated.js"
Started tracing 3 functions. Press Ctrl+C to stop.

可以看到有三个函数被调用,也就是说这是三个函数都得被hook,终于不用像以前傻呵呵只改一个函数了。

破解过程

为了省时间,在这里就不用Hopper了。我们在frida生成的__handlers__文件夹(位于当前目录,也就是在trace之前要cd到一个准备好的目录)中,分别将三个函数的onLeave改成1:

 复制代码 隐藏代码
onLeave(log, retval, state) {
  retval.replace(1);
}

之后再运行frida-trace,打开软件,提示信息消失。正当欣喜若狂开始清理垃圾时,突然停止清理,提示我买会员。噩耗传来:这是伪破解。不过别泄气啊。

仔细观察软件会发现,有的地方是未注册的UI,有的地方是已注册的UI,也就是暴破函数没找全。我们查看一下-[CMActivationManager isAppActivated]伪代码,发现,里面的sub_100334850在做着不为人知的事情:

 复制代码 隐藏代码
/* home.php?mod=space&uid=341152 CMActivationManager */
-(char)isAppActivated {
    rax = sub_100334850(0x0);
    return rax;
}

sub_100334850

 复制代码 隐藏代码
int sub_100334850(int arg0) {
    var_2E8 = arg0;
    rax = objc_autoreleasePoolPush();
    var_300 = 0x0;
    var_2A0 = &var_300;
    var_318 = rax;
    if (**_NSApp != 0x0) {
            var_320 = qword_1007a3b28(**_NSApp, 0x1007a3b70);
            var_328 = var_320;
    }
    else {
            var_328 = 0x0;
    }
    var_2A8 = var_328;
    sub_100392510("DM_ENABLE_DEBUG_LOGGING_ACTIVATION", @"_get_: %p", var_2A8, 0x0, r8, r9, stack[-1704]);
    if ((var_2A8 == 0x0) || (var_2A0 == 0x0)) goto loc_1003349b4;
  // ......
  // Plethora ommitted...

代码很长,就不全部展示了。Shift+X查看交叉引用,让我们“顺瓜摸藤”,结果让我眼前大吃一惊,好多啊……

[macOS]再次挑战Mac某清理软件最新版暴破

原来,这个sub是个判断激活的进程,不止isAppActivated调用了它,还有许许多多的类和方法,包括EntryPoint

想要hook这个sub,还需获取在内存中的地址,着实麻烦,就不写frida了。Hopper直接改返回值。双击空格,切到ASM模式,让我们:

 复制代码 隐藏代码
mov rax, 0x1
ret

Cmd+Shift+E,生成可执行文件,给源文件改名,替换——三步走,之后打开CMM X

[macOS]再次挑战Mac某清理软件最新版暴破 [macOS]再次挑战Mac某清理软件最新版暴破

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注