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 ;
}
提供了一个入口函数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. (API level ) Skin: HVGA hw.dPad: no hw.accelerometer: yes hw.device.name: Nexus vm.heapSize: 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: hw.device.hash2: MD5:d3c9ed02af441ec949711439b9a48b85 hw.ramSize: 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--
使用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 工具去执行
android hook 框架 libinject2 简介、编译、运行的更多相关文章
- android hook 框架 libinject2 如何实现so注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 ADBI 简介、编译、运行
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 libinject 如何实现so注入
前面两篇 android hook 框架 libinject2 简介.编译.运行 android hook 框架 libinject2 如何实现so注入 实际运行并分析了 Android中的so注入( ...
- Android Hook框架adbi的分析(1)---注入工具hijack
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/74055505 一.Android Hook框架adbi的基本介绍 adbi是And ...
- android hook 框架 ADBI 如何实现dalvik函数挂钩
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- Android Hook框架adbi的分析(3)---编译和inline Hook实践
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75200800 一.序言 在前面的博客中,已经分析过了Android Hook框架a ...
- android hook 框架 xposed 如何实现挂钩
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 ADBI 如何实现so注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 xposed 如何实现注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
随机推荐
- C语言进阶—— 接续符和转义符13
接续符的意义: C语言中的接续符 (\) 是指示编译器行为的利器 我们来看一个案例: #in\ clud\ e <st\ dio.h> in\ t m\ ain(\ ) { pri\ nt ...
- Python 装饰器执行顺序迷思
Table of Contents 1. 探究多个装饰器执行顺序 1.1. 疑问 1.2. 函数和函数调用的区别 1.3. 装饰器函数在被装饰函数定义好后立即执行 1.4. 疑问的解释 2. 参考资料 ...
- 1,版本控制git--仓库管理
再开始这个话题之前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3.d ...
- android MotionEvent
getAction() 获取事件的类型,这是一个组合值,由pointer的index值和事件类型值组合而成的 getActionMasked() 获取事件的类型,不具有其他信息 参考: http:// ...
- Result Maps collection does not contain value for xxxx
这是mybatis查询返回值的错误,我在做一个查询数值的方法,但是我是这样写的: <select id="findSize" resultMap="long&quo ...
- Internet接入方式
(转载) 接入网可以大概分成两类:拨号上网(包括ASDL)与专线上网 在接入网中,目前可供选择的接入方式主要有PSTN.ISDN.DDN.LAN.ADSL.VDSL.Cable-Modem.PON和L ...
- python consumer producer
from threading import Thread, Lock import time import random queue = [] lock = Lock() class Producer ...
- 如何在Apache中使用PHP处理PHP文件
一.将PHP预处理器作为Apache的模块(插件) Apache软件自身的功能都是基于模块化管理的. 将PHP预处理器作为Apache的一个模块即可. 在apache/conf/httpd.conf的 ...
- 剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)
剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)2013-11-23 16:25 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后, ...
- DOS程序员手册(八)
备,就可以从程序中访问驱动程序.可以用句柄功能调用来 打开设备(见列表12.9) 列表12.9 /*example.C List ...