转载自: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这一项删除就是了。

后记

有同学留言说上面的方法不起作用,于是叽歪刘写了个注册机

注册机是用10.9的SDK编译的,在Reveal1.0.3(2287)上测试通过。

下载解压后,用右键的“打开”菜单运行程序。亲,叽歪刘只能帮你到这里了。

破解Revealapp的试用时间限制的更多相关文章

  1. Reveal使用步骤和 破解Revealapp的试用时间限制

    下载地址:http://pan.baidu.com/s/1eQstR2M 一.Reveal使用步骤 1.启动Reveal --> Help --> Show Reveal Library ...

  2. Latex 4: WinEdt 10试用时间限制的破解+注册码激活

    方法1:我发现这个方法1,现在(2018.06.05)在winedt 10.2上已经不能用了,在低版本(10.1及以下版本)上还可以用,所以如果方法1不行,请看方法2. WinEdt 是目前我发现最好 ...

  3. 非Navicat破解延长14天试用时间

    延长Navicat使用时长 Navicat作为一套多连接数据库开发工具,十分好用,购买正版太过昂贵,破解版过于麻烦,有时候还会有安全问题,好在我们有14天的试用时间,我们可以从这个方面入手 对于有能力 ...

  4. 破解SQLYog30天试用方法

    开始-运行-regedit ,进入注册表,在 \HEYK_CURRENT_USER\Software\{FCE28CE8-D8CE-4637-9BC7-93E4C0D407FA}下的InD保存着SQL ...

  5. Linux 下 UltraEdit 版本 破解 30 天试用限制

    原创 http://yhz61010.iteye.com/blog/2319599 rm -rfd ~/.idm/uex rm -rf ~/.idm/*.spl rm -rf /tmp/*.spl 一 ...

  6. reveal

    链接 界面调试工具Reveal Reveal使用教程 iOS分析UI利器——Reveal及简单破解方法 Reveal使用步骤和 破解Revealapp的试用时间限制 end

  7. JIRA笔记(一):安装部署JIRA

    (一)     说明 说明JIRA的安装及破解. 操作系统:WIN 10 数据库:Oracle 12C R2(这个版本的jira,atlassian建议的是 12C R1,不过R2也能用,其他版本不清 ...

  8. 破解UltraEdit(Ver20.00.0.1040),无限试用

    因为是第一次破解较大型的商业软件,所以有必要记录一下,另外UE的价格也实在太贵了... 第零步:准备 准备好破解常用软件.我常用的工具有IDA(用于静态分析).Ollydbg(动态调试).PEiD(用 ...

  9. 也谈.Net中间语言——破解Delphi2CS行数和时间限制

    其实我一直在研究将Delphi版的传奇2源代码使用C#实现,不过由于我并没有学习过Delphi.就只能说先试着用一些工具转换代码. 后来我在网上找到了一款软件:Delphi2CS.这款软件比较强大,虽 ...

随机推荐

  1. Azylee.Utils 工具组

    https://github.com/yuzhengyang/Fork Fork 是平时做 C# 软件的时候,整合各种轮子的一个工具项目,包括并不仅限于:各种常用数据处理方法,文件读写 加密 搜索,系 ...

  2. Visual Studio格式化所有文档

    1.下载 Format All Files 2. 格式化指定类型的文件 说明: Enable Remove and Sort Usings:移除未使用过的引用+排序引用 Exclusion Patte ...

  3. 兼容IE浏览器保存Cookie

    兼容IE:Response.Cookies[":member"].Expires=DateTime.Now.AddDays(1); 其它浏览器:Response.Cookies[& ...

  4. 14 (H5*) JS第4天 函数、作用域、预解析

    目录 1:函数的其他定义 2:函数作为参数 3:函数作为返回值 4:作用域 5:作用域链 6:预解析 7:预解析分段 复习 <script> /* * 复习: * 函数:把一些重复的代码封 ...

  5. Node.js实战7:你了解buffer吗?

    Buffer是NodeJS的重要数据类型,很有广泛的应用. Buffer是代表原始堆的分配额的数据类型.在NodeJS中以类数组的方式使用. 比如,用法示例: var buf = new Buffer ...

  6. web 前端2 html css一些小问题技巧

    html css一些小问题技巧 1 对于儿子块float后,父亲块如果没内容就不见了,如何让父亲块依然跟随飘起了的儿子块撑起来呢?? 用到的属性after方法  公共方法作为继承即可. 1.1  方法 ...

  7. How to increase timeout for your ASP.NET Application ?

    How to increase timeout for your ASP.NET Application ? 原文链接:https://www.techcartnow.com/increase-tim ...

  8. Maven构建Struts2框架的注意事项

    [本人出错点:404,就是在web.xml配置文件中少配置了struts.xml的路径] 1.创建Maven,搭建Struts框架,实现最基本的Hello World 在pom.xml中加入strut ...

  9. union,union all, Intersect和Minus [转]

    Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...

  10. C# String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)

    原文:http://blog.csdn.net/wushang923/article/details/7527499 注意点:切换方法的时候要注意返回值引起的变化!!! 1.Compare会通过传递进 ...