先貼個圖
參考了
struct block_literal_1 *descriptor;
// imported variables
};
在 64 位系統上,指標型別的大小是 8 個位元組,而 int 是 4 個位元組,
因此,invoke 函式指標的位址就是在第 16 個位元組之後。我們可以通過 lldb 的 memory 命令來列印出指定位址的記憶體,我們上面已經得到了 block 的位址,現在就列印出它的記憶體內容
memory read --size 8 --format x 0x16d1a6050
如前所述,函式指標的位址是在第 16 個位元組之後,並占用 8 個位元組,所以可以得到函式的位址是 0x0000000105e014a8。
要找出 block 的函式簽名,需要通過descriptor
結構體中的signature
成員,然後通過它得到乙個nsmethodsignature
物件。
首先,需要找到descriptor
結構體。這個結構體在 block 中是通過指標持有的,它的位置正好在invoke
成員後面,占用 8 個位元組。可以從上面的記憶體列印中看到descriptor
指標的位址是0x0000000106336398。
為了找出signature
的位址,我們還需要確認這個 block 是否擁有copy_helper
和disponse_helper
這兩個可選的函式指標。由於((0xc2000000 & (1 << 25)) != 0)
,因此我們可以確認這個 block 擁有剛剛提到的兩個函式指標。
現在可以總結下:signature
的位址是在descriptor
下偏移兩個 unsiged long 和兩個指標後的位址,即 32 個位元組後。現在讓我們找出它的位址,並列印出它的字串內容:
memory read --size 8 --format x 0x00000001075496c2
看到這一串亂碼是不是覺得有點崩潰,折騰了半天,怎麼列印出這麼一串鬼東西,雖然裡面有乙個熟悉的 nsdictionary,但是其它的東西完全看不懂啊。
不要慌,這確實就是乙個函式簽名,只是我們需要通過nsmethodsignature
找出它的引數型別:
po [nsmethodsignature signaturewithobjctypes:"v16@?0@\"xsearchservice\"8"]
注意在雙引號」前加轉義\
(lldb) memory read --size 8 --format x 0x16d1a6050
0x16d1a6050: 0x00000001b6ca1e88 0x00000000c2000000
0x16d1a6060: 0x0000000105e014a8 0x0000000106336398
0x16d1a6070: 0x00000001c4329ba0 0x00000001c4329ba0
0x16d1a6080: 0x4094615555555555 0x0000000000000000
(lldb) memory read --size 8 --format x 0x0000000106336398
0x106336398: 0x0000000000000000 0x0000000000000028
0x1063363a8: 0x0000000105e014dc 0x0000000105e014e8
0x1063363b8: 0x00000001075496c2 0x0000000000000001
0x1063363c8: 0x0000000000000000 0x0000000000000028
(lldb) p (char *)0x00000001075496c2
(char *) $0 = 0x00000001075496c2 "v16@?0@"xsearchservice"8"
(lldb) po [nsmethodsignature signaturewithobjctypes:"v16@?0@\"xsearchservice\"8"]
number of arguments = 2
frame size = 224
is special struct return? no
return value: -------- -------- -------- --------
type encoding (v) 'v'
flags {}
modifiers {}
frame
memory
argument 0: -------- -------- -------- --------
type encoding (@) '@?'
flags
modifiers {}
frame
memory
argument 1: -------- -------- -------- --------
type encoding (@) '@"xsearchservice"'
flags
modifiers {}
frame
memory
class 'xsearchservice'
這裡還有個方法簽名的相關原理
最終可還原的引數為
%hook tbsrpxsearchservice
- (void)dosearchstart:(id)arg1 success:(void (^)(id response))completionhandler fail:(id)arg3 ismore:(_bool)arg4;
%orig(arg1,completionhandler,arg3,arg4);
}%end
iOS獲取相關引數
應用程式的名稱和版本號等資訊都儲存在mainbundle的乙個字典中,用下面 可以取出來。nsdictionary infodict nsbundle mainbundle infodictionary nsstring versionnum infodict objectforkey cfbund...
block塊的獲取
用流copy獲取第二個block塊的內容 public void downloadbyseek throws illegalargumentexception,ioexception 建立輸出流,指定位置.fileoutputstream fostream new fileoutputstream ...
ios逆向 如何獲取線上應用的標頭檔案
你是否曾因為應用上線的第一天即遭破解而無奈苦惱,想要加強防範,卻又束手無策嗎?你是否曾為某乙個應用深深折服,想要借鑑學習,卻又無從下手嗎?2 通過ssh連線越獄手機 預設密碼alpine 3 ps e 檢視所有程序 4 找到目標程序,記錄程序編號和所在位置 5 cycript p 674 cycri...