iOS逆向開發(fā)之工具介紹及簡(jiǎn)單運(yùn)用

進(jìn)行iOS逆向開發(fā)首先需要下載相關(guān)的工具。

準(zhǔn)備工作

  • 越獄手機(jī)(例如我的:iPhone 4s,系統(tǒng)8.4.1)
  • 越獄手機(jī)上的Cydia中安裝CycriptOpenSSH
  • Mac上安裝iFunBoxXCodeHopper DisassemblerSublime Text
  • Mac終端命令行中安裝Class DumpTheosDumpdecrypted

工具作用介紹

OpenSSH

Mac連接手機(jī),通過Mac的終端命令操作手機(jī)。

Cycript

獲取手機(jī)中某一個(gè)運(yùn)行的進(jìn)程,并可以獲取App進(jìn)程后用OC代碼獲取反編譯App的Documents目錄路徑。

iFunBox

Mac端的連接手機(jī)后的圖形界面,比較方便的把砸殼后的文件直接導(dǎo)出到Mac上。下載地址:iFunBox

Xcode

這個(gè)就不用多說了,iOS開發(fā)工具。

Hopper Disassembler

這個(gè)是進(jìn)行反匯編的工具,可以反匯編、反編譯并且調(diào)試你的應(yīng)用,我們可以通過這個(gè)工具查看偽代碼的方法名和變量,還原函數(shù)體的具體邏輯。

下載破解版地址:hopper disassembler for mac破解版 v4.0.8

破解方法如下:http://www.sdifen.com/hopperdisassembler408.html

更多使用方法可以參考文章:iOS 逆向工程工具集之Hopper Disassembler破解版的安裝與使用

Class Dump

對(duì)App可執(zhí)行文件獲取其頭文件,這樣我們可以根據(jù)頭文件中暴露的方法名去猜測(cè)其App的編寫邏輯。然后利用上述的反編譯工具對(duì)某一文件進(jìn)行函數(shù)的具體編寫邏輯。

安裝方法:
點(diǎn)擊下載后解壓后會(huì)有class-dump和源碼文件。

  • 如果是OS X 10.11之前,可以直接將class-dump 復(fù)制到/usr/bin/class-dump目錄下即可。
  • 如果是OS X 10.11,因?yàn)闆]有/usr/bin文件夾的寫權(quán)限,所以我們得用另外的方法。
  • 1、打開Terminal,輸入mkdir ~/bin,在當(dāng)前用戶根目錄下創(chuàng)建一個(gè)bin目錄;
  • 2.把class-dump給拷貝到這個(gè)目錄里,并賦予其可執(zhí)行權(quán)限:mv /path/to/class-dump ~/bin; chmod +x ~/bin/class-dump
  • 3.打開~/.bash_profile文件:vi ~/.bash_profile,在文件最上方加一行:export PATH=$HOME/bin/:$PATH,然后保存并退出(在英文輸入法中依次按下esc和:(shift + ;,即冒號(hào)),然后輸入wq,回車即可);
  • 在Terminal中執(zhí)行source ~/.bash_profile

更多class-dump的使用可以參考文章iOS逆向之class-dump

Theos

創(chuàng)建一個(gè)Tweak工程,通過定制工程文件,再通過指定的bundle id,編譯+打包+安裝,從而向手機(jī)上的App注入代碼,進(jìn)而實(shí)現(xiàn)對(duì)某個(gè)App中的功能的破解(例如會(huì)員去廣告、搶紅包等功能)。

安裝方法:

  • 1、安裝dpkg

    sudo brew install dpkg

    dpkg是Theos依賴的工具之一,dpkg是Debian Packager的縮寫。我們可以使用dpkg來制作deb,Theos開發(fā)的插件都將會(huì)以deb的格式進(jìn)行發(fā)布的。所以我在安裝Theos之前要安裝dpkg, 當(dāng)然此處我們使用強(qiáng)大的brew來完成dpkg的安裝。

  • 2、安裝ldid

    sudo brew install ldid

    在Theos開發(fā)插件中,iOS文件的簽名是使用ldid工具來完成的,也就是說ldid取代了Xcode自帶的Codesign

  • 3、Theos安裝

    cd opt/
    git clone --recursive https://github.com/theos/theos.git

    因?yàn)槲覀兊腡heos一般是安裝在/opt/目錄下的,所以先cd到/opt目錄下,然后從github上相關(guān)的地址clone下來即可
    下載好Theos后,還需要把theos的權(quán)限改為自己,如下命令

    chown $(id -u):$(id -g) /usr/local/opt/theos

    最后這一步也很重要,要把theos的執(zhí)行路徑加入到環(huán)境變量中,在~/. bash_profile中加上這么兩句:

    export THEOS=/usr/local/opt/theos
    export PATH=/usr/local/opt/theos/bin/:$PATH

    vim ~/.bash_profile加上上面兩條,保存退出。

  • 4、測(cè)試安裝是否成功
    重啟終端后,cd到任意可執(zhí)行目錄,
    執(zhí)行:nic.pl

    New Instance Creator開始執(zhí)行則已經(jīng)安裝成功。

    nic.pl.png

更多關(guān)于theos的安裝與使用參考文章:

Dumpdecrypted

俗稱:砸殼dumpdecrypted是個(gè)出色的app脫殼開源工具,它的原理是:將應(yīng)用程序運(yùn)行起來(iOS系統(tǒng)會(huì)先解密程序再啟動(dòng)),然后將內(nèi)存中的解密結(jié)果dump寫入文件中,得到一個(gè)新的可執(zhí)行程序文件。

下載及生成砸殼用到dumpdecrypted.dylib工具,如下命令:

qingfengdeMacBook-Pro:練習(xí) qingfeng$ git clone https://github.com/stefanesser/dumpdecrypted.git
Cloning into 'dumpdecrypted'...
remote: Enumerating objects: 31, done.
remote: Total 31 (delta 0), reused 0 (delta 0), pack-reused 31
Unpacking objects: 100% (31/31), done.
qingfengdeMacBook-Pro:練習(xí) qingfeng$ ls
ArchitechureExample SwiftExample        架構(gòu)學(xué)習(xí)
CoreAnimationExample    TouchEventExample   函數(shù)式編程
RuntimeExample      dumpdecrypted       工廠方法一
qingfengdeMacBook-Pro:練習(xí) qingfeng$ cd dumpdecrypted
qingfengdeMacBook-Pro:dumpdecrypted qingfeng$ make
`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos
qingfengdeMacBook-Pro:dumpdecrypted qingfeng$ ls
Makefile        dumpdecrypted.c     dumpdecrypted.o
README          dumpdecrypted.dylib

更多相關(guān)使用參考文章:dumpdecrypted介紹及其使用

Sublime Text

打開后面要用到的Makefile文件。
下載地址:Sublime Text

實(shí)現(xiàn)目標(biāo)

我們來破解一款“傳奇來了”的游戲,在我們打開“傳奇來了”APP之后,自動(dòng)彈出一個(gè)警告框。先放一張結(jié)果圖:

逆向截屏.PNG

實(shí)現(xiàn)流程

1、利用dumpdecrypted.dylib砸殼

第一步:利用OpenSSH命令通過mac終端來操作手機(jī),openSSH密碼是alpine。退出登錄的命令是exit。手機(jī)和電腦需要在同一個(gè)網(wǎng)段,連接同一個(gè)wifi,然后點(diǎn)開設(shè)置查看當(dāng)前手機(jī)分配的IP地址。如下圖:

IP地址.png

然后輸入如下命令(密碼是alpine):

qingfengdeMacBook-Pro:~ qingfeng$ ssh root@192.168.11.130
root@192.168.11.130's password:
iPhone:~ root#

第二步:查找要反編譯app的路徑

ps -e 獲取手機(jī)中所有的當(dāng)前運(yùn)行的進(jìn)程
ps -A|grep mobile 抓取手機(jī)上運(yùn)行的APP進(jìn)程

運(yùn)行命令如下:

iPhone:~ root# ps -e 
  PID TTY           TIME CMD
    1 ??         0:15.59 /sbin/launchd
   32 ??         0:11.16 /usr/libexec/UserEventAgent (System)
   36 ??         0:18.43 /System/Library/Frameworks/CoreTelephony.framework/Sup
...
iPhone:~ root# ps -A|grep mobile
  382 ??         0:14.73 /usr/libexec/mobileassetd
  940 ??         0:36.71 /var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient
  951 ttys000    0:00.01 grep mobile
iPhone:~ root#

其中的/var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient是我們要破解的app的路徑。

第三步:使用Cycript找出反編譯App的Documents目錄路徑

這里有兩個(gè)路徑,/var/mobile/Containers/Bundle/Application/下的是app的路徑,/var/mobile/Containers/Data/Application則是我們要找的Documents路徑。
我們通過如下命令來獲取App的Documents路徑。

iPhone:~ root# cycript -p CQClient
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomans:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/"
cy#

其中的/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/即是我們要找的Documents目錄路徑。

退出cyscript命令環(huán)境control+z。如下:

cy# ^Z
[1]+  Stopped(SIGTSTP)        cycript -p CQClient
iPhone:~ root#

退出OpenSSH的命令是exit。但在這之前需要輸入命令jobs,否則無法退出。具體可以查看這篇文章Linux中 “there are stopped jobs”問題的解決方案。命令如下:

iPhone:~ root# exit
logout
There are stopped jobs.
iPhone:~ root# jobs
[1]+  Stopped(SIGTSTP)        cycript -p CQClient
iPhone:~ root# exit
logout
Connection to 192.168.11.130 closed.

第四步:將dumpdecrypted.dylib拷貝到Documents目錄下,此處是使用的scp dumpdecrypted.dylib路徑 root@ip:Documents路徑方式。也可以使用iFunBox或者PP助手進(jìn)行文件操作(我試了不行,不知道是不是方法不對(duì),還是在iFunBox或者PP助手展示的文件路徑不對(duì))。此處的dumpdecrypted.dylib可以通過上面Dumpdecrypted工具介紹的方法生成。
命令如下:

qingfengdeMacBook-Pro:~ qingfeng$ scp /Users/qingfeng/Documents/WorkSpace/Exercise/dumpdecrypted/dumpdecrypted.dylib root@192.168.11.130:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/
root@192.168.11.130's password: 
dumpdecrypted.dylib                           100%  193KB   1.8MB/s   00:00    
qingfengdeMacBook-Pro:~ qingfeng$

第五步:使用dumpdecrypted砸殼
重新用mac連接上手機(jī),首先cd到Documents路徑下,然后執(zhí)行命令DYLD_INSERT_LIBRARIES= dumpdecrypted.dylib app路徑。命令如下:

qingfengdeMacBook-Pro:~ qingfeng$ ssh root@192.168.11.130
root@192.168.11.130's password: 
iPhone:~ root# cd /var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/
iPhone:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient
mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 32bit ARM binary in memory.
[+] offset to cryptid found: @0x9980(from 0x9000) = 980
[+] Found encrypted data at address 00004000 of length 655360 bytes - type 1.
[+] Opening /private/var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 16384 in the file
[+] Opening CQClient.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4980
[+] Closing original file
[+] Closing dump file
iPhone:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents root# 

利用ls命令查看后,其中QQ.decrypted就是我們要的破解文件。

iPhone:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents root# ls
CQClient.decrypted  dumpdecrypted.dylib  jrdb

2、使用class-dump將文件解析

我們同樣用scp命令將CQClient.decrypted拷貝到Mac桌面文件夾。

qingfengdeMacBook-Pro:~ qingfeng$ scp root@192.168.11.130:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/CQClient.decrypted /Users/qingfeng/Documents/WorkSpace/Exercise
root@192.168.11.130's password: 
CQClient.decrypted                            100% 1918KB   2.5MB/s   00:00    
qingfengdeMacBook-Pro:~ qingfeng$

我們?cè)偈褂?code>class-dump進(jìn)行解析。

qingfengdeMacBook-Pro:QQHeader qingfeng$ class-dump --arch armv7 /Users/qingfeng/Documents/WorkSpace/Exercise/CQClient.decrypted -H -o /Users/qingfeng/Documents/WorkSpace/Exercise/CQClientHeader 
qingfengdeMacBook-Pro:QQHeader qingfeng$

這樣即可獲取頭文件。因?yàn)槲矣玫氖謾C(jī)是iPhone4s,所以使用armv7,其他型號(hào)使用相對(duì)應(yīng)的4(armv7),4s(armv7),5(armv7),5s(arm64),6(arm64),6s(arm64),7(arm64)等

如果是用的frida-ios-dump砸殼,砸殼出來的ipa文件,可以從里面獲取.app文件,這個(gè)時(shí)候我們可以用class-dump -H /Users/xxxx/ProductName.app -o /Users/xxxx/HearderFile這種形式的命令來獲取頭文件

3、反編譯靜態(tài)分析 Hopper Disassembler

Hopper是一款運(yùn)行在Mac、Windows和Linux下的調(diào)試(os x only)、反匯編和反編譯的交互式工具。
可以對(duì)32、64位的MAC程序、Windows程序和IOS程序(arm)進(jìn)行調(diào)試、反編譯等。功能如下:

  • 能夠分析出函數(shù)的代碼塊、變量等
  • 可以生成代碼塊的控制流圖CFG
  • 可以通過Python腳本來調(diào)用Hopper的其他一些功能,使用更加靈活
  • 在MAC上還可以通過GDP動(dòng)態(tài)調(diào)試分析
  • 對(duì)Objective C的極佳的支持——能夠解析出Selector、字符串和發(fā)送的消息
  • 反編譯,生成偽代碼
  • 分析快速,且占用資源少

我們把CQClient.decrypted拖進(jìn)去,就能進(jìn)行代碼分析了。具體怎么分析可以參考這篇文章[Mac OSX 之自己動(dòng)手初步學(xué)習(xí)破解軟件入門](Mac OSX 之自己動(dòng)手初步學(xué)習(xí)破解軟件入門)

4、Tweak與Theos

tweak的實(shí)質(zhì)就是iOS平臺(tái)的動(dòng)態(tài)庫。iOS平臺(tái)上有兩種形式的動(dòng)態(tài)庫,dylibframeworkFramework這種開發(fā)者用的比較多,而dylib這種就相對(duì)比較少一點(diǎn),比如libsqlite.dyliblibz.dylib等。而tweak用的正是dylib這種形式的動(dòng)態(tài)庫。我們可以在/Library/MobileSubstrate/DynamicLibraries目錄下查看手機(jī)上存在著的所有tweak。這個(gè)目錄下除dylib還存在著plistbundle兩種格式的文件,plist文件是用來標(biāo)識(shí)tweak的作用范圍,而bundletweak所用到的資源文件。

與正常的App開發(fā)使用Xcode不同,Tweak的開發(fā)環(huán)境是theos或者iosopendeviosopendev是在theos的基礎(chǔ)上實(shí)現(xiàn)的基于Xcode的開發(fā)環(huán)境。而theos是一種命令式的開發(fā)編譯環(huán)境,與c/c++的命令行編譯形式很相像。

詳情參考這篇文章:Tweak及TheOS簡(jiǎn)介

安裝參考工具介紹Theos部分。
使用步驟及文件介紹如下:

1、Tweak工程的創(chuàng)建

cd到要?jiǎng)?chuàng)建tweak的目錄下,執(zhí)行如下指令:

nic.pl

執(zhí)行完nic.pl指令后,會(huì)出現(xiàn)如下選擇模板的界面:

qingfengdeMacBook-Pro:CQClientTweak qingfeng$ nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/application_swift
  [4.] iphone/cydget
  [5.] iphone/flipswitch_switch
  [6.] iphone/framework
  [7.] iphone/ios7_notification_center_widget
  [8.] iphone/library
  [9.] iphone/notification_center_widget
  [10.] iphone/preference_bundle_modern
  [11.] iphone/tool
  [12.] iphone/tool_swift
  [13.] iphone/tweak
  [14.] iphone/xpc_service
Choose a Template (required): 13

在這里我們要開發(fā)的是tweak插件,所以輸入13選擇iphone/tweak,按下Enter繼續(xù)。接著出現(xiàn)如下需要我們填寫信息的步驟:

Project Name (required): AlertTest
Package Name [com.yourcompany.alerttest]: com.tianfu.alert
Author/Maintainer Name [清風(fēng)]: tianfu
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.cqll.90
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: com.cqll.90
Instantiating iphone/tweak in alerttest/...
Done.
  • 1、Project Name (required):輸入工程名字,必填項(xiàng)。
  • 2、Package Name [com.yourcompany.alerttest]:包名
  • 3、Author/Maintainer Name [清風(fēng)]:作者名字
  • 4、[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:要注入的程序的BundleID,默認(rèn)的進(jìn)程為com.apple.springboard,這里我們填寫com.cqll.90游戲傳奇來了的BundleID
  • 5、List of applications to terminate upon installation安裝后需要重啟的應(yīng)用,這里我們也填寫傳奇來了的BundleIDcom.cqll.90

2、工程文件說明

Tweak工程新建完成后,其工程目錄的文件如下所示:

tweak文件目錄.png

2.1 control文件

該文件記錄了工程的基本信息,會(huì)被打包進(jìn)deb包中,字段內(nèi)容如下:

Package: com.tianfu.alert
Name: AlertTest
Depends: mobilesubstrate
Version: 0.0.1
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: tianfu
Author: tianfu
Section: Tweaks
  • Package字段:用于描述這個(gè)deb的名字,采用的命名方式和bundle identifier類似,可以按需更改;

  • Name字段:用于描述這個(gè)工程的名字,可以按需更改;

  • Depends字段:用于描述這個(gè)deb的依賴。依賴指的是這個(gè)程序運(yùn)行的基本條件,可以填寫固件版本或其他程序,如果當(dāng)前iOS不滿足“依賴”中所定義的條件,則此tweak無法正常工作,可以按需更改。例如:

    Depends: mobilesubstrate, firmware (>=6.0)
    

    表示當(dāng)前iOS版本必須在6.0以上,且必須安裝MobileSubstrate,才能正常運(yùn)行這個(gè)tweak

  • Version字段:用于描述這個(gè)deb包的版本號(hào),可以按需更改;

  • Architecture字段:用于描述deb包安裝的目標(biāo)設(shè)備架構(gòu),不要更改;

  • Description字段:deb包的簡(jiǎn)單介紹,可以按需更改;

  • Maintainer字段:用于描述tweak的作者,可以按需更改;

  • Author字段:用于描述tweak的作者,可以按需更改;

  • Section字段:用于描述deb包所屬的程序類別,不要更改。

control文件中,可以自定義的字段還有很多,一般上面的信息就已經(jīng)足夠了。更全面的可以查看官方網(wǎng)站。值得注意的是:Theos在打包deb時(shí)會(huì)對(duì)control文件做進(jìn)一步的處理。比如更改Version字段為:0.0.1-2,標(biāo)識(shí)Theos的打包次數(shù),方便管理;增加Installed-Size字段,用于描述deb包安裝后的估算大小,與實(shí)際大小可能有偏差,不要更改。

2.2 Makefile

該文件用來指定工程編譯和鏈接要用到的文件、框架、庫等信息,將整個(gè)過程自動(dòng)化。字段內(nèi)容如下:

THEOS_DEVICE_IP = 192.168.11.130
THEOS = /usr/local/opt/theos
include $(THEOS)/makefiles/common.mk

TWEAK_NAME = AlertTest
AlertTest_FILES = Tweak.xm

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "killall -9 CQClient"
  • 第一行的include字段指定了工程的common.mk,固定寫法,不要修改;
  • TWEAK_NAME字段填入的是建立工程時(shí)命令行輸入的Project Name,與control文件中的Name字段對(duì)應(yīng),不要更改;
  • ReverseDemo_FILES字段指定工程包含的源文件,如果工程中需要用到多個(gè)源文件則用空格將各個(gè)文件名分開,可以按需更改;
  • include字段指定工程的mk文件,這里新建的是tweak工程,所以填入的是tweak.mk文件,還可以根據(jù)需求填入application.mk以及tool.mk文件。
  • 最后一行after-install字段指定安裝程序后需要執(zhí)行的操作,這里需要注入CQClient進(jìn)程并執(zhí)行自己的代碼,因此需要重啟CQClient進(jìn)程,好讓MobileSubstrate加載對(duì)應(yīng)的dylib

Makefile文件中除了自動(dòng)生成的這些字段外,還可以根據(jù)功能手動(dòng)添加其他字段:

  • THEOS_DEVICE_IP字段用來指定要連接的手機(jī)設(shè)備的IP,方便后面安裝。如上縮寫export THEOS_DEVICE_IP = 192.168.11.130

  • THEOS是存放theos命令的路徑。

  • ARCHS字段可以用來指定處理器架構(gòu),一般情況下填寫ARCHS = armv7 arm64即可。

  • TARGET字段用來指定SDK版本,例如:

    TARGET = iphone:7.0
    
  • framework字段可以指定要導(dǎo)入的框架,例如ReverseDemo_FRAMEWORKS = UIKit,UIKit為后續(xù)測(cè)試代碼需要用到的框架,另一方面,還可以通過ReverseDemo_PRIVATE_FRAMEWORKS字段指定要導(dǎo)入的私有庫,格式不變。例如

    ReverseDemo_FRAMEWORKS = UIKit CoreTelephony CoreAudio
    ReverseDemo_PRIVATE_FRAMEWORKS = AppSupport ChatKit
    

更多的可以參考這篇文章Theos

2.3 AlertTest.plist

plist文件記錄工程的配置信息,主要作用是指定程序的作用范圍,內(nèi)容如下:

alert.plist.png

從上面可以看到,該文件的內(nèi)容是一系列的Dictionary,最外層為RootFilter鍵,Filter鍵下得array即為要設(shè)置的部分。該部分分為三類:

  • 第一類是Bundles,即所編寫程序的作用對(duì)象,這個(gè)類型的字段就是所要注入的程序Bundle名,如果要注入的進(jìn)程為SpringBoard,則填入com.apple.springboard,可以指定多個(gè)作用對(duì)象;
  • 第二類是Classes,即指定要注入的類名,同樣是根據(jù)填入的字符串來篩選注入的類名;
  • 第三類Executables,及指定要注入的可執(zhí)行文件名。

這三類Array可以根據(jù)需要來設(shè)定。但按照混合配置方式,一個(gè)文件只有滿足Filter中所有Array下的至少一個(gè)條件,tweak才能生效。這樣顯然不合理。所以額外有一個(gè)Mode鍵,將其值設(shè)置為Any,那么文件滿足Filter中的任一條件就能成為tweak的作用對(duì)象。

當(dāng)Filter下的array只有一類時(shí),不需要添加Mode和Any鍵值對(duì)。

2.4 Tweak.xm

該文件是實(shí)現(xiàn)具體功能的關(guān)鍵所在,是實(shí)現(xiàn)具體功能的源文件,這個(gè)文件支持Logos和C、C++語法。文件內(nèi)容如下:

/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include <substrate.h>, it will be done automatically, as will
the generation of a class list and an automatic constructor.

%hook ClassName

// Hooking a class method
+ (id)sharedInstance {
    return %orig;
}

// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
    %log; // Write a message about this call, including its class, name and arguments, to the system log.

    %orig; // Call through to the original function with its original arguments.
    %orig(nil); // Call through to the original function with a custom argument.

    // If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}

// Hooking an instance method with no arguments.
- (id)noArguments {
    %log;
    id awesome = %orig;
    [awesome doSomethingElse];

    return awesome;
}

// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/

以上的注釋展示了基本的Logos語法,具體可以分為三類:

  • 第一類%hook%end,其中%hook后面指定要hook的類名,另一方面,hook的整塊邏輯完成后結(jié)尾要加上%end,在hook邏輯中可以添加要hook的函數(shù),并在函數(shù)體內(nèi)部實(shí)現(xiàn)想要添加的代碼邏輯;
  • 第二類是%orig,該語句代表執(zhí)行原函數(shù)邏輯,即完成hook操作后可以選擇是否調(diào)用原函數(shù)的代碼,若需要調(diào)用則加上%orig;即可;
  • 第三類是%log,這類代碼的作用是在log中打印hook的函數(shù)的類名、參數(shù)等信息。

除了注釋中展示的三種語法外,Logos還支持%group%init%ctor等語法,更多的Logos語法參考這篇文章

這里我們輸入代碼來實(shí)現(xiàn)個(gè)彈出提示框的簡(jiǎn)單功能,代碼如下:

%hook AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"成功注入代碼" message:@"IOS 逆向工程" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alertView show];
#pragma clang diagnostic pop
return %orig;

}
%end

3、編譯&打包&安裝

3.1 編譯

Theos采用與debian相同的make命令來編譯Theos工程。執(zhí)行如下指令:

qingfengdeMacBook-Pro:alerttest qingfeng$ make

輸出結(jié)果如下:

qingfengdeMacBook-Pro:alerttest qingfeng$ make
> Making all for tweak AlertTest…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
==> Linking tweak AlertTest (armv7)…
==> Generating debug symbols for AlertTest…
rm /Users/qingfeng/Documents/WorkSpace/Exercise/CQClientTweak/alerttest/.theos/obj/debug/armv7/Tweak.xm.mm
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (arm64)…
==> Linking tweak AlertTest (arm64)…
==> Generating debug symbols for AlertTest…
rm /Users/qingfeng/Documents/WorkSpace/Exercise/CQClientTweak/alerttest/.theos/obj/debug/arm64/Tweak.xm.mm
==> Merging tweak AlertTest…
==> Signing AlertTest…

從上圖的輸出結(jié)果可以看到,Theos完成了預(yù)處理、編譯、簽名等一系列的操作,此時(shí)目錄下多了一個(gè).theos文件夾。

3.2 打包

使用如下指令打包:

qingfengdeMacBook-Pro:alerttest qingfeng$ make package

輸出結(jié)果如下:

qingfengdeMacBook-Pro:alerttest qingfeng$ make package
> Making all for tweak AlertTest…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak AlertTest…
dm.pl: building package `com.tianfu.alert:iphoneos-arm' in `./packages/com.tianfu.alert_0.0.1-1+debug_iphoneos-arm.deb'

這時(shí)候目錄下多了一個(gè)packages文件夾,里面有一個(gè).deb文件。

3.3安裝

執(zhí)行指令:

make package install

輸出結(jié)果如下:

qingfengdeMacBook-Pro:alerttest qingfeng$ make package install
> Making all for tweak AlertTest…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak AlertTest…
dm.pl: building package `com.tianfu.alert:iphoneos-arm' in `./packages/com.tianfu.alert_0.0.1-4+debug_iphoneos-arm.deb'
==> Installing…
root@192.168.11.130's password: 
(Reading database ... 3518 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking com.tianfu.alert (0.0.1-4+debug) over (0.0.1-2+debug) ...
Setting up com.tianfu.alert (0.0.1-4+debug) ...
install.exec "killall -9 CQClient"
root@192.168.11.130's password: 
qingfengdeMacBook-Pro:alerttest qingfeng$

可以看到已經(jīng)成功安裝。打開app,看到如下結(jié)果:

逆向截屏.PNG

更多的介紹參考文章:
1、iOS逆向之TheOS
2、iOS逆向教程 2.1 Theos的安裝及用法

參考文章

1、iOS 逆向工程--基礎(chǔ)工具的運(yùn)用
2、iOS逆向工程
3、ios逆向傻瓜入門教程(一)
4、IOS APP破解完整流程(逆向工程完整詳解)
5、iOS 逆向工程-淺析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。