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 简介、编译、运行的更多相关文章

  1. android hook 框架 libinject2 如何实现so注入

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  2. android hook 框架 ADBI 简介、编译、运行

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  3. android hook 框架 libinject 如何实现so注入

    前面两篇 android hook 框架 libinject2 简介.编译.运行 android hook 框架 libinject2 如何实现so注入 实际运行并分析了 Android中的so注入( ...

  4. Android Hook框架adbi的分析(1)---注入工具hijack

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/74055505 一.Android Hook框架adbi的基本介绍 adbi是And ...

  5. android hook 框架 ADBI 如何实现dalvik函数挂钩

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  6. Android Hook框架adbi的分析(3)---编译和inline Hook实践

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75200800 一.序言 在前面的博客中,已经分析过了Android Hook框架a ...

  7. android hook 框架 xposed 如何实现挂钩

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  8. android hook 框架 ADBI 如何实现so注入

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  9. android hook 框架 xposed 如何实现注入

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

随机推荐

  1. [Uva11178]Morley's Theorem(计算几何)

    Description 题目链接 Solution 计算几何入门题 只要求出三角形DEF的一个点就能推出其他两个点 把一条边往内旋转a/3度得到一条射线,再做一条交点就是了 Code #include ...

  2. 笔记-redis深入学习-1

    笔记-redis深入学习-1 redis的基本使用已经会了,但存储和读取只是数据库系统最基础的功能: 数据库系统还得为可靠实现这两者提供一系列保证: 数据.操作备份和恢复,主要是持久化: 高可用:主要 ...

  3. Ubuntu下配置LAMP + PhpStorm

    本文仅作为一个记录,以下配置在Ubuntu 14.10 64-bit上验证通过. 安装Apache 2:sudo apt-get install apache2 安装成功能够后,通过浏览器访问loca ...

  4. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

  5. 110Balanced Binary Tree

    问题:判断二叉树是否为平衡二叉树分析:树上的任意结点的左右子树高度差不超过1,则为平衡二叉树.         搜索递归,记录i结点的左子树高度h1和右子树高度h2,则i结点的高度为max(h1,h2 ...

  6. MySQL之查询性能优化(四)

    优化特定类型的查询 COUNT()的作用 COUNT()是一个特殊函数,有两个非常不同的作用:它可以统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL). 如果在COUN ...

  7. Java-多线程与单例

    最近在公司写需求时遇到了多线程与单例一同出现的情况. 这个时候想到的就是线程安全以及单例的定义了,虽然单例指的是在内存中它只有一份,但是并不是说就是线程安全的. 所以,我当时就到网上找了关于多线程下单 ...

  8. Java中的垃圾回收机制&内存管理&内存泄漏

    1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...

  9. 《Cracking the Coding Interview》——第17章:普通题——题目3

    2014-04-28 22:18 题目:计算N的阶乘尾巴上有多少个零? 解法:计算5的个数即可,因为2 * 5 = 10,2的个数肯定比5多.计算5的个数可以在对数时间内搞定. 代码: // 17.3 ...

  10. android 继承ListView实现滑动删除功能.

    在一些用户体验较好的应用上,可以经常遇见   在ListView中  向左或向右滑动便可删除那一项列表. 具体实现  则是继承ListView实现特定功能即可. (1). 新建 delete_butt ...