iOS 逆向开发先导篇——我是这么调试开发的
今天在整理东西的时候,无意间发现一个逆向微信的功能清单,想起来原来自己曾经还学过一些 iOS 逆向工程的皮毛知识。
虽然答应了朋友最终没实现,但我还是想分享下我的经验和想法,最后顺便再看看【微信群 id】长什么样子的。
话不多说,开启本文的主旨:iOS 逆向开发的先导篇 —— tweak 编写之前的准备。
现在网上太多有关逆向微信的帖子了。我总不能和他们一样,也是说说什么是逆向,什么是 tweak之类的,这也太入俗套了。本文的顺序是:
- 要逆向微信,首先考虑的是如何注入我们编写的动态库和重签名,所以先从编写 Script 脚本开始;
- 如何利用 xcode 调试和执行 Script 在非越狱手机上安装微信;
- 编写 tweak 代码,生成动态库,来点实在的功能,如:防撤销等功能;
- 整理下工具以供开发使用。
编写 Script 脚本
#!/bin/bash
# 利用开发者证书申请一个 id
BUNDLEIDENTIFIER=com.meishu.ye
APPLICATIONIDENTIFIER=***.${BUNDLEIDENTIFIER}
WECHATFILEPATH=/Users/****/git/jailbreak/6.5.3/WeChat2
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib ./Debug-iphoneos/bot.dylib
ls
ORIGINDIR=$(pwd)
cp ./Debug-iphoneos/bot.dylib bot.dylib
cp ./libsubstrate.dylib libsubstrate.dylib
cp ./FontAwesome.otf FontAwesome.otf
cp ./WechatIMG1.png WechatIMG1.png
LIBNAME=$(find bot.dylib)
LIBSUBNAME=$(find libsubstrate.dylib)
FONTNAME=$(find FontAwesome.otf)
WECHATIMG1=$(find WechatIMG1.png)
# $(find *.dylib)
TEMPDIR=$(mktemp -d)
# 0.get argv
if [ x$1 != x ]
then
BUNDLEIDENTIFIER=$1
fi
# 1.unzip ipa
unzip -qo ${WECHATFILEPATH}/WeChat.ipa -d $TEMPDIR
# 2.copy files
cp ${WECHATFILEPATH}/embedded.mobileprovision $TEMPDIR/
cp ${WECHATFILEPATH}/entitlements.plist $TEMPDIR/
cp ${LIBNAME} $TEMPDIR/
cp ${LIBSUBNAME} $TEMPDIR/
cp ${FONTNAME} $TEMPDIR/
cp ${WECHATIMG1} $TEMPDIR/
# 2.1 rm origin WeChat 1月22日 begin
# rm $TEMPDIR/Payload/WeChat.app/WeChat
# cp ${WECHATFILEPATH}/WeChat $TEMPDIR/Payload/WeChat.app/
# 2.1 rm origin WeChat 1月22日 end
# 3.resign
cd $TEMPDIR
plutil -replace application-identifier -string ${APPLICATIONIDENTIFIER} entitlements.plist
plutil -replace CFBundleIdentifier -string ${BUNDLEIDENTIFIER} Payload/WeChat.app/Info.plist
mv ${FONTNAME} Payload/WeChat.app/
mv ${LIBNAME} Payload/WeChat.app/
mv ${LIBSUBNAME} Payload/WeChat.app/
#${WECHATFILEPATH}/insert_dylib --all-yes @executable_path/${LIBSUBNAME} Payload/WeChat.app/WeChat
#mv Payload/WeChat.app/WeChat_patched Payload/WeChat.app/WeChat
#chmod +x Payload/WeChat.app/WeChat
${WECHATFILEPATH}/insert_dylib --all-yes @executable_path/${LIBNAME} Payload/WeChat.app/WeChat
${WECHATFILEPATH}/optool install -c load -p @executable_path/${LIBNAME} -t Payload/WeChat.app/WeChat
mv Payload/WeChat.app/WeChat_patched Payload/WeChat.app/WeChat
chmod +x Payload/WeChat.app/WeChat
rm -rf Payload/WeChat.app/_CodeSignature
rm -rf Payload/WeChat.app/PlugIns
rm -rf Payload/WeChat.app/Watch
cp embedded.mobileprovision Payload/WeChat.app/
codesign -fs "iPhone Developer: **** (****)" --no-strict --entitlements=entitlements.plist Payload/WeChat.app/${LIBSUBNAME}
codesign -fs "iPhone Developer: **** (****)" --no-strict --entitlements=entitlements.plist Payload/WeChat.app/${LIBNAME}
codesign -fs "iPhone Developer: **** (****)" --no-strict --entitlements=entitlements.plist Payload/WeChat.app
# 4.end
rm -rf ${ORIGINDIR}/WeChat.app
mv Payload/WeChat.app ${ORIGINDIR}
rm -rf ${TEMPDIR}
解释:
- 我们只是为了学习,逆向一些 APP,所以没必要去越狱我们的 iPhone 手机,所以本文的最主要目标就是不越狱的情况下逆向微信功能;
- 如果手里没有越狱手机,最好的办法是通过某助手下载破解的微信 APP,如本文中用到的是6.5.3版本;
-
install_name_tool
最核心就是用来替换依赖的名字。简单的来讲把原来的 libsubstrate.dylib 替换为带路径的版本,第三个参数是要修改的可执行文件名,如本文的注入文件: bot.dylib。有关install_name_tool
的更多功能,可参考链接:http://www.unix.com/man-page/osx/1/install_name_tool/ - plutil 命令的作用是替换到原有的 embedded.mobileprovision 和 entitlements.plist 替换成自己的。plutil 命令格式: image
- 利用 insert_dylib 工具注入动态库和依赖库;
- 删除多余的文件:
_CodeSignature
、PlugIns
、Watch
,以免注入失败; - 最后就是利用 codesign 命令来为微信中的相关文件签名,签名完后的可执行文件就可以顺利安装到非越狱手机上了
xcode 调试
太懒的写字了,直接看图,主要有三个步骤来生成破解的 WeChat APP,安装到手机上进行调试:
image
- 创建 WeChat 同名工程,用于每次编译和运行时生成 WeChat.app;
- 在 Build Phases 中设置 Target Dependencies,增加 dylib,只要每次运行都会先编译最新的动态库;
- 在 Run Script 中增加一条 Script 将我们上文写的 copy 过来即可;
-
运行 WeChat。这里需要将 第 3 步的生成的 WeChat.app 替换掉 第 1 步的。
image
运行结果,就可以在 All Output 上看到所有运行的 logs 了:
image
image
有了 log,编写 tweak 动态链接库代码就可以调试了。同时安装了两个微信已经是傻傻分不清了。
编写 tweak
工欲善其事,必先利其器。看看我的利器吧:
image
image
有利器了,我们就可以编写 tweak 代码了。如果说只是为了如何创建和编写 tweak 代码,相信有很多网上教程可供参考的。这里就不再赘述了,可见文末的推荐。
编写第一个 hook 函数:
// 防撤销
- (void)DelMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap {
NSLog(@"CMessageMgr:DelMsg:arg1:%@, MsgWrap:%@", arg1, wrap);
BOOL isMesasgeFromMe = NO;
CContactMgr *contactManager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
CContact *selfContact = [contactManager getSelfContact];
if ([[wrap m_nsFromUsr] isEqualToString:[selfContact m_nsUsrName]]) {
%orig;
}
}
- (void)DelMsg:(id)arg1 MsgList:(id)arg2 DelAll:(BOOL)arg3 {
NSLog(@"CMessageMgr:DelMsg:arg1:%@, MsgList: %@, DelAll: %d", arg1, arg2, arg3);
BOOL isMesasgeFromMe = NO;
CContactMgr *contactManager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
CContact *selfContact = [contactManager getSelfContact];
for (CMessageWrap* wrap in arg2) {
if ([[wrap m_nsFromUsr] isEqualToString:[selfContact m_nsUsrName]]) {
isMesasgeFromMe = YES;
break;
}
}
if(isMesasgeFromMe || arg3) {
%orig;
}
}
image
image
工具篇
- Hopper Disassembler v3
Hopper is a reverse engineering tool for OS X and Linux, that lets you disassemble, and decompile your 32/64bits Intel Mac, Linux, Windows and iOS executables!Take a look at the feature list!
Hopper 是一款运行在 Mac、Windows 和 Linux 下的调试 (os x only)、反汇编和反编译的交互式工具。可以对32、64位的 Mac、Windows、和 iOS 应用进行调试、反编译等。
只要将 WeChat 二进制文件拖到 Hopper Disassembler 就可以了,我们可以在左边看到很亲切的 Objective-C 语法的方法列表,我们可以搜索想要了解的函数或者类,这里很明确;中间是每个函数的汇编语言吧,虽然我的汇编学的还不错,但我还是喜欢看代码,比较亲切。如下图的[CMessageWrap nativeUrl]
方法。
- insert_dylib
Command line utility for inserting a dylib load command into a Mach-O binary.
我们需要利用 insert_dylib
命令将我们写的动态库 bot.dylib 和 依赖库 libsubstrate.dylib 注入到 WeChat.app/WeChat 目标二进制文件中,最后生成 WeChat.app/WeChat_patched。最后只需要将生成的文件替换为 WeChat.app/WeChat 即可。
insert_dylib github:
https://github.com/Tyilo/insert_dylib
- optool
optool is a tool which interfaces with MachO binaries in order to insert/remove load commands, strip code signatures, resign, and remove aslr. Below is its help.
optool github:
https://github.com/alexzielenski/optool
总结
本文是 iOS 逆向开发的先导篇,通过一些工具和 xcode 来调试开发 tweak,为下一步的具体开发做好铺垫。
下一步:开发功能
推荐参考:
- 使用 CocoaPods 给微信集成 SDK 打印收发消息。http://t.cn/R9pADno
- 移动App入侵与逆向破解技术-iOS篇。http://www.jianshu.com/p/6729f88107d6
- Make WeChat Great Again。http://yulingtianxia.com/blog/2017/02/28/Make-WeChat-Great-Again/
- 分分钟让你在 微信运动 霸占榜首. http://www.jianshu.com/p/bfd4abd78f21
- 我是如何利用 Xcode 调试开发微信消息预览插件的. http://t.cn/R9p2tBu
- iOS 逆向 - 微信 helloWorld. http://www.jianshu.com/p/04495a429324
- 越狱开发2-Tweak入门. http://luoxianming.cn/2016/11/13/yueyutweak1/
听说最美的人和最帅的人,都会给作者打赏,以资鼓励
coding01 期待您关注
qrcode