逆向[01]--破解wormhole

wormhole是一个比较新的iOS/安卓手机投屏软件,特点是可以实现电脑控制苹果手机的功能,这个功能其他投屏软件是不支持的。

一、环境

操作系统:Hackintosh 10.15.6

使用工具:

二、分析

软件本身是免费的,但是限制了两个功能,iOS投屏和多开投屏,需要购买pro版本才可以使用。

将文件拖入hopper,首先从字符串入手,str搜索buy now

查看一下references,看到了sub_10001d490这个函数,多次出现ChoosePlatformWidget。

搜索active,有一个is_active,ref后跳到__ZN20ChoosePlatformWidget19CheckActiveResponseEP12ResponseData,这个一看就像验证激活是否成功,response就是服务端给我们发的内容,Charles抓包验证一下,果然在使用pro功能时他会请求服务器验证激活状态。

顺便看下ChoosePlatformWidget这个类都有什么方法

看到了checkactive,checkactivesuccess这些敏感信息

这样为我们提供了两条思路

  1. 绕过checkactive,直接实现pro功能
  2. 修改checkActiveResponse,让其判断为激活过

这里介绍思路2,第一条我试过需要破解两处ios和多开处绕过,具体方法暂不介绍了。

看一下checkactivesuccess的引用,一个是checkActiveResponse,另一个是DoActiveResponse

lldb在checkActiveResponse下断点,只要使用pro功能就会触发断点,所以没猜错的话checkactive,doactive,一个是检查成功一个是激活后成功,我们不需要激活他,因为checkactive成功后就可以使用pro功能了,doactive不需要。

再分析下checkActiveResponse,看到这里调用了checkactivesuccess

根据图进行分析,往上翻了好久看到关键跳转

一边是处理很多后的checkactivesuccess,一边是__ZN20ChoosePlatformWidget14ShowActivePageEv,当然要进success了。

三、破解

lldb在这里下断点 b 0x10001aa60

触发断点,查看下bl寄存器,re read bl ,返回0x00

改成1阻止跳转,re write bl 1

继续 c

lldb完整内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Last login: Tue Aug 18 10:50:38 on ttys004
Welcome to fish, the friendly interactive shell
⋊> ~ lldb /Volumes/Wormhole/Wormhole.app/Contents/MacOS/Wormhole 10:54:05
(lldb) target create "/Volumes/Wormhole/Wormhole.app/Contents/MacOS/Wormhole"
Current executable set to '/Volumes/Wormhole/Wormhole.app/Contents/MacOS/Wormhole' (x86_64).
(lldb) run
Process 24114 launched: '/Volumes/Wormhole/Wormhole.app/Contents/MacOS/Wormhole' (x86_64)
2020-08-18 10:54:13.903662+0800 Wormhole[24114:471239] flock failed to lock maps file: errno = 35
2020-08-18 10:54:13.904696+0800 Wormhole[24114:471239] flock failed to lock maps file: errno = 35
2020-08-18 10:54:14.518369+0800 Wormhole[24114:471199] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x124baea40> F8BB1C28-BAE8-11D6-9C31-00039315CD46
2020-08-18 10:54:14.565026+0800 Wormhole[24114:471199] HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
2020-08-18 10:54:14.565509+0800 Wormhole[24114:471199] HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
2020-08-18 10:54:14.565859+0800 Wormhole[24114:471199] HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
Process 24114 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x00007fff6efb3dfa libsystem_kernel.dylib`mach_msg_trap + 10
libsystem_kernel.dylib`mach_msg_trap:
-> 0x7fff6efb3dfa <+10>: retq
0x7fff6efb3dfb <+11>: nop

libsystem_kernel.dylib`mach_msg_overwrite_trap:
0x7fff6efb3dfc <+0>: movq %rcx, %r10
0x7fff6efb3dff <+3>: movl $0x1000020, %eax ; imm = 0x1000020
Target 0: (Wormhole) stopped.
(lldb) b 0x10001aa60
Breakpoint 1: where = Wormhole`ChoosePlatformWidget::CheckActiveResponse(ResponseData*) + 736, address = 0x000000010001aa60
(lldb) c
Process 24114 resuming
Process 24114 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x000000010001aa60 Wormhole`ChoosePlatformWidget::CheckActiveResponse(ResponseData*) + 736
Wormhole`ChoosePlatformWidget::CheckActiveResponse:
-> 0x10001aa60 <+736>: testb %bl, %bl
0x10001aa62 <+738>: je 0x10001aaf5 ; <+885>
0x10001aa68 <+744>: leaq -0x60(%rbp), %rdi
0x10001aa6c <+748>: leaq -0x98(%rbp), %rsi
Target 0: (Wormhole) stopped.
(lldb) re read bl
bl = 0x00
(lldb) re write bl 1
(lldb) c
Process 24114 resuming
2020-08-18 10:55:41.952721+0800 Wormhole[24114:471199] Current os version:10.15.5


发现破解成功,pro功能能用了,手机验证一下,没问题

所以要想跳转到成功,反转下跳转指令就可以了,修改汇编指令,je替换为jne

je->jne

由于hopper是demo版本,不能输出二进制,不过我们能查看修改内容,红色部分就是。

使用hex fiend进行二进制修改,将8D 00 00 00 48 8D 7D A0 48 8D B5 68 FF FF FF E8 74 15 0D 00 48 8D 3D 3D AF F7 00 BE 07 00 00 00前面的值修改成85即可

保存后就可以使用了。至此破解成功,验证功能皆正常使用,对比一下,也就是4变成了5。