Android Dalvik模式下劫持 Java 函式
阿新 • • 發佈:2019-01-14
0x00. 前言
這是去年底乾的事情了,研究這個的目的是為了劫持App中的所有流量並引導到squid節點。大部分的Http請求可以在編譯dex時通過修改位元組碼,做些小手腳搞定;但是對於Webview中的視訊流,以前一直沒有解決,XX專案組由於是加速業務後端收費,對流量洩露並不敏感只會少收錢;而我們做定向流量業務前端收費,洩漏了會被使用者投訴。
為了劫持這個這個流量,走了兩次彎路。先研究了用js注入偷偷修改video物件的方法,雖然可以劫持一部分視訊請求,但是成不成功完全決定於CP的js怎麼寫,太不擼棒棒了。之後研究了在代理伺服器去修改所有頁面和js指令碼,篡改url中的host欄位為代理伺服器地址,方案甚至都做到上線去,這導致了部分請求出現跨域,相對地址的請求丟失源站host,也斃了。
0x01.技術背景
以前搞視訊研究過RTSP轉H5 Video, 雖然H5 Video支援不少編碼器和容器,但是各大視訊網站基本上也就提供mp4+ts兩種容器和mp4v+h264兩種vcodec。其實呢webview中的音視訊最後也是通過MediaPlayer來下載播放。所以我們要是能拿到MediaPlayer 用反射呼叫私有非公開函式,幹個代理進去就可以了。然並卵,MediaPlayer物件根本拿不到。但是,這裡有個但是..... MediaPlayer總是要傳引數進去的, 所以小機智的我們就不自然的聯想到hook這個方法了...
0x02
MediaPlayer 有一組不同過載的setDataSource方法,用途就是傳url,如果能hook這個方法,篡改掉url,在呼叫原來的方法,應該就能解決我們的問題? 然而,真的是可以哦,可以劫持