Sketch!一次悸动的小逆向尝试

Posted iOS大全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sketch!一次悸动的小逆向尝试相关的知识,希望对你有一定的参考价值。

来源:Uri(@Urinx )   

链接:http://www.jianshu.com/p/9a1d4924103e


丙戌月 癸酉日


故事从一开始应该是这样的:最近一直在使用Sketch,然而呢,直到某一天弹出这个着实让我惊叹不已:



想着今天是1024专属日,于是乎上官网看看然而发现并没有限免,万年不变的价格也是出奇的合理,99美元能买到这样一款优秀到超出想象,好用到违反广告法的软件真的是赚到了。


Sketch!一次悸动的小逆向尝试


看看还有没有其它类似的App,要不找找看有木有破解版?故事的结尾刚要如此,然而笔锋一转,情节立马一波三折,没想到用盗版软件的也会有自己破解软件的今天-_-||。因为最近刚看完了一些ios逆向开发的书,奈何没有越狱的设备,只好在OS X上练练手。正所谓道法自然,虽平台,工具不同,但内功都是一样的。


不忍直视的弹窗


现在先让我们为这个万恶的弹窗默哀一分钟,接着就开始仔细关注分析一下有哪些入手点。仔细一看就会发现,那个welcome界面依然还在的,也就是说主程序仍然是可以使用的,只是在其上多出了一个如下图的提示注册的弹窗,获取了当前的焦点,以至于我们无法进行其他的操作。


Sketch!一次悸动的小逆向尝试


所以我们的任务很简单啦,要么在register上做文章,弄清楚注册流程和算法(第一次我就不要不要试这个了,顿时压力好大);要么在quit按钮上做文章,使其只关闭弹窗但不退出整个程序;或者在判断是否Trial Expired的过程中做手脚;最后,还有最简单的,但是却不优雅的,就是直接去掉弹窗就好了。


工具嘛,IDA或Hopper Disassembler按自己的喜欢就可以了,这里我就用Hopper Disassembler就可以了。开始前也可以class dump一下头文件看看,会有助于后面的分析,这里我就不用了。


那就开始咯


进入Sketch.app目录,找到Sketch二进制文件把它丢进Hopper里然后坐等分析,分析完后如下图:


Sketch!一次悸动的小逆向尝试


Hopper这个软件很强大,不过是收费的,但提供免费试用的,试用版的每30分钟会退出一次(咳咳,用自己来破解自己,想想就可怕)。


我们在左边搜索一下弹窗出现的相关关键字Trial:


Sketch!一次悸动的小逆向尝试


从字面上,我们一眼就能看出每个类每个方法的作用,其中BCTrialCountdown这个类我猜就是负责计算剩余试用天数的,里面的trialPopUpWithNumberOfDays方法应该就是那个不厌其烦每次弹出提示我们还有多少天过期。


而BCTrialExpiredWindowController应该就是我们要找的弹窗的controller,有show,quit,visitStore,registerLicense等方法,嗯,没错,就是它了。这样我们就很快定位到相关函数了。


下面我们来仔细看看show方法的汇编代码:


Sketch!一次悸动的小逆向尝试

Sketch!一次悸动的小逆向尝试

Sketch!一次悸动的小逆向尝试

Sketch!一次悸动的小逆向尝试


其实也没什么可看的,看最后的一个call,传给_objc_msgSend的两个参数,一个是自身的实例,另一个是runModalForWindow的selector,也就是说这里才弹出窗口:


Sketch!一次悸动的小逆向尝试


你可以下个断点确认下,我已经确认了,也就是说,在0x1002aa7a6处将这个call r12置成nop不让它调用就可以了。


Sketch!一次悸动的小逆向尝试


这样弹窗就不会出现了。到这里,尽管目的达到了,可是感觉不怎么优雅,明明是考验开锁技巧的,却偏偏用锤子直接把锁砸开了。尽管我现在做不到写注册机这种地步,可是还是让我们把修改还原,还是再多看看吧。


代码辣么长,我想再看看


上面我们是粗鲁的破坏掉了BCTrialExpiredWindowController的show方法,使其失去了弹窗的作用。与其破坏,还不如不让其调用。我们找找看看是在哪调用的。


Sketch!一次悸动的小逆向尝试


可以看到,从0x1002a8834处开始调用BCTrialExpiredWindowController的show方法,往上看看这个sub procedure整体:


Sketch!一次悸动的小逆向尝试


整体上这样看就很明白了,0x1002a87f2到0x1002a8832这段是判断是否有license,如果有,就跳转到0x1002a884c处,然后返回,如果不正确,就往下到0x1002a8834调用BCTrialExpiredWindowController的show方法弹窗。这样也表明了0x1002a87e7的test是用来判断是否过期,过期的话就跳转去判断是否有license。


看懂了这里,我们就只用修改cmp r14, 0x1这句为cmp r14, 0x0,然后就能无限使用了,这比之前的是不是更好一些呢。


Sketch!一次悸动的小逆向尝试


然后Shift+Cmd+E将其保存为二进制文件,将原来的二进制文件备份,然后相应的替换即可。


至此,弹窗已去,万佛朝宗,大功告成,天下我有。


最美的永远是意外


悲剧往往发生在你双击的那一刻,因为你永远都不会知道打开的是什么。当我们双击运行看看,咦,怎么打不开,而且是闪退有木有,难道是我们打开的方式不对?


没错,真的是打开方式不对。这次我们不点击应用图标,而是进入其目录直接运行二进制文件看看:


Sketch!一次悸动的小逆向尝试


这下就明白了。程序自己退出了,并打印了一些信息,说明程序内部有对自身进行检测,如果发现代码,签名等被修改了就强制退出。嗯,我猜应该是这样。


没办法,看来活还没干完,打开Hopper接着干。这次,我们查找Invalid Signing这个字符串,看是哪里输出的。


00000001001bffbf         lea        rdi, qword [ds:cfstring_Invalid_Signing]    ; @"Invalid Signing", argument "format" for method imp___stubs__NSLog, XREF=sub_1001bfe40+357

00000001001bffc6         xor        eax, eax

00000001001bffc8         call       imp___stubs__NSLog

00000001001bffcd         mov        edi, 0xae                                   ; argument "status" for method imp___stubs__exit

00000001001bffd2         call       imp___stubs__exit


嗯,没错,就是这里。调用NSLog输出@"Invalid Signing",然后就退出程序。


再来看看全部代码,下图会更直观一些:


Sketch!一次悸动的小逆向尝试


可以看到,不管上面进行了什么操作,都要经过0x1001bff7a这里,然后通过test r13d, r13d判断是直接返回呢,还是跳到0x1001bffbf这里退出呢。既然这样,我们将下面的jne 0x1001bffbf置为nop就可以了。


修改后保存成二进制文件,再运行就没有问题了。



最后放出链接,http://pan.baidu.com/s/1qWmXcTm


打完收工。


------------------ 推荐 ------------------


范品社推出了十几款程序员、电影、美剧和物理题材的极客T恤单件 ¥59.9、两件减¥12、四件减¥28,详见网店商品页介绍。

淘口令:复制以下红色内容,然后打开手淘即可购买

范品社,使用¥极客T恤¥抢先预览(长按复制整段文案,打开手机淘宝即可进入活动内容)

以上是关于Sketch!一次悸动的小逆向尝试的主要内容,如果未能解决你的问题,请参考以下文章

倾囊相授 Sketch 使用的小技巧

设计师的小本本!(牛校必备服装sketch book)

为什么我喜欢 Sketch 多于 PS ?

那些你可能还没发现的Sketch冷知识第一期

说说London Sketch

[交互设计]Sketch小技巧大讲堂 第一期