13

十分钟暴力破解mac os x版本BetterZip[详细图文版]

 2 years ago
source link: https://www.52pojie.cn/thread-1466563-1-1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
查看: 3206|回复: 47

[MacOS逆向] 十分钟暴力破解mac os x版本BetterZip[详细图文版]

  [复制链接]

楼主

发表于 2021-6-28 11:32

本帖最后由 longestusername 于 2021-6-28 11:51 编辑

BetterZip是MacOS操作系统上的一款[压缩/解压]工具。相比于其他压缩工具,它最大的优点是,可以像文件夹一样浏览操作压缩包的文件列表,并通过向外部复制黏贴(或拖出)的方式解压指定的文件;或者通过向压缩包内部复制黏贴(或拖入)的方式将制定的文件添加内压缩包内。该文件支持的压缩方式包括:ZIP, DMG, TAR, TGZ, TBZ, TXZ, TZ, Zstandard, Brotli, 7-ZIP, XAR等。
直接浏览temp.tar的示例如下
112125l7u5iavuca3j0f3r.png

其官网地址为:https://macitbetter.com/; 当前最新版本为:Version 5.1.1 (1655)

112215r1cyjw253yjjee2y.png
如上图,在注册界面随便输入License key,尝试破解。可以获得注册失败时的关键词“The code is invalid. ”。ida pro打开BetterZip的可执行文件(BetterZip.app/Contents/MacOS/BetterZip), 并打开Strings window(快捷键:Shift+F12),搜索(快捷键ctrl+f)关键词:The code is invalid. 如下图:
112251zvjwadvj7w782dxd.png

找到该字符串在代码中的引用位置,最终定位到:-[RegistrationController testCode]函数中:
112322kbnvvv3nfvztby8b.png

分析该函数,发现该函数调用函数checkRegistration,并通过该函数返回值判断已注册、未注册、试用、过期等不同注册状态。


那么,我们下一步修改checkRegistration返回值为9999997+5(截图里面的checv是否大于999998应该是9999998,见谅)。
为了方便测试想法,我们用frida对checkRegistration函数进行hook,然后修改其返回值。Frida是一款跨平台的hook框架,其官网为https://frida.re. 安装命令为pip install frida-tools  . 官网有详细的文档,网上也有大量的教程和使用示例,不熟悉的兄弟可以搜索下看看。

这里的Hook脚本如下:

[Python] 纯文本查看 复制代码
#!/usr/bin/python
# coding=utf-8
#   Author    :   Simon Huang
#   Time      :   6/26/21 3:08 PM
import frida
import sys
#https://frida.re/docs/functions/
def on_message(message, data):
print("[{}] => {}".format(message, data))
def main(target_process):
session = frida.attach(target_process)
hook_str = """
var libname = "BetterZip";
var fname = "checkRegistration";
Interceptor.attach(Module.getExportByName(libname, fname), {
onLeave: function(retval) {
retval.replace(9999997+5);
}
});
"""
script = session.create_script(hook_str)
script.on("message", on_message)
script.load()
print("[!] Ctrl+D or Ctrl+Z to detach from instrumented program.\n\n")
sys.stdin.read()
session.detach()
if __name__ == "__main__":
main("BetterZip")
我们运行BetterZip。然后运行该脚本(命令:python beterzip_inject.py),然后再次在license Key窗口随便输入一些文字。效果如下图:

可以看到已经提示:Your copy of BetterZip is registered. Thank you. 这是提示注册成功。但是仔细看右下角,仍然存在”Buy Now…”/”28 Days Left”等类似试用期的字样提示。说明破解仍然不彻底。我们搜索Buy Now…如下图:

双击后到达该字符串定义的位置,然后不断按下x快捷键,查找其xref,直到代码段引用该字符串的地方。最终到达了这里:

我们分析该函数,如下图

所以,我们需要修改+[RegistrationController isRegistered]的函数返回值为1(也就是true)让试用期不再显示。
更新frida的hook脚本代码如下(将对isRegistered的hook部分加入);
[Python] 纯文本查看 复制代码
import frida
import sys
#https://frida.re/docs/functions/
def on_message(message, data):
print("[{}] => {}".format(message, data))
def main(target_process):
session = frida.attach(target_process)
hook_str = """
var isRegistered = ObjC.classes.RegistrationController['+ isRegistered'];
Interceptor.attach(isRegistered.implementation, {
onEnter: function (args) {
console.log('isRegistered: hooked in..');
},
onLeave: function(retval) {
console.log('isRegistered return value:' + retval);
retval.replace(0x1);
}
});        
var libname = "BetterZip";
var fname = "checkRegistration";
Interceptor.attach(Module.getExportByName(libname, fname), {
onLeave: function(retval) {
retval.replace(9999997+5);
}
});
"""
script = session.create_script(hook_str)
script.on("message", on_message)
script.load()
print("[!] Ctrl+D or Ctrl+Z to detach from instrumented program.\n\n")
sys.stdin.read()
session.detach()
if __name__ == "__main__":
main("BetterZip")
再次运行BetterZip和我们的hook脚本。效果如下图:


那么我们发现,注册成功,并且右下角的试用期显示也消失了。
下面,我们将对两个函数返回值的修改patch到二进制文件中。
1.  使用keypatcher将+[RegistrationController isRegistered]函数的前两条指令修改为
mov rax, 1
    ret
如下图:


2.  使用keypatcher修改checkRegistration函数的前两条指令为:
mov rax, 0x1
ret
如下图所示:

3.  首先备份原来的BetterZip可执行文件:cp BetterZip BetterZip.bak
4.  然后在ida pro中使用Edit->Patch Program->apply patches to input file.. 将上面的修改保存到文件。


5.  再次运行patch后的BetterZip,我们发现破解成功。且运行正常。

---------------下面不晓得为啥有一些错传的图片显示 也不晓得咋个删除掉,兄弟们忽略掉即可 --------------

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK