關於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程式如下:
makefile內容如下://
// 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)
編譯完成後得到可執行程式main。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
在得到可執行程式後,我們首先要找到虛函式表所在的區段,因此使用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演算法是訓練多層網路的典型演算法,但實際上對於僅含...