zoukankan      html  css  js  c++  java
  • 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
    ", getpid());
        LOGD("Hello %s
    ", 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:UsersAdministrator.androidavdandroid-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 工具去执行

  • 相关阅读:
    C++ 重载操作符- 01 简单的入门
    C++ 析构函数
    Auto Control 001 自动控制的一般概念
    C++ 友元
    安装 SQL Server 2014 Express
    关闭是否只查看安全传送的网页内容提示框 和 是否允许运行软件,如ActiveX控件和插件提示框
    Python 网络爬虫 010 (高级功能) 解析 robots.txt 文件
    2019-06-12 Java学习日记之JDBC
    2019-06-11 Java学习日记之Bootstrap
    2019-06-10 Java学习日记之JQuery
  • 原文地址:https://www.cnblogs.com/jiayy/p/4286828.html
Copyright © 2011-2022 走看看