Android上玩玩Hook:Cydia Substrate實戰

2021-01-15 CSDN技術社區

CSDN移動將持續為您優選移動開發的精華內容,共同探討移動開發的技術熱點話題,涵蓋移動應用、開發工具、移動遊戲及引擎、智能硬體、物聯網等方方面面。如果您想投稿、參與內容翻譯工作,或尋求近匠報導,請發送郵件至tangxy#csdn.net(請把#改成@)。 

作者簡介:周聖韜,百度高級Android開發工程師,博客地址:http://blog.csdn.net/yzzst

了解Hook

還沒有接觸過Hook技術讀者一定會對Hook一詞感覺到特別的陌生,Hook英文翻譯過來就是「鉤子」的意思,那我們在什麼時候使用這個「鉤子」呢?

我們知道,在Android作業系統中系統維護著自己的一套事件分發機制。應用程式,包括應用觸發事件和後臺邏輯處理,也是根據事件流程一步步的向下執行。而「鉤子」的意思,就是在事件傳送到終點前截獲並監控事件的傳輸,像個鉤子勾上事件一樣。並且能夠在勾上事件時,處理一些自己特定的事件。如下圖所示:


Hook的這個本領,使它能夠將自身的代碼「融入」被勾住(Hook)的程序的進程中,成為目標進程的一個部分。我們也知道,在Android系統中使用了沙箱機制,普通用戶程序的進程空間都是獨立的,程序的運行彼此間都不受幹擾。

這就使我們希望通過一個程序改變其他程序的某些行為的想法不能直接實現,但是Hook的出現給我們開拓了解決此類問題的道路。當然,根據Hook對象與Hook後處理的事件方式不同,Hook還分為不同的種類,如消息Hook、API Hook等。

Cydia Substrate框架

如果使用過蘋果手機的用戶應該對Cydia Substrate框架來說一點都不會陌生,因為Cydia Substrate框架為蘋果用戶提供了越獄相關的服務框架。


Cydia Substrate原名MobileSubstrate(類庫中都是以MS開頭),作者為大名鼎鼎的Jay Freeman(saurik)。

當然,Cydia Substrate也推出了Android版。Cydia Substrate是一個代碼修改平臺,它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。

安裝Cydia Substrate框架Android本地服務

首先就是在Android設備中安裝Cydia Substrate框架的本地服務應用substrate.apk,我們可以在其官網下載到。

當然,我們安裝substrate後,需要「Link Substrate Files」(連接本地的Substrate服務文件),這一步是需要Root權限的,連接後還需要重啟設備才能夠生效。

下載使用Cydia Substrate庫 

Cydia Substrate官方建議在Android SDK Manager中添加它們插件地址的方式進行更新下載。如:在用戶自定義網址中添加http://asdk.cydiasubstrate.com/addon.xml。


通過使用Android SDK Manager工具下載完Cydia Substrate框架後,其存儲於目錄${ANDROID_HOME}\sdk\extras\saurikit\cydia_substrate下。

但是,由於Android SDK Manager在國內使用起來存在很多的限制,下載的時候也不是非常穩定,所以還是建議大家直接去官網下載開發庫。 


下載完成後,將得到的所有文件(很多的jar包與so庫),都拷貝都Android項目下的libs文件夾中,就可以直接使用了。其中的substrate.h頭文件與lib文件夾下的so文件是提供在使用NDK進行原生Hook程序開發中的函數支持庫。

TIPS:Cydia Substrate框架對於inline Hook的操作目前還是存在一些bug,使用的時候可能會出現崩潰的現象,部分使用了國內定製的ROM的設備在使用Cydia Substrate框架時會造成設備無法重新啟動或無法Hook的現象。Cydia Substrate怎麼用?

Cydia Substrate怎麼用?其實很簡單,Cydia Substrate提供了三個靜態的方法工具類,我們只需要學會使用它就好 。

MS.hookClassLoad    拿到指定Class載入時的通知MS.hookMethod   使用一個Java方法去替換另一個Java方法MS.moveUnderClassLoader   使用不同的ClassLoder重載對象

具體說明如下:

/** * Hook一個指定的Class * * @param name Class的包名+類名,如android.content.res.Resources * @param hook 成功Hook一個Class後的回調 */void hookClassLoad(String name, MS.ClassLoadHook hook);/** * Hook一個指定的方法,並替換方法中的代碼 * * @param _class Hook的calss * @param member Hook class的方法參數 * @param hook 成功Hook方法後的回調 * @param old Hook前方法,類似C中的方法指針 */void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);/** * Hook一個指定的方法,並替換方法中的代碼 * * @param _class Hook的calss * @param member Hook class的方法參數 * @param alteration */void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);/** * 使用一個ClassLoader重載一個對象 * * @param loader 使用的ClassLoader * @param object 帶重載的對象 * @return 重載後的對象 */<T> T moveUnderClassLoader(ClassLoader loader, T object);

開始實戰(廣告注入)

聽到這個題目,我估計很多打包黨也已經迫不及待了,稍安勿躁。靠廣告是賺不了大錢的,筆者也是一個打包黨。程式設計師還是以成長發展為主,一時的快錢帶會讓你在編程的路上越走越遠。

回到正題,使用Cydia Substrate框架我們能夠任意的Hook系統中的Java API,當然其中也用到了很多的反射機制,那麼除了系統中給開發者提供的API以外,我們能否也Hook應用程式中的一些方法呢?答案是肯定的。下面我們就以一個實際的例子講解一下如何Hook一個應用程式。

下面我們針對Android作業系統的瀏覽器應用,Hook其首頁Activity的onCreate方法(其他方法不一定存在,但是onCreate方法一定會有),並在其中注入我們的廣告。根據上面對Cydia Substrate的介紹,我們有了一個簡單的思路。

首先,我們根據某廣告平臺的規定,在我們的AndroidManifest.xml文件中填入一些廣告相關的ID。並且在AndroidManifest.xml文件中填寫一些使用Cydia Substrate相關的配置與權限。當然,我們還會聲明一個廣告的Activity,並設置此Activity為背景透明的Activity,為什麼設置透明背景的Activity,如下圖:


好了,下面我們就來實際操作一下。

其AndroidManifest.xml文件的部分內容如下所示:

<!-- 廣告相關的權限 --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.GET_TASKS" /><!-- 加入substrate權限 --><uses-permission android:name="cydia.permission.SUBSTRATE" /><application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- 廣告相關參數 --> <meta-data android:name="APP_ID" android:value="c62bd976138fa4f2ec853bb408bb38af" /> <meta-data android:name="APP_PID" android:value="DEFAULT" /> <!-- 聲明substrate的注入口味Main類 --> <meta-data android:name="com.saurik.substrate.main" android:value="com.example.hookad.Main" /> <!-- 透明無動畫的廣告Activity --> <activity android:name="com.example.hookad.MainActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 廣告的action --> <action android:name="com.example.hook.AD" /> </intent-filter> </activity></application>

對於Cydia Substrate的主入口Main類,依照之前的步驟新建一個包含有initialize方法的Main類。

這個時候我們希望使用MS.hookClassLoad方式找到瀏覽器主頁的Activity名稱。

這裡我們使用adb shell下使用dumpsys activity命令找到瀏覽器主頁的Activity名稱為com.android.browser.BrowserActivity。


使用MS.hookClassLoad方法獲取了BrowserActivity之後再hook其onCreate方法,在其中啟動一個含有廣告的Activity。Main類的代碼如下所示:

public class Main { /** * substrate 初始化後的入口 */ static void initialize() { //Hook 瀏覽器的主Activity,BrowserActivity MS.hookClassLoad("com.android.browser.BrowserActivity", new MS.ClassLoadHook() { public void classLoaded(Class<?> resources) { Log.e("test", "com.android.browser.BrowserActivity"); // 獲取BrowserActivity的onCreate方法 Method onCreate; try { onCreate = resources.getMethod("onCreate", Bundle.class); } catch (NoSuchMethodException e) { onCreate = null; } if (onCreate != null) { final MS.MethodPointer old = new MS.MethodPointer(); // hook onCreate方法 MS.hookMethod(resources, onCreate, new MS.MethodHook() { public Object invoked(Object object, Object...args) throws Throwable { Log.e("test", "show ad"); // 執行Hook前的onCreate方法,保證瀏覽器正常啟動 Object result = old.invoke(object, args); // 沒有Context // 執行一個shell 啟動我們的廣告Activity CMD.run("am start -a com.example.hook.AD"); return result; } }, old); } } }); }}

對於啟動的廣告MainActivity,在其中就是彈出一個插屏廣告。當然可也可是其他形式的廣告或者浮層,內容比較簡單這裡不做演示了。對整個項目進行編譯,運行。這個時候我們重新啟動Android自帶的瀏覽器的時候發現,瀏覽器會彈出一個廣告彈框。


從上面的圖片我們可以看出來了,之前我們設置插屏廣告MainActivity為無標題透明(Theme.Translucent.NoTitleBar)就是為了使得彈出來的廣告與瀏覽器融為一體,讓用戶感覺是瀏覽器彈出的廣告,也是惡意廣告程序為了防止自身被卸載掉的一些通用隱藏手段。

這裡演示的注入廣告是通過Hook指定的Activity中的onCreate方法來啟動一個廣告Activity。當然,這裡我們演示的Activity只是簡單的彈出來了一個廣告。如果啟動的Activity帶有惡意性,如將Activity做得與原Activity一模一樣的釣魚Activity,那麼對於行動裝置用戶來說是極具欺騙性的。

寫在最後

其實我不想發這篇文章,我做過廣告打包黨,深知這又為各個地下掘金的打包黨提供了思路。但,Cydia Substrate不僅僅是為了對廣告進行注入而生,希望大家多多挖掘思路,以共同學習提升為主。

預告: 2015中國移動開發者大會(MDCC 2015)將於10月15-16日在北京新雲南皇冠假日酒店召開。大會特設五大技術專場:平臺與技術iOS、平臺與技術Android、產品與設計、遊戲開發、企業移動化。此外,大會更是首次舉辦國內極具權威影響力的IoT技術峰會,特設硬體開發技術與虛擬實境兩大專場。大會將聚集國內最具實力的產品技術團隊,與開發者一道進行最前沿的探討與交流。

第一時間掌握最新移動開發相關信息和技術,請關注mobilehub公眾微信號(ID: mobilehub)。 


相關焦點

  • 鉤子:by hook or by crook
    「By hook or by crook」 例句:   One thing you can say about Jack is that he always gets the job done, whether by hook or by crook.
  • cydia軟體源在哪怎麼添加使用方法教程
    cydia軟體源在哪怎麼添加使用方法教程 來源:www.18183.com作者:集落時間:2014-12-28 cydia軟體源在哪怎麼添加 cydia使用方法教程,本文小編為您帶來cydia軟體源在哪怎麼添加 cydia使用方法教程。
  • hook是「鉤子」,那美國人常說的「hook up」是什麼意思呢?
    off the hookhook做名詞解釋是「掛鈎,吊鉤」,做動詞解釋是「鉤住」,off有「離開、脫掉」之意,那off the hook字面意思就是「脫掉了掛鈎,擺脫掉了」,延伸過來,我們就能知道,本意是指「擺脫困境、脫身」。所以「I am off the hook」意思就是「我終於解脫了」。
  • 不通過cydia源安裝deb插件教程!
    deb插件包的2種安裝安裝方法:一、cydia重啟自動安裝
  • 無需Cydia直接在瀏覽器上下載deb安裝包教程
    無需Cydia直接在瀏覽器上下載deb安裝包教程 2017-02-05 11:27 | 作者:leidian | 來源:265G QQ群號:624022706
  • 盤古iOS8.1 完美越獄已可以安裝 Cydia
    我國iOS團隊盤古率先推出了iOS8、iOS8.1的完美越獄工具,不過在當初剛剛放出越獄工具時,由於cydia商店還沒有跟進iOS8,所以暫時無法在iOS8越獄設備中使用Cydia,今天,盤古團隊發布了支持iOS8.1的cydia 1.1.14安裝包,越獄用戶可以通過內置的「盤古」來下載安裝Cydia。
  • 分享iPhone4S越獄後有用的cydia源
    分享iPhone4S越獄後有用的cydia源!現在iPhone4S和iPad2都越獄了!越獄後需要安裝cydia源能使你的iPhone4S和iPad2在IOS5下功能更完善更強大!
  • 旅行的青蛙Unity遊戲逆向修改Android&iOS
    所以要單獨分析iOS的話難度會大很多,如果從Android的C#腳本入手的話,因為iOS和Android腳本都是一樣的話,可以從Android分析的函數名來對應iOS的c函數然後進行hook修改。根據函數hook代碼還原之後就可以根據之前分析到的函數名來hook對應的代碼了,首先是三葉草的數目通過SuperGameMaster.CloverPointStock()獲取的,在IDA搜索CloverPointStock如下:
  • Android壓力測試Monkey工具
    com.android.quicksearchboxcom.android.protipscom.android.browsercom.android.launchercom.android.termcom.android.speechrecordercom.android.server.vpn
  • iOS8越獄安裝Cydia及iFile插件傻瓜教程
    工具下載:Cydia 1.1.13 下載:http://weip.dev.weiphone.net/deb/cydia_1.1.13_iphoneos-arm.deb對應依賴的語言包下載:http://weip.dev.weiphone.net/deb/cydia-lproj
  • I'll solve the problem by hook or by crook是用鉤子解決問題嗎
    hook與crook都有「鉤子」的意思,by hook or by crook字面意思是「用鉤子」,這個習語實際意思是「用種種方法;不擇手段;千方百計;無論如何」。by hook or by crook英語解釋為by any necessary means。看下老外聊天時怎麼用。
  • iOS7完美越獄後安裝Cydia插件與設置教程
    在iOS7完美越獄之後在桌面上會出現Cydia圖標,我們點擊進入。 第一次進入Cydia會準備文件系統並且會自動退出,之後重新進入。並在屏幕上角點擊左上角的按鈕添加源。 輸入http://cydia.angelxwind.net 完成後進入剛剛添加的源,選擇AppSync for iOS7.0+並安裝。
  • Substrate Warpage 探討 1
    弓曲是覆銅板類似於柱形或曲球形的一種變形,而扭曲是基板在平行於對角線方向的一種變形,其中一個角不包含在另外三個角的平面上。具體測試方法,可以上網搜索。生產工藝:process key (樹脂含量、流動率、凝脂化時間)張力控制:NA溫度控制:NA層壓設計: 層壓過程中的時間『、溫度、及升溫升壓速率緩慢降溫速度/成型壓力:NA銅層均勻性:NA加工方向一致性:NA關於具體的分析過程,待續討論,後面會討論warpage 常見原因和預防措施,同時會share 部分substrate
  • Android利用SurfaceView顯示Camera圖像爬坑記(四)
    可能有一些不是特別好的地方,歡迎指出先上效果圖;import android.hardware.Camera;import android.os.Handler;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;import com.example.camera.util.CameraUtil;/*
  • com.android.systemui已停止是什麼意思 怎麼解決
    com.android.systemui已停止是什麼意思 怎麼解決 來源:www.18183.com作者:皮卡時間:2016-01-20 我們如果需要解決手機使用中出現com.android.systemui已停止運行的問題,那麼我們首先要搞清楚com.android.systemui
  • Aromatase is a novel neosubstrate of cereblon responsible for...
    HEMATOPOIESIS AND STEM CELLS| JUNE 11, 2020Aromatase is a novel neosubstrate
  • android系統桌面設置為背景的方法
    packagecom.yao_guet;importandroid.app.WallpaperManager;importandroid.content.Context;importandroid.os.IBinder;importandroid.util.AttributeSet;importandroid.util.Log
  • 什麼是越獄/Cydia/解鎖 iPhone所有名詞解釋教程篇
    自製固件說白了就是DIY版的作業系統,或者叫盜版系統,就像電腦上的番茄花園windows系統一樣。8.白蘋果是什麼意思?iPhone開機的時候會有一個白蘋果的標誌,在屏幕最中間。周圍全部為黑色。論壇裡面所說的白蘋果就是開機以後不能進入系統,一直持續保持白蘋果這個界面。說白了,就是手機無法正常使用了。
  • android啟動頁設計專題及常見問題 - CSDN
    ><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent
  • 15個優秀的開源項目,讓你輕鬆應對Android開發
    【公眾號回復「1024」,送你一個特別推送】聲明原創|本文為codeGoogler授權發布,未經允許請勿轉載一、huabanDemo-android