非越狱theos的Tweak创建的dylib安装到iOS设备

2020-05-05 作者:编程知识要点   |   浏览(71)

前言

最近在钻研iOS hook技术,刚刚摸到一点门道,现做如下总结,本文中将以微信作为实验对象注入。Theos是Mac上的iOS插件开发环境,集成了创建,打包,安装到手机的所有功能,本文稍后会讲到如何搭建theos开发环境。

参考文章:
[iOS Reverse入门]微信注入
iOS逆向入门实践 — 逆向微信,伪装定位(一)

非越狱环境下iOS版WeChat 逆向研究示例,dylibz(动态库)注入、应用重签名

工欲善其事必先利其器,需要的工具:

  • Xcode Command Line Tools
  • Xcode
  • Homebrew
  • dkpg
  • llid
  • thoes
  • 一台已越狱的手机
  • OpenSSH
  • 手机终端NewTerm
  • 苹果开发者账号
  • Impactor
  • 一台Mac 电脑,或者一台装有Mac OSX的windows电脑
一. 先在已经越狱的手机上,打开Cydia搜索OpenSSH,并安装。
  1. WIFI连接(暂未使用过):手机和Mac电脑在同一网络下。
    例如我的iPhone的ip是: 192.168.00.00
macdeMacBook-Pro:~ mac$ ssh root@192.168.00.00
  1. USB连接:比WIFI响应速度快,网络环境无限制
    1.安装usbmuxd库,usbmuxd库中就顺带安装了一个小工具iproxy,该工具会将设备上的端口号映射到电脑上的某一个端口,例如:
iproxy 2222 22

2.以上命令就是把当前连接设备的22端口(SSH端口)映射到电脑的2222端口,那么想和设备22端口通信,直接和本地的2222端口通信就可以了。 因此,SSH连接设备就可以这样连接了:

macdeMacBook-Pro:~ mac$ iproxy 2222 22
waiting for connection
  1. 终端提示 waiting for connection ,表示这两个端口之间已经可以通信了,保留当前终端(如果关闭就停止端口之间的通信了),新建另一个终端输入,默认密码:alpine
Last login: Fri Dec 15 16:14:13 on ttys010
macdeMacBook-Pro:~ mac$ ssh -p 4567 root@127.0.0.1
root@127.0.0.1's password: 
credoode-iPad:~ root# 

基本原理

通过app启动时调用我们注入的dylib,进行app hook,最终能够执行我们注入的dylib。

具体步骤

1.现在已经越狱的手机上,打开Cydia搜索OpenSSH,并安装。2.在Mac上下载Impactor,安装并打开,将越狱后的手机连接至电脑;下载手机终端NewTerm;将下载的.deb文件拖入到Impactor界面,按照提示输入开发者账号密码,deb文件会直接按照道手机上。这一步可以参考我的博客:解决Cydia数据库错误:could not open file /var/lib/dpkg/status。3.手机连接WIFI,打开手机设置,无线局域网设置,点击已连接的wifif后面的那个倒感叹号按钮,查看手机的IP地址,如:192.168.0.1记录下这个IP地址。4.打开手机终端NewTerm,输入命令:

ssh root@xx.xx.xx.xx

其中,xx.xx.xx.xx是你的手机IP地址,输入密码:alpine,注意要一个一个字母的输入。5.在Mac上打开终端,配置环境变量:

export THEOS=/opt/theos

6.从Github下载theos开发环境:sudo git clone git://github.com/DHowett/theos.git $THEOS7.安装Homebrew,若已安装,跳过此步:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

8.安装dpkg及llid

brew install dpkg ldid

9.下载libsubstrate.dylib,并移动到 /opt/theos/lib/10.在Mac终端中cd到桌面,新建一个substrate.h文件:

touch substrate.h

用文本编辑器打开substrate.h文件,打开substrate.h,拷贝里面的所有代码,粘贴到substrate.h中,保存关闭,将编辑好的substrate.h文件移动到:

/opt/theos/header/

若没有header这个文件夹,则手动创建:

cd /opt/theosmkdir header

11.运行脚本nic.pl,在Mac终端输入命令:

/opt/theos/bin/nic.pl

若成功,会出现如下界面:

图片 1

选则[11.]iphone/tweak,我们要做的是一个简单的iOS插件,输入:

11

并回车。接着输入项目名:

Project Name : 

我输入了test,回车,接着输入包名

Package Name

我输入了

com.xgf.test

接着输入作者名:

Author/Maintainer Name [风过的夏]: 

我在这里输入了我在简书的网名CGPointZero下面的输入是最重要的,输入要hook的app的bundle identifier

[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:

12.在hook一个app之前,你要先下载该app,下载你要hook的app;13.获取你的手机上安装的所有app的bundle identifier。随便新建一个Xcode项目,在ViewController.m文件中倒入运行时头文件:

#import "ViewController.h"#import <objc/runtime.h>

添加如下方法:

-touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace"); NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)]; NSLog(@"apps: %@", [workspace performSelector:@selector(allApplications)]);}

手机连接电脑,真机调试,程序运行后,点击一下屏幕,复制打印的信息到文件编辑器中,找到你要hook的app对应的bundle identifier:在这里,拿微信开刀,hook微信,在进入聊天界面时,注入一段代码。搜索wechat,找到微信的bundle identifier,记录这个值:

图片 214.接着第11步,输入要hook的app的bundle identifier:

[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:

输入微信的bundle identifier:

com.tencent.xin

14.指定你开发的插件被安装完成之后,应该重启哪些部分,必比如重启SpringBoard,若不需要重启任何东西,输入:

-

回车15.在终端中cd到用户根目录,比如:

cd /Users/xia/

可以看到刚刚创建的tweak项目:test文件夹16.打开Tweak.xm文件,在这里,编写要注入的代码:

%hook ClassName

表示要hook的类名,这个需要通过:

dumpdecryptedcycriptlogifyhopperlldbdebugserver

过程比较复杂,由于这里只讲入门,因此,直接hook别人已经dump出的微信的一个类:

BaseMsgContentViewController

这个类在第一次进入某个聊天界面时会被初始化。16.编写注入代码:

%hook BaseMsgContentViewController%end

%hook%end之间注入我们的代码:如,我们在视图加载完成之后,做一个简单的弹框:

-viewDidLoad{ %orig; UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"CGPointZero" message:@"这是注入的代码" delegate:nil cancelButtonTitle:@"确定 !" otherButtonTitles:nil]; [alert show];}

其中的:

%orig;

表示执行原来的代码,若不写这一句,原来的代码将不会被执行!17.应为我们的hook代码使用了UIKit框架,所以需要在插件项目目录/Users/xia/test/Makefile中加入framework依赖:

WelcomeWagon_FRAMEWORKS = UIKit

保存,关闭。18.打包进入插件项目目录:

cd /Users/xia/test

设置环境变量:

export THEOS=/opt/theos

输入指令:

make

成功后,通过ssh连接手机,并安装到手机上执行命令:

export THEOS_DEVICE_IP=xx.xx.xx.xx

这里的xx.xx.xx.xx是第4步的手机IP地址,会要求输入密码,默认密码:

alpine

最后执行:

make package install

将插件直接安装到手机上19.测试重启微信,随便进入一个聊天界面,预期结果弹框显示之前代码中编写的内容:

图片 3

打开cydia,查看刚刚安装都插件test

图片 4

至此,已经完成了微信的注入!虽然只是加了个弹框,但是处理起来还是不容易啊!下面是我个人的一些信息,欢迎交流:

  • Blog: CGPointZeero
  • GitHub: Insfgg99x
  • Mooc: CGPointZero
  • Jianshu: CGPointZero
  • Email: newbox0512@yahoo.com

@CGPoitZero

图片 5

二. 在Mac上打开终端,配置环境变量:
export THEOS=/opt/theos
  • 从Github下载theos开发环境:
sudo git clone git://github.com/DHowett/theos.git $THEOS
  • 安装Homebrew,若已安装,跳过此步
  • 安装dpkg及llid
brew install dpkg ldid
  • 下载libsubstrate.dylib,并移动到 /opt/theos/lib/
  • 在Mac终端中cd到桌面,新建一个substrate.h文件:
touch substrate.h
  • 用文本编辑器打开substrate.h文件,打开substrate.h,拷贝里面的所有代码,粘贴到substrate.h中,保存关闭,将编辑好的substrate.h文件移动到:
/opt/theos/header/
  • 若没有header这个文件夹,则手动创建:
cd  /opt/theos
mkdir header
  • 运行脚本nic.pl,在Mac终端输入命令:
/opt/theos/bin/nic.pl

如运行成功:

macdeMacBook-Pro:~ mac$ /opt/theos/bin/nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/cydget
  [4.] iphone/flipswitch_switch
  [5.] iphone/framework
  [6.] iphone/ios7_notification_center_widget
  [7.] iphone/library
  [8.] iphone/notification_center_widget
  [9.] iphone/preference_bundle_modern
  [10.] iphone/tool
  [11.] iphone/tweak
  [12.] iphone/xpc_service
Choose a Template (required):
  • 选择[11.]iphone/tweak,我们要做的是一个简单的iOS插件,输入:
11

接着依次输入项目名称(只能包含字母和数字),输入包名,输入作者名:

Project Name (required): test
Package Name [com.yourcompany.test]: com.tom.test
Author/Maintainer Name [mac]: developer
  • 获取你的手机上安装的所有app的bundle identifier:
    随便新建一个Xcode项目,在ViewController.m文件中:
#import "ViewController.h"
#import <objc/runtime.h>

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
    NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
    NSLog(@"apps: %@", [workspace performSelector:@selector(allApplications)]);
}

连接真机调试,点击屏幕,复制打印的信息到文件编辑器,找到你要hook的app对应的bundle identifier,如微信的,搜索weChat(注:也可以在ipa解压后的plist里面找)

  • 输入要hook的app的bundle identifier:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:

输入微信的bundle identifier:

com.tencent.xin
  • 指定你开发的插件被安装完成之后,应该重启哪些部分,必比如重启SpringBoard,若不需要重启任何东西,输入:
-
  • 在终端中cd到用户根目录,比如:
cd /Users/Mac/

可以看到刚刚创建的tweak项目:test文件夹

  • 打开Tweak.xm文件,在这里,编写要注入的代码:
%hook ClassName

类名的获取靠多个途径获取,此处暂不赘述.直接hook别人已经dump出的微信的一个类:

BaseMsgContentViewController

这个类在第一次进入某个聊天界面时会被初始化。

  • 在%hook和%end之间注入我们的代码:
%hook BaseMsgContentViewController
-(void)viewDidLoad{
    %orig;
    UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"CGPointZero" message:@"这是注入的代码" delegate:nil cancelButtonTitle:@"确定 !" otherButtonTitles:nil];
    [alert show];
}
%end

%orig表示执行原来的代码,若不写这一句,原来的代码将不会被执行!

  • 应为我们的hook代码使用了UIKit框架,所以需要在插件项目目录/Users/xia/test/的Makefile中加入framework依赖:
WelcomeWagon_FRAMEWORKS = UIKit
  • 进入插件项目目录:
cd /Users/Mac/test

设置环境变量:

export THEOS=/opt/theos

Theos 采用与 debian 相同的 make 命令来编译。执行 make 命令:

make

此处若出现如下错误

==> Error: The vendor/include and/or vendor/lib directories are missing. Please run

 `git submodule update --init --recursive` 

in your Theos directory. More information:

 [https://github.com/theos/theos/wiki/Installation

2](https://github.com/theos/theos/wiki/Installation) 

运行语句,重新make

sudo  git submodule update --init --recursive
  • 如出现错误
Haykams-MacBook:stringtheory haykam$ make package
> Making all for tweak ExampleName…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak ExampleName…
Can't locate IO/Compress/Lzma.pm in @INC (you may need to install the IO::Compress::Lzma module) (@INC contains: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at /opt/theos/bin/dm.pl line 12.
BEGIN failed--compilation aborted at /opt/theos/bin/dm.pl line 12.
make: *** [internal-package] Error 2

可以用终端

sudo cpan IO::Compress::Lzma

cpan Compress::Raw::Lzma
  • 可以用图形工具拷贝到移动设备,也可以用终端
export THEOS_DEVICE_IP=xx.xx.xx.xx

这里要注意,如果显示连接SSH失败,

ssh: connect to host 127.0.0.1 port 22: Connection refused

可能还要

export THEOS_DEVICE_PORT=2222

接着调用 make package install 命令完成编译打包安装

make package install

如报错如下,完整文本忘了赋值留存

Can't locate IO/Compress/Lzma.pm in @INC......

则需要运行(如果失败,则重试一下),答案地址:

should both install
sudo cpan IO::Compress::Lzma
and
cpan Compress::Raw::Lzma

运行成功,再次打包

应用砸壳

App store里的应用都是加密的,没办法直接拿来使用,所以在做之前都需要一个砸壳的过程,而砸壳使用的工具是dumpdecrypted, 原理就是让app预先加载一个dumpdecrypted.dylib,然后在程序运行时,将代码动态解密,最后在内存中dump出来整个程序。当然砸壳是需要在越狱环境下进行的,所以我直接从PP助手等各种xx助手里面下载越狱应用(不是正版应用),也就是所谓的脱过壳的应用。

注意: 有好多应用是只有部分架构被解密,这时需要检查从xx助手下载的越狱应用是否已解密,还有就是Watch App以及一些扩展依然加密了,所以最好还是确认一下,否则的话,就算hook成功,签名成功,安装成功,app还是会闪退。

查看越狱应用是否已经解密的方式,以WeChat-6.5.18为例:
1.将xx助手中下载的WeChat-6.5.18.ipa包解压,会得到一个相同的名称的文件夹,然后进入该文件夹中->Payload->WeChat,右键WeChat->显示包内容,进入app包中
2.打开终端,并进入刚才解压的WeChat-6.5.18文件夹中Payload文件夹中,执行cd命令:
cd /Users/mofeini/Desktop/weChat/WeChat-6.5.18/Payload
3.通过终端,找到应用对应的二进制文件,查看该app包含哪些架构, 执行file命令:
file WeChat.app/WeChat
结果:

WeChat.app/WeChat: Mach-O universal binary with 2 architectures: [arm_v7: Mach-O executable arm_v7] [arm64]
WeChat.app/WeChat (for architecture armv7):    Mach-O executable arm_v7
WeChat.app/WeChat (for architecture arm64):    Mach-O 64-bit executable arm64

从结果中可以看到WeChat.app包含两个构架: arm_v7arm64,关于架构和设备之间的关系,可以查看iossupportmatrix。理论上只要把最老的架构解密即可,因为新的cpu会兼容老的架构。

  1. 通过终端命令otool 输出app 的load commands,然后查看获取的cryptid这个对应的value来判断app是否被加密,1代表加密了,0代表解密,执行otool -l (注意不是1哦)命令;
    otool -l WeChat.app/WeChat | grep -B 2 crypt
    结果:
         cmd LC_ENCRYPTION_INFO
     cmdsize 20
    cryptoff 16384
   cryptsize 48906240
        cryptid 0
--
         cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 16384
    cryptsize 52396032
        cryptid 0

从结果中可以看到cryptid对应的value都是0,可以确定此app已经被解密了,第一个对应的是较老的armv7架构,后者则是arm64架构

由于微信的项目中包含多个target: 包含WeChatWatchNative和WeChatShareExtensionNew。所以我们还需要按照上面的步骤,确认以下二进制文件(其中有两个是Watch中的,一个是微信分享扩展):

WeChat.app/Watch/WeChatWatchNative.app/WeChatWatchNative
WeChat.app/Watch/WeChatWatchNative.app/PlugIns/WeChatWatchNativeExtension.appex/WeChatWatchNativeExtension
WeChat.app/PlugIns/WeChatShareExtensionNew.appex/WeChatShareExtensionNew

结果:
WeChatWatchNative 未获取到信息
WeChatWatchNativeExtension cryptid 1
WeChatShareExtensionNew cryptid 0
注意: WeChatWatch还是加密的,会影响到下面步骤中的重签名,最简单的办法就是,对对应ipa包解压后,将里面的Watch文件夹删除,再进行重新签名

制作需要注入微信的dylib动态库

制作dylib动态库的两种方式: iOSOpenDev 和 theos
由于iOSOpenDev总是安装失败,所以这里使用theos

  • 使用终端命令,安装配置theos,将其Cloning into '/opt/theos'...
    安装ldid:brew install dpkg ldid ,在Theos开发插件中,iOS文件的签名是使用ldid工具来完成的,也就是说ldid取代了Xcode自带的Codesign;当出现Updating Homebrew...耐心等待即可;
    配置$THEOS: export THEOS=/opt/theos 等号后面是theos文件所在路径
    Theos安装:sudo git clone --recursive https://github.com/theos/theos.git $THEOS,Theos一般是安装在/opt/目录下的,Cloning完成后,可cd到/opt目录下查看;
    Cloning完成Theos后,要修改一下文件的权限:sudo chown -R $(id -u):$(id -g) /opt/theos
    配置环境变量: 在终端执行open ~/.bash_profile打开此文件,在后面加入:
export PATH=/opt/theos/bin:$PATH
export THEOS=/opt/theos

出现的问题: 当执行brew install dpkg ldid提示

/usr/local/Homebrew/Library/Homebrew/brew.rb:12:in `<main>': Homebrew must be run under Ruby 2.3! (RuntimeError)

解决:重新执行brew install dpkg ldid

创建tweak

使用theos来创建工程,创建工程也是比较简单的,就是调用我们theos目录中bin下的nic.pl命令。在执行nic.pl命令后,会让你选择新建工程的模板,目前theos中内置的是12套模板。当然我们此处创建的是tweak类型的工程,所有我们选择11

  • 新建工程,执行终端命令:
    nic.pl
    然后,终端会显示12套模板,并提示Choose a Template (required):,我们输入11回车
    接下来会提示项目名Project Name (required):,输入项目名wechatplugin,回车
    该 deb 包的名字:Package Name [com.yourcompany.wechatplugin]: 输入com.ossey.WeChatPlugin回车
    作者Author/Maintainer Name [Swae]: 输入你的名
    tweak 作用对象的 bundle identifier(比如微信为com.tencent.xin):[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: 输入com.tencent.xin回车
    tweak 安装完成后需要重启的应用名[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard],(比如微信为WeChat)

本文由永利官网发布于编程知识要点,转载请注明出处:非越狱theos的Tweak创建的dylib安装到iOS设备

关键词: