什么是tweak?
英文意思为捏, 拧,扭,稍稍调整(机器、系统等)。
依据维基百科的定义,tweak指的是对电子系统进行轻微调整来增强其功能的工具;在ios中tweak特指那些能够增强其它可执行程序功能的动态链接库。
在cydia中99%的tweak都是基于mobile substract编写的
北京时间9月30日更新的美团iOS客户端4.8.1版 93,就能够强力阻止各种dylib的注入,使得一切tweak均为狗比,小弟就带大家看看美团是怎么做到的,而我们又可以通过什么方式,破解这种防护。
anti-DYLD_INSERT_LIBRARIES :
反DYLD_INSERT_LIBRARIES
dylib的注入一般是通过DYLD_INSERT_LIBRARIES这个环境变量来实现的,现在dylib连注入都失败,即其constructor根本未得到执行,说明此行为不是由美团的代码完成的,而应该发生在代码执行前。既然这样的话,此行为多半是因MachO头部的某个标注,导致dyld 107有意为之的。那么……
我们直接去看看dyld的源代码 238好了啊!源代码总共也没几行,我们着重看看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无视,分别是:
- 可执行文件被setuid或setgid了;
- 可执行文件含有__RESTRICT/__restrict这个section;
- 可执行文件被签了某个entitlements。
其中,因为Apple的审核机制,1和3不能由用户指定,因此不大可能出现在AppStore App中。为了确保万无一失,我们简单验证一下就好了:
ldid -e /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan
可以看到,imeituan这个可执行文件既没有setuid/setgid位,也没有特殊的entitlements,那么它含有__RESTRICT/__restrict这个section的可能性激增。至于如何验证我们的想法,用OSX逆向顶级大牛fG! 177的改造版MachOView 384看看就好了嘛~
好了,这应该就是美团4.8.1所采用的大杀器了,这种anti-DYLD_INSERT_LIBRARIES的方法,其实早在iOS 7完美越狱时,已经由GeoHot提到过了 256膜拜!!!
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"
打完收工~
四、总结
根据我们的分析结果,来一个马后炮,我们可搜到Sam 140的一篇新博文 877(关键词“DYLD_INSERT_LIBRARIES __RESTRICT”),讲到的正是这个帖子所提到的内容。除了更专业更详细外,他还给出了怎么用这种机制给自己的App加上防护的方法,完爆我们这种只破坏不保护的猥琐行径:huffy:,值得崇拜~!
http://www.samdmarshall.com/blog/blocking_code_injection_on_ios_and_os_x.html 877
http://geohot.com/e7writeup.html 256
http://www.opensource.apple.com/source/dyld/dyld-210.2.3/src/dyld.cpp 238
https://theiphonewiki.com/wiki/Launchd.conf_untether 80