一、反注入
有一天,你会发现 cycript 不好使,提示这个
iPhone:~ root# cycript -p app
dlopen(/usr/bin/Cycript.lib/libcycript.dylib, 5): Library not loaded: /System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore
Referenced from: /usr/bin/Cycript.lib/libcycript.dylib
Reason: image not found
*** _assert(status == 0):../Inject.cpp(143):InjectLibrary
然后你还发现 Tweak 生成的 dylib 注入不了目标进程。这时可以判断,这个应用是做了反注入的保护了。通过搜索到国外的一篇文章
https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html
了解到在可执行文件添加一个名为 __RESTRICT,__restrict 的节,可以反注入,实际的原理是在 dyld 源码里 pruneEnvironmentVariables 函数里有判断如果有这个节就会无视 DYLD_INSERT_LIBRARIES
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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; } |
通过 Xcode 里的 Other Linker Flags 设置参数,则可以添加节。
-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
使用 MachOView 看一下效果
这时果然发现 cycript 注入不行了。
二、反反注入
我们了解了反注入的原理之后,如何反反注入呢?很简单,只需要把这个节名给改名不就行了吗?使用十六进制编辑工具打开文件,然后查找字符串改掉,再上传文件替换掉之前的应用文件就可以了。
转载请注明:exchen's blog » [iOS Hacker] 反注入和反反注入