獵豹移動安全中心 · 2015/07/13 19:12
author:獵豹安全中心
下面進入主題,說說是如何實現語音監控的。
core-android-audiocapture-master\dbi_release
資料夾裡面是程式主要**,包括的檔案如下
其中,hijack資料夾下包含了乙份程序注入的**,該**的主要功能就是通過ptrace將乙個動態鏈結庫(*.so檔案)注入到指定的程序裡面,並執行。實際上關於程序注入的**,之前已經有過很多個版本了,關於細節就不再贅述。相信在不久之後,基於hackingteam洩漏版進行改寫的hijack將會大量的出現。
在my_init函式開始部分,首先對系統版本進行了判斷,並根據不同的版本採取不同的措施。
為了更容易理解,我們選取android 4.0的環境,看看my_init都做了寫什麼事情。
可以看到很多hook_coverage_xx
形式的變數,這實際上是函式呼叫的巨集定義。相關的定義在hijack_func\hooker.h
檔案中
根據上圖可以知道,hook_coverage_xx實際上是呼叫了help_no_hash函式。那麼我們先來總結一下help_no_hash函式都做了些什麼,該函式在libt.c檔案中定義。
首先,help_no_hash呼叫find_name來獲取指定函式位址。find_name的實現在util.c檔案中,過程就是通過指定的pid讀取/proc//maps檔案,獲取libname的基址base和檔案路徑path,隨後根據path讀取libname這個檔案並解析,獲取funcname的相對位址偏移va,最後計算base+va就是funcname在程序中的實際位址,最後寫入addr中。最後把libname所在的記憶體屬性設定為可讀寫和執行,方便後期進行修改。
經過find_name的呼叫,就可以找到funcname函式的實際位址,就是addr的值。之後通過判斷addr的值,就可以知道該函式指令集是arm還是thumb。並根據不同的指令集進行不同的處理。重點看一下arm指令集的處理
根據上圖,可以看到,主要內容就是初始化hook變數,hook變數的型別是struct hook_t *,隨後修改funcname函式的前12個位元組,實現inline hook。
對於thumb指令集,實現的功能也類似。都是inline hook,只是在具體指令上有些差別。此處就不再贅述了。
綜合上述的資訊,總結一下,help_no_hash函式的主要功能就是對於指定的函式實現inline hook。相信該部分**以後也會流行起來的。但是該段**雖然寫的比較漂亮,但是依舊存在一些問題,諸位發揮拿來主意的時候,最好還是多測試一下。
回到主題,既然知道了help_no_hash是實現了inline hook功能,那麼就來總結一下,都hook了哪些函式。
上表總結了hook關係。我們重點關注的是」hook函式」這一項,裡面的內容就是實際的**。各個函式主要是實現監控並記錄的功能,我們挑選乙個比較有代表性的」newtrack_h」來進行分析。
newtrack_h函式實現是在hijack_func\hooker_thumb.c檔案中。
由於使用的是inline hook,並且目的是監控,而非控制,所以,在每個hook函式開始位置都有相似的呼叫原始函式的過程。通過helper_precall和helper_postcall來實現安裝和解除安裝inline hook的功能。
之後經過一些無關緊要的操作,生成乙個struct cblk_t *型別的結構體變數cblk_tmp,並進行初始化。
然後為cblk_tmp->filename生成乙個值,作為儲存的檔名。
以cblk_tmp->filename作為檔名建立檔案
繼續對cblk_tmp的成員變數進行賦值,最後放入雜湊表中,方便後續的查詢等操作。
在函式的開始部分,依舊是呼叫原始的函式。
之後,會根據系統版本,通過硬編碼的偏移值,獲取系統結構位址。
然後將資訊寫入檔案
注意到,bufferraw就是音訊的資訊,根據之前的**,可以看到playbacktrack_getnextbuffer3_h實際上是對audioflinger::playbackthread::track::getnextbuffer函式進行的hook,其引數audiobufferprovider::buffer *的內容,就是音訊內容,也就是bufferraw的**。通過記錄bufferraw,就能記錄原始的音訊內容了。
在recordtrack_getnextbuffer3_h函式中也有類似的操作,就不贅述了。
至此,語音監控功能的原始碼分析也就基本完成了。總體看來,hackingteam的**寫的還是非常漂亮的,其中動態庫注入部分,以及inline hook部分原始碼,預計在未來一段時間會被借鑑與各種android專案中。但是這分**依舊存在一些問題,首先是必須root許可權才能正確執行,而且在實現的過程中,使用了一些硬編碼,而android系統本身碎片化十分嚴重,各種定製rom流行,這就使得硬編碼只能適配少數一部分系統,而無法做到對所有android系統都有效。相信這也是一種無奈之舉吧。
xctf中的Lottery( git原始碼洩露)
這道題先用敏感檔案洩露工具掃到了.git檔案洩露,於是用githack將檔案還原進行 審計。漏洞處在api.php這個檔案 function buy req switch same count money prize 2 session money money response status ok ...
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
Cartographer原始碼篇 原始碼分析 1
在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...