相信大多数AppStore开发者在阅读完《iOS应用逆向工程9》之后,对iOS开发的理解会深入不少。一入侯门深似海,tweak的出现让各种裸奔App的作者瞬间跪了,自己的App被玩弄于股掌之间,内牛满面:cry:
但是,一些防护性优秀App的出现,给安全性堪忧的AppStore注入了一针强心剂。他们用到的防护方式处于业界领先地位,值得我们学习:handshake:。如北京时间9月30日更新的美团iOS客户端4.8.1版3,就能够强力阻止各种dylib的注入,使得一切tweak均为狗比。下面,小弟就带大家看看美团是怎么做到的,而我们又可以通过什么方式,破解这种防护。
一、下载美团,把玩把玩
下载完成,启动App之后,ssh到iOS,运行

ps -e

得到输出

 1374 ??         0:03.53 /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan

好的,拿到了美团的目录路径和进程名。下面我们分别尝试用Cycript注入dylib,和用debugserver来动态调试:

此处应有图,挂掉了,也找不回来了 

嗯……事情变得棘手了:注入dylib和动态调试都失败了。动态调试失败,很大的概率是采用了ptrace方法,这里就不赘述了,网上随便搜一搜就有很多例子;而dylib注入失败是大家比较少碰到的情况,我们就从它下手,看看到底发生了什么。

二、anti-DYLD_INSERT_LIBRARIES
dylib的注入一般是通过DYLD_INSERT_LIBRARIES这个环境变量来实现的,现在dylib连注入都失败,即其constructor根本未得到执行,说明此行为不是由美团的代码完成的,而应该发生在代码执行前。既然这样的话,此行为多半是因MachO头部的某个标注,导致dyld3有意为之的。那么……
我们直接去看看dyld的源代码5好了啊!源代码总共也没几行,我们着重看看pruneEnvironmentVariables这个函数,它的注释写道:
同时注意到这个switch case:

switch (sRestrictedReason) {case restrictedNot:break;case restrictedBySetGUid:dyld::log("main executable (%s) is setuid or setgid\n", sExecPath); break; case restrictedBySegment: dyld::log("main executable (%s) has __RESTRICT/__restrict section\n", sExecPath); break; case restrictedByEntitlements: dyld::log("main executable (%s) is code signed with entitlements\n", sExecPath); break; }

三种情况下,DYLD_环境变量会被dyld无视,分别是:
1. 可执行文件被setuid或setgid了;
2. 可执行文件含有__RESTRICT/__restrict这个section;
3. 可执行文件被签了某个entitlements。
其中,因为Apple的审核机制,1和3不能由用户指定,因此不大可能出现在AppStore App中。为了确保万无一失,我们简单验证一下就好了:

FunMaker-5s:~ root# ls -l /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan
-rwxr-xr-x 1 mobile mobile 25340624 Sep 30 10:23 /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan*
FunMaker-5s:~ root# ldid -e /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <dict> <key>keychain-access-groups</key> <array> <string>FSS9ANCQ68.com.meituan.access</string> <string>FSS9ANCQ68.com.meituan.imeituan</string> </array> <key>com.apple.developer.pass-type-identifiers</key> <array> <string>T3ZLXP4K5B.*</string> </array> <key>application-identifier</key> <string>FSS9ANCQ68.com.meituan.imeituan</string> <key>aps-environment</key> <string>production</string> </dict> </plist><?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>keychain-access-groups</key> <array> <string>FSS9ANCQ68.com.meituan.access</string> <string>FSS9ANCQ68.com.meituan.imeituan</string> </array> <key>com.apple.developer.pass-type-identifiers</key> <array> <string>T3ZLXP4K5B.*</string> </array> <key>application-identifier</key> <string>FSS9ANCQ68.com.meituan.imeituan</string> <key>aps-environment</key> <string>production</string> </dict> </plist>

可以看到,imeituan这个可执行文件既没有setuid/setgid位,也没有特殊的entitlements,那么它含有__RESTRICT/__restrict这个section的可能性激增。至于如何验证我们的想法,用OSX逆向顶级大牛fG!3的改造版MachOView7看看就好了嘛~

好了,这应该就是美团4.8.1所采用的大杀器了,这种anti-DYLD_INSERT_LIBRARIES的方法,其实早在iOS 7完美越狱时,已经由GeoHot提到过了5:shocked:膜拜!!!

三、anti-anti-DYLD_INSERT_LIBRARIES
既然anti-DYLD_INSERT_LIBRARIES是由__RESTRICT/__restrict实现的,那么anti-anti-DYLD_INSERT_LIBRARIES自然就等同于anti-RESTRICT/restrict咯!而要anti-RESTRICT/restrict也很简单,把imeituan这个可执行文件用macvim等二进制编辑器打开,把所有的__RESTRICT/__restrict字符串给重命名一下就好了,比如:

这样dyld就找不到__RESTRICT/__restrict,也就不会忽略DYLD_INSERT_LIBRARIES了嘛!
把改过以后的imeituan拷贝回iOS,

snakeninnys-MacBook:~ snakeninny$ scp /Users/snakeninny/imeituan root@192.168.3.3:/var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan

因为我们对App的可执行文件进行了静态patch,其md5值已经改变,所以Apple签名失效,正常情况下美团App无法启动。要解决这个问题,很方便,也很惭愧,因为要用到盗版App的利器——AppSync……
在Cydia中搜索AppSync,安装并respring后即可禁用iOS的签名校验。一切就绪后,打开美团,用Cycript重新测测看:

FunMaker-5s:~ root# cycript -p imeituan
cy# [UIApp displayIdentifier]
@"com.meituan.imeituan"

打完收工~

四、总结
根据我们的分析结果,来一个马后炮,我们可搜到Sam2的一篇新博文23(关键词“DYLD_INSERT_LIBRARIES __RESTRICT”),讲到的正是这个帖子所提到的内容。除了更专业更详细外,他还给出了怎么用这种机制给自己的App加上防护的方法,完爆我们这种只破坏不保护的猥琐行径:huffy:,值得崇拜~!

参考:
1. http://www.samdmarshall.com/blog/blocking_code_injection_on_ios_and_os_x.html23
2. http://geohot.com/e7writeup.html5
3. http://www.opensource.apple.com/source/dyld/dyld-210.2.3/src/dyld.cpp5
4. https://theiphonewiki.com/wiki/Launchd.conf_untether1

转载于:https://www.cnblogs.com/sunnyke/p/4514760.html

防止tweak依附,App有高招;破解App保护,tweak留一手相关推荐

  1. 局域网限速软件_2号破解app重器推荐一款强大的快捷软件

    破解版精 破解版精品软件 一些软件需要使用者付费购买才能使用其所有功能(或者才能解除使用期限),这时一些计算机高手就破解这个软件,使其不用付费也可以完全使用全部功能(或者永久使用),这种软件就叫破解版 ...

  2. Android打包混淆----APP加密防破解 + 重新签名

    ① 准备一个打包过的app文件包 . ②  登陆移动APP加密防破解爱加密官网http://www.ijiami.cn,没有账号的需要先注册账号(登陆后才能上传App文件进行加密). ③ 注册完后,登 ...

  3. 企查查app sign算法破解(完结)

    在经历前两次探索之后,终于可以把所有的加密关键参数搞定了. 企查查app sign算法破解初步探索 企查查app sign算法破解(二) 最后一个参数aXM,这个参数使用的是阿里的聚安全加密,直接看代 ...

  4. 企查查app sign算法破解初步探索

    企查查app sign算法破解初步探索 之前有说过企查查的sign的解密,但这次是企查查app的sign算法破解,目前是初步进程. 目前我们需要做查壳,具体方法可以百度搜索,企查查用的360加固,很简 ...

  5. APK保护技术——保护应用、游戏APP不被破解

    作者:韩梦飞沙 QQ:313134555 5种常用的APK保护技术--保护应用.游戏APP不被破解 - ChangHuiYuan的专栏 - 博客频道 - CSDN.NET

  6. Android中静态方式破解某App实现所有视频app去除广告功能

    转:  Android中静态方式破解某App实现所有视频app去除广告功能 作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频 ...

  7. Android打包混淆----APP加密防破解 + 重新签名

    ~ ~  APP加密(混淆打包防反编译)的步骤:~ ~ ① 准备一个打包过的app文件包 . ②  登陆移动APP加密防破解爱加密官网http://www.ijiami.cn,没有账号的需要先注册账号 ...

  8. 如何保护iPhone App不被破解办法

    转自: http://mobile.51cto.com/iphone-285302.htm 如何保护iPhone App不被破解办法是本文要介绍的内容,主要是来讲解iphone APP中的安全问题,来 ...

  9. 【iOS app加密】iOS app之游戏加密防破解

    [iOS app加密]iOS app之游戏加密防破解.iOS app游戏类应用有一个很泛滥但被视为鸡肋的问题,那就是iOS app被破解的问题.因为国内大多数游戏靠内购和广告盈利,游戏安装包也只是在早 ...

  10. iOS App 签名的原理 App 重签名(三)

    目录 iOS App 重签名 - 准备工作 iOS App 重签名 - 手动重签名 iOS App 重签名 - 使用脚本重签名 iOS App 重签名 - 使用 XCode 重签名 注意 iOS Ap ...

最新文章

  1. Gentoo 安装日记 17(修改/etc/fstab)
  2. python中property方法有用_python中@property和property函数常见使用方法示例
  3. java扫描指定package注解_java获取包下被指定注解的类
  4. Android 后台发送邮件 (收集应用异常信息+Demo代码)
  5. 软件技术毕业论文编程方向
  6. 音频信号频率测试软件,音频测试信号频率详细解说
  7. 如何查找ADI原厂提供的DSP技术资料
  8. 优化模型之指派问题(整数规划)
  9. lol服务器是用什么系统,能玩lol的云服务器
  10. PTA基础编程题目集编程题
  11. 地铁信号tts是什么服务器,机场地铁公共广播
  12. 使用yum报错:There are no enabled repos. Run “yum repolist all“ to see the repos you have.
  13. MPB:猪胃肠道内容物和黏膜样品采集与微生物组成分析
  14. HTTP:网络请求状态码204、304
  15. linux aria2 参数,aria2常用命令
  16. 绿联扩展坞拆解_拆解报告:UGREEN绿联3A1C五合一多功能拓展坞
  17. 前端学习之CSS第三天
  18. QBC和QBE查询方法
  19. mysql 一些命令 杂乱
  20. 25. Linux中的web服务器Apache

热门文章

  1. SIM800C使用HTTPS进行GET
  2. pc单机版雷电修改器源码
  3. 用户在小程序操作后通过公众号(服务号)推送通知
  4. 第三章 嵌入式Python概述(三)
  5. 用java编写一个微博登陆页面
  6. Java实现发送短信的例子 - 使用【SMS短信平台】
  7. 新浪微博中链接不能直接打开的最新解决方案
  8. 别用 VMware 了,这款虚拟机简单、轻量、好用还免费...
  9. HTML+CSS+JavaScript实现在线网盘
  10. 09-jquery获取元素的尺寸