在非越獄裝置上Hook C 的虛函式是否可能?

2021-06-23 04:36:54 字數 2225 閱讀 9767

關於c++中虛函式與普通函式的區別,大家可以參考:《深度探索c++物件模型》。

對於hook普通的c++函式,與hook c函式沒什麼太大區別,主要的區別在於c++有名稱改編,原理是在函式入口加入跳轉指令。

這塊兒在windows平台上有微軟的detours,也有開源的easyhook。在mac平台上有mobilesubstrate,相信做過越獄開發的對這個都比較熟悉。

所有上面列到的工具在hook c++普通函式時都需要修改segment __text,而這個段在ios平台上唯讀的,具體許可權為:rx。因此在非越獄的裝置上沒法修改函式入口,也就無法hook。

但是我們是可以hook objective-c函式的,雖然objective-c的執行時提供了一些方法,但是主要的原因在於:針對oc的方法呼叫需要查詢乙個資料對映表,將訊息轉換為真正的c函式呼叫,而這個對映表是放在可修改的資料段中的。

這點與c++的虛函式有幾分類似,下面一起分析下看看是否有可能hook c++的虛函式。

demo程式如下:

//

// main.cpp

// vtlocation

//// created by proteas on 14-8-12.

//#include class base

;

public:

virtual void sayhello() ;

};class child : public base

;public:

virtual void sayhello() ;

};int main (int argc, const char * argv)

makefile內容如下:

export developer_dir := $(shell xcode-select --print-path)

sdk_ver_ios=7.1

sdk_ios_device="$(developer_dir)/platforms/iphoneos.platform/developer/sdks/iphoneos$(sdk_ver_ios).sdk"

min_ver_ios=-miphoneos-version-min=5.0

arch_ios=-arch armv7

cc_ios=xcrun -sdk "iphoneos" gcc

all: main.cpp

$(cc_ios) -o main main.cpp $(arch_ios) $(min_ver_ios) -isysroot $(sdk_ios_device) -i$(sdk_ios_device)/usr/include -i. -lc++ -lstdc++

ldid -s main

clean:

rm -f main

編譯完成後得到可執行程式main。

在得到可執行程式後,我們首先要找到虛函式表所在的區段,因此使用ida 載入 main 查詢虛函式表。

然後我們選擇資料段:

因為demo程式很簡單,跳轉到資料段後,直接就看到了虛函式表:

直接可以看到虛函式表的各個表項,這裡需要注意的是:非純虛函式還是發生了名稱改編。沒驗證純虛函式,不過印象中純虛函式是沒有名稱改編的,因為微軟的com依賴這一特性。

下面我們使用machoview載入可執行程式,檢視0xc060所載區段的屬性。

因為0xc060正好是區段開始的地方,所以正好命中,下面看下這個包含這個section的segment的屬性:

可以看到這個segment的屬性為:rw,也就是可以改的,因此是可hook的。

同時基於這個理論:c++的多型特性是執行時特性,執行時本身也是需要修改的,因此也可得到其是可hook的。

非越獄iOS裝置的遠端控制實現原理

webdriveragent是facebook基於xcuitest推出的ios的移動測試框架,支援目前市面上所有ios9以上的裝置。webdriveragent 作為新的基於 xcuitest 的測試工具,有其固有優點 具體使用 請檢視官網 要注意的 1 taget 證書要設定成開發者的證書 2 在...

在本地除錯移動裝置上的頁面 神器weinre介紹

於是weinre出現了!它是乙個基於nodejs的工具。可以把遠端的頁面運 況對映到本地,在本地的瀏覽器中檢視除錯資訊,修改的css樣式也可以實時同步到遠端頁面上,歐耶!話不多說,趕快看看如何使用吧 安裝對於習慣在windows下開發的程式猿,看到nodejs總有一種隔海相望的感覺,但現在nodej...

深度學習在嵌入式裝置上的應用

下面來 一下深度學習在嵌入式裝置上的應用,具體如下 1 深度學習的概念源於人工神經網路的研究,包含多個隱層的多層感知器 mlp 是一種原始的深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示 屬性類別或特徵 以發現資料的分布式特徵表示。bp演算法是訓練多層網路的典型演算法,但實際上對於僅含...