FurionXin的博客

Tweak笔记(二):wxsightpreview

微信小视频Tweak与打包重签名

这是在我逆向微信的时候所做的一些工作,同时也借鉴了许多大神的代码与博客。本文分为两大部分,第一部分是获取朋友圈小视频代码的实现流程,第二部分是将写好的插件安装到应用中,讲应用重签名打包,最后安装在非越狱机中。
微信的是一款非常出色的应用,编写习惯非常好。而且功能众多,文件达到了100M以上,所以是逆向的学习和实践的一个很好的对象。而这篇文章的主要是讲如何编写微信朋友圈小视频分享插件的。

一、获取朋友圈的小视频

首先下载微信客户端。我下载的是6.3.28版本的。环境是iPhone5S 9.1的越狱机。直接在PP助手上下载越狱版的,可以免去砸壳。至于整个流程我就不赘述了,在下面这篇博客中大神讲的非常清楚,有什么大家可以在博客里留言,或是给我留言也好:
传送门

二、打包安装重签名过程

将Tweak编写完后,通过make package install安装到手机上确认没有问题后,我们就可以吧插件安装到应用中进行打包重签名安装给非越狱机了。

1.检查依赖项:

如果设备没有越狱,是没有mobilesubstrate等环境的,而且一些系统目录是没有读写权限的,这时我么只能从目标app的二进制文件入手,通过手动修改load commands来加载自己的dylib,那么上面我们的插件又是使用theos基于mobilesubstrate编译的,有没有办法确定我们的dylib有没有依赖其他的库呢?

使用osx自带的otool工具即可,可以看出,我们的lib是依赖于substrate库的,其他的都是系统库,所以我们从越狱设备中把cydiasubstrate文件copy出来重命名为libsunstrate.dylib,和我们的dylib一起放入wechat.app目录中

最后使用install_name_tool命令修改动态库的路径把它指向app二进制文件的同级目录:

otool -L wxsightforward.dylib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WeChatRedEnvelop.dylib (architecture armv7):
/Library/MobileSubstrate/DynamicLibraries/wxsightforward.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.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
/usr/lib/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
wxsightforward.dylib (architecture arm64):
/Library/MobileSubstrate/DynamicLibraries/wxsightforward.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.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
/usr/lib/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

可以看到除了 substrate 库,其它依赖的都是系统自带的库。我们将 libsubstrate.dylib 拷出,使用 install_name_tool 命令修改动态库的路径,指向 app 二进制文件的同级目录。

scp root@:/usr/lib/libsubstrate.dylib ~/Desktop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ install_name_tool -change /usr/lib/libsubstrate.dylib @loader_path/libsubstrate.dylib wxsightforward.dylib
$ otool -L wxsightforward.dylib
wxsightforward.dylib (architecture armv7):
/Library/MobileSubstrate/DynamicLibraries/wxsightforward.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.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
@loader_path/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
wxsightforward.dylib (architecture arm64):
/Library/MobileSubstrate/DynamicLibraries/wxsightforward.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.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
@loader_path/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

2.将动态链接库注入到二进制文件中

接下来,需要将dylib注入到微信的二进制文件中,可以使用开源的optool工具。
编译安装optool工具:

git clone --recursivelink
1
2
$ cd optool
$ xcodebuild -project optool.xcodeproj -configuration Release ARCHS="i386 x86_64" build

将砸壳的ipa文件将砸壳过的 ipa 文件解压,然后将 libsubstrate.dylib 与 wxsightforward.dylib 拷贝到解压后的 WeChat.app 目录下,如果app中包含watchApp等多个可执行文件,删除掉Watch文件夹和PlugIns文件夹即可,然后使用optool吧dylib注入到WeChat这个二进制文件中:

1
$ /path/to/optool install -c load -p "@executable_path/wxsightforward.dylib" -t wechat/Payload/WeChat.app/WeChat

3.打包并重签名

注入成功后接下来就是需要打包并重签名,这里我用到了AppResign这个工具。
使用方法:

1
./AppResign input out


然后通过PP助手或者iTools将ipa包安装到手机上即可。
最后一点要注意的是,由于中国的开发者利用免费的证书大量对应用进行重签名,所以目前苹果加上了许多限制,免费开发者的provisioning证书有效时间从之前的30天改为7天,过期后需要重新签名。另外就是一个星期内最多只能申请到10个证书。公司证书可以给安装该ID的其他人安装,企业证书可以给任何用户安装。