Cydia Substrate 原名为 Mobile Substrate ,它的主要作用是针对OC方法、C函数以及函数地址进行HOOK操作。当然它并不是仅仅针对iOS而设计的,安卓一样可以用。是对Method Swizzle和fishhook的封装。
创新互联建站-专业网站定制、快速模板网站建设、高性价比通川网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式通川网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖通川地区。费用合理售后完善,10年实体公司更值得信赖。
Cydia Substrate主要由3部分组成:
因为APP程序质量参差不齐崩溃再所难免,破解程序本质是dylib,寄生在别人进程里。 系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。所以CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。
当只有一个分组时,有隐性的构造函数,所以直接%hook %end就可以hook想要的类和方法。%hook %end可以hook一个类
给类添加方法时,编译不过去,编译器报找不到这个方法的错误,那么可以自己建立一个.h文件,里面放要hook的类的头文件,头文件里包括自己添加的方法就可以编译通过。
在微信的第一次加载界面,把背景图片换掉,再加一个按钮,按钮事件跟登录事件效果一样
然后再获取Action的方法:
当安装多个xcode的版本,使用该工具使用指定的版本。
-p 或者 --print-path 查看当前开发者目录,也即是xcode的版本目录。print the path of the active developer directory
-s path 或 --switch path 选择xcode的版本
--install 安装
--version 查看版本
--reset 恢复默认
sudo rm -rf /Library/Developer/CommandLineTools 强制删除安装目录下的文件
是管理Fat File的工具, 可以查看cpu架构, 提取特定架构,整合和拆分库文件。
Mac OS X下二进制可执行文件的动态链接库是dylib文件。所谓dylib,就是bsd风格的动态库。基本可以认为等价于windows的dll和linux的so。mac基于bsd,所以也使用的是dylib。
Linux下用 ldd 查看,苹果系统用 otool 。
otool命令介绍
MobSF
Mach-O 文件格式解析
xcodebuild :通过工程文件,生成app文件。
xcrun :通过app文件,来生成ipa文件(包含了签名的过程)。
通过app文件生成ipa文件
libtool是一个通用库支持脚本(/usr/bin/libtool),将使用动态库的复杂性隐藏在统一、可移植的接口中。
可以在不同平台上创建并调用动态库,我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节, 只要告诉libtool说我需要要编译哪些库即可,并且,它只与libtool文件打交道,例如lo、la为后缀的文件。
libtool工具的使用
库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
详细命令参见, 菜鸟网络-ar命令
可以用来创建、修改库,也可以从库中提出单个模块。
lipo libAFNetworking.a -thin arm64 -output lib-arm64.a 生成Arm64包
ar -t lib-arm64.a 输出包含的.o文件 和 otool -L libAFNetworking.a 一样。
ar -x lib-arm64.a 解压出包里面的.o文件
在iOS开发中,常常用来分析二进制和静态库文件。
列出 .o .a .so 中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。
iOS开发中,可以用来查看.a静态库所有打包进去的.o文件和函数接口信息,帮助我们定位崩溃信息。
例如: nm -u libAFNetworking.a 列出某个.o文件的接口信息。
二进制查看命令,将文件显示为16进制字符串表示形式。
例如: xxd libYTKNetwork.a | grep "net" 查看YTKNetwork.a文件里面包含net字符串的,帮助我们分析一些二进制文件。
DWARF文件初探——提取轻量符号表
Mac系统下lipo, ar, nm等工具的使用简介
美团 iOS 工程 zsource 命令背后的那些事儿
Linux工具参考篇
iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离
工具名称用途区别备注
theos、iosOpenDev生成dylib
insert_dylib、optool、yololib向二进制文件插入dylib
install_name_tool
修改dylib引用路径
iResign、sigh resign、codesign等重签名工具修改后的二进制文件是需要重签名的
二、过程
1、生成dylib
dylib的生成 可采用theos,也可采用iosOpenDev。
theos是越狱专门开发用的工具,生成的dylib可直接作用于越狱机器上。
但theos并不是apple源生支持的工具,它在Mac端编译生成deb包,安装进IOS系统,由IOS系统dpkg安装成插件模式 并随之生成dylib。theos在Mac端需要调用IOS开发SDK,目前无法调用9.3以上的SDK,theos工具没有更新。
iosOpenDev则是apple官方支持的插件生成工具,可直接由Xcode生成。
这种dylib由两种 CaptainHookTweak、Logos Tweak.
不过这两种没什么区别:Logos Tweak的语法较为简单 同theos的一致,CaptainHookTweak较为复杂。
2、插入dylib
这三种工具 均可向二进制文件插入dylib 不过各有千秋
yololib仅能对64位的二进制文件 插入 32位插入也能成功 但是 出现如下
insert_dylib既可以对64位 也可以对32位进行插入 同时 还会供选择 是否删除掉二进制文件原有的签名 即 LC_CODE_SIGNATURE
optool 则功能更强大 可供选择 是插入哪种LC LIB。本例暂用不上。
3、修改dylib引用
插入dylib后 需要对它添加cydiaSubstrate dylib的引用。即使用install_name_tool这个工具
之前就是这个地方没有做 导致签名后的文件 一直安装出现闪退 dylib也没有调用
由于目前手头没有越狱手机 之前没有调出过cydiaSubstrate dylib 所以这个步骤暂时中断(最主要 每个越狱版本系统的cydiaSubstrate dylib都是不一样的 目前没有可越狱的系统 也就没有对应的dylib)
不过 可细想 因为越狱手机上 是自己存在这个cydiaSubstrate dylib的 所以 theos插件本身不必再导入这个dylib,直接对其添加引用即可。
然而 在非越狱手机上 就需要自己把这个cydiaSubstrate dylib放进app包里 并手头添加它的引用路径了
既然这样 那apple 源生的iosOpenDev为什么还要出开发dylib的工具呢
那是因为apple 推出iosOpenDev生成dylib 根本不是让你这样玩的 apple是让你把这个dylib添加进IOS工程里 在工程里对其添加引用 如果以后该app有少量的更新 只需要更新这个dylib即可 而不必更新整个app。这个在IOS开发中 叫做 增量更新。
在完全不使用cydia提供的hook接口的基础上 也可以使用openDev使用的hook接口
操作如下:
a:将 dylib(如需要调用cydia substrate 的 MSHOOK函数 则 还需要添加cydia substrate dylib)到app包里;
b:insert工具插入。注意这里有一个坑 就是凡是复制到dylib里的包 除了使用install_name_tool对其添加引用外 插入到Mach-O LOAD COMMANDS里的dylib还需要添加可执行路径
首先需要cd进app包里
然后/Users/danchen/desktop/diff_hook/insert_dylib@executable_path/ios_hook.dylibhook_demo hook_demo
c:之后重签名
对app包里每一个修改的添加的文件进行签名
codesign -f -s "iPhone Developer: 694708086@qq.com (T4MM3JZDL2)" hook_demo
codesign -f -s "iPhone Developer: 694708086@qq.com (T4MM3JZDL2)" ios_hook.dylib
再对整个app包添加签名权限
codesign -f -s "iPhone Developer: 694708086@qq.com (T4MM3JZDL2)" --entitlements entitlements.plist hook_demo.app
直接安装app包即可,也可以使用xcrun将其打包成ipa 安装即可
dylib里的内容
4、重签名
完成这些步骤后
首先 要对 修改过的二进制文件、dylib、cydiaSubstrate dylib进行重签名 即把iPhone Developer: 694708086@qq.com (T4MM3JZDL2) 写入进去
然后 使用xcrun将app文件 打包成ipa 使用iResign、sigh resign等工具 对ipa包重签名 再安装进系统
重签名权限文件entitlements.plist
可使用ldid -e 二进制文件查看entitlements文件内容生成
三、区别
theos与iosOpenDev
区别theosiosOpenDev备注
来源越狱开发作者appletheos来自第三方开发,iosOpenDev则是apple官方Xcode支持的
UI无Xcodetheos没有开发UI界面,iosOpenDev的开发界面是Xcode
版本支持目前theos仅支持SDK IOS9.3以下都支持两者调用SDK,theos仅支持SDK9.3以下,目前theos作者尚未更新工具
hook 语言方式Logos TweakLogos Tweak、CaptainHookTweak
insert_dylib、optool、yololib工具差别
区别insert_dyliboptoolyololib备注
支持结构64、32位都支持64、32位都支持仅支持64位
四、总结
这种方式仅能hook app自身进程里所调用的函数 无法hook系统级别的进程
由于非越狱上的沙盒机制,本地app仅能访问本app数据,无法访问别的app的数据,访问系统数据(相册、地理位置等)也需要向用户请求权限。更别说去hook系统级别的进程。
当然 存在非越狱下 绕过沙盒机制的技术:
比如这个人 非越狱下一个app卸载另一个app、一个app获取领一个app里的文件内容。但这种漏洞技术没有公开 仅存在于越狱团队内部。而且这种漏洞技术也没能hook系统级进程。
理论上来讲 非越狱下hook系统级别的进程 是有可能的 只不过难度相当大(换言之 如果真有这种非越狱下就能hook系统级别的漏洞和技术的话 越狱团队干嘛还费那大力气去越狱呢)
可以用dyld函数动态加载。要把dylib放在Document文件夹内的话,修改安装目录即可,第一次启动要自己copy出去哦。
1、首先打开手机桌面的“设置”,进入之后通过滑动菜单,找到“icloud”选项。 2、icloud的设置界面有很多选项,已经有帐号的可以直接在Apple ID和密码中输入即可登录,而没有Apple ID的则需要创建。选择界面最后的“免费获取Apple ID”。 3、在弹出的生日日期设置窗口中选则好自己的生日,跳转到下一步。备注:日期可以不是真实的,但必须是要自己能记住的。 4、这时会要求设置姓名,输入自己的姓名即可,设置好之后点击右上角的“下一步”。 5、这时候会要求设置作为帐号的邮箱地址,分别有两个选项“使用您当前的电子邮件地址”和“获取免费的icloud电子邮件地址”。 6、选择前者则可以使用自己已经有点邮箱作为AppleID的帐号,如QQ、126、163、新浪等,而选择后者的话将自动为申请者申请一个icloud的邮箱地址,建议选择前者,毕竟邮箱多了要一个个记住也是一件麻烦的事。 设置好之后到达下一步。 7、在这里以“使用您当前的电子邮件地址”为例子,输入自己的任意一个邮箱帐号即可。点击下一步。 8、在新的界面中会要求你输入Apple ID的密码,想好自己要设置的密码,分别输入后再确认输入一次即可。备注:Apple ID的密码要求至少8位字符且包含大小写字母。 9、然后会进入问题设置界面,按照提示选择三个问题,并输入答案即可。 备注:密保问题的作用是当忘记Apple ID的时候可以用于找回密码,因此必须要记住三个密保问题的答案。 10、当设置好三个密保问题之后会要求输入一个救援电子邮箱,其作用也和上面的三个密保问题一样,用于防治忘记Apple ID的密码,因此需要记住自己输入的救援电子邮箱。备注:救援电子邮箱必须是有效可用的。 11、此界面无什么作用,直接默认后点击下一步即可。 12、此时会弹出Apple的协议和条款的确认窗口,也没多大用处,直接点击右下角“同意”即可。 13、已以基本要完成了,界面会显示正在创建AppleID账户。 14、完成创建之后会回到icloud的验证界面,此步骤的作用就是验证刚才用于Apple ID帐号的邮箱地址是否正确。 15、这时候直接在手机或者电脑浏览器上登录第5步中输入的邮箱,会受到一封苹果发来的确认邮件,按照里面的提示,验证之后就可以。这时再打开手机就会发现帐号已经被激活,可以使用了。 16、最后,在下载app或者其他设置的时候直接按照提示输入密码或同一选项即可。
动态链接库是以 .dylib 和 .framework 为结构的文件。
1.把framework封装进另一个framework中?
首先,苹果大方的告诉我们他们是不允许这样做的。。。
其次,实际上把静态库封进另一个静态库确实是行不通的;
然而,把动态库封进静态库是可行的:
使用方式:
场景2:
当你在静态库中使用了动态库的方法,当你使用此静态库时也要在project中引入动态库并且做如下图操作:
否则,会报错,错误如下:
dyld: Library not loaded: @rpath/ZegoAVKit2.framework/ZegoAVKit2
Referenced from: /var/containers/Bundle/Application/0A23D0E0-EE5E-4E18-8020-D9F7D2F3B5CD/ahwx.app/ahwx
Reason: image not found