逆向笔记5

声明
本文内容仅用于软件安全、逆向工程与技术防护机制的学习与研究目的。

文中所涉及的分析方法、技术原理仅作理论与实践探讨,不包含任何可直接用于绕过、破坏或规避商业软件授权、加密或其他技术保护措施的工具、程序、补丁或可复现操作步骤。

本文不鼓励、不支持任何形式的软件盗版、非法传播或商业用途。
由读者基于本文内容所产生的任何行为及后果,均与作者无关。

若相关内容涉及任何权利方的合法权益,请联系作者删除或修改。

1.静态分析

查找授权文件

通过静态分析,结果如下:

prl_disp_service

负责激活校验工作

基本工作原理如下

FUN_1002XXX  (许可证加载)
  ├─ FUN_10046XXX  (Base64)
  │    └─ FUN_1004XXX  (签名验证)
  └─ FUN_100XXXX  (JSON )

FUN_1002XXXX  (许可证使用入口)
  └─ FUN_100XXXX  (??好像是字段规则判断)

FUN_100XXXXX (版本读取)

发现在校验成功后,均返回0,版本校验3为pro版

2.patch

使用Ghidra将FUN_100XXXXX、FUN_1004XXXXX、FUN_100XXXXX

将寄存器w0 置零 再ret

mov w0,#0

ret

将FUN_1000XXXXX置3返回

运行时提示出现偏差

根据错误码查找到

prl_disp_service存在如下函数

FUN_100XXXXX

FUN_100XXXXX

prl_vm_app存在如下函数

FUN_100XXXXX

FUN_100XXXXX

主要作用是查对端的identifier和teamid 而且是互查

成功返回依旧为0,直接patch掉再次启动

3.更换思路patch

发现GUI同样读取,但是通过内存读栈展示激活界面?

更换思路,不再patch许可证密钥,静态分析激活流程

发现FUN_100XXXXX为关键验证流程,读取license.json进行签名

接受3个参数

n ,所在位置0x100XXXXX ,实际含义为RSA模数,硬编码至程序中

R² mod n ,所在位置0x100XXXXX,Montgomery预计算值,硬编码至程序中

n’ ,所在位置是FUN_100XXXXX,为逆元,同样硬编码,编码方式如下

mov x20, #0xEA29
movk x20, #0x229F, LSL #16
movk x20, #0x0346, LSL #32
movk x20, #0xE444, LSL #48

生成自己的公钥及私钥取模数,并将硬编码替换

程序互验部分看起来和其他部分的代码没有耦合,直接patch掉ret 0即可

发现未签名,补充两个程序的自签

4.问题1

运行时弹AMFI: code signature validation failed

The file is adhoc signed but contains restricted entitlements

查询了Apple官方文档,发现其中请求的权限

com.apple.security.hypervisor
com.apple.vm.device-access(需要apple的AMFI认证)
com.apple.vm.networking(需要apple的AMFI认证)
com.apple.developer.team-identifier(需要apple的AMFI认证)
com.apple.application-identifier
com.apple.security.application-groups(需要apple的AMFI认证)
改为重签
com.apple.application-identifier
com.apple.security.cs.allow-unsigned-executable-memory
com.apple.security.hypervisor

5.问题2

运行成功,但是弹出成网络初始化失败

确认是缺少com.apple.vm.networking权限导致的

再研究了一下,发现可以使用root用户绕过

不难发现在启动vm线程时uid = 501

直接一个mov w0,#0

留下评论

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