Android10安全改進,Android安全:Hook技術

 2023-11-30 阅读 28 评论 0

摘要:原址 一、Hook技術?1.Hook英文翻譯為“鉤子”,而鉤子就是在事件傳送到終點前截獲并監控事件的傳輸,像個鉤子鉤上事件一樣,并且能夠在鉤上事件時,處理一些自己特定的事件;?2.Hook使它能夠將自己的代碼“融入”被勾住(Hook)的

原址

一、Hook技術?
1.Hook英文翻譯為“鉤子”,而鉤子就是在事件傳送到終點前截獲并監控事件的傳輸,像個鉤子鉤上事件一樣,并且能夠在鉤上事件時,處理一些自己特定的事件;?
2.Hook使它能夠將自己的代碼“融入”被勾住(Hook)的進程中,成為目標進程的一部分;?
3.在Andorid沙箱機制下,Hook是我們能通過一個程序改變其他程序某些行為得以實現;?
二、Hook分類?
1.根據Android開發模式,Native模式(C/C++)和Java模式(Java)區分,在Android平臺上?
? Java層級的Hook;?
? Native層級的Hook;?
2.根Hook對象與Hook后處理事件方式不同,Hook還分為:?
? 消息Hook;?
? API Hook;?
3.針對Hook的不同進程上來說,還可以分為:?
? 全局Hook;?
? 單個進程Hook;?
三、Hook原理?
Hook技術本質是函數調用,由于處于Linux用戶狀態,每個進程有自己獨立的進程控件,所以必須先注入所要Hook的進程空間,修改其內存中進程代碼,替換過程表的符號地址,通過ptrace函數附加進程,向遠程進程注入so庫,從而達到監控以及遠程進程關鍵函數掛鉤;?
四、Hook工作流程?
1.Android相關內核函數:?
? ptrace函數:跟蹤一個目標進程,結束跟蹤一個目標進程,獲取內存字節,像內存寫入地址;?
? dlopen函數:以指定模式打開指定的動態鏈接庫文件;?
? mmap函數:分配一段臨時的內存來完成代碼的存放;?
2.向目標進程注入代碼總結后的步驟分為以下幾步:?
? 用ptrace函數attch上目標進程;?
? 發現裝載共享庫so函數;?
? 裝載指定的.so;?
? 讓目標進程的執行流程跳轉到注入的代碼執行;?
? 使用ptrace函數的detach釋放目標集成;?
五、常用Hook工具-Xposed框架?
1.Xposed框架是一款可以在不修改APK的情況下影響程序運行(修改系統)的框架服務;?
2.通過替換/system/bin/app_process程序控制zygote進程,使app_process在啟動過程中加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的Dalvik虛擬機的劫持;?
六、Xposed框架安裝?
1.從官方網站(http://repo.xposed.info/module/de.robv.android.xposed.installer),下載de.robv.android.xposed.installer_v33_36570c.apk,安裝本地服務XposedInstaller;?
2.安裝進入到XposedInstaller應用程序,“框架”模塊出現“未激活”提示;?

3.點擊“框架”,進入到需要激活框架的界面,我們點擊“安裝/更新”就能完成框架的激活了,因為安裝時會需要Root權限(下載相關工具如“Root精靈”),安裝后會啟動Xposed的app_process,所以安裝過程會存在設備多次重啟(安裝過程如下圖);?
正在安裝(下載):?

獲取Root權限(授權Root權限提示,并確定):?

安裝完成(安裝完成提示重啟):?

安裝成功(框架模塊激活提示消失,即安裝成功):?

七、Xposed框架模塊安裝?
1.Xposed框架內置了下載功能,我們只需要在下載模塊點擊之后,進行瀏覽、下載、搜索即可;?

2.默認按照時間排序,你可以點擊放大鏡圖標,進行搜索如(XuiMod,一款專門用于狀態欄和置頂電池模塊);?
搜索XuiMod模塊:?

3.點擊搜索到的模塊,可以查看到該模塊的描述信息,版本信息。在版本信息模塊下進行模塊的下載安裝;?
XuiMod描述信息:?

XuiMod版本信息,點擊下載相關模塊:?

下載完成,點擊“安裝”進行安裝:?

安裝完成后,進入“模塊”,激活下載安裝的模塊,重啟生效:?

重啟后,長按XuiMod進入到模塊運行界面,進行相關的操作,重啟生效(如下圖,手機頂部打開電源充電,居中,充電動畫功能):?

八、Xposed自定義模塊開發?
上個段落,我們講解下如何下載、安裝和使用Xposed模塊。那么我們如何根據自己的需求,自己開發一個Xposed模塊,下面我們就介紹下相關流程:?
1.下載XposedBridgeApi-<version>.jar(http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067)文件,用戶提供Hook相關的API,如下:?

  1. /**
  2. *包裝加載時的回調
  3. */
  4. public void handleLoadPackage(final LoadPackageParam lpparam)
  5. /**
  6. *Xposed提供的Hook方法
  7. *@param className 待Hook的Class
  8. *@param classLoader ClassLoader
  9. *@param methodName 待Hook的Method
  10. *@param paramterTypesAndClassback hook回調
  11. */
  12. Unhook findAndHookMethod(String className,ClassLoader classLoader,String methodName,Object... parameterTypesAndCallback)
2.創建一個Android Project HookDemo,在項目app目錄下創建lib目錄(如果將jar包放置到libs目錄下,可能會產生錯誤,估計Xposed作者在其框架內部也引用了BrideApi,這樣操作能避免重復),將jar包放置到lib目錄(不是項目本身的libs目錄)下,選擇jar包->右鍵->Add As Library將這個jar包添加到BuildPATH;?

3.創建一個InputDemo項目(該項目使用輸入框提示用戶輸入信息,點擊按鈕獲取用戶的信息并做相關的邏輯),用于模擬Hook目標,通過Xposed獲取用戶輸入信息(關鍵代碼和運行如下);?

  1. OK.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. String inPut = Input.getText() + "";
  5. //獲取用戶輸入,并驗證是否輸入正確
  6. if (isInputOK(inPut)) {
  7. Toast.makeText(MainActivity.this, "Input Success", Toast.LENGTH_SHORT).show();
  8. } else {
  9. Toast.makeText(MainActivity.this, "Input Faild", Toast.LENGTH_SHORT).show();
  10. }
  11. }
  12. });
  13. … …
  14. private boolean isInputOK(String inPut) {
  15. if ("123456".equals(inPut)) {
  16. return true;
  17. } else {
  18. return false;
  19. }
  20. }
4.在HookDemo項目中,修改AndroidManifest.xml文件中配置插件的名稱和Api版本號;?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.pengchengxiang.hookdemo">
  4. <application>
  5. … …
  6. <meta-data
  7. android:name="xposedmodule"
  8. android:value="true" />
  9. <!--模塊描述-->
  10. <meta-data
  11. android:name="xposeddescription"
  12. android:value="a hook demo" />
  13. <!--模塊版本-->
  14. <meta-data
  15. android:name="xposedminversion"
  16. android:value="30" />
  17. </application>
  18. </manifest>
5.創建一個入口類繼承并實現IXposedHookLoadPackage接口,使用findAndHookMethod方法Hook輸入信息; ?
  1. public class Main implements IXposedHookLoadPackage {
  2. @Override
  3. public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
  4. if (!loadPackageParam.packageName.equals("com.example.pengchengxiang.inputdemo")) {
  5. return;
  6. }
  7. XposedBridge.log("Loaded app:" + loadPackageParam.packageName);
  8. //Hook MainActivity類的isInputOK方法,并將該方法的參數輸出至Xposed工具中
  9. findAndHookMethod("com.example.pengchengxiang.inputdemo.MainActivity", loadPackageParam.classLoader, "isInputOK", String.class, new XC_MethodHook() {
  10. @Override
  11. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  12. XposedBridge.log("hook start");
  13. XposedBridge.log("param1:" + param.args[0]);
  14. }
  15. @Override
  16. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  17. XposedBridge.log("hook end");
  18. XposedBridge.log("param1:" + param.args[0]);
  19. }
  20. });
  21. }
  22. }

注意:在實際應用過程中,你Hook的方法參數可能是目標程序自定義的類,非Android SDK提供,如"com.example.pengchengxiang.inputdemo.Test"。這里我們可以使用方法XposedHelpers.findClass來獲取參數類型的class對象,如下:

  1. XposedHelpers.findAndHookMethod("com.example.pengchengxiang.inputdemo.MainActivity", loadPackageParam.classLoader, "isInputOK", String.class,
  2. XposedHelpers.findClass("com.example.pengchengxiang.inputdemo.Test", loadPackageParam.classLoader), new XC_MethodHook() {...}
6.聲明主入口路徑,在assets文件夾中創建xposed_init文件,并在其中聲明主入口類;?

com.example.pengchengxiang.hookdemo.Main
7.完成InputDemo和HookDemo并安裝在手機中,在XposedInstaller中啟動我們的自己開發的模塊;?

8.重新啟動手機,在XposedInstaller中日志模塊,查看在InputDemo中使用XposedBridge.log輸出的日志;?


提示1:查看日志模塊,如果報錯如下圖:?

處理1:第一,檢查XposedBridgeApi-54.jar是否防在新建的lib目錄下;第二,估計Xposed作者在其框架內部也使用了BridgeApi,使用Provided依賴避免重復引用;?


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/185613.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息