1. 程式人生 > >iOS逆向工程整理_0x01

iOS逆向工程整理_0x01

原理

Objective-C 是一門動態語言,我們可以利用OC的Runtime動態的替換App原有的函式,來達到我們(不可告人)的目的。OC 中對某個物件的方法的呼叫並不像 C++ 一樣直接取得方法的實現的偏移值來呼叫,所以 C++ 方法與實現的關係在編譯時就可確定。而 OC 中方法和實現的關係是在執行時決定的。在呼叫某個物件的方法時,實際上是呼叫了 obj_msgsend 向物件傳送一個名稱為方法名的訊息,而我們可以替換這個響應這個訊息的實現內容。OC 中比較有力的動態特性 Method Swizzing 就是建立在這個基礎之上。
簡單來說就是以下三句程式碼:

Method originalMethod
= class_getInstanceMethod(theClass, originalSelector);
Method newMethod = class_getInstanceMethod(theClass, newSelector); method_exchangeImplementations(originalMethod, newMethod);

這樣一來,原來呼叫originalSelector函式,都會指向我們的newSelector函式,以此實現HOOK。

工欲善其事,必先利其器

要進行iOS的HOOK開發,首先要準備一臺Mac電腦(廢話),一臺越獄的iphone或者ipad。針對這類的需求,大神們開發了很多NB的工具,專門幫我們更好的去HOOK,我們都是站在大神的肩膀上。
先介紹以下越獄開發常見的工具OpenSSH,Dumpdecrypted,class-dump、Theos、Reveal、IDA,Hopper

OpenSSH

這個工具是通過命令列工具訪問蘋果手機,執行命令列指令碼。在Cydia中搜索openssh,安裝。具體用法如下:
1、開啟mac下的terminal,輸入命令ssh [email protected](越獄裝置ip地址)
2、接下來會提示輸入超級管理員賬號密碼,預設是alpine
3、回車確認,即可root登入裝置
你也可以將你mac的公鑰匯入裝置的/var/root/.ssh/authorized_keys檔案,這樣就可以免密登入root了。

Cycript

Cycript是大神saurik開發的一個非常強大的工具,可以讓開發者在命令列下和應用互動,在執行時檢視和修改應用。它可以幫助你HOOK一個App。Cycript最為貼心和實用的功能是它可以幫助我們輕鬆測試函式效果,整個過程安全無副作用,效果十分顯著,實乃業界良心!
安裝方式:在Cydia中搜索Cycript安裝
使用方法:
1、root登入越獄裝置
2、cycript-p 你想要測試的程序名
3、隨便玩,完全相容OC語法比如cy# [#0x235b4fb1 hidden]
Cycript有幾條非常有用的命令:
choose:如果知道一個類物件存在於當前的程序中,卻不知道它的地址,不能通過“#”操作符來獲取它,此時可以使用choose命令獲取到該類的所有物件的記憶體地址
列印一個物件的所有屬性 [obj _ivarDescription].toString()
列印一個物件的所有方法[obj _methodDescription].toString()
動態新增屬性 objc_setAssociatedObject(obj,@”isAdd”, [NSNumbernumberWithBool:YES], 0);
獲取動態新增的屬性 objc_getAssociatedObject(self, @”isAdd”)

Reveal

Reveal是由ITTY BITTY出品的UI分析工具,可以直觀地檢視App的UI佈局,我們可以用來研究別人的App介面是怎麼做的,有哪些元素。更重要的是,可以直接找到你要HOOK的那個ViewController,賊方便不用瞎貓抓耗子一樣到處去找是哪個ViewController了。
安裝方法:
1、下載安裝Mac版的Reveal
2、iOS安裝Reveal Loader,在Cydia中搜索並安裝Reveal Loader
在安裝Reveal Loader的時候,它會自動從Reveal的官網下載一個必須的檔案libReveal.dylib。如果網路狀況不太好,不一定能夠成功下載這個dylib檔案,所以在下載完Reveal Loader後,檢查iOS上的“/Library/RHRevealLoader/”目錄下有沒有一個名為“libReveal.dylib”的檔案。如果沒有就開啟mac Reveal,在它標題欄的“Help”選項下,選中其中的“Show Reveal Library in Finder”,找到libReveal.dylib檔案,使用scp拷貝到 iOS的/Library/RHRevealLoader/目錄下。至此Reveal安裝完畢!

Dumpdecrypted

Dumpdecrypted就是著名的砸殼工具,所謂砸殼,就是對 ipa 檔案進行解密。因為在上傳到 AppStore 之後,AppStore自動給所有的 ipa 進行了加密處理。而對於加密後的檔案,直接使用 class-dump 是得不到什麼東西的,或者是空檔案,或者是一堆加密後的方法/類名。
使用步驟如下:
1、裝置中開啟需要砸殼的APP。
2、SSH連線到手機,找到ipa包的位置並記錄下來。
3、Cycript到該ipa的程序,找到App的Documents資料夾位置並記錄下來。
4、拷貝dumpdecrypted.dylib到App的Documents 的目錄。
5、執行砸殼後,並拷貝出砸殼後的二進位制檔案。
具體執行命令:
1、ssh [email protected] (iP地址為越獄裝置的iP地址)
2、 ps -e (檢視程序,把程序對應的二進位制檔案地址記下來)
3、cycript -p 程序名
4、 [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask][0] (找到程式的documents目錄)
5、scp ~/dumpdecrypted.dylib [email protected]:/var/mobile/Containers/Data/Application/XXXXXX/Documents
6、DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/
Application/XXXXXX/xxx.app/xxx
然後就會生成.decrypted的檔案,這個就是砸殼後的檔案。接下來各種工具都隨便上了class-dump、IDA、Hopper Disassembler

class-dump

class-dump就是用來dump二進位制執行檔案裡面的class資訊的工具。它利用Objective-C語言的runtime特性,將儲存在Mach-O檔案中的標頭檔案資訊提取出來,並生成對應的.h檔案,這個工具非常有用,有了這個工具我們就像四維世界裡面看三維物體,一切架構盡收眼底。
class-dump用法:
class-dump –arch armv7 -s -S -H 二進位制檔案路徑 -o 標頭檔案儲存路徑

IDA

IDA是大名鼎鼎的反編譯工具,它乃逆向工程中最負盛名的神器之一。支援Windows、Linux和Mac OS X的多平臺反彙編器/偵錯程式,它的功能非常強大。class-dump可以幫我們羅列出要分析的標頭檔案,IDA能夠深入各個函式的具體實現,無論的C,C++,OC的函式都可以反編譯出來。不過反編譯出來的是彙編程式碼,你需要有一定的彙編基礎才能讀的懂。
IDA很吃機器效能(我的機器經常卡住不動),還有另外一個反編譯工具Hopper,對機器效能要求沒那麼高,也很好用,殺人越貨的利器。

LLDB

LLDB是由蘋果出品,內置於Xcode中的動態除錯工具,可以除錯C、C++、Objective-C,還全盤支援OSX、iOS,以及iOS模擬器。LLDB要配合debugserver來使用。常見的LLDB命令有:
p命令:首先p是列印非物件的值。如果使用它列印物件的話,那麼它會打印出物件的地址,如果列印非物件它一般會打印出基本變數型別的值。當然用它也可以申明一個變數譬如 p int a=10;(注lldb使用a = 10; (注lldb使用在變數前來宣告為lldb內的名稱空間的)
po 命令:po 命令是我們最常用的命令因為在ios開發中,我們時刻面臨著物件,所以我們在絕大部分時候都會使用po。首先po這個命令會打印出物件的description描述。
bt [all] 列印呼叫堆疊,是thread backtrace的簡寫,加all可列印所有thread的堆疊。
br l 是breakpoint list的簡寫,列出所有的斷點
image list -o -f 列出模組和ASLR偏移,以及偏移後的地址,可以通過偏移後的地址-ASLR偏移來得出模組的基地址。
b NSLog給函式設定斷點
br s -a IDA中偏移前的地址+ASLR偏移量 給記憶體地址設定斷點
p (char *)$r1列印函式名稱
br dis、br en和br del表示禁用、啟用和刪除斷點
nexti(ni)跳過一行
stepi(si)跳入函式
c繼續執行直到斷點
register write r0 1修改暫存器的值

usbmuxd

很多人都是通過WiFi連線使用SSH服務的,因為無線網路的不穩定性及傳輸速度的限制,在複製檔案或用LLDB遠端除錯時,iOS的響應很慢,效率不高。iOS越獄社群的知名人士Nikias Bassen開發了一款可以把本地OSX/Windows埠轉發到遠端iOS埠的工具usbmuxd,使我們能夠通過USB連線線ssh到iOS中,大大增加了ssh連線的速度,也方便了那些沒有WiFi的朋友。使用usbmuxd能極大提升ssh的速度,用LLDB遠端連線debugserver的時間被縮短至15秒以內,強烈建議大家把usbmuxd作為ssh連線的首選方案

Theos

以上都是App的分析工具,而Theos是一個越獄開發工具包(具體寫程式碼),由iOS越獄界知名人士Dustin Howett開發並分享到GitHub上。Theos與其他越獄開發工具相比,最大的特點就是簡單:下載安裝簡單、Logos語法簡單、編譯釋出簡單,可以讓使用者把精力都放在開發工作上去。就是讓你省去了繁瑣的原始程式碼編寫,簡化了編譯和安裝過程。同樣有一款工具iOSOpenDev是整合在Xcode裡的,可以直接在Xcode中配置開發、執行越獄程式,不過iOSOpenDev的安裝,過程真的是讓人要吐血(我有一臺mac死活都裝不上)。
用法,theos有多種模板可以選擇,最常用的就是tweak外掛了:/opt/theos/bin/nic.pl

NIC 2.0 - New Instance Creator

[1.] iphone/application
[2.] iphone/library
[3.] iphone/preference_bundle
[4.] iphone/tool
[5.] iphone/tweak
打包編譯安裝,需要按照固定格式編寫Makefile檔案,然後執行命令
make package install,自動編譯打包安裝到iOS裝置。
如果你用的是IOSOpenDev就更簡單了,配置好iOS裝置ip地址,直接執行product->Bulid for->profiling,自動打包安裝好。

相關推薦

iOS逆向工程整理_0x01

原理 Objective-C 是一門動態語言,我們可以利用OC的Runtime動態的替換App原有的函式,來達到我們(不可告人)的目的。OC 中對某個物件的方法的呼叫並不像 C++ 一樣直接取得方法的實現的偏移值來呼叫,所以 C++ 方法與實現的關係在編譯時就

iOS逆向工程之App脫殼

工程 脫殼 一、生成dumpdecrypted.dylib動態庫首先我們要生成“砸殼”用的動態庫dumpdecrypted.dylib,我們“砸殼”時主要用到這個動態庫。該動態庫的源碼在github上是開源的(Github地址),要想得到dumpdecrypted.dylib這個動態庫,只需要從git

iOS逆向工程之Hopper中的ARM指令

工程一、Hopper中的ARM指令ARM處理器就不多說了,ARM處理器因為低功耗等原因,所以大部分移動設備上用的基本上都是ARM架構的處理器。當然作為移動設備的Android手機,iPhone也是用的ARM架構的處理器。如果你想對iOS系統以及你的應用進一步的了解,那麽對ARM指令集的了解是必不可少的,ARM

iOS逆向工程概述(轉)

tails 盤古 order detail 功能 分析工具 border 還要 越獄 逆向工程一詞,對很多人來說可能很陌生,在android領域,我們經常會聽到“反編譯某個apk”,那麽逆向工程從某種角度講也包括反編譯這項技術,這樣一對比,可能我們就更容易理解逆向工程的定義

iOS - 逆向工程

逆向工程 ssi command 安裝完成 repo min round relay ipa 公司最近搞得物聯網項目,很註重安全,對於我這種架構師,當然考慮到APP使用上的安全。分享一篇逆向基礎文章. 1.ios逆向工程指的是在軟件層面上進行逆向分析的一個過程。如果想要達到

iOS逆向工程-工具篇

對於初開始學習iOS逆向工程的人來說,實現一個tweak可以算是入門逆向工程了。當然了,可能你現在還不知道tweak是什麼。簡單來說,你可以把一個tweak當作某一個app的一個外掛(類似於瀏覽器廣告遮蔽外掛)。在app執行的時候,tweak會hook住某個函式,然後在hoo

ios逆向工程-靜態分析

轉載自:http://my.oschina.net/iq19900204/blog/340297 最近在學習IOS逆向工程,檢視網路上的資料也不是太多,邊學邊總結一下。 首先學習資料: 《ios應用逆向工程 分析與實戰》 --------------------

Theos的安裝和使用-iOS逆向工程

Theos的安裝和使用-iOS逆向工程 Theos就是一套越獄開發工具包 1. Theos的安裝 1.1 安裝homebrew https://brew.sh/ 1.2 安裝dpkg sudo brew install dpkg 1.3 安

Hopper Disassembler基礎使用-iOS逆向工程

Hopper Disassembler基礎使用-iOS逆向工程 1.選擇包 2.顯示包內容 3. 4.

iOS逆向工程之Hopper+LLDB除錯第三方App

LLDB是Low Level Debugger的簡稱,在iOS開發的除錯中LLDB是經常使用的,LLDB是Xcode內建的動態除錯工具。使用LLDB可以動態的除錯你的應用程式,如果你不做其他的額外處理,因為debugserver缺少task_for_pid許可權,所以你只

iOS開發之逆向工程

逆向工程:是一個廣義概念,是指從可執行的程式系統出發,運用解密、反彙編、系統分析、動態除錯等多種技術對軟體進行分析,推匯出軟體產品的結構、流程、演算法、軟體架構、設計模式、執行方法、相關資源及文件等這一過程。軟體逆向的整個過程統稱為軟體逆向工程,過程中所採用的技術統稱為軟體逆

iOS App 的逆向工程: Hacking on Lyft

About the Speaker: Conrad Kramer 我是 Conrad Kramer,工作在 Workflow 的一枚 iOS 工程師,今天要跟大家聊聊 iOS Apps 逆向工程那些事兒。通常來說,逆向工程就是試圖只通過最終產物來了解它背後工作

在IDEA中使用MyBatis Generator逆向工程生成代碼

classpath 生成器 targe base time jar包 選項 操作 ava 本文介紹一下用Maven工具如何生成Mybatis的代碼及映射的文件。 一、配置Maven pom.xml 文件 在pom.xml增加以下插件: <build>

IDEA 中生成 MyBatis 逆向工程實踐

工程1.搭建 MyBatis Generator 插件環境 a. 添加插件依賴 pom.xml <!--mybatis 逆向生成插件--> <plugin> <groupId>org.mybatis

Spring+SpringMVC+MyBatis深入學習及搭建(十)——MyBatis逆向工程

cat springmvc blank 不為 tex llc root from ssi 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面講到:Spring+SpringMVC+MyBatis深入學習及

mybatis高級應用四_逆向工程

rgs lec 配置 lean lin 執行 ble r.java cal 1 逆向工程 源碼請參考:雲盤下工程 generatorSqlmapCustom 1.1 什麽是逆向工程 mybaits需要程序員自己編寫sql語句,mybatis官方提供逆向工程 可以針對

ios逆向過程中lldb調試技巧

spa ria gin poi enabled data- dll tor html 在ios逆向過程中,善於運用lldb,會給逆向帶來很大的方便 一般的命令: 1、image list -o -f 看看各個模塊在內存中的基址 2、register read r0 讀取

Mybatis逆向工程

lca trace 配置 表操作 test stack type lmap ack 逆向工程可以自動生成mybatis執行所需要的代碼,但是只能是單表操作,表與表之間的關系無法映射出來。 單表操作可以容易實現緩存,方便分庫分表。 首先直接上個demo鏈接: http://p

java代碼逆向工程生成uml

arch 選項 ima sin cli 匹配 round hive uml類圖 今天在看一個模擬器的源碼,一個包裏有多個類,一個類裏又有多個屬性和方法,如果按順序看下來,不僅不能對整個模擬器的框架形成一個大致的認識,而且只會越看越混亂,所以,想到有沒有什麽工具可以將這些

mybatis 逆向工程

auth override dtd false log str model example project 根據實際情況添加相應的數據庫驅動jar包 package util; import java.io.File; import java.io.IOExcep