Android上玩玩Hook?
在中國互聯網這片弱肉強食的叢林中,封閉抄襲是壟斷巨頭的通行證,創新是弱小創業者的墓志銘。
了解Hook
還沒有接觸過Hook技術讀者一定會對Hook一詞感覺到特別的陌生,Hook英文翻譯過來就是“鉤子”的意思,那我們在什么時候使用這個“鉤子”呢?
我們知道,在Android操作系統中系統維護著自己的一套事件分發機制。應用程序,包括應用觸發事件和后臺邏輯處理,也是根據事件流程一步步的向下執行。而“鉤子”的意思,就是在事件傳送到終點前截獲并監控事件的傳輸,像個鉤子勾上事件一樣。并且能夠在勾上事件時,處理一些自己特定的事件。如下圖所示:
Hook的這個本領,使它能夠將自身的代碼“融入”被勾住(Hook)的程序的進程中,成為目標進程的一個部分。我們也知道,在Android系統中使用了沙箱機制,普通用戶程序的進程空間都是獨立的,程序的運行彼此間都不受干擾。
這就使我們希望通過一個程序改變其他程序的某些行為的想法不能直接實現,但是Hook的出現給我們開拓了解決此類問題的道路。當然,根據Hook對象與Hook后處理的事件方式不同,Hook還分為不同的種類,如消息Hook、API Hook等。
CydiaSubstrate框架
?
如果使用過蘋果手機的用戶應該對Cydiasubstrate框架來說一點都不會陌生,因為Cydiasubstrate框架為蘋果用戶提供了越獄相關的服務框架。
Cydiasubstrate原名MobileSubstrate(類庫中都是以MS開頭),作者為大名鼎鼎的Jay Freeman(saurik)。
當然 Cydiasubstrate 也推出了 Android版。Cydia Substrate是一個代碼修改平臺。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。
官網地址:http://www.cydiasubstrate.com/。
安裝Cydiastrate框架Android本地服務
首先就是在Android設備中安裝Cydiasubstrate框架的本地服務應用substrate.apk,我們可以再其官網下載到。
官方下載地址為:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk
當然,我們安裝substrate后,需要“Link Substrate Files”(連接本地的Substrate服務文件),這一步是需要Root權限的,連接后還需要重啟設備才能夠生效。
下載使用Cydiasubstrate庫?
Cydiasubstrate官方建議在Android SDK Manager中添加它們插件地址的方式進行更新下載。
如:在用戶自定義網址中添加http://asdk.cydiasubstrate.com/addon.xml。
通過使用Android SDK Manager工具下載完Cydiasubstrate框架后,其存儲于目錄${ANDROID_HOME}\sdk\extras\saurikit\cydia_substrate下。
但是,由于Android SDK Manager在國內使用起來存在很多的限制,下載的時候也不是非常穩定,所以還是建議大家直接去官網下載開發庫。?
官方下載地址為:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip。
下載完成后,將得到的所有文件(很多的jar包與so庫),都拷貝都Android項目下的libs文件夾中,就可以直接使用了。
其中的substrate.h頭文件與lib文件夾下的so文件是提供在使用NDK進行原生Hook程序開發中的函數支持庫。
TIPS:CydiaSubstrate框架對于inline Hook的操作目前還是存在一些bug,使用的時候可能會出現崩潰的現象,部分使用了國內定制的ROM的設備在使用CydiaSubstrate框架時會造成設備無法重新啟動或無法Hook的現象。CydiaSubstrate怎么用?
CydiaSubstrate怎么用?其實很簡單,CydiaSubstrate提供了三個靜態的方法工具類,我們只需要學會使用它就好 。
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">MS<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.hookClassLoad</span> 拿到指定Class載入時的通知 MS<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.hookMethod</span> 使用一個Java方法去替換另一個Java方法 MS<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.moveUnderClassLoader</span> 使用不同的ClassLoder重載對象</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>具體說明如下:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Hook一個指定的Class* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> name Class的包名+類名,如android.content.res.Resources*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> hook 成功Hook一個Class后的回調*/</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> hookClassLoad(String name, MS.ClassLoadHook hook);<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Hook一個指定的方法,并替換方法中的代碼* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> _class Hook的calss*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> member Hook class的方法參數*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> hook 成功Hook方法后的回調*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> old Hook前方法,類似C中的方法指針*/</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Hook一個指定的方法,并替換方法中的代碼* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> _class Hook的calss*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> member Hook class的方法參數*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> alteration*/</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> hookMethod(Class _class, Member member, MS.MethodAlteration alteration);<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 使用一個ClassLoader重載一個對象* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> loader 使用的ClassLoader*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> object 帶重載的對象*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @return</span> 重載后的對象*/</span> <T> T moveUnderClassLoader(ClassLoader loader, T object);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>開始實戰(廣告注入)
聽到這個題目,我估計很多打包黨也已經迫不及待了,稍安勿躁。靠廣告是賺不了大錢的,筆者也是一個打包黨。程序員還是以成長發展為主,一時的快錢帶會讓你在編程的路上越走越遠。
回到正題,使用Cydiasubstrate框架我們能夠任意的Hook系統中的Java API,當然其中也用到了很多的反射機制,那么除了系統中給開發者提供的API以外,我們能否也Hook應用程序中的一些方法呢?答案是肯定的。下面我們就以一個實際的例子講解一下如何Hook一個應用程序。
下面我們針對Android操作系統的瀏覽器應用,Hook其首頁Activity的onCreate方法(其他方法不一定存在,但是onCreate方法一定會有),并在其中注入我們的廣告。根據上面對Cydiasubstrate的介紹,我們有了一個簡單的思路。
首先,我們根據某廣告平臺的規定,在我們的AndroidManifest.xml文件中填入一些廣告相關的ID。并且在AndroidManifest.xml文件中填寫一些使用Cydiasubstrate相關的配置與權限。當然,我們還會聲明一個廣告的Activity,并設置此Activity為背景透明的Activity,為什么設置透明背景的Activity,如下圖:
好了,下面我們就來實操一下。
其AndroidManifest.xml文件的部分內容如下所示:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 廣告相關的權限 --></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.INTERNET"</span> /></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.ACCESS_NETWORK_STATE"</span> /></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.ACCESS_WIFI_STATE"</span> /></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.READ_PHONE_STATE"</span> /></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.WRITE_EXTERNAL_STORAGE"</span> /></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.GET_TASKS"</span> /></span> <span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 加入substrate權限 --></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"cydia.permission.SUBSTRATE"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:allowBackup</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"true"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:icon</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@drawable/ic_launcher"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:label</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@string/app_name"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:theme</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@style/AppTheme"</span> ></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 廣告相關參數 --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"APP_ID"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"c62bd976138fa4f2ec853bb408bb38af"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"APP_PID"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"DEFAULT"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 聲明substrate的注入口味Main類 --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.saurik.substrate.main"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.example.hookad.Main"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 透明無動畫的廣告Activity --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">activity </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.example.hookad.MainActivity"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:theme</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@android:style/Theme.Translucent.NoTitleBar"</span> ></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">intent-filter</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">action</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.intent.action.VIEW"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">category</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.intent.category.DEFAULT"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 廣告的action --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">action</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.example.hook.AD"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">intent-filter</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">activity</span>></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li></ul>對于Cydiasubstrate的主入口Main類,依照之前的步驟新建一個包含有initialize方法的Main類。
這個時候我們希望使用MS.hookClassLoad方式找到瀏覽器主頁的Activity名稱。
這里我們使用adb shell下使用dumpsys activity命令找到瀏覽器主頁的Activity名稱為com.android.browser.BrowserActivity。
使用MS.hookClassLoad方法獲取了BrowserActivity之后再hook其onCreate方法,在其中啟動一個含有廣告的Activity。Main類的代碼如下所示:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> Main {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">/*** substrate 初始化后的入口*/</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> initialize() {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//Hook 瀏覽器的主Activity,BrowserActivity</span>MS.hookClassLoad(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.android.browser.BrowserActivity"</span>, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> MS.ClassLoadHook() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> classLoaded(<span class="hljs-title" style="box-sizing: border-box;">Class</span><?> resources) {Log.e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"test"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.android.browser.BrowserActivity"</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲取BrowserActivity的onCreate方法</span>Method onCreate;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">try</span> {onCreate = resources.getMethod(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"onCreate"</span>, Bundle.class);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">catch</span> (NoSuchMethodException e) {onCreate = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;}<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (onCreate != <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>) {final MS.MethodPointer old = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> MS.MethodPointer();<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// hook onCreate方法</span>MS.hookMethod(resources, onCreate, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> MS.MethodHook() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> Object <span class="hljs-title" style="box-sizing: border-box;">invoked</span>(Object <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">object</span>, Object...args) throws Throwable {Log.e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"test"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"show ad"</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 執行Hook前的onCreate方法,保證瀏覽器正常啟動</span>Object result = old.invoke(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">object</span>, args);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 沒有Context</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 執行一個shell 啟動我們的廣告Activity</span>CMD.run(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"am start -a com.example.hook.AD"</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> result;}}, old);}}});} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li></ul>對于啟動的廣告MainActivity,在其中就是彈出一個插屏廣告。當然可也可是其他形式的廣告或者浮層,內容比較簡單這里不做演示了。對整個項目進行編譯,運行。這個時候我們重新啟動Android自帶的瀏覽器的時候發現,瀏覽器會彈出一個廣告彈框。
從上面的圖片我們可以看出來了,之前我們設置插屏廣告MainActivity為無標題透明(Theme.Translucent.NoTitleBar)就是為了使得彈出來的廣告與瀏覽器融為一體,讓用戶感覺是瀏覽器彈出的廣告。也是惡意廣告程序為了防止自身被卸載掉的一些通用隱藏手段。
這里演示的注入廣告是通過Hook指定的Activity中的onCreate方法來啟動一個廣告Activity。當然,這里我們演示的Activity只是簡單的彈出來了一個廣告。如果啟動的Activity帶有惡意性,如將Activity做得與原Activity一模一樣的釣魚Activity,那么對于移動設備用戶來說是極具欺騙性的。
寫在之后
其實我不想發這篇文章,我做過廣告打包黨,深知這又為各個地下掘金的打包黨提供了思路。
但,CydiaSubstrate不僅僅是為了對廣告進行注入而生,希望大家多多挖掘思路,以共同學習提升為主。
最后,有興趣探討的加我一下微信,大家交交朋友。
原文地址: http://blog.csdn.net/yzzst/article/details/47318751
總結
以上是生活随笔為你收集整理的Android上玩玩Hook?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AndFix解析——(下)
- 下一篇: Android Hook神器——XPos