版权申明:本文只作研究学习使用,建议大家支持正版,共同维护程序员兄弟的利益!
寻找突破口
试用几次发现这个延迟界面出现的时机有:
- 刚启动Dash会出这个
- 搜索几次以后定期就会出这个
- new 一个新的tab时
分析程序找到关键位置
- search text “Please Purchase to skip waiting” 无结果,再找”purchase dash"
这里记下有:
DHInApp
DHPurchaseButton
使用“the page will load” search,发现
找到
DHPinKy 其api有 +showPinky , +waitTick
- 分析关键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,这里偏移值可能不一样了)
修改的二进制还有几个问题
-
添加可执行权限
chmod +x Dash -
无法启动修改后的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~)
- 还需要禁用校验
有4个api:
+load
+appleRootCertificateData
+systemMACAddress
+appStoreReceiptDictionaryForFile:
看下+load的反编译代码
- 检查 Contents/_MASReceipt/receipt文件是否存在
- 代码检查
SecStaticCodeCreateWithPath()
SecRequirementCreateWithString()
SecStaticCodeCheckValidity() - appReceipt,systemMACAddress check
- bundle id, version ,hash check
最直接的解决方法就是:
- 把+load的实现全部抹掉。
- 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 签名