PDF Expert 2.4.8 无限试用

最近公司坑了,失业了,面了几家都不怎么合适,闲来无事就折腾折腾……

试用了一下 PDF Expert 这个东东,功能很不错,7天试用过期了,想着继续试用,下面简单说一下修改方法。

Hopper分析和配合LLDB动态调试了一下,发现sub_1003acf40这里的函数很关键。

可以搜索DMTrialIsTrialInitialized定位引用的地方找到这个函数:

                     sub_1003acf40:
00000001003acf40 push rbp ; CODE XREF=sub_10008be60+111, sub_10008be60+159, sub_10008be60+351, sub_10008be60+403, sub_1000955f0+122, sub_1000955f0+170, sub_1000955f0+306, sub_1000955f0+354, sub_100096720+143, sub_100096720+191, sub_100096720+661, …
00000001003acf41 mov rbp, rsp
00000001003acf44 push rbx
00000001003acf45 push rax
00000001003acf46 movabs rax, 0x7fffffffffffffff
00000001003acf50 mov qword [rbp+var_10], rax
00000001003acf54 lea rdi, qword [rbp+var_10] ; argument #1 for method _O7RH3WAr7wAQMdz5Xv
00000001003acf58 call _O7RH3WAr7wAQMdz5Xv
00000001003acf5d movzx edi, al
00000001003acf60 call sub_1006fc530
00000001003acf65 test al, 0x1
00000001003acf67 je loc_1003acf74

00000001003acf69 mov rcx, qword [rbp+var_10]
00000001003acf6d mov al, 0x3
00000001003acf6f test rcx, rcx
00000001003acf72 je loc_1003acfc0

loc_1003acf74:
00000001003acf74 mov rax, qword [objc_ivar_offset__TtC10PDF_Expert23UserActionvationManager_secondTrial] ; CODE XREF=sub_1003acf40+39
00000001003acf7b mov rbx, qword [r13+rax]
00000001003acf80 test rbx, rbx
00000001003acf83 jne loc_1003acfa0

00000001003acf85 mov rax, qword [objc_ivar_offset__TtC10PDF_Expert23UserActionvationManager_customController]
00000001003acf8c mov rdi, qword [r13+rax] ; argument "instance" for method imp___stubs__objc_msgSend
00000001003acf91 mov rsi, qword [0x1008c73b0] ; @selector(trialObject), argument "selector" for method imp___stubs__objc_msgSend
00000001003acf98 call imp___stubs__objc_msgSend
00000001003acf9d mov rbx, rax

loc_1003acfa0:
00000001003acfa0 mov rdi, rbx ; CODE XREF=sub_1003acf40+67
--> 00000001003acfa3 call imp___stubs__DMTrialIsTrialInitialized
00000001003acfa8 movzx edi, al
00000001003acfab call sub_1006fc56c
00000001003acfb0 test al, 0x1
00000001003acfb2 je loc_1003acfbe

00000001003acfb4 mov rdi, rbx
00000001003acfb7 call imp___stubs__DMTrialGetTrialState
00000001003acfbc jmp loc_1003acfc0

loc_1003acfbe:
00000001003acfbe xor eax, eax ; CODE XREF=sub_1003acf40+114

loc_1003acfc0:
00000001003acfc0 add rsp, 0x8 ; CODE XREF=sub_1003acf40+50, sub_1003acf40+124
00000001003acfc4 pop rbx
00000001003acfc5 pop rbp
00000001003acfc6 ret

主要是让这个函数返回1就可以继续试用了,看一下Hopper的线框流程图发现有两条路径走到返回,于是都修改返回值为1,可以这样改:

不想写汇编代码的话,可以切换到Hex模式把:

48 89 DF E8 F8 EF 34 00 EB 02 31 C0 48 83 C4 08

改成:

48 89 DF B0 01 90 90 90 EB 02 B0 01 48 83 C4 08

Produce New Executable之后,运行会弹出Keychain访问密码的窗口,这个是因为签名不受信任(Hopper去掉签名了)导致的,输入密码即可。

另外还弹出下面这个,也是因为签名不同导致的:

终端先cd /Applications/PDF Expert.app/Contents,然后grep搜索下Insecure update,结果:

dark-xps:Contents darkhandz$ grep -r 'Insecure update' .
Binary file ./Frameworks/DevMateKit.framework/DevMateKit matches
Binary file ./Frameworks/DevMateKit.framework/Versions/A/DevMateKit matches
Binary file ./Frameworks/DevMateKit.framework/Versions/Current/DevMateKit matches
Binary file ./Frameworks/Sparkle.framework/Sparkle matches
Binary file ./Frameworks/Sparkle.framework/Versions/A/Sparkle matches
Binary file ./Frameworks/Sparkle.framework/Versions/Current/Sparkle matches

两个Framework都很可疑,先从上面的开始吧。

用Hopper分析一下DevMateKit,搜索字符串Insecure update,发现是和SUUpdater这个类有关,于是回到PDF Expert继续分析。

搜索SUUpdater,类名是objc_cls_ref_SUUpdater,寻找引用,逐步深入会发现Expert11AppDelegate checkForUpdates这个方法会调用它:

直接ret就行了,Hex模式把55C3

还有checkForUpdatesInBackground的调用也要干掉:

objc_msgSend的call干掉:

E8 EC 90 27 00 48 89 DF E8 FC 90 27 00

改成:

90 90 90 90 90 48 89 DF E8 FC 90 27 00

就不会跳出来了。

后来发现偶尔还是会跳,就是另一个叫Sparkle的,找到updateSparkleFeedURLAccordingToSettings函数,直接ret掉。

改完就一直剩余7天试用了:

上述文字仅供学习研究,不提供任何二进制文件,不用于商业用途。