Reveal简介
PDF Expert是一款超简单的PDF编辑器。
破解过程
PDF编辑后,command + x
保存,弹出购买完整版的窗口:

用Inferface Inspector
查看,是一个继承DMActivationController
的控制器,马上想到第三方库DevMateKit。
用frida-trace
看一下DMActivationController
调用了哪些方法:
$ frida-trace -m "-[DMActivationController *]" PDF\ Expert
......
-[DMActivationController performActivationStepWithStep:0x66]
......
Xcode下断点
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x000000010ef53a7c DevMateKit`-[DMActivationController performActivationStepWithStep:]
frame #1: 0x000000010d9fcf2c PDF Expert`___lldb_unnamed_symbol15830$$PDF Expert + 380
frame #2: 0x000000010da49d23 PDF Expert`___lldb_unnamed_symbol16724$$PDF Expert + 371
frame #3: 0x000000010da268f7 PDF Expert`___lldb_unnamed_symbol16130$$PDF Expert + 39
frame #4: 0x00007fff4fe4160b AppKit`-[NSApplication(NSResponder) sendAction:to:from:] + 312
(lldb) image lookup --address 0x10d9fcdb0
Address: PDF Expert[0x00000001003b1db0] (PDF Expert.__TEXT.__text + 3865456)
Summary: PDF Expert`___lldb_unnamed_symbol15830$$PDF Expert
(lldb) image lookup --address 0x10da49bb0
Address: PDF Expert[0x00000001003febb0] (PDF Expert.__TEXT.__text + 4180336)
Summary: PDF Expert`___lldb_unnamed_symbol16724$$PDF Expert
(lldb) image lookup --address 0x10da268d0
Address: PDF Expert[0x00000001003db8d0] (PDF Expert.__TEXT.__text + 4036240)
Summary: PDF Expert`___lldb_unnamed_symbol16130$$PDF Expert
Hopper查看一下找到的三个函数:0x1003b1db0,0x1003febb0,0x1003db8d0
- 0x1003b1db0大部分代码是performActivationStepWithStep:的逻辑
- 0x1003febb0出现大量
PDFDocumentsTabContentViewController
字眼,考虑修改这个函数。 - 0x1003db8d0啥也没干

sub_1003b1c70:
00000001003b1c70 mov eax, 0x1
00000001003b1c72 ret
现在可以保存成功了,但是点击左上角的PDF Expert菜单,还显示“输入序列码”。所以得在sub_1003b1c70里面,找到更底层的验证函数。

返回值是由r12d传递到eax,影响寄存器r12的,也就图中黄色的几个地方。
r12初始值为0x1,sub_100381ad0的返回值不等于0x3,才有可能改变r12的值。
进sub_100381ad0看看,看到了经过混淆的函数
0000000100381aeb call _O7RH3WAr7wAQMdz5Xv
Kevlar
的函数是经过混淆的,函数体与DevMateKit
Demo中的对比,确定是下面的函数:
//! Checks if applicaion activated
#define DMKIsApplicationActivated PfCuPgJSp5KVlvc8W1
FOUNDATION_EXTERN BOOL DMKIsApplicationActivated(DMKevlarError *outKevlarError);
果断把error置空,return YES:
_O7RH3WAr7wAQMdz5Xv:
00000001005a4e90 cmp rdi, 0x0
00000001005a4e94 je 0x1005a4ea2
00000001005a4e96 mov qword [rdi], 0x0
00000001005a4e9d add eax, 0x20b716 ;为了不破坏结构,保留了原来的这条指令
00000001005a4ea2 mov rax, 0x1
00000001005a4ea9 ret
重签名,破解成功!
网友评论