iOS逆向實戰(zhàn)--030:theos

adv-cmds

adv cmdsPushFix依賴包中的一個組件,而PushFix依賴包則是Cydia插件必備依賴包(絕大多數Cydia程序的依賴)之一

Cydia中,安裝adv-cmds插件

Cycript

在越獄環(huán)境中使用Cycript

在越獄設備上,安裝Cycript插件。需要先安裝adv-cmds插件,因為被Cycript插件所依賴

Cydia中,安裝Cycript插件

在設備中打開WeChat,并找到它的進程

ps -A | grep WeChat
-------------------------
7619 ??         0:39.37 /var/containers/Bundle/Application/454EA887-EB3B-43B3-ABFD-B9B2CA006981/WeChat.app/WeChat

針對WeChat進程,進入cy環(huán)境

root# cycript -p 7619

此時我們并沒有污染WeChat,但可以使用cycript命令進行調試了

例如:獲取UIApplication

UIApp
-------------------------
#"<UIApplication: 0x10db0c260>"
導入cy文件

在越獄環(huán)境中,使用自定義cy文件

找到之前使用的“獲取當前控制器”的cy腳本,在越獄環(huán)境中,將腳本拷貝到設備上的Cycript指定目錄下,即可使用

cur_vc.cy腳本,拷貝到/usr/lib/cycript0.9目錄下

scp -P 12345 ./cur_vc.cy root@localhost:/usr/lib/cycript0.9
-------------------------
cur_vc.cy                                                                                        100%  959   496.6KB/s   00:00

針對WeChat進程,進入cy環(huán)境。可以使用進程id或名稱

cycript -p WeChat

導入cur_vc腳本

@import cur_vc
-------------------------
{}

獲取當前控制器

currentVC()
-------------------------
#"<MoreViewController: 0x10f36da00>"

使用cy文件,必須拷貝到Cycript指定目錄下,這樣很可能造成文件沖突。所以Cycript引入了命名空間,可以將cy文件拷貝到不同子目錄中,然后按照指定規(guī)則導入

/usr/lib/cycript0.9目錄下,已經默認存在一些子目錄

iPhone6P:/usr/lib/cycript0.9 root# ls
-------------------------
com/  cur_vc.cy*  org/

com目錄下,存在以作者名字命名的saurik目錄,里面存儲了官方的MS.cy腳本

iPhone6P:/usr/lib/cycript0.9/com root# ls
-------------------------
saurik/

仿照官方的目錄結構,在com目錄下,創(chuàng)建自定義目錄

mkdir zang

cur_vc腳本,移動到自定義目錄下

mv ./cur_vc.cy /usr/lib/cycript0.9/com/zang

進入WeChat進程的cy環(huán)境,導入cur_vc腳本

@import com.zang.cur_vc
-------------------------
{}

使用這種方式,保證了腳本的唯一性,有效避免文件沖突。并且按不同目錄劃分,更利于腳本的管理

theos

theos是一個越獄開發(fā)工具包,使用它可以創(chuàng)建Tweak項目,動態(tài)Hook第三方程序

使用MonkeyDev框架,它提供的Logos語法,其實也依賴于theos

theos安裝

sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
  • theos有很多依賴庫,使用recursive參數,可以循環(huán)下載,將依賴庫一并安裝
  • opt目錄,用來安裝附加軟件包。有時會出現(xiàn)系統(tǒng)權限問題,建議將theos安裝自定義目錄?;蛘甙惭b到opt目錄,然后在自定義目錄中拷貝一份

theos安裝后,配置環(huán)境變量

vim ~/.zshrc
-------------------------
export THEOS=/Users/zang/Zang/Tools/theos
export PATH=$THEOS/bin:$PATH

安裝theos的過程中,可能會一同安裝ldid

ldid是針對越獄插件的簽名工具。如果未安裝,需要手動安裝

brew install ldid
theos插件

使用theos插件,竊取Alipay的登錄密碼

在設備中打開Alipay,并找到它的進程

ps -A | grep Alipay
-------------------------
8147 ??         0:27.89 /var/containers/Bundle/Application/995CAC20-52A5-4D23-A605-FCF623931B79/AlipayWallet.app/AlipayWallet

進入Alipay進程的cy環(huán)境

cycript -p AlipayWallet

導入cur_vc腳本

@import com.zang.cur_vc

動態(tài)調試

進入Alipay的密碼登錄頁面

查看當前控制器

currentVC()
-------------------------
#"<ALULoginContainerController: 0x10bf68860>"

打印控制器下所有視圖

#0x10bf68860.view.recursiveDescription() .toString ()

首先找到登錄按鈕

在輸出的視圖中,搜索“登錄”文案,找不到任何結果。因為在cy環(huán)境中,中文使用了Unicode編碼

將“登錄”文案,通過Unicode編碼為\u767b\u5f55

在輸出的視圖中,搜索\u767b\u5f55

  • 共找到兩處“登錄”文案,第一處是“登錄”,第二處是“換個方式登錄”

找到“登錄”按鈕的UIButton

  |    |    | <AUButton: 0x118e08500; baseClass = UIButton; frame = (16 367.667; 382 51); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x283f66aa0>>
  |    |    |    | <UIImageView: 0x118e49990; frame = (0 0; 382 51); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x283f67da0>>
  |    |    |    | <UIButtonLabel: 0x118e08af0; frame = (170.667 13.6667; 41 24); text = '\u767b\u5f55'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x281e69400>>
  |    |    |    |    | <_UILabelContentLayer: 0x283f49d20> (layer)

找到UIButton的事件響應者和事件名稱

找到UIButton的事件響應者

#0x118e08500.allTargets
-------------------------
[NSSet setWithArray:@[#"<AUButton: 0x118e08500; baseClass = UIButton; frame = (16 367.667; 382 51); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x283f66aa0>>",#"<ALUAccuratePWDView: 0x118e501a0; frame = (0 0; 414 736); layer = <CALayer: 0x283f85880>>"]]]
  • 找到兩個響應者,一個是UIButton自身,另一個是ALUAccuratePWDView控件

確認UIButton的觸摸事件

#0x118e08500.allControlEvents
-------------------------
64
  • 64對應的UIControlEventTouchUpInside枚舉值

找到UIControlEventTouchUpInside的定義

UIControlEventTouchUpInside                                     = 1 <<  6
  • 1左移6位,即:26次方,結果為64

UIButton觸發(fā)UIControlEventTouchUpInside,事件響應者為ALUAccuratePWDView

找到響應者的事件名稱

通過響應者和觸摸事件,找到事件名稱

[#0x118e08500 actionsForTarget: #0x118e501a0 forControlEvent: 64]
-------------------------
@["onNext"]
  • 參數1為響應者對象,參數2為觸摸事件的枚舉值,返回事件名稱onNext

登錄的UIButton可觸發(fā)ALUAccuratePWDView對象的onNext方法

找到密碼文本框

在密碼框中輸入123456

使用老套路,在輸出的視圖中,搜索123456

  • 找到密碼框的UITextField

從視圖結構的層級分析:
UITextFieldaluInputBoxaluAccurateLoginBoxALUAccuratePWDView

和密碼框相關的父視圖,可追尋至ALUAccuratePWDView控件。此控件也是“登錄”按鈕的事件響應者

靜態(tài)分析

使用frida-ios-dump導出Alipay

frida-ps -U
-------------------------
PID  Name
7652  Cydia
7619  微信
8147  支付寶
...
dump.py 支付寶

解壓ipa,拷貝出MachO文件,使用class-dump導出頭文件

class-dump -H AlipayWallet -o ./header
  • 小竅門:將包內容按大小排序,可快速定位MachO文件

找到ALUAccuratePWDView.h文件

  • 并沒有找到aluAccurateLoginBox對象,但有一個命名為_loginBoxaluLoginBox對象

找到aluLoginBox.h文件

  • 找到了命名為_passwordInputBoxaluInputBox對象

找到aluInputBox.h文件

  • 找到了命名為_textFieldaluTextField對象,繼承自UITextField

可以鎖定密碼文本框的查找路徑:

selfALUAccuratePWDView)→_loginBoxaluLoginBox)→_passwordInputBoxaluInputBox)→_textFieldUITextField)→text(屬性)

ALUAccuratePWDView.h文件中,同時找到了onNext方法

可以確定登錄按鈕的響應事件:[ALUAccuratePWDView onNext]

搭建theos插件

使用nic.pl,創(chuàng)建插件

nic.pl
-------------------------
NIC 2.0 - New Instance Creator
 [1.] iphone/activator_event
 [2.] iphone/activator_listener
 [3.] iphone/application_modern
 [4.] iphone/application_swift
 [5.] iphone/cydget
 [6.] iphone/flipswitch_switch
 [7.] iphone/framework
 [8.] iphone/library
 [9.] iphone/notification_center_widget
 [10.] iphone/notification_center_widget-7up
 [11.] iphone/preference_bundle_modern
 [12.] iphone/theme
 [13.] iphone/tool
 [14.] iphone/tool_swift
 [15.] iphone/tweak
 [16.] iphone/tweak_with_simple_preferences
 [17.] iphone/xpc_service
Choose a Template (required):

輸入15,選擇iphone/tweak插件

輸入工程名稱

Project Name (required): AlipayPwdDemo

輸入包名稱,類似BundleID,要求全部小寫

Package Name [com.yourcompany.alipaypwddemo]: com.zang.alipaypwddemo

輸入作者名稱,默認計算機名稱。如果不修改,直接回車

Author/Maintainer Name [zang]:

輸入插件將要附加的進程,填寫BundleID。可以在cy環(huán)境,通過APPID獲取

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

輸入附加后殺掉的進程,默認為SpringBoard(桌面進程),殺掉后所有進程都會重啟。如果不修改,直接回車

[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:

插件創(chuàng)建完成,生成tweak工程

  • AlipayPwdDemo.plist:附加應用的包名稱
  • control:配置信息,版本號、作者名稱等
  • Makefile:編譯時用到的文件,需要配置
  • Tweak.x:代碼,使用Logos語法

修改Tweak.x文件的后綴名

.x文件支持OC語法,我們需要支持OC、C/C++語法的.xm文件,故此將Tweak.x修改為Tweak.xm

修改Makefile

手機安裝插件,也是通過SSH連接的,所以在Makefile中,增加USB連接的IP和端口的配置

export THEOS_DEVICE_IP=localhost
export THEOS_DEVICE_PORT=12345

由于Tweak.x文件的后綴名修改,在Makefile中,同步修改AlipayPwdDemo_FILES

AlipayPwdDemo_FILES = Tweak.xm

alipaypwddemo目錄,使用vscode打開

打開Tweak.xm文件,寫入以下代碼:

#import <UIKit/UIKit.h>

%hook ALUAccuratePWDView

- (void)onNext {
  
  UIView *view1 = MSHookIvar<UIView *>(self, "_loginBox");
  UIView *view2 = MSHookIvar<UIView *>(view1, "_passwordInputBox");
  UITextField *pwd = MSHookIvar<UITextField *>(view2, "_textField");

  NSLog(@"登錄密碼:%@", pwd.text);
}

%end
安裝theos插件

工程目錄中,不允許包含中文,否則編譯報錯

使用終端,進入alipaypwddemo目錄

cd /Users/zang/Zang/Spark/LG/alipaypwddemo

清理工程

make clean
-------------------------
==> Cleaning…

編譯工程

make
-------------------------
==> Notice: Build may be slow as Theos isn’t using all available CPU cores on this computer. Consider upgrading GNU Make: https://github.com/theos/theos/wiki/Parallel-Building
Making all for tweak AlipayPwdDemo…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
...
==> Merging tweak AlipayPwdDemo…
==> Signing AlipayPwdDemo…

打包

make package
-------------------------
==> Notice: Build may be slow as Theos isn’t using all available CPU cores on this computer. Consider upgrading GNU Make: https://github.com/theos/theos/wiki/Parallel-Building
Making all for tweak AlipayPwdDemo…
make[2]: Nothing to be done for `internal-library-compile'.
Making stage for tweak AlipayPwdDemo…
dm.pl: building package `com.zang.alipaypwddemo:iphoneos-arm' in `./packages/com.zang.alipaypwddemo_0.0.1-1+debug_iphoneos-arm.deb'

安裝

make install
-------------------------
==> Installing…
Selecting previously unselected package com.zang.alipaypwddemo.
(Reading database ... 1859 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking com.zang.alipaypwddemo (0.0.1-1+debug) ...
Setting up com.zang.alipaypwddemo (0.0.1-1+debug) ...
==> Unloading SpringBoard…

安裝成功后,設備的SpringBoard(桌面進程)重啟

Cydia中,可以看到我們的自定義插件

Mac電腦上,打開Devices and Simulators,選擇Open Console,打開控制臺

手機上,打開Alipay,進入密碼登錄頁,輸入123456,點擊登錄按鈕

HOOK成功,使用theos插件,在不污染應用的情況下,竊取到Alipay的登錄密碼

theos與Xcode

如果電腦中有多個版本的Xcode,需要指定Xcode路徑

獲取Xcode路徑

xcode-select -p
-------------------------
/Applications/Xcode.app/Contents/Developer

指定Xcode路徑

xcode-select --switch /Applications/Xcode.app/Contents/Developer
總結

Cycript

  • 越獄手機安裝Cycript插件,依賴于adv-cmds插件
  • 依附進程,使用cycript -p 進程id/名稱

導入cy文件

  • 將自定義cy文件,放入/usr/lib/cycript0.9目錄中
  • 為了不重名,放入com目錄中,創(chuàng)建自己組織的文件夾
  • 加載時,使用@import com.組織名稱.文件名稱

theos

  • 是一個越獄開發(fā)工具包
  • 可以創(chuàng)建Tweak項目,動態(tài)Hook第三方程序

搭建theos插件

  • 使用nic.pl15,創(chuàng)建iphone/tweak插件
  • 輸入的包名稱,類似BundleID,要求全部小寫
  • 需要支持OCC/C++語法,修改Tweak.x文件后綴名,改為.xm
  • 文件后綴名的修改,同步修改Makefile文件中的配置
  • Makefile文件中,增加USB連接的IP和端口

安裝theos插件

  • 工程目錄中,不允許包含中文,否則編譯報錯
  • 清理工程:make clean
  • 編譯工程:make
  • 打包:make package
  • 安裝:make install

theosXcode

  • 多個版本的Xcode,需要指定Xcode路徑
  • 獲取Xcode路徑,使用xcode-select -p
  • 指定Xcode路徑,使用xcode-select --switch /Applications/Xcode.app/Contents/Developer
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容