- 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文件夾。
- libarthook思路
2.1 FindClass
2.2 GetMethodID
2.3 獲取虛表的偏移地址
2.4 獲取虛表的長度
2.5 在虛表中尋找MethodID
2.6 修改找到的方法的指針,指向patch method - 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方法為入口。 - 使用
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)









