iOS 逆向开发先导篇

1,604 阅读5分钟
原文链接: mp.weixin.qq.com

今天在整理东西的时候,无意间发现一个逆向微信的功能清单,想起来原来自己曾经还学过一些 iOS 逆向工程的皮毛知识。

虽然答应了朋友最终没实现,但我还是想分享下我的经验和想法,最后顺便再看看【微信群 id】长什么样子的。

话不多说,开启本文的主旨:iOS 逆向开发的先导篇 —— tweak 编写之前的准备。

现在网上太多有关逆向微信的帖子了。我总不能和他们一样,也是说说什么是逆向,什么是 tweak之类的,这也太入俗套了。本文的顺序是:1. 要逆向微信,首先考虑的是如何注入我们编写的动态库和重签名,所以先从编写 Script 脚本开始;2. 如何利用 xcode 调试和执行 Script 在非越狱手机上安装微信;3. 编写 tweak 代码,生成动态库,来点实在的功能,如:防撤销等功能;4. 整理下工具以供开发使用。

编写 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}

解释:1. 我们只是为了学习,逆向一些 APP,所以没必要去越狱我们的 iPhone 手机,所以本文的最主要目标就是不越狱的情况下逆向微信功能;2. 如果手里没有越狱手机,最好的办法是通过某助手下载破解的微信 APP,如本文中用到的是6.5.3版本;3.  install_name_tool  最核心就是用来替换依赖的名字。简单的来讲把原来的 libsubstrate.dylib 替换为带路径的版本,第三个参数是要修改的可执行文件名,如本文的注入文件: bot.dylib。有关 install_name_tool  的更多功能,可参考链接:http://www.unix.com/man-page/osx/1/installnametool/ 4. plutil 命令的作用是替换到原有的 embedded.mobileprovision 和 entitlements.plist 替换成自己的。plutil 命令格式:  5. 利用 insert_dylib 工具注入动态库和依赖库;6. 删除多余的文件:_CodeSignature、  PlugIns、  Watch,以免注入失败; 7. 最后就是利用 codesign 命令来为微信中的相关文件签名,签名完后的可执行文件就可以顺利安装到非越狱手机上了

xcode 调试

太懒的写字了,直接看图,主要有三个步骤来生成破解的 WeChat APP,安装到手机上进行调试:1. 创建 WeChat 同名工程,用于每次编译和运行时生成 WeChat.app;2. 在 Build Phases 中设置 Target Dependencies,增加 dylib,只要每次运行都会先编译最新的动态库;3. 在 Run Script 中增加一条 Script 将我们上文写的 copy 过来即可;4. 运行 WeChat。这里需要将 第 3 步的生成的 WeChat.app 替换掉 第 1 步的。

运行结果,就可以在 All Output 上看到所有运行的 logs 了:

有了 log,编写 tweak 动态链接库代码就可以调试了。同时安装了两个微信已经是傻傻分不清了。

编写 tweak

工欲善其事,必先利其器。看看我的利器吧:

有利器了,我们就可以编写 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;
    }
}

工具篇

  • 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 期待您关注