Android逆向進階(7)——揭開Hook的神秘面紗
本文作者:i春秋作家——HAI_
0×00 前言
HAI_逆向使用手冊(想嘗試一下新的寫法)
其他 Android逆向進階 系列課程 <<<<<<<
人物說明
小白:已經掌握了一些基礎的逆向技能的菜鳥。
小紅:小白的女朋友。
大白:小白的師傅。
竹山(大白居)
師傅師傅,我今天下山聽見有人說,江湖中出現了一種為Hook的武林秘籍。據說十分厲害,可以攔截System。攔截程序猿開發的出來app。
小白啊,你知道什麽是Hook嗎。
聽說過,但是卻不明白什麽是hook。
Hook這個秘籍啊,說白了是對函數進行重寫。我們重寫這個函數,就可以實現我們想要的目的,攔截呀,還有其他的內容。
師傅,我想學這個Hook秘籍。
好好,我們慢慢來。
先說說我們今天學習的Hook技能吧。
技能(內容)
1.一個新的武器(Xposed框架)的使用
2.練習使用Hook的第一重內功(Android Studio 3.0 +Xposed)
3.木樁實戰練習
4.木樁f進階(小白的自我進步)
0×01 一個新的武器(Xposed框架)的使用
小白,認真學習哦,我們先來試試我們的新武器。Xposed,以後江湖闖蕩也有一個防身的技巧。
小白你等等,我去找找這個武器我放在哪了。所謂工欲善其事必先利其器。
好了,師傅你快去,別啰嗦了。
1. 武器 get
小白,要想使用這個武器,就要先打通經脈。
1.1 經脈(環境)
1.Root,手機root,無root不安卓。打通root經脈我們才能進行之後的操作。
2.Xposed框架安裝,想要使用Xposed這個武器,就要先能拿的起來才能談使用。
1.2武器
xposedBridgeApi-82.jar.jar。
這個就是我們的武器了,小白,來,我給你演示演示這個武器的基本使用方法。
2.武器演示
我們這裏使用Xposed武器攔截packageName,然後進行輸出。
其實這個武器還是搭配內功才能發揮最大的能力。
搭配內功,師傅,這個怎麽搞。
莫急莫急,我們一步一步來。
0×02 練習使用Hook的第一重內功(Android Studio 3.0 +Xposed)
小白,我先傳授你第一重內功的運行穴位。要好好聽哦。
Android Studio 3.0 基本配置
我們先來給內容運行提供一個環境。
(1)首先構建一個不需要Activity的項目
(2)然後導入jar包。並且右鍵add as Library。
(3)填寫Androidmanifest.xml文件。
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="Hook log test" />
<meta-data
android:name="xposedminversion"
android:value="53" />
(4) 修改依賴方式
Xposed裏已有該jar包內容,再次打包進去會沖突。
(5)基本Xposed模型創建
使用alt+enter實現一個方法。
小白,聽我啰嗦兩句。
handleLoadPackage,這個方法用於在加載應用程序的包的時候執行用戶的操作。
LoadPackageParam loadPackageParam:,這個參數包含了加載的應用程序的一些基本信息。
內功實現
這裏一句話就可以實現。
XposedBridge.log(“HAI_app: ” + loadPackageParam.packageName);
這裏我們要進行思考了,什麽是 XposedBridge.log了。
posedBridge.log的打印會輸出到xposed框架的啟動程序的日誌功能中。這樣也更方便我們的查看。
我們來做配置的最後一步。設置開始地方。
新建assets目錄裏,新建一個file。file名稱為xposed_init。
寫入包名+類。
測試成果
Build APK
安裝進行測試。
手機安裝然後重新啟動即可。
思考
所謂師傅領進門,修行看個人。所以啊。
我知道了師傅,我們是不是可以通過這個簡單的來進行過濾啊。比如寫一個簡單的分析系統。或者是其他的東西,我們還可以對這個進行過濾。我先自己去試試。
小白的自我修行
通過這個運行路徑,對報名進行分析和過濾。
進行簡單的嘗試。
使用昨天學的java字符串的substring來進行對字符串過濾。
然後進行測試。
當然也可以針對這個進行更加詳細的說明。
0×03木樁實戰練習
小白,來來,師傅這裏給你找了一個木樁,我打給你看看。這個hook是怎麽法功的,怎麽打的。要學好哦。
知道了師傅。
木樁信息收集
1.基本信息
小白啊,用我們之前使用過的一個武器,來收集這些基本信息吧。
師傅,我們一般都收集什麽信息啊。
恩,我們一般要收集
1.木樁的包名
2.木樁的簡單的邏輯
….
小白,這個你就自己收集把。
小白的操作
首先是包名。使用武器,apkhelper。
獲取到包名信息。com.example.login
然後是簡單的邏輯手機。
2.反編譯信息收集
小白啊,收集玩了嗎?
收集完了師傅。
好,我們接下來收集反編譯信息。知己知彼,方能百戰不殆。
師傅的操作
首先我們來看看我們要收集的東西。
1.關鍵的類名。
2.關鍵的函數位置。
來用Android Killer武器反編譯木樁。
定位。
查看類名,進行記錄。
小白,看清楚,是這個樣子進行記錄。
原來是這樣。com/example/login/MainActivity;
但是我們要改成這樣的。com.example.login.MainActivity
現在就需要定位到關鍵函數了。
這個login就是我們要Hook住的函數啦。
Ljava/lang/String;Ljava/lang/String;從這裏我們可以看到是兩個輸入內容。並且類型是String。我們現在要做的就是要hook住這個輸出,然後對其進行輸出。
木樁實戰練習
環境搭建
好了,小白,前期資料收集的差不多了。我現在要發功了,要看清楚我的使用哦。
先把環境調整好。
然後先做一個簡單的過濾。
這個時候,收集的包名就排上用場了。
因為是hook的是方法,所以我們這裏使用一個方法。
第一個參數,要hook的包名+方法名,這個也是我們收集好的。
第二個參數不動
第三個參數方法名
第四個參數 輸入的參數
我們有兩個String類型的參數,所以才這樣寫
最後一個參數,就是做一個監聽。可以監聽這個方法的使用前和使用後。
f for木樁
小白,一切準備你就須,看為師給你f這個木樁。
小白,你看這第一招
XposedBridge.log("ZHUZHU520:LoginName:"+param.args[0]);
這一招搞它的第一個輸入。
然後再來看這一招
XposedBridge.log("ZHUZHU520 assward:"+param.args[1]);
這一招搞它的第二個輸入。
然後最後一招。
XposedBridge.log("ZHUZHU520:end???:"+param.getResult());
這一招就是攔截返回值。
小白啊,這裏有一個需要思考的內容。
這樣hook的意義或者作用是什麽?
小白的思考
師傅,我覺得首先,這樣可以攔截下輸入的參數,還有返回的值。如果在hook裏做一個轉發信息的技能。那不就可以成功的對登錄賬戶的人進行賬號和密碼的獲取。
這不就是和釣魚一樣了嘛。
我覺得這是一個很大的漏洞,如果登錄廠商沒有做相應的處理,那這裏我可以拿這個搞死他。
好了,小白,你說的很對,我們現在來對這個進行下測試吧。
f 木樁測試
小白啊,你看這裏我們就成功的攔截內容了。小白給你一個任務,用hook f掉這個木樁,我希望他能登錄成功,哪怕我輸入的對的。
0×04 木樁f進階(小白的自我進步)
XposedBridge.log("ZHUZHU520:end???:"+param.getResult());
思考一
師傅之前使用了一個param.getResult()獲取了返回值,那我是不是可以使用相同的set方法,重新對這個進行賦值啊。
根據各種方式,我們知道了這裏的返回值就是Z,也就是布爾型。
說幹就幹,爭取f掉木樁。
進行測試。
成功hook。
思考二
除了可以hook返回值,還可以hook輸入值。
但是這樣有點畫蛇添足的感覺。
0×05 結束語
小白啊,hook就學到這裏吧。有時間我們繼續學習hook 技能。回去多練練。
Android逆向進階(7)——揭開Hook的神秘面紗