cycript注入动态库的方式,这必需要在越狱环境下才能实现。ios
cycript的原理是动态库注入,可是其动态库注入的原理,与咱们常见的经过LC_LOAD_DYLIB在可执行文件中注入动态库不一样. cycript的操做是 : 抓取到要挂载的应用, 因为越狱机上拥有权限,因此直接在挂载的进程上建立一个挂起的线程, 而后在这个线程里申请一片用于加载动态库的内存,而后恢复线程,动态库就被注入。
二次打包动态库的注入,是经过修改可执行文件的Load Commands来实现的. 在Load Commands中增长一个LC_LOAD_DYLIB , 写入dylib路径,这样程序执行的时候, 就会编译这个 LC_LOAD_DYLIB 找到要注入的 dylib,加载动态库 .c++
tweak,它是各类破解补丁的统称git
iOS的tweak大体分为两种:github
第一种是在cydia上发布的,须要越狱才能安装,大部分是deb格式的安装包,iOS在越狱后,会默认安装一个名叫mobilesubstrate的动态库,它的做用是提供一个系统级的入侵管道,全部的tweak均可以依赖它来进行开发,目前主流的开发工具备theos和iOSOpenDev,前者是采用makefile的一个编译框架,后者提供了一套xcode项目模版,能够直接使用xcode开发可调试,可是这个项目已经中止更新了,对高版本的xcode支持很差。
第二种是直接打包成ipa安装包,并使用本身的开发证书或者企业证书签名,不需越狱也能够安装,可直接放到本身的网站上,可实如今线安装;对于没有越狱的手机,因为权限的限制,咱们是没有办法写系统级的tweak的,例如springboard的补丁是无法运行的,这种tweak大可能是针对某个app,把目标app进行修改注入处理,再从新签名和发布,有点相似于windows软件的xxx破解版、xxx免注册版
没有越狱的机器因为系统中没有mobilesubstrate这个库,咱们有二个选择,第一个是直接把这个库打包进ipa当中,使用它的api实现注入,第二个是直接修改汇编代码;第一个适用于较为复杂的破解行为,并且越狱tweak代码能够复用,第二种适用于破解一些if…else…之类的条件语句spring
oc届著名的method swizzling技术,他就是iOS的注入原理,相似于windows的钩子,因此咱们注入也称为hooksegmentfault
Mobilesubstrate为了方便tweak开发,提供了三个重要的模块:windows
MobileHooker 就是用来作上面所说的这件事的,它定义一系列的宏和函数,底层调用objc-runtime和fishhook来替换系统或者目标应用的函数 MobileLoader 用来在目标程序启动时根据规则把指定目录的第三方的动态库加载进去,第三方的动态库也就是咱们写的破解程序,他的原理下面会简单讲解一下 Safe mode 相似于windows的安全模式,好比咱们写的一些系统级的hook代码发生crash时,mobilesubstrate会自动进入安全模式,安全模式下,会禁用全部的第三方动态库
上面讲到了mobileloader,他是怎么作到把第三方的lib注入进目标程序的呢?
这个咱们要从二进制文件的结构提及,从下面的图来看,Mach-O文件的数据主体可分为三大部分,分别是头部(Header)、加载命令(Load commands)、和最终的数据(Data)。mobileloader会在目标程序启动时,会根据指定的规则检查指定目录是否存在第三方库,若是有,则会经过修改二进制的loadCommands,来把本身注入进全部的app当中,而后加载第三方库。api
下面用machoview来打开一个真实的二进制文件给你们看看,能够看出,二进制当中全部引用到的动态库都放在Load commands段当中,因此,经过给这个段增长记录,就能够注入咱们本身写的动态库了xcode
在这里插入咱们本身的动态库有什么用?咱们本身写的代码如何新增执行的入口,咱们还须要一个”main”函数来执行咱们本身的代码,这个”main”函数在oc里面称为构造函数,只要在函数前声明 “attribute((constructor)) static” 便可,sass
#import "CaptainHook.h" static __attribute__((constructor)) void entry(){ // NSLog(@"\n ?!!!congratulations!!!?\n?----------------insert dylib success----------------?"); // // [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { // // CYListenServer(6666); // }]; }
逆向分析最经常使用的有三种方法:
网络分析
经过分析和篡改接口数据,能够有效的破解经过接口数据来控制客户端行为的app,经常使用的抓包工具备Tcpdump, WireShark, Charles等,windows平台有fidller
静态分析
经过砸壳、反汇编、classdump头文件等技术来分析app行为,经过这种方式能够有效的分析出app实用的一些第三方库,甚至分析出app的架构等内容,经常使用的工具备dumpdecrypted(砸壳)、hopper disassembler(反汇编)、class_dump(导头文件)
动态分析
有静就有动,万物都是相生相克的,动态分析指的是经过分析app的运行时数据,来定位注入点或者获取关键数据,经常使用的工具备[cycript][5](运行时控制台)、 lldb+debugserver(远程断点调试)、logify(追踪)
control+D,来退出Cydia.
Logify.pl脚本在你安装theos的时候就自带:/opt/theos/bin/logify.pl
神器Logify了,它是theos的一个模块,做用就是根据头文件自动生成tweak,生成的tweak会在头文件的全部方法中注入NSLog来打印方法的入参和出参,很是适合追踪方法的调用和数据传递
把一个本身的dylib放到APP的目录下,而后修改二进制文件,以让APP加载这个动态库。这个动态库也是须要签名的,使用对app重签名的方式对这个动态库进行签名。
动态库的注入,可使用这个工具 insert_dylib脚本.
insert_dylib --all-yes @executable_path/test.dylib Payload/WeChat.app/WeChat
/Users/devzkn/code/taokeSearchtweak/taokesearchtweak/.theos/obj/debug
-rwxr-xr-x 1 devzkn staff 148160 Oct 31 18:02 taokeSearchTweak.dylib
devzkndeMacBook-Pro:debug devzkn$ otool -L taokeSearchTweak.dylib taokeSearchTweak.dylib (architecture armv7): /Library/MobileSubstrate/DynamicLibraries/taokeSearchTweak.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.55.0) /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1349.56.0) /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2) taokeSearchTweak.dylib (architecture arm64): /Library/MobileSubstrate/DynamicLibraries/taokeSearchTweak.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.55.0) /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1349.56.0) /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
Theos会在编译动态库时, 会这个动态库添加上这一条依赖,因此要想在非越狱环境上运行,还得把CydiaSubstrate库也跟着打包到APP中.
在Makefile里Tweak_Name=XXXX下添加如下两行 :
SUBSTRATE ?= yes instance_USE_SUBSTRATE = $(SUBSTRATE)
把上面的instance替换成你的TweakName,在上面的这个例子中就是XXXX
而后打包使用命令:
`make SUBSTRATE=no
`这样Theos打包的时候,会将依赖的CydiaSubstrate中的符号加载到最终生成的动态库中,再也不依赖CydiaSubstrate库.
codesign -f -s "iPhone Distribution: xxxx..." --entitlements Entitlements.plist Payload/wework.app
打包APP :
xcrun -sdk iphoneos PackageApplication -v Payload/wework.app -o ~/xxx.ipa
# 查看当前系统中可用的全部签名证书 security find-identity -v -p codesigning # 签名, 能够加 -f 参数 以覆盖签名 codesign -s 'iPhone Developer: Thomas Kollbach (7TPNXN7G6K)' Example.app # 查看签名状态 codesign -vv -d Example.app # 另一种方式来查看签名 ldid -e Demo.app/demo