ios 开发日记 23 - Reveal使用步骤

一.Reveal使用步骤

1.启动Reveal --> Help --> Show Reveal Library in Finder,拖动添加Reveal.framework到工程中。
选中 Copy items into destination group‘s folder (if needed)以及当前的targets。
展开查看Reveal.framework中所有h文件都正确加入工程中;

确保Summary--> Linked Frameworks and Libraries目录下,包含以下三个framework
Reveal.Framework
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework

2.TARGETS中设置命令
TARGETS --> Settings --> Other Linker Flags -->添加命令 -ObjC

3.由于Reveal只支持iOS6,所以程序的最低适配版本要选择为iOS6.1
Bulid Setting --> iOS Deployment Target -->iOS6.1

4.运行程序,切换到Reveal,左上部分下拉框选择当前运行的程序就可以操作了。

如果还不行直接去看官网的教程吧!
http://support.revealapp.com/kb/getting-started/integrating-reveal-with-your-ios-app

破解Revealapp的试用时间限制

原文地址:http://jingwei6.me/2014/02/28/reveal_crack.html

Revealapp作为分析iOS app UI结构的利器,还是非常称手的,89刀的价格也是物有所值。本文分析其试用版时间限制,只是用于学习,如果一直用,还是买个licence支持一下吧。

试用版有30天的时间限制,既然是30天时间限制,肯定每次启动是要读当前时间的啰。所以最简单的hack方法就是修改系统时间。如果这种方法可以接受,就不用往下看了。

如果你的工作严重依赖于Calendar,那么修改系统时间的方法就是不可以接受的。下面的追踪过程包含了对双精度浮点数在内存中的表示、ObjC对象模型等问题的讨论,如果不感兴趣可直接跳到文末查看最终的解决方案。

开始的尝试

用dtruss看了下启动时调用的syscall,是没有网络通讯的,说明app的安装时间不可能是从网络读下来的,那么这个时间肯定是写在本地的文件系统。

用opensnoop看了下启动时Reveal读过的所有文件,没有值得注意的地方。最后的发现证实这个思路忽略了一个问题,一个app读的文件并不一定是它自己打开的,可以是进程间通信。

这些简单的尝试失败后,就只能老老实实的分析代码了。

从关键字开始

试用版的Reveal有提醒试用剩余时间的信息在窗口的右上角”Free trial ends in xx days”(我觉得这不是一个好的设计,这句话似乎时刻挑衅着使用者:“来呀,你来hack我呀”)。“trial”是我感兴趣的关键字,除了在数据段肯定能找到这个关键字以外,说不定在ObjC的运行时类型系统中还能有意外的收获。果真,Reveal没有对类型信息进行模糊处理,在class-dump生成的头文件中发现了:
-[IBARegistrationPreferencesViewController messageForTrialDaysRemaining:(long long)arg1] 
从函数名来看它应该就是生成试用剩余时间字符串的。

上GDB,单步跟踪,

0x000000010008bd34 push rbp 
0x000000010008bd3f move rbx, rdx ; rdx 就是还剩下的试用天数,也就是函数的参数arg1

以此为突破口,发现下面的小段代码。

0x00000001000872cd call 0x100086ec2 
0x00000001000872d2 mov rcx, rax ; rax中是上面函数返回的已过去的天数 
0x00000001000872d7 mov eax, 0x1e ; 0x1e=30 30天的限制 
0x00000001000872dc sub rax, rcx ; 30减去已经过去的天数的,减出来就是还剩下的天数

再往下走,需要分析的数据不再像是“天数”这样的整数,而是像软件安装日期NSDate这样的对象,特征不明显。所以就有必要清楚NSDate这个对象中日期的表示方法。

内存中的NSDate对象

NSDate对象应该有两个域,第一个“isA”是所有ObjC对象都有的类型指针,指向NSDate类型对象。第二个是个双精度浮点数,表示从2001年1月1日到现在的时间间隔,单位是秒。

pointer: isA
double: _timeIntervalSinceReferenceDate

其实isA指针就是NSDate对象的特征,所有的NSDate对象都是以相同的8个字节开始。第二个域是一个浮点数,分两步把它转换为一个日期。

第一步,十六进制浮点数转换为十进制

双精度浮点数由8个字节构成,1个bit表示符号,11个bit表示指数,剩下的52位用来表示底数。
使用python可以方便的把8字节的十六进制浮点数转换为十进制数:
struct.unpack(‘<d‘,‘c3b72c7a9ebfb841‘.decode(‘hex‘))[0]

在gdb中,可以直接使用命令 
p *(double*)(NSDate指针地址+8)

第二步,秒数转换为日期

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:415285808.20822901]; 
NSLog(@"\n%@", date);

使用上面的方法,可以在跟踪汇编代码的时候检查内存中的NSDate对象,以及它所表示的日期。(这需要点耐心)

最终,安装Reveal的时间第一次出现在内存中的位置被找到,这个位置所在的函数显然负责把存在文件某处的一个magic number转换为软件安装日期。

但是意料之外的是,这个想像中的magic number并不magic,它仅仅是存在user default的plist文件中的一项,而且就是安装日期的双精度浮点数的十六进制表示。

结论

所以,要想永久试用Reveal,只需要打开

~/Library/Preferences/com.ittybittyapps.Reveal.plist

把IBAApplicationPersistenceData这一项删除就是了。

时间: 2024-10-07 05:56:51

ios 开发日记 23 - Reveal使用步骤的相关文章

ios 开发日记 13-剖析网易新闻标签栏视图切换(addChildViewController属性介绍)

iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍) 时间 2014-06-25 21:45:21  CSDN博客 原文  http://blog.csdn.net/hmt20130412/article/details/34523235 主题 网易iOS开发 本来只是打算介绍一下addChildViewController这个方法的,正好今天朋友去换工作面试问到网易新闻标签栏效果的实现,就结合它,用个小Demo实例介绍一下:(具体解释都写在了Demo里

iOS开发日记31-Block终极篇

今天博主有一个Block的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 1.什么是Block      Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 2.在iOS开发中,什么情况下使用Block      Block除了能够定义参数列表.返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态.此

iOS开发日记26-详解时间戳

今天博主有一个时间戳的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. iOS开发中,我们在很多情况下都会遇到使用当下时间作为参数的情况,这称之为时间戳.在iOSSDK中,与时间戳相关的API主要有三个,NSDate,NSCalendar和NSDate?Components. NSDate 就是一个绝对的时间,可以换算成相对1970s的时差. NSCalendar 顾名思义就是日历,封装了系统如何按照年月日的方式来组织时间,组织时间的方式和地区,时区有很大关系. NSDate?Comp

iOS开发日记16-动画Animation

今天博主有一个动画Animation的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. iOS开发中的动画分为两种:一种为UIView动画,又称隐式动画,动画后frame的数值发生了变化.另一种是CALayer动画,又称显示动画,动画后模型层的数据不会发生变化,图形回到原来的位置.但是在实际开发中,因为UIView可以相应用户交互,所以UIView动画用的多. 一.UIview的动画 1.实现方式:动画块,block begin //设置动画效果  修改属性值,动画时长等等 conmm

iOS开发日记30-Autolayout

今天博主有一个Autolayout的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 1 .概述 在以前的 iOS 程序中,是如何设置布局 UI 界面的? (1)经常编写大量的坐标计算代码 (2)为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还需要分别为2种屏幕编写不同的坐标计算代码(即传说中的“屏幕适配”) 什么是 Autolayout ? (1)Autolayout是一种“自动布局”技术,专门用来布局UI界面的 (2)Autolayout自iOS

iOS开发日记22-CocoaPods

今天博主有一个CocoaPods的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. CocoaPods是一个第三方库的管理工具,在团队开发时,不建议大家使用CocoaPods,但是在独立开发时,十分推荐. 安装CocoaPods,我们首先需要FQ. 在终端敲入 $ gem sources --remove https://rubygems.org/ 等有反应后再敲入 $ gem sources -a http://ruby.taobao.org/ 然后测试下是真的可以了么,敲入 $ g

ios开发日记11 对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的. AD: tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,

iOS开发日记44-图片及处理

今天博主有一个图片及处理的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 图片通常是移动端流量耗费最多的部分,并且占据着重要的视觉空间.合理的图片格式选用和优化可以为你节省带宽.提升视觉效果. 几种图片格式简介: 1.静态图片的编码与解码 JPEG PNG WebP BPG 2.动态图片的编码与解码 GIF APNG WebP BPG 首先谈一下大家耳熟能详的几种老牌的图片格式吧: JPEG 是目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格式.它只支持有损压缩,其压缩

iOS开发日记43-XCode7免证书真机调试

今天博主有一个XCode7免证书真机调试的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 在Xcode 7中,苹果改变了自己在许可权限上的策略,此前Xcode只开放给注册开发者下载,但Xcode 7改变了这种惯有的做法,无需注册开发者账号,仅使用普通的Apple ID就能下载和上手体验. 此前开发者需每年支付99美元的费用成为注册开发者才能在iPhone和iPad真机上运行代码,苹果新的开发者计划则放宽要求,无需购买,只要你感兴趣同样可以在设备上测试app. 操作步骤: 1.进入xc