如何改变第三方app代码?
- 动态库(FrameWork,Dylib)(工程和动态库有关联,动态库加载进app中)
- 静态注入
- 修改MachO文件的Load Commans
比如一些简单的代码注入,hook第三方app上的函数去改成自己的
framework注入
- 在xcode TARGETS增加一个framework
- 点击项目TARGETS/Build Phases 添加New Copy Files Phases (Destination选择Frameworks, 点击+进刚才新建的framework,然后勾选Copy only when installing(编译,主要是把刚才新建的framework加载到Products/app 的Frameworks,打包进app里面,可以用image list查看)) (不用勾选Copy only when installing)
- 在刚才新建的Framework下新加类文件, 在+load方法中加进你的代码
- 上面的frame只是加载进.app/FrameWorks下,但是在.app的macho并没有把rongframework加载进macho中
- 然后可以通过yololib把rongframework的macho加载到app的macho中 (链接:https://pan.baidu.com/s/1JWQzPvi7ufMb5sKwNW2w2Q 密码:y6wg)(把yololib文件放在usr/local/bin 中就行,可以直接调用)
- yololib用法(后面的路径是.app/Frameworks下载rongframework)(也就是加载二进制 规则修改)(注意:Wechat修改的不是编译后的Products的Wechat 是要被替换的ipa下的Wechat执行yololib 然后在打包成ipa,然后在替换)然后看下wechat包含了rongframework,然后运行就执行你的代码了(这里主要看上一遍签名文章有写)(把Payload打包成ipa zip -ry WeChat.ipa Payload)
1yololib WeChat Frameworks/RongFramework.framework/RongFramework - 打包成新的ipa放在App下就行了 (这里主要看上一遍签名文章有写 App这些是有脚本在执行)
注意:
1. 第6步最容易犯错,在找到App下的WeChatMacho文件执行(找到rongframework的macho文件对.app/相对路径
1 |
yololib WeChat Frameworks/RongFramework.framework/RongFramework |
yololib 就是告诉WeChat要加载Frameworks/RongFramework.framework/RongFramework的macho文件,注意路径一定不要错,否则代码注入失败
2.然后勾选Copy only when installing作用?
就是把framework打包进app中,可以展示包文件在FrameWorks/下有你的framework,(这一步并没有在可执行文件中包含 第6步做就行)
Dylib注入
- 在xcode TARGETS增加一个Libary(mac)
- 点击项目TARGETS/Build Phases 添加New Copy Files Phases (Destination选择Frameworks, 点击+进刚才新建的Dylib,然后勾选Copy only when installing(编译,主要是把刚才新建的Dylib加载到Products/app 的Dylib,打包进app里面,可以用image list查看))和上面framework那步一样的
- 然后编译可以会出错
dylib路径不对(dylib路径没有在Debug-iphoneos,在Debug路径下,把Debug下copy到Debug-iphoneos下就行了)(target/Build Setting搜Per-configuration Intermediate Build Files Path),
注意:在target下的Debug路径复制后copy到2个地方一个是target和dylib路径下,但是不同的target下同一变量名路径不一样,所以在dylib强制改下路径,这样就是把Debug下的lib放到Debug-iphoneos下
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#重签名第三方App到手机上#------------------------------#变量# ${SRCROOT} xcode工程路径# $BUILT_PRODUCTS_DIR工程的products路径# $TARGET_NAME target路径# $PRODUCT_DUNDLE_IDENTIFIER 当前工程下的bundleID# $EXPANDED_CODE_SIGN_IDENTITY 当前工程下的证书#------------------------------#资源路径RESOURCE_PATH="${SRCROOT}/App"TARGET_IPA_PATH="$RESOURCE_PATH/*.ipa"TEMP_PATH="${SRCROOT}/Temp"#文件夹创建rm -rf "$TEMP_PATH"mkdir -p "$TEMP_PATH"mkdir "$RESOURCE_PATH"#------------------------------#1.解压ipa到Temp/unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"#2.获取解压后的Temp/Payload/target.app (比如target就是你的.app名)TEMP_PAYLOAD_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app; echo "$1")#------------------------------#3.获取garget/Demo.appTARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"echo "ppppppppp= $TARGET_APP_PATH"#4.删除Demo中的.app 也就是3步的.app 后重建rm -rf "$TARGET_APP_PATH"mkdir -p "$TARGET_APP_PATH"#5.将2步的解压后的target.app下的所以内容 copy到工程下Products下(就是替换Demo.app为target.app)cp -rf "$TEMP_PAYLOAD_APP_PATH/" "$TARGET_APP_PATH"#------------------------------#6.删除Extention和WatchApp(个人证书不能签名Extention)rm -rf "$TARGET_APP_PATH/PlugIns"rm -rf "$TARGET_APP_PATH/Watch"#7.修改Plist的bundleID (xcode中的plist右键选择None 可以看到它真实的名字CFBundleIdentifier)#用/usr/libexec/PlistBuddy工具 用法 "Set KEY Value" "目标文件路径"/usr/libexec/PlistBuddy -c "Set CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"#------------------------------#8.给Macho增加执行权限#获取macho文件 路径APP_Macho_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`chmod +x "$TARGET_APP_PATH/$APP_Macho_BINARY"#------------------------------#9.重签名第三方的Frameworks (把里面所有的framework循环重签名)TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"# 不是所有的App都有FrameWorkif [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];thenfor FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*do#强制签名/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"donefi#------------------------------ 对于dylib <span style="font-size: 18pt;"><strong>------------------#10.注入自定义的动态库echo</strong></span> "开始注入"#????? libRongHook.dylib 写死的FRAMEWORK_PATH = "Frameworks/libRongHook.dylib"yololib "$TARGET_APP_FRAMEWORKS_PATH/APP_Macho_BINARY" "$FRAMEWORK_PATH"echo "注入完成✅"
12345678dyld: Library not loaded: @rpath/WCDB.framework/WCDBReferenced from: /var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/WeChatReason: no suitable image found. Did find:/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: code signing blocked mmap() of '/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB'/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: code signing blocked mmap() of '/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB'/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: stat() failed with errno=1/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: code signing blocked mmap() of '/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB'/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: stat() failed with errno=1
出现这个错误是dylib是x86,所以在TARGETS/RongHook/ 改下架构。看最下面问题
注意:很容易出现错误,检查app/frameworks是否包含了dylib,然后在检查macho是否加载进dylib
1. 自定义动态库打包到macho中,需要注意点
1 2 3 4 5 6 7 8 |
dyld: Library not loaded: @rpath/WCDB.framework/WCDB Referenced from: /var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/WeChat Reason: no suitable image found. Did find: /private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: code signing blocked mmap() of '/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB' /private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: code signing blocked mmap() of '/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB' /private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: stat() failed with errno=1 /private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: code signing blocked mmap() of '/private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB' /private/var/containers/Bundle/Application/12F225DA-AE0D-4390-8ED9-8F57DEDBC626/DylibTest.app/Frameworks/WCDB.framework/WCDB: stat() failed with errno=1 |
出现这个错误是dylib是x86,所以在TARGETS/RongHook/ 改下架构如图
但是这里改这么多太麻烦。有简单办法就是
- 直接改Base SDk位iOS的,它会自动把上面的一些mac改为iOS
- 然后把Signing选iphone 证书就好