吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12767|回复: 50
收起左侧

[MacOS逆向] [图文]破解mac osx逆向神器Hopper Disassembler4.7.7离线激活流程

  [复制链接]
longestusername 发表于 2021-7-17 12:54
本帖最后由 longestusername 于 2021-7-17 13:21 编辑


[详细图文]破解mac osx逆向神器Hopper Disassembler4.7.7离线激活流程

by 大和尚



一 Disassemble Hopper简介



Disassemble Hopper是一款可以和IDA pro媲美的逆向工具,它可以用来反汇编、反编译和动态调试Mac OSX和Linux操作系统上X86、X64、ARM、ARM64等各种架构的应用程序。其界面如图1:


图1

图1


图1. Hopper界面图示


其官网地址为:https://www.hopperapp.com/ 当前最新版本为: 4.7.7;购买价格为$99.00/年;


二。 注册流程未注册版本开启软件以后,自动弹出注册界面如下:

图2

图2


图2:hopper注册窗口



在License File框内填入伪造的License文件路径,并点击“离线激活”按钮(Offline Activation)以后,转到第二步的验证界面如下;

图3

图3

图3:离线验证界面


三。 界面分析通过逆向分析,以上两个窗口对应的Controller类,及图2窗口的Offline Activation按钮、图3窗口的OK按钮的responser回调函数分别如图4所示:

图4

图4

图4. V层-C层对应关系图示




四。流程分析

那么我们从“Registration”窗口的“Offline Activation”按钮的Responser响应函数开始逆向。即-[RegistrationWindowController offlineActivationButtonClicked:]函数,其函数流程如下;



图5

图5

图5.离线激活按钮响应函数流程图


其中1,5,6,7四个函数需要特别注意,

表格1 重点逆向函数
1preCheckLicenseAndPresentErrorLicense格式预检查,返回值需要为true。
5lv_getAssistanceCode()需要进一步逆向
6OfflineValidationWindowController该步骤弹出图3Offline Validation窗口,需进一步逆向[OfflineValidationWindowController okButtonClicked:]
7checkSavedRegistrationAndDisplayUserInfo该函数检查保存到UserDefaults中的注册信息并显示。返回值需要为true。


对preCheckLicenseAndPresentError逆向,

图6

图6

图6. preCheckLicenseAndPresentError函数代码片段图



由于涉及到的函数比较多,逻辑比较复杂;ida pro的截图太多应该放不开。本文中尽量用语言文字讲一下函数流程逻辑,感兴趣的朋友可以对应文字自己用ida pro逆向一下相应函数。

preCheckLicenseAndPresentError函数流程;

1. 首先判断license路径是否存在

2. 判断license内容是否为空

3. 将license文件以plist格式解析

4. 读取其中的Product字段

5. 判断license的Product字段是否为Hopper Disassembler v4


对lv_getAssistanceCode()逆向,该函数流程:

1. 调用sub_10008D34D获取当前电脑的Mac地址

2. 将License解析成Plist结构并获取Order字段

3. 将以上两步字符串通过CRC32、BASE64等截断拼接后返回一个字符



我们需要修改sub_10008D34D的返回值,使其返回一个固定的伪造mac地址(例如:11:22:33:44:55:66),以避免真实Mac地址上传到服务端而导致被封禁或者被溯源。


图7

图7

图7. -[OfflineValidationWindowController okButtonClicked:]函数流程




该函数相对较简单,我们只需要进一步逆向lv_checkSavedSignature即可,并让该函数返回值为true。lv_checkSavedSignature逆向:

1. 从license中获取Order字段

2. 调用sub_10035E0D0检查Order字段的hash值是否与预留的92个Banned Hash相同。(该函数返回值修改为false。)

3. 调用sub_10008D34D获取mac地址(该函数返回值修改为固定伪造值)

4. 调用lv_checkSignature判断mac地址、Order字段以及在Ok页面输入的字符串(保存为SMS字段),是否匹配;(像lv_checkSignature这种函数,其函数体只是纯粹的数学计算、hash计算、密码学计算等,处理最为简单,整个函数体都不要,直接在函数开始插入mov eax, 0x1; ret;两条指令,就搞定了。)


因此我们需要保证或者修改lv_checkSignature返回值为true。当然修改返回值最为简单。        

根据图5以及表格1的指导,下面分析[HopperAppDelegate -checkSavedRegistrationAndDisplayUserInfo]函数.

checkSavedRegistrationAndDisplayUserInfo逆向:  



1.调用sub_100012E37函数(对license进一步检查并更新两个全局变量)

  1). 100864DB1全局变量:0,1值保存license是否检查过了的标记。修改该值为1.

  2). 调用sub_1000CA4DE函数(对license Signature、Email、Order、Expires字段检查)   

            a. 调用sub_10035E0D0判断Order是否Banned。该函数返回值修改为false。

            b. 调用sub_10035E182判断Email是否Banned。该函数返回值修改为false。

            c. 对Expires字段进行一系列计算判断是否过期。Expires的值伪造的大一些。

           d. Signature判定是根据Order、Email、Expires的值进行变换、MD5等操作后比较。比较复杂,不过我们直接修改sub_1000CA4DE返回值为true即可。

      3). 调用sub_100012726(获取license的类型)

          a. 获取License的Type字段,判断是否Named或者Computer

          b. 返回值1:表示Named;2:表示Computer;0:表示当前License无效。因此我们修改该函数返回值为1.

     4).10068FAF0全局变量:0表示license合法,1表示license非法。因此该变量的语义应该是:license是否非法标记。修改该值为0.

     5). 修改函数返回值为1(true).

2. 调用sub_100012D05(获取license类型)

     1). 该函数直接调用并返回sub_100012726的结果。

3. 调用sub_100012c05(获取License中的注册名)

    1).判断全局变量10068FAF0(license是否非法全局变量)的值是否为1,如果是则返回demo

    2). 调用sub_10001260E获取License中的Name字段。伪造license文件中,我们可以在Name字段放上喜欢的注册名。

4. 显示用户注册信息并返回。我们需要修改checkSavedRegistrationAndDisplayUserInfo函数的返回值为1.


至此,整个离线激活流程就分析完了。


五。破解方法总结


2. 破解修改点


[RegistrationWindowController  -preCheckLicenseAndPresentError]修改返回值为1
[HopperAppDelegate -checkSavedRegistrationAndDisplayUserInfo]
修改返回值为1
sub_100012D05修改返回值为1
全局变量0x100864DB1修改值为1
lv_checkSavedSignature
修改返回值为1
lv_checkSignature
修改返回值为1
sub_10008D34D修改返回值为固定伪造mac地址
sub_10035E0D0修改返回值为0
sub_10035E182修改返回值为0
sub_1000CA4DE修改返回值为1
sub_100012726修改返回值为1
全局变量0x10068FAF0修改值为0





根据以上的破解过程,我们伪造一个license文件内容如下:

image.png
无标号图:伪造License内容(输入原文页面会乱码)




六。破解验证


实施了表2的破解点以后,并使用伪造的license文件(文件名保存为cracking.hopperLicense, 后缀必须为hopperLicense否则无法选中)进行离线激活测试:


图8

图8

图8. 离线验证随便输入验证码


图9

图9

图9. 离线破解成功图

查看about:


图10

图10


图10. 查看About界面license过期日期



七。结语

        上周工作日中午牺牲午休时间、再加上周末抽时间搞了以上hopper的离线激活破解。离线破解流程到此看起来阶段性成功了,但真正加载文件逆向时,却时常莫名崩溃,看crash dump文件都是在一个同步锁release的位置。具体原因和解决方法还需要进一步的分析。所以现在来看hopper破解了又没完全破解,希望有兴趣的兄弟把它搞定并分享出来。谢谢。

免费评分

参与人数 23吾爱币 +30 热心值 +22 收起 理由
billsmiless + 2 + 1 谢谢@Thanks!
JokerHou + 1 然而我没有苹果笔记本,
┣▇▇▇═─ + 1 + 1 鼓励转贴优秀软件安全工具和文档!
JPK + 1 + 1 热心回复!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
xuexiyixiaxia + 1 + 1 热心回复!
Mint_Grass + 1 + 1 谢谢@Thanks!
xin1433223 + 1 谢谢@Thanks!
LENY77777 + 1 + 1 我很赞同!
cxp521 + 1 + 1 谢谢@Thanks!
jgs + 1 + 1 谢谢@Thanks!
FleTime + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
抱薪风雪雾 + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
pdc9911 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhupf + 1 + 1 谢谢@Thanks!
水蜜桃好甜 + 1 + 1 我很赞同!
75212684 + 1 + 1 谢谢@Thanks!
xzl9552547 + 1 我很赞同!
fanvalen + 1 + 1 终于有讨论mac下得调试器了
其二 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
hearne + 1 + 1 技术活,当赏!
yuehanoo + 1 + 1 卡@Thanks!

查看全部评分

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

jgs 发表于 2021-7-17 20:10
不改程序,在安装目录随便放1个文件20S左右必崩,要过掉这个校验,另外找个泄露版的license,patch掉 V4版本、email和produce的黑名单校验也可以省掉改一些函数
jgs 发表于 2021-7-18 21:22
zyjsuper 发表于 2021-7-18 16:06
可以参考下这个帖子:https://www.chinapyg.com/forum.php?mod=viewthread&tid=137783&highlight=hopper

我的帖子,Linux可以调试和修改,MacOS版难在调试和修改,有效验。
其二 发表于 2021-7-17 13:21
 楼主| longestusername 发表于 2021-7-17 13:23
我就是大和尚
那年夏天52 发表于 2021-7-17 13:38
这个看着比ida的界面舒服点
飘零星夜 发表于 2021-7-17 13:54
大佬牛逼,修改点又点多,找不到啊

然而我没有苹果笔记本,
贩卖洗衣粉 发表于 2021-7-17 13:54
感谢大牛的无私分享
水蜜桃好甜 发表于 2021-7-17 15:55
感谢楼主分享
miekioon 发表于 2021-7-17 18:39
真牛逼,感谢楼主分享,学习到了
忆年 发表于 2021-7-17 20:36
难在怎么获取完整版本,demo 版本功能不全 CleanShot 2021-07-17 at 20.31.15@2x.jpg
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-29 21:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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