android hook 框架 libinject2 簡介、編譯、運行


 

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 工具去執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM