消去Reveal购买提示框

原文链接:https://www.chenghu.me/?p=1230

如需转载,请注明: 本文来自:小虎的开发笔记
作者:小虎 2014-05-21

———————————-
5月22日更新
今天更新了Reveal1.0.4版本
看了下
整体思路不变,只不过地址变化了
0x0000000100095f56 4B833C2600 cmp qword [ds:r14], 0×0
0x0000000100095f5b 740F je 0x100095f6c
即把 地址95f5b 的74改为75
即可以达到同样的效果
————————————

Reveal真的很好用,文章只记录自己第一次尝试逆向OSX App的过程,仅做技术交流,建议大家购买Reveal正版,大家都是做软件开发的,还是要尊重别人的劳动成果。

今天在分析一个iOS App的时候发现自己的Reveal(1.0.3版本)过了30天试用期,只能购买或退出。

记得以前看过别人分析Reveal的文章《破解Revealapp的试用时间限制》,看评论好像没有效果,然后作者给了一个 注册机,结果下来以后只能在OSX10.9上运行,办公电脑上还是10.8系统,悲剧。
把 注册机 丢Hopper中看了一下

主要替换了4个地址的内容,本来想手动修改一下这4个地址的内容
想想刚看完《iOS应用逆向工程》,不如自己手动调试一下。
说干就干。
备份一下目录/Applications/Reveal.app/Contents/MacOS/下的Reveal
然后Dump出来所有的.h文件,已做备用。
然后把Reveal丢到Hopper中,搜索一下关键字“expired”(弹出的模态对话框中的内容)

发现了3条提示文案,然后紧接着上面有一个 “IBATrialModeReminderWindowController”好像比较像,字面的意思也是试用提醒的弹窗
去看一下这个文件的.h文件

看到几个方法

  • (void)purchaseRevealButtonPressed:(id)arg1;
  • (void)continueTrialButtonPressed:(id)arg1;
    应该可以确认这个view应该就是弹出来的提示框
    那么怎么可以阻止这个view创建呢?
    这个view居然没有init方法,不过很快发现一个类方法
  • (id)controller;
    应该是创建该view的方法吧。
    我们只能借助GDB来动态调试一下了

    在Hopper中看一下IBATrialModeReminderWindowController的controller方法的起始地址是0x100092f90

    在GDB中下个断点,然后跑起来

    然后就是si的走,想想我只需要知道回调到哪就好,那不如直接在结束的地方下断点
    (gdb) break *0x100092fbb
    然后继续si,让程序飞一会
    然后看地址终于飞回来了,到了0x0000000100094da6这个地址

    去Hopper里面看一下,0x0000000100094da6这个地址是干啥的

    来到了IBATrialModeReminderPresenter类的showTrialModeSheetForWindow_canDelayContinue方法
    看一下c代码

    这个地方主要判断了rdi的内容是否等0x0,else的内容里是创建这个提示的模态对话框,那如果走if的部分呢?
    改一下代码跑一下试试
    0x0000000100094d66 4B833C2600 cmp qword [ds:r14], 0×0
    0x0000000100094d6b 740F je 0x100094d7c
    把地址100094d6b的74改成75
    然后运行一下Reveal

    没有弹对话框,页面右侧还是“Free trial has ended”
    手机上开个程序试试,看看功能还能否用

    可以使用了,好了继续回去调程序了。

主要今天着急使用,后面有时间的话看看能不能找一下注册流程。

本人小白一枚,大牛勿喷。

1 个赞

感谢楼主,试一试

有2个疑问请教楼主啊:1)“想想我只需要知道回调到哪就好,那不如直接在结束的地方下断点” 这个是为什么?2)“地址100094d6b的74改成75”,为啥74改75就走if部分呢?

问题1,比如
方法1{
方法2{

}
}

这种调用,在方法2结束后,就会到了方法1中

问题2,
74在汇编里是je
75在汇编里是jne
je等价相等调转
jne等价不相等跳转

不知道我说的你明白了吗,还没明白的话,可以继续留言

这里的74是“740F”吧,“704F”这里是偏移地址么,74是je??

是的,整行的话是 740F改为750F,不是偏移,是汇编代码74 就是 je

正好请教下,汇编语言“740F”这一栏,是神马意思啊

740F 的意思就是 je 0x100094d7c
就是如果上面的条件相等,就跳转到0x100094d7c地址继续执行
如果不相等就往下执行

我没问清楚,je 0xxxx这个条件跳转指令我是知道的,最左边的是虚拟地址 中间“740f”这一列不知道啥意思,有什么用?

74是机器码,转成汇编就是je
0f就是往下f个地址的那句汇编的地方

我这边修改后,重新启动会报错:Insecure update error,不知道楼主有没有碰到过这个问题以及怎样绕过mac签名失败提示框的?请教下。

是不是修改了程序的签名?我改了后就可以直接用了,没出现其他的提示

先mark一下

飞一会 (si指令),是输入完si之后一直按回车么???

是的,GDB和LLDB里如果只输入回车,默认执行上一条指令,即这里的step instruction

您好,
我把Reveal加载进Hopper后,是这样的:

                                     ; Basic Block Input Regs: rax rsp -  Killed Regs: rdx rbp rsi rdi
                                            methImpl_static_IBATrialModeReminderWindowController_controller:
0000000100094180 55                              push       rbp
0000000100094181 4889E5                          mov        rbp, rsp
0000000100094184 488D35C5050A00                  lea        rsi, qword [ds:objc_msg_alloc] ; @selector(alloc)
000000010009418b FF15BF050A00                    call       qword [ds:objc_msg_alloc]     ; @selector(alloc)
0000000100094191 488B3528B40900                  mov        rsi, qword [ds:objc_sel_initWithWindowNibName_] ; @selector(initWithWindowNibName:)
0000000100094198 488D15B9010B00                  lea        rdx, qword [ds:cfstring_IBATrialModeReminderWindowController] ; @"IBATrialModeReminderWindowController"
000000010009419f 4889C7                          mov        rdi, rax
00000001000941a2 FF15F8910600                    call       qword [ds:imp___got__objc_msgSend]
00000001000941a8 4889C7                          mov        rdi, rax
00000001000941ab 5D                              pop        rbp
00000001000941ac E991C30000                      jmp        imp___stubs__objc_autoreleaseReturnValue
                        ; endp

分别在 0000000100094180  和  00000001000941ab 处下断点,之后一直si执行,结果一直回不来了,si结果显示是:
0x00007fff8f483bcc in ?? ()
(gdb) 
0x00007fff8f483bcf in ?? ()
(gdb) 
0x00007fff8f483bd4 in ?? ()
(gdb) 
0x00007fff8f483bd7 in ?? ()
(gdb) 
0x00007fff8f483bda in ?? ()
(gdb) 
0x00007fff89abef96 in ?? ()
(gdb) 
0x00007fff89abef98 in ?? ()
(gdb) 
0x00007fff89abef9e in ?? ()

一直显示诸如上面这样
,请问您是怎么回事?多谢

看起来是程序流程跑到另一个image里去了,但也有可能是gdb的bug。你换lldb试试,或者爱特一下楼主

多谢多谢

@zoom 麻烦您帮忙看看啊?

用XCode4.6下带有的和楼主一样的GDB版本调试,能显示出来诸如:0x00007fff89abf1da in pthread_rwlock_unlock ()
(gdb)
0x00007fff89ac00f2 in dyld_stub_OSAtomicCompareAndSwap32Barrier ()
(gdb)
0x00007fff8f483bac in OSAtomicCompareAndSwapIntBarrier$VARIANT$mp ()
(gdb)
0x00007fff8f483bae in OSAtomicCompareAndSwapIntBarrier$VARIANT$mp ()
(gdb)
0x00007fff8f483bb2 in OSAtomicCompareAndSwapIntBarrier$VARIANT$mp ()
(gdb)
0x00007fff8f483bb5 in OSAtomicCompareAndSwapIntBarrier$VARIANT$mp ()

感觉应该进入其他线程,一直si就回不来了
,您知道这个怎么解决比较好么?多谢:)

在你想要停下来的进程里下个断点,我举个例子:

断点1
si之后不知道跑哪里去了 // 下了断点2后,直接c
断点2 // 你需要这个