iOS 逆向开发先导篇——我是这么调试开发的

今天在整理东西的时候,无意间发现一个逆向微信的功能清单,想起来原来自己曾经还学过一些 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/install_name_tool/
  4. plutil 命令的作用是替换到原有的 embedded.mobileprovision 和 entitlements.plist 替换成自己的。plutil 命令格式: image
  5. 利用 insert_dylib 工具注入动态库和依赖库;
  6. 删除多余的文件:_CodeSignaturePlugInsWatch,以免注入失败;
  7. 最后就是利用 codesign 命令来为微信中的相关文件签名,签名完后的可执行文件就可以顺利安装到非越狱手机上了

xcode 调试

太懒的写字了,直接看图,主要有三个步骤来生成破解的 WeChat APP,安装到手机上进行调试:
image

  1. 创建 WeChat 同名工程,用于每次编译和运行时生成 WeChat.app;
  2. 在 Build Phases 中设置 Target Dependencies,增加 dylib,只要每次运行都会先编译最新的动态库;
  3. 在 Run Script 中增加一条 Script 将我们上文写的 copy 过来即可;
  4. 运行 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] 方法。
image

  • 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,为下一步的具体开发做好铺垫。

下一步:开发功能

推荐参考:


听说最美的人和最帅的人,都会给作者打赏,以资鼓励


coding01 期待您关注

qrcode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值