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

发布时间:2017-10-20 8:04:32
来源:知识图谱

寻找突破口


试用几次发现这个延迟界面出现的时机有:
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 签名

返回顶部