美文网首页
iOS逆向开发先导篇-我是这么调试开发的

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

作者: 一意孤行的程序猿 | 来源:发表于2020-07-07 13:57 被阅读0次

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


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

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

现在网上太多有关逆向向微信的帖子了。我总不能和他们一样,也是说说什么是逆向,什么是tweak之类的,这也太入俗套了。本文的顺序是:
1.要逆向微信,首先考虑的是如何注入我们编写的动态库和重签名,所以先从编写脚本脚本;
2.如何利用xcode调试和执行脚本在非越狱手机上安装微信;

  1. 编写调整代码,生成动态库,来点实在的功能,如:防重启等功能;
    4.整理下工具以供开发使用。

编写脚本

#!/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版本;

  1. 最核心就是被替换依赖的名字。简单的做成把原来的libsubstrate.dylib替换为带路径的版本,第三个参数是要修改的替换文件名称,如此处的注入文件:bot.dylib。有关的更多功能,可参考链接: install_name_tool install_name_tool http://www.unix.com/man-page/osx/1/安装名称工具/
    4. plutil命令的作用是替换到原有的embedded.mobileprovision和entitlements.plist替换成自己的.plutil命令格式:5.利用insert_dylib工具注入动态库和依赖库; 6.删除多余的文件:,,,以免注入失败;7.最后就是利用codesign命令来为微信中的相关文件签名,签名完后的写入文件就可以顺利安装到非越狱手机上了

_CodeSignature PlugIns Watch

xcode调试

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


1.创建WeChat同名工程,用于多次编译和运行时生成WeChat.app;
2。在构建阶段中设置目标依赖项,增加dylib,只要每次运行都会先编译最新的动态库;
3.在运行脚本中增加一条脚本将我们上面写的副本复制过来;
4.运行微信。这里需要将第3步的生成的WeChat.app替换掉第1步的。


运行结果,就可以在所有输出上看到所有运行的日志了:


有了log,编写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;
    }
}

工具篇

  • 料斗拆卸器v3

Hopper是OS X和Linux的逆向工程工具,可让您反汇编和反编译32/64位Intel Mac,Linux,Windows和iOS可执行文件!请查看功能列表!

Hopper是一种在Mac,Windows和Linux下的调试(仅OS X),反汇编和反编译的互补工具。可以对32、64位的Mac,Windows,和iOS应用进行调试,反编译等。

只要将WeChat二进制文件拖到Hopper Disassembler就可以了,我们可以在左边看到很亲切的Objective-C语法的方法列表,我们可以搜索想要了解的函数或者类,这里很明显;中间是每个函数的汇编语言吧,虽然我的汇编学的还不错,但我还是喜欢看代码,比较亲切。如下图的[CMessageWrap nativeUrl] 方法。

  • insert_dylib

用于将dylib加载命令插入Mach-O二进制文件的命令行实用程序。

我们需要利用命令将我们写的动态库bot.dylib和依赖库libsubstrate.dylib注入到WeChat.app/WeChat目标二进制文件中,最后生成WeChat.app/WeChat_patched。最后只需替换生成的文件替换为WeChat。 app / WeChat即可。 insert_dylib

insert_dylib github:
https://github.com/Tyilo/insert_dylib

  • 操作工具

optool是一种与MachO二进制文件交互的工具,用于插入/删除加载命令,剥离代码签名,辞职和删除aslr。下面是它的帮助。

optool github:
https://github.com/alexzielenski/optool

总结

本文是iOS逆向开发的先导篇,通过一些工具和xcode来调试开发tweak,为下一步的具体开发做好铺垫。

推荐👇:

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:789143298 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

申请即送:

  • ——点击加入:iOS开发交流群

  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,

相关文章

网友评论

      本文标题:iOS逆向开发先导篇-我是这么调试开发的

      本文链接:https://www.haomeiwen.com/subject/jnpaqktx.html