還沒有接觸過Hook技術(shù)讀者一定會對Hook一詞感覺到特別的陌生,Hook英文翻譯過來就是“鉤子”的意思,那我們在什么時候使用這個“鉤子”呢?
我們知道,在Android操作系統(tǒng)中系統(tǒng)維護著自己的一套事件分發(fā)機制。應(yīng)用程序,包括應(yīng)用觸發(fā)事件和后臺邏輯處理,也是根據(jù)事件流程一步步的向下執(zhí)行。而“鉤子”的意思,就是在事件傳送到終點前截獲并監(jiān)控事件的傳輸,像個鉤子勾上事件一樣。并且能夠在勾上事件時,處理一些自己特定的事件。如下圖所示:

Hook的這個本領(lǐng),使它能夠?qū)⒆陨淼拇a“融入”被勾住(Hook)的程序的進程中,成為目標進程的一個部分。我們也知道,在Android系統(tǒng)中使用了沙箱機制,普通用戶程序的進程空間都是獨立的,程序的運行彼此間都不受干擾。
這就使我們希望通過一個程序改變其他程序的某些行為的想法不能直接實現(xiàn),但是Hook的出現(xiàn)給我們開拓了解決此類問題的道路。當然,根據(jù)Hook對象與Hook后處理的事件方式不同,Hook還分為不同的種類,如消息Hook、API Hook等。
如果使用過蘋果手機的用戶應(yīng)該對Cydia Substrate框架來說一點都不會陌生,因為Cydia Substrate框架為蘋果用戶提供了越獄相關(guān)的服務(wù)框架。

Cydia Substrate原名MobileSubstrate(類庫中都是以MS開頭),作者為大名鼎鼎的Jay Freeman(saurik)。
當然,Cydia Substrate也推出了Android版。Cydia Substrate是一個代碼修改平臺,它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。
首先就是在Android設(shè)備中安裝Cydia Substrate框架的本地服務(wù)應(yīng)用substrate.apk,我們可以在其官網(wǎng)下載到。
當然,我們安裝substrate后,需要“Link Substrate Files”(連接本地的Substrate服務(wù)文件),這一步是需要Root權(quán)限的,連接后還需要重啟設(shè)備才能夠生效。
Cydia Substrate官方建議在Android SDK Manager中添加它們插件地址的方式進行更新下載。如:在用戶自定義網(wǎng)址中添加http://asdk.cydiasubstrate.com/addon.xml。

通過使用Android SDK Manager工具下載完Cydia Substrate框架后,其存儲于目錄${ANDROID_HOME}\sdk\extras\saurikit\cydia_substrate下。
但是,由于Android SDK Manager在國內(nèi)使用起來存在很多的限制,下載的時候也不是非常穩(wěn)定,所以還是建議大家直接去官網(wǎng)下載開發(fā)庫。

下載完成后,將得到的所有文件(很多的jar包與so庫),都拷貝都Android項目下的libs文件夾中,就可以直接使用了。其中的substrate.h頭文件與lib文件夾下的so文件是提供在使用NDK進行原生Hook程序開發(fā)中的函數(shù)支持庫。
TIPS:Cydia Substrate框架對于inline Hook的操作目前還是存在一些bug,使用的時候可能會出現(xiàn)崩潰的現(xiàn)象,部分使用了國內(nèi)定制的ROM的設(shè)備在使用Cydia Substrate框架時會造成設(shè)備無法重新啟動或無法Hook的現(xiàn)象。
Cydia Substrate怎么用?其實很簡單,Cydia Substrate提供了三個靜態(tài)的方法工具類,我們只需要學(xué)會使用它就好 。
MS.hookClassLoad 拿到指定Class載入時的通知
MS.hookMethod 使用一個Java方法去替換另一個Java方法
MS.moveUnderClassLoader 使用不同的ClassLoder重載對象
具體說明如下:
聽到這個題目,我估計很多打包黨也已經(jīng)迫不及待了,稍安勿躁。靠廣告是賺不了大錢的,筆者也是一個打包黨。程序員還是以成長發(fā)展為主,一時的快錢帶會讓你在編程的路上越走越遠。
回到正題,使用Cydia Substrate框架我們能夠任意的Hook系統(tǒng)中的Java API,當然其中也用到了很多的反射機制,那么除了系統(tǒng)中給開發(fā)者提供的API以外,我們能否也Hook應(yīng)用程序中的一些方法呢?答案是肯定的。下面我們就以一個實際的例子講解一下如何Hook一個應(yīng)用程序。
下面我們針對Android操作系統(tǒng)的瀏覽器應(yīng)用,Hook其首頁Activity的onCreate方法(其他方法不一定存在,但是onCreate方法一定會有),并在其中注入我們的廣告。根據(jù)上面對Cydia Substrate的介紹,我們有了一個簡單的思路。
首先,我們根據(jù)某廣告平臺的規(guī)定,在我們的AndroidManifest.xml文件中填入一些廣告相關(guān)的ID。并且在AndroidManifest.xml文件中填寫一些使用Cydia Substrate相關(guān)的配置與權(quán)限。當然,我們還會聲明一個廣告的Activity,并設(shè)置此Activity為背景透明的Activity,為什么設(shè)置透明背景的Activity,如下圖:

好了,下面我們就來實際操作一下。
其AndroidManifest.xml文件的部分內(nèi)容如下所示:
對于Cydia Substrate的主入口Main類,依照之前的步驟新建一個包含有initialize方法的Main類。
這個時候我們希望使用MS.hookClassLoad方式找到瀏覽器主頁的Activity名稱。
這里我們使用adb shell下使用dumpsys activity命令找到瀏覽器主頁的Activity名稱為com.android.browser.BrowserActivity。

使用MS.hookClassLoad方法獲取了BrowserActivity之后再hook其onCreate方法,在其中啟動一個含有廣告的Activity。Main類的代碼如下所示:
對于啟動的廣告MainActivity,在其中就是彈出一個插屏廣告。當然可也可是其他形式的廣告或者浮層,內(nèi)容比較簡單這里不做演示了。對整個項目進行編譯,運行。這個時候我們重新啟動Android自帶的瀏覽器的時候發(fā)現(xiàn),瀏覽器會彈出一個廣告彈框。
從上面的圖片我們可以看出來了,之前我們設(shè)置插屏廣告MainActivity為無標題透明(Theme.Translucent.NoTitleBar)就是為了使得彈出來的廣告與瀏覽器融為一體,讓用戶感覺是瀏覽器彈出的廣告,也是惡意廣告程序為了防止自身被卸載掉的一些通用隱藏手段。
這里演示的注入廣告是通過Hook指定的Activity中的onCreate方法來啟動一個廣告Activity。當然,這里我們演示的Activity只是簡單的彈出來了一個廣告。如果啟動的Activity帶有惡意性,如將Activity做得與原Activity一模一樣的釣魚Activity,那么對于移動設(shè)備用戶來說是極具欺騙性的。
其實我不想發(fā)這篇文章,我做過廣告打包黨,深知這又為各個地下掘金的打包黨提供了思路。但,Cydia Substrate不僅僅是為了對廣告進行注入而生,希望大家多多挖掘思路,以共同學(xué)習(xí)提升為主。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個個人學(xué)習(xí)交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。