- 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ù)使用時可能會出現(xiàn)問題
將busybox安裝到
system/xbin
目錄下
首先要看system當前掛載信息
輸入adb shell
秸歧,然后輸入mount
可以看到信息,如下圖
mount
然后將system修改為可讀寫
remount
接著將busybox移動到xbin目錄衅澈,然后運行上述安裝命令即可键菱。
1.2 so庫編譯
1.2.1 在使用時,需要根據(jù)自己的需要對arthook_demo.h
文件和arthook_demo.c
文件進行修改今布。原始的文件內(nèi)容如下所示
arthook_demo.h
arthook_demo.c
在
arthook_demo.h
文件中经备,主要需要根據(jù)需要修改MYHOOKCLASS
的值拭抬,MYHOOKCLASS變量記錄的是1.2.3 使用ndk編譯。
打開終端侵蒙,在
ARTDroid/examples/arthook_demo/jni
目錄下造虎,運行ndk_buildARTDroid 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í)行犁功,沒有則結(jié)束并提醒用戶將其添加到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 文件首先檢查了依賴娜睛,主要是確定手機上已經(jīng)將busybox安裝到/system/xbin
目錄下髓霞。
3.4.2 判斷參數(shù)卦睹,如果參數(shù)為空則提示用戶,打印help信息方库。
3.4.3 如果參數(shù)是-t分预,則打印相關(guān)信息,并執(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 在使用之前,首先需要關(guān)閉SELinux被济,關(guān)閉命令是setenforce 0
救赐。
4.1 運行srcipts/install.sh
install.sh會調(diào)用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文件時,會提示用戶輸入相應的參數(shù)刊棕,如下圖所示炭晒。
可以看到有兩種方式,一個是添加-s+包名甥角,另一個是-t+pid网严。我這里用的是-t+pid。首先確定下opt所屬的USER名字嗤无,如下圖震束,為u0_a64
然后用ps命令,可以看到u0_a64對應的pid為1038
重新運行runhijack.sh文件翁巍,添加參數(shù)驴一,如下圖所示
接著在app上點擊,可以看到已經(jīng)hook成功灶壶。
對應的日志記錄如下
在運行install.sh文件時肝断,可能會提示缺少一些so文件后者a文件,主要是因為adbi目錄下的內(nèi)容沒有被編譯,使用ndk-build自己進行編譯之后重新運行install.sh即可
PTRACE_GETREGS ptrace(PTRACE_GETREGS,pid,0,data) 讀取寄存器的值胸懈,pid表示被跟蹤的子進程担扑,data為用戶變量地址,用于返回讀到的數(shù)據(jù)趣钱。這個指令會讀取17個基本寄存器的值
PTRACE_ATTACH ptrace(PTRACE_ATTACH,pid) 跟蹤指定的pid進程涌献。被跟蹤進程將成為當前進程的子進程并進入中止狀態(tài)