1. 程式人生 > >android hook方法收集及選擇優化

android hook方法收集及選擇優化

android有些東西需要收集下應用app的執行情況,比如網路請求等;這些工作在底層執行比較好,這樣java層不需要動;根據這些需要收集了下當前網路上已有的方法:


1.android hook 框架 ADBI ,需要ptrace ,root許可權執行;
2.android hook 框架 libinject2 ,需要ptrace ,root許可權執行;
3.Android dalvik掛鉤-Xposed框架如何實現注入,xposed 替換的就是這個  /system/bin/app_process ,需要root許可權;

4.CydiaHook,需要root&安裝Cydia Substrate.apk。

以上這些都需要root來執行;

下面收集的是不需要root許可權:

1.基於segment的elf hook ,例子如下:

http://blog.csdn.net/L173864930/article/details/40507359

2.對1進行優化的

https://github.com/asLody/ElfHook。

通過以上比較,因為是我們需要分析自己的app,不需要收集別人應用以致系統的,因此可以選擇不需要root的2進行;

對ElfHook進行分析,發現還有些問題:

1.hook so的問題,因為有些機子的so,如htc機子的so大部分的許可權為p即私有;因此需要去掉只有s即分享才hook的判斷;

2.解析載入程序的裝置版本有點問題;原來寫死了大小版本都是兩位,而實際上有可能存在3位的版本號,如htc,因此這塊的分析裝置版本的根據符號“:”分割即可;

3.arm64-v8a編譯會有些符號沒有定義,找下bionic/libc/include/elf.h,把缺失不全基本上能正常編譯,同時注意編譯ndk的版本;

4.通過分析,java層的api呼叫後,相關底層的基本上是通過libjavacore.so來做jni呼叫,因此大部分的需要hook的方法可以到這so去查詢;

5.對於某些機子如聯想的個別,用android_getaddrinfofornet替換了getaddrinfo呼叫,但是他們的android_getaddrinfofornet的引數又跟標準的不一致,因此在hook真正呼叫到android_getaddrinfofornet就會崩潰了;查詢libjavacore.so後,

其實可以通過hook另外一個方法freeaddrinfo 來獲取解析後的ip,getaddrinfo和freeaddrinfo 通過列印log來看下是配對使用的,因此用這個來hook拿到java的網路呼叫的ip;

6.最後補充,這個demon其實真正修改的本so引用外部實現的函式,程式碼修改的是rel.plt及rel.dyn跳轉地址;即,列舉修改所有本應用所有載入的so多呼叫的外部特定函式,因此注意這個玩意是修改外部引用的函式而不是實現的這個函式的地方地址。