ios逆向獲取Block的引數和返回值

2021-09-22 21:25:19 字數 3091 閱讀 6897

先貼個圖

參考了

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_helperdisponse_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...