破解《PDF Expert》

Reveal简介

PDF Expert是一款超简单的PDF编辑器。

破解过程

PDF编辑后,command + x保存,弹出购买完整版的窗口:

1339727-aacc08545c2a53c5.png
购买完整版本

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啥也没干
1339727-b111c45586514b19.png
sub_1003febb0流程图
                     sub_1003b1c70:
00000001003b1c70         mov        eax, 0x1
00000001003b1c72         ret

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


1339727-c40495b94b55c083.png
sub_1003b1c70流程图

返回值是由r12d传递到eax,影响寄存器r12的,也就图中黄色的几个地方。
r12初始值为0x1,sub_100381ad0的返回值不等于0x3,才有可能改变r12的值。
进sub_100381ad0看看,看到了经过混淆的函数

0000000100381aeb         call       _O7RH3WAr7wAQMdz5Xv

Kevlar的函数是经过混淆的,函数体与DevMateKitDemo中的对比,确定是下面的函数:

//! 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

重签名,破解成功!

猜你喜欢

转载自blog.csdn.net/weixin_33910137/article/details/87019187