Android so注入-libinject2 簡介、編譯、運行
Android so注入-libinject2 如何實現so注入
Android so注入-Libinject 如何實現so注入
Android so注入掛鈎-Adbi 框架簡介、編譯、運行
Android so注入掛鈎-Adbi 框架如何實現so注入
Android so注入掛鈎-Adbi 框架如何實現so函數掛鈎
Android so注入掛鈎-Adbi 框架如何實現dalvik函數掛鈎
Android dalvik掛鈎-Xposed框架如何實現注入
Android dalvik掛鈎-Xposed框架如何實現掛鈎
簡介:
libinject 最開始是2011年看雪android安全版版主之一‘古河’大神發布的一份android平台的注入庫: 發個Android平台上的注入代碼 ,網上很多隨后發布的注入代碼都是其變種,不過我這幾天嘗試運行那份代碼,發現有些問題,本博運行和分析的代碼是另外一位大神的改進版本,在我的環境里運行注入和掛鈎都成功了 : Android中的so注入(inject)和掛鈎(hook) - For both x86 and arm ,為了表示區別,我把這份代碼稱為 libinject2 。
編譯運行:
1. 在android studio里新建一個module(其實也可以隨便把代碼放在某個目錄下,直接用ndk-build編譯的,我這里放在android studio里主要為了方便編輯代碼),目錄如下
非常簡單,就2個文件,一個inject.c存放源碼,jni目錄下 Android.mk 存放編譯腳本,原文作者同時支持了i386和arm,我在測試的時候,把i386的代碼去掉了(將原鏈接的inject.c代碼拷貝下面,把 i386 宏包圍的代碼都去掉,並且去掉了 Application.mk 文件)
2. Android.mk 內容如下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := inject LOCAL_SRC_FILES := ../inject.c LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog include $(BUILD_EXECUTABLE)
對於Android.mk文件的格式,可以參考 這里
3. 在 win7 下下載一個ndk包,設置目錄到PATH環境變量,cmd進入終端,cd進入上述jni目錄,執行 ndk-build , 正常情況下,會在 libs/armeabi/ 下生成 inject 可執行程序
4. 在android studio 里再新建一個module,用於編譯測試用的動態庫
其中,hello.c 內容如下:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <android/log.h> #include <elf.h> #include <fcntl.h> #define LOG_TAG "DEBUG" #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args) int hook_entry(char * a){ LOGD("Hook success, pid = %d\n", getpid()); LOGD("Hello %s\n", a); return 0; }
提供了一個入口函數hook_entry,里邊調用android的日志函數,最后的日志會在 logcat 里出現,通過 adb logcat 命令可以查看
Android.mk 內容如下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog #增加了對android log 庫的鏈接 LOCAL_MODULE := hello LOCAL_SRC_FILES := ../hello.c include $(BUILD_SHARED_LIBRARY) #指定編譯為動態庫
同樣,使用 ndk-build 編譯后,libs/armeabi/ 下出現 libhello.so
5. 啟動模擬器,推送 libhello.so 和 inject 到虛擬機里
我啟動的模擬器配置如下
Name: android-helloworld CPU/ABI: ARM (armeabi-v7a) Path: C:\Users\Administrator\.android\avd\android-helloworld.avd Target: Android 4.4.2 (API level 19) Skin: HVGA hw.dPad: no hw.accelerometer: yes hw.device.name: Nexus 7 vm.heapSize: 32 skin.dynamic: no hw.device.manufacturer: Google hw.gps: yes hw.audioInput: yes hw.cpu.model: cortex-a8 tag.id: default hw.mainKeys: no hw.camera.front: none hw.lcd.density: 213 hw.device.hash2: MD5:d3c9ed02af441ec949711439b9a48b85 hw.ramSize: 1024 hw.trackBall: no hw.battery: yes hw.sdCard: no tag.display: Default hw.keyboard: yes hw.sensors.proximity: no disk.dataPartition.size: 200M hw.sensors.orientation: yes avd.ini.encoding: ISO-8859-1
使用adb push命令推送
6. adb shell 進入模擬器運行
先將動態庫和可執行程序設置權限777,在另一個終端啟動測試進程 target, 然后用 inject 注入該進程, 第三個終端用 adb logcat 查看日志,如下
打印出來 Hello I'm parameter! 證明 hook_entry 函數執行成功了。至此,說明這份inject代碼是可以實現注入的, 這篇博客 Android中的so注入(inject)和掛鈎(hook) - For both x86 and arm 實現注入之后掛鈎的是函數。這里不打算跟他一樣,參考之前的一篇博文:
android hook 框架 ADBI 簡介、編譯、運行 , 里邊掛鈎的是目標進程的 libc.so里的epoll_wait函數,這里使用同樣一套掛鈎代碼來測試一下:
首先,adb傳輸需要的文件到模擬器:
adb push libexample.so /data/local/tmp/ adb push inject /data/local/tmp adb push target /data/local/tmp adb push testclient /data/local/tmp
主要是注入工具由 hijack 改成 inject , 其他的不變,運行如下:
其中,inject 的注入接口與 hijack 有些不一樣,hijack 不需要指定注入so之后運行的初始化函數,inject 需要執行,其命令為:./inject -p 1556 -l /data/local/tmp/libexample.so -f my_init , 在 編譯libexample.so時將 void __attribute__ ((constructor)) my_init(void); 這一行注釋掉,這樣注入之后不會自動執行,而由inject 工具去執行