iOS https(SSL/TLS)數據捕獲

要捕獲iPhone上的appstore的數據還真的沒那麼容易,之前介紹的那些使用代理手工導入證書的方法已經徹底失效了,結果就是安裝證書以後再打開appstore也沒法正常的創建鏈接。按照個人分析實際上是appstore在檢測證書無效以後直接就沒有發起任何的請求(能夠經過wireshark抓包查看網絡數據)
隨之而來的是第二種方法,patch ssl證書校驗函數,根據這個原理實現的有兩個工具,一個是ssl kill switch,另一個是trustme。原理都是同樣的,而且也很是的簡單,按照做者的說法是truestme實現的更底層一些。可是很不幸的是,結局是一樣的悲哀的,在iOS6以後這個東西也是失效了。
其實我這裏要說的方法也比較簡單,若是閱讀過上面兩個工具的源代碼(請自行搜索相關代碼),而且理解mac os/iOS 下https實現的相關原理,那麼也就天然的想到hook發送和接收函數的方法來捕獲數據了。
須要關心的函數只有兩個sslread和sslwrite:
代碼:

SSLRead
Performs a normal application-level read operation.

 OSStatus SSLRead (
   SSLContextRef context,
   void *data,
   size_t dataLength,
   size_t *processed
);
Parameters
context
An SSL session context reference.
data
On return, points to the data read. You must allocate this buffer before calling the function. The size of this buffer must be equal to or greater than the value in the dataLength parameter.
dataLength
The amount of data you would like to read.
processed
On return, points to the number of bytes actually read.

而須要關心的字段則就是那個data了,於是要想知道https數據的內容只要可以正常的獲取到data字段的內容就好了,一樣對於發送函數sslwrite也一樣適用:
代碼:

SSLWrite
Performs a normal application-level write operation.

OSStatus SSLWrite (
   SSLContextRef context,
   const void *data,
   size_t dataLength,
   size_t *processed
);
Parameters
context
An SSL session context reference.
data
A pointer to the buffer of data to write.
dataLength
The amount, in bytes, of data to write.
processed
On return, the length, in bytes, of the data actually written.


已經找到了要處理的api,那麼剩下的就比較簡單了,直接用越獄開發環境theos來建立一個tweak插件而後寫入要實現的代碼編譯就好了。要實現hook僅須要以下的兩行代碼便可:
代碼:

MSHookFunction((void *)SSLWrite, (void *)_hook_SSLWrite, (void **)&_real_SSLWrite);
  MSHookFunction((void *)SSLRead, (void *)_hook_SSLRead, (void **)&_real_SSLRead);

這個能夠參考ssl kill switch 的相關代碼(其他的代碼請自行實現)。剩下的就是編譯和安裝了。
若是不會寫這個東西能夠下載我已經編譯好的一個deb,在ssh或者設備上的終端輸入:
代碼:

wget http://code.h4ck.org.cn/ios-ssl-tls-hook/src/f54821c790451d9d25f8ed78cb80179166d47e2f/com.mars.sslohook_0.1-45_iphoneos-arm.deb?at=master

dpkg -i com.mars.sslohook_0.1-45_iphoneos-arm.deb

進行下載和安裝。
若是要禁用這個插件請直接卸載便可,執行下面的命令:
代碼:

dpkg -r com.mars.sslohook

依賴環境,若是要安裝這個插件須要下面的兩個東西:
MobileSubstrate (Should come with jailbroken devices)
dpkg (Install from Cydia)
若是木有的話,那就不要嘗試了,設備木有越獄也不要嘗試了(測試環境爲iPod touch 和iPhone5 固件版本6.1.2)
若是沒有安裝dpkg能夠經過cydia的自動安裝來進行,用同步軟件將deb放入相關的目錄下安裝便可。
安裝以後執行killall -HUP SpringBoard來加載插件。
若是須要修改要hook的應用請編輯Library/MobileSubstrate/DynamicLibraries目錄下的mars.plistios


在mars.plist中添加要hook的應用便可。

捕獲的數據大部分爲明文,日誌文件保存在/tmp/com.mars.sslhooklog.text,固然因爲https一樣支持gzip壓縮因此有一部分數據是gzip壓縮的內容,因爲受到的數據可能會存在分片的問題,因此沒有實現解壓gzip的相關代碼,這個能夠根據上下文中的相關信息或者收到的數據長度對捕獲到的十六進制數據進行轉存和解壓。
明文數據:

壓縮數據:

至於怎麼轉存,那就各顯神通吧,我也木有蝦米好辦法,數據分片好蛋疼的說。

固然啦,若是你有更好的工具或者實現方法歡迎分享api

相關文章
相關標籤/搜索