ARTDroid使用說明

  1. busybox安裝
    1.0 BusyBox說明
    Busy是一個集成了部分linux命令和工具的軟件。BusyBox開發(fā)的目的是可以在android系統(tǒng)上繼續(xù)使用linux中的命令,如grep,find等。
    1.1 BusyBox下載與安裝
    BusyBox下載地址:https://busybox.net/downloads/binaries/
    下載完成之后,將文件重命名為busybox,然后使用push命令,將busybox推到手機,然后使用adb shell進入手機,在busybox文件所在目錄運行./busybox --install ./,這個會將busybox安裝到當前目錄。
    一定要將busybox安裝到system/xbin目錄下,要不然后續(xù)使用時可能會出現問題

將busybox安裝到system/xbin目錄下
首先要看system當前掛載信息
輸入adb shell,然后輸入mount可以看到信息,如下圖

mount

然后將system修改為可讀寫
remount

接著將busybox移動到xbin目錄,然后運行上述安裝命令即可。

1.2 so庫編譯
1.2.1 在使用時,需要根據自己的需要對arthook_demo.h文件和arthook_demo.c文件進行修改。原始的文件內容如下所示

arthook_demo.h

arthook_demo.c

arthook_demo.h文件中,主要需要根據需要修改MYHOOKCLASS的值,MYHOOKCLASS變量記錄的是
1.2.3 使用ndk編譯。
打開終端,在ARTDroid/examples/arthook_demo/jni目錄下,運行ndk_build
ARTDroid so庫編譯

編譯完成之后,生成的so庫所在的目錄是ARTDroid/examples/arthook_demo/libs文件夾。

  1. libarthook思路
    2.1 FindClass
    2.2 GetMethodID
    2.3 獲取虛表的偏移地址
    2.4 獲取虛表的長度
    2.5 在虛表中尋找MethodID
    2.6 修改找到的方法的指針,指向patch method
  2. sh文件分析
    3.1 install.sh
    3.1.1 check_dependencies
    在環(huán)境變量PATH中查看是否有SDK路徑和NDK路徑,有則繼續(xù)執(zhí)行,沒有則結束并提醒用戶將其添加到PATH中。
    3.1.2 check_first_run
    判斷是否是第一次運行demo,判斷的方法是判斷判斷是否存在DIR/.first_run.no文件,如果存在,則說明不是第一次運行,如果不存在則是第一次運行,此時創(chuàng)建DIR/.first_run.no,并將IS_FIRST_RUN的值改為true
    3.1.3 compile_all
    進入到DIR目錄,然后判斷IS_FIRST_RUN是否為true,為true則繼續(xù)。進入DIR/adbi文件夾,運行clean.sh和build.sh。然后在DIR文件夾下,運行clean.sh和build.sh。
    3.1.4 push_to_device
    使用adb push,將libarthookdemo.so和hijack移動到手機的/data/local/tmp文件夾下。
    3.2 adbi/build.sh
    進入到adbi/hijack/jni目錄,運行ndk-build命令生成hijack,然后進入到adbi/instruments/base/jni目錄,運行ndk-build命令生成base.a文件,進入到adbi/instruments/example/jni目錄,運行ndk-build生成libexample.so文件。
    3.3 DIR/build.sh
    進入到arthook/core/jni目錄下,然后在終端運行ndk-build命令,將jni目錄編譯得到libarthook.so文件,然后進入到examples/arthook_demo/jni目錄下,運行ndk-build命令,得到libarthookdemo.so
    3.4 runhijack.sh
    runhijack.sh完成的動作是導入libarthookdemo.so和hijack.bin文件。
    3.4.1 文件首先檢查了依賴,主要是確定手機上已經將busybox安裝到/system/xbin目錄下。
    3.4.2 判斷參數,如果參數為空則提示用戶,打印help信息。
    3.4.3 如果參數是-t,則打印相關信息,并執(zhí)行/data/local/tmp/hijack -p pid -l /data/local/tmp/libarthookdemo.so -d -D 2
    3.5 hijack.c
    在3.4中可知,runhijack.sh最終會運行hijack.bin。而這個文件是有hijack.c編譯得到的,所以這里繼續(xù)分析hijack.c文件,以main方法為入口。
  3. 使用
    4.0 在使用之前,首先需要關閉SELinux,關閉命令是setenforce 0。
    4.1 運行srcipts/install.sh
    install.sh會調用ndk編譯需要的文件。具體的代碼分析在第三部分有說明。
    4.2 push文件到手機
    將編譯好的文件傳到手機,這些文件包括/examples/classes.dex,/adbi/hijack/libs/armeabi/hijack,scripts/device/init.sh,scripts/device/runhijack.sh,examples/arthook_demo/libs/armeabi/libarthookdemo.so.上傳完成之后,data/local/tmp目錄下的文件應該是這樣的

    4.3 修改dex/opt的所有者。
    首先用ps命令查看我們要測試的apk的USER,如下圖中,我要測試的apk對應的USER是u0_a54,然后使用chown命令,將dex/opt的所有者改為u0_a54.具體的命令是chown u0_a54:u0_a54 dex/opt

    4.4 運行runhijack.sh文件。
    運行runhijack.sh文件時,會提示用戶輸入相應的參數,如下圖所示。

    可以看到有兩種方式,一個是添加-s+包名,另一個是-t+pid。我這里用的是-t+pid。首先確定下opt所屬的USER名字,如下圖,為u0_a64

    然后用ps命令,可以看到u0_a64對應的pid為1038

    重新運行runhijack.sh文件,添加參數,如下圖所示

    接著在app上點擊,可以看到已經hook成功。

    對應的日志記錄如下

在運行install.sh文件時,可能會提示缺少一些so文件后者a文件,主要是因為adbi目錄下的內容沒有被編譯,使用ndk-build自己進行編譯之后重新運行install.sh即可
PTRACE_GETREGS ptrace(PTRACE_GETREGS,pid,0,data) 讀取寄存器的值,pid表示被跟蹤的子進程,data為用戶變量地址,用于返回讀到的數據。這個指令會讀取17個基本寄存器的值
PTRACE_ATTACH ptrace(PTRACE_ATTACH,pid) 跟蹤指定的pid進程。被跟蹤進程將成為當前進程的子進程并進入中止狀態(tài)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容