Mac OS X上逆向Dash v2.2.0过程分析

版权申明:本文只作研究学习使用,建议大家支持正版,共同维护程序员兄弟的利益!

寻找突破口


试用几次发现这个延迟界面出现的时机有:

  1. 刚启动Dash会出这个
  2. 搜索几次以后定期就会出这个
  3. new 一个新的tab时

分析程序找到关键位置

  1. search text “Please Purchase to skip waiting” 无结果,再找”purchase dash"

这里记下有:
DHInApp
DHPurchaseButton

使用“the page will load” search,发现

找到
DHPinKy 其api有 +showPinky , +waitTick

  1. 分析关键api逻辑

在函数符号表中搜索这几个api,找到函数的定义

在hopper中使用快捷键 option+ret ,查看反汇编译代码:

可以看到里面有很多goto,if等挑战语句。其中几个关键的地方:

[rbx setWaitCount:0x8]; 这里明显是用来设置延迟窗口的显示时间的。如果把这个时间改为0,是不是就不会显示窗口了呢?

在汇编代码中找到对应的这段代码:

修改可执行程序

mov edx, 0x8 对应的机器码为:

记下,偏移为 000cc95f ,机器码为 BA 08 00 00

我们把 mov edx, 0x8 改为 mov edx, 0x0 ,也就是机器码为 BA 00 00 00 (如果不是dash v2.2.0,这里偏移值可能不一样了)

修改的二进制还有几个问题

  1. 添加可执行权限
    chmod +x Dash

  2. 无法启动修改后的dash
    我尝试直接覆盖/Application下dash的二进制文件。如下

    发现Dash无法启动, 应该是Dash从App Store下载,修改binary导致签名不一致导致无法在系统上运行。解决办法是使用自签名证书重新对Dash签名。参考http://forums.macnn.com/79/developer-center/355720/how-re-sign-apples-applications-once/

发现任然无法启动Dash。后经网友提示,Dash使用了二进制的校验,相关类是NPReceiptVerification(PS:世上还是好人多,再次谢谢flyingbird~)

  1. 还需要禁用校验

有4个api:
+load
+appleRootCertificateData
+systemMACAddress
+appStoreReceiptDictionaryForFile:

看下+load的反编译代码

  1. 检查 Contents/_MASReceipt/receipt文件是否存在
  2. 代码检查
    SecStaticCodeCreateWithPath()
    SecRequirementCreateWithString()
    SecStaticCodeCheckValidity()
  3. appReceipt,systemMACAddress check
  4. bundle id, version ,hash check

最直接的解决方法就是:

  1. 把+load的实现全部抹掉。
  2. hook +load method ,直接return

这样,所有的校验都失效了。

改SecStaticCodeCheckValidity() 绕过二进制修改校验

把这里的jne改为je 也就是:在偏移0012 049a出把机器码 0F 85 BD 01 00 00 改为 0F 84 BD 01 00 00

试了一下,成功了。

这里还有一些有意思的问题我们还没有涉及到,下次分解:

1, 序列号文件验证的地方在哪里?
2. 如何直接把序列号算出来

参考

http://forums.macnn.com/79/developer-center/355720/how-re-sign-apples-applications-once/ 使用自签名证书对修改的app binary 签名

4 个赞

请问文章里用的 汇编转机器码,查看并修改二进制的工具能推荐下吗?:)

机器码在hopper里面看,修改二进制用的sublime Text的一个插件hexEditor

非常感谢分享!文章写的很赞! :+1:

very good,
什么时候出分析license的过程呢?
自己分析了下,好凌乱。。

想要做的事情太多,时间总是太少,哎~~

赞下楼主。 自己刚逆向完网上一搜发现了这篇,呵呵。
不过我比较简单粗暴,直接showpinky return掉,发现也可行

首先,感谢楼主分享教程,菜鸟非常的受益。我■■了V2.2.6版本,NPReceiptVerification类又加回来了,不过已经顺利的■■了,现在的问题是签名问题,我做的自签名好像只能在我的本机使用。
我尝试使用苹果的其他的MAC APP发布证书签名,但发现在其他机器打不开。。
@nonstriater 不知道有没有办法签过名之后,在别的MAC上面也能运行?

打不开,报什么错吗?

15/9/8 上午10:30:50.002 com.apple.xpc.launchd[1]: (com.kapeli.dash.417796[1126]) Service exited with abnormal code: 173
15/9/8 上午10:30:50.008 storeassetd[703]: AssetServiceDelegate: Accepting new connection <NSXPCConnection: 0x7fc1f8515c50> connection from pid 701 with interface <AssetServiceInterface: 0x7fc1f8522970> (PID 701)
15/9/8 上午10:30:50.008 storeassetd[703]: addOperation <FetchReceiptOperation: 0x7fc1f8730b10>{name = ‘(null)’}

点开之后,图标显示一下就消失了,这是我在系统控制台看到的日志

这个是我用Developer ID Application(苹果的MAC发布证书)证书签名的,如果用本机自己制作的签名打开就没有出现问题

我现在想确认一下,是我哪点错了?还是这条路走不通? 问题可能描述的不太具体,想了解哪些?就说一下我就直接回复啦

你看看这个帖子,不知道有没有帮助

我这样的菜鸟分析了一下:
1.我把二进制修改了以后,因为变了,打不开。用苹果的其他的MAC APP发布证书签名,也会因为签名不一致而打不开。
2.所以一般的■■是分析license来■■,而不是直接修改二进制文件,但是我看见群里分享的reveal相关的教程也是在直接修改二进制文件之后运行的,不清楚咋回事?
这个先Mark一下,后续继续关注。

你好,你在修改二进制文件并保存后,使用Developer ID Application证书签名后,应该有遇到Service exited with abnormal code: 173错误,请问你是怎么处理的呢?

我现在是使用自签名的方式,都会遇到同样的问题。

早上好,请看[这个帖子][1],讲的很详细说明了我遇到的问题的原因
我的解决方法是,直接用Hopper修改后导出执行文件,不对他进行签名 :joy: :joy: :joy: :joy:
这样的话可以执行,反正都是在练习■■,没有打算把发布■■版出去。。
[1]: http://apple.stackexchange.com/questions/26808/why-do-app-store-applications-transferred-into-applications-on-another-machine

中午好,谢谢你的回复。
我按照@nonstriater 和你的思路做了尝试,修改二进制后,就在本机也无法运行。后面通过自签名,在本地还是无法打开,会报错“Service exited with abnormal code: 173”。

后面我发现我修改的Dash版本是从App Store下载的,所以打开的时候,估计内核校验什么(因为我也不知道,菜鸟)不通过。

后面我从Dash官网下载了非App Store的版本进行修改,修改完二进制文件保存后,就可以在本机使用。

有时间再研究一下,再次感谢你的回复。