iOS攻防 - (九)将iOS应用hook和注入dylib后,重新签名并打包
1.下载微信,并解密WeChat.ipa
我的本篇博客已经讲过,此处不再赘述 ;http://blog.csdn.net/u013538542/article/details/72697647
2.查看解密后的微信的基本信息
通过cd命令到解密后微信的目录,名称com.tencent.xin-iOS7.0-(Clutch-2.0.4)是利用Clutch解密后生成的ipa,并解压压缩包的目录
$ cd com.tencent.xin-iOS7.0-(Clutch-2.0.4)/Payload/WeChat.app/
$ file WeChat
得到微信编译使用的架构:
WeChat: Mach-O universal binary with 2 architectures: [arm_v7: Mach-O executable arm_v7] [arm64]
WeChat (for architecture armv7): Mach-O executable arm_v7
WeChat (for architecture arm64): Mach-O 64-bit executable arm64
然后查看微信是否解密成功,利用otool工具,安装过xcode就表明已经安装过otool
$ otool -l WeChat | grep crypt
得到如下信息,cryptid 等于1表示加密,0表示解密
cryptoff 16384 cryptsize 52756480 cryptid 0 cryptoff 16384 cryptsize 56770560 cryptid 0
3.安装iOSOpenDev
这里有英文版本解决方案:https://gist.github.com/ashish1405/8744a1cf9d3d78af3a75559042f7eb54
以下是对此篇英文文章进行说明和实践
3.1 先安装MacPorts,选择你的MacBook相应的版本安装
3.2 重启启动终端,输入如下,也就是更新MacPorts
sudo port -v selfupdate
3.3 安装DPKG,安装过程中有一个提示,输入Y即可
sudo port -f install dpkg
3.4 安装两个工具, theos和ldid
看这个博客 http://blog.csdn.net/u013538542/article/details/72811142
3.6 去浏览器打开以下地址,下载必须要用的openssl和Specifications
解压后,把Specifications目录下的,
3.6.1 iPhone.Simulator开头的四个文件拷贝到
/Applications/Xcode/Content/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications
如果Specifications目录不存在,则创建一个3.6.2 将iPhoneOS开头的四个文件拷贝到
/Applications/Xcode/Content/Developer/Platforms/IphoneOS.platform/Developer/Library/Xcode/Specifications
如果Specifications目录不存在,则创建一个
4.创建hook工程项目
4.1 创建一个Xcode工程,选择iOSOpenDev模板里的CaptainHook Tweak,给项目命名为hook
4.2 替换hook.mm文件的内容如下:
attribute((constructor)) static void entry() {
NSLog(@”hello, world!”);
}
4.3 Edit Scheme = Debug, 然后编译项目command + B
,在项目的目录LatestBuild
下找到hook.dylib, 并把hook.dylib拷贝到WeChat.app/
目录下
4.4 下载yololib , 编译后,把yololib可执行文件拷贝到com.tencent.xin-iOS7.0-\(Clutch-2.0.4\)
同级目录,并执行如下命令,其实意思就是向WeChat可执行文件里注入hook.dylib库
./yololib com.tencent.xin-iOS7.0-(Clutch-2.0.4)/Payload/WeChat.app/WeChat hook.dylib
会输出如下所示
VictorZhang@VictorZhang:~/Desktop/apps/WeChat$ ./yololib com.tencent.xin-iOS7.0-\(Clutch-2.0.4\)/Payload/WeChat.app/WeChat hook.dylib
2017-05-28 13:13:22.001 yololib[1079:122842] dylib path @executable_path/hook.dylib
2017-05-28 13:13:22.002 yololib[1079:122842] dylib path @executable_path/hook.dylib
Reading binary: com.tencent.xin-iOS7.0-(Clutch-2.0.4)/Payload/WeChat.app/WeChat
2017-05-28 13:13:22.003 yololib[1079:122842] FAT binary!
2017-05-28 13:13:22.003 yololib[1079:122842] Injecting to arch 9
2017-05-28 13:13:22.003 yololib[1079:122842] Patching mach_header..
2017-05-28 13:13:22.003 yololib[1079:122842] Attaching dylib..
2017-05-28 13:13:22.003 yololib[1079:122842] Injecting to arch 0
2017-05-28 13:13:22.003 yololib[1079:122842] 64bit arch wow
2017-05-28 13:13:22.003 yololib[1079:122842] dylib size wow 56
2017-05-28 13:13:22.003 yololib[1079:122842] mach.ncmds 77
2017-05-28 13:13:22.003 yololib[1079:122842] mach.ncmds 78
2017-05-28 13:13:22.003 yololib[1079:122842] Patching mach_header..
2017-05-28 13:13:22.004 yololib[1079:122842] Attaching dylib..
2017-05-28 13:13:22.004 yololib[1079:122842] size 51
2017-05-28 13:13:22.004 yololib[1079:122842] complete!
4.5 拷贝hook.dylib到WeChat.app/目录下
cp hook.dylib WeChat.app/
4.6 创建一个项目,bundle identifier可以取为com.tencent.xin2 ,当然你取什么都可以,然后在https://developer.apple.com 创建它的App ID和Provisioning Profile证书(distribution版),并且打一个release包,把这个包里面包含的 embedded.mobileprovision
文件拷贝到 WeChat.app/
下
4.7 在 https://developer.apple.com 查找到证书的对应的AppID=com.tencent.xin2
的provisioning profile证书,下载下来,通过如下命令可以看到.mobileprovision
的内容
security cms -D -i example.mobileprovision
4.8 通过签名命令可以得到如下Entitlements的配置信息,
codesign -d –entitlements - WeChat.app
并创建一个Entitlements.plist文件,粘贴上面命令输出的内容,文件基本内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>BA7DZZ39KJ.com.domain.projectname</string>
<key>com.apple.developer.team-identifier</key>
<string>BA7DZZ39KJ</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>BA7DZZ39KJ.*</string>
</array>
</dict>
</plist>
4.9 查看所有可用于签名的证书
security find-identity -v -p codesigning
4.10 对hook.dylib动态库进行签名,并验证,其中B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9是证书的一个字符串,可以从4.9的步骤查看到,验证无报错信息,则表示通过
codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 WeChat.app/hook.dylib
codesign –verify WeChat.app/hook.dylib
4.11 先把WeChat.app/_CodeSignature
目录删除掉,然后把WeChat.app里的Info.plist文件里的BundleID改成com.tencent.xin2
,接着对WeChat.app进行签名,验证
codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 WeChat.app
codesign –verify WeChat.app
4.12 查看WeChat.app可执行文件签名状态的信息,这些信息在出现不明错误时会提供巨大的帮助:
codesign -vv -d WeChat.app
4.13 ipa打包
xcrun -sdk iphoneos PackageApplication -v WeChat.app -o $(pwd)/WeChat2.ipa
但是,自从Xcode 8.3.2 后,PackageApplication 就不可用了,先google找找问题吧,解决方案如下:
我把Xcode 8.3.2之前的PackageApplication脚本复制到了/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
目录下,然后使用 chmod 777 PackageApplication
给这个脚本执行权限,最后可以正常打包了,下载地址
我们知道正常打包的流程如下
1.清除缓存
xcodebuild clean
2.编译项目,编译后,当前项目目录会出现 `build/Release-iphoneos/TodaysAppForReSign.app’ 文件
xcodebuild -sdk iphoneos10.3 -target TodaysAppForReSign -configuration Release -arch arm64 -arch armv7 CODE_SIGN_IDENTITY=”iPhone Distribution: victor zhang (BBBBAAAACCCC888899)”
3.生成ipa包
xcrun -sdk iphoneos PackageApplication -v build/Release-iphoneos/TodaysAppForReSign.app -o $(pwd)/TodaysAppForReSign.ipa
在这里,我们只需要使用第三步即可
未完待续。。。