HURUWO编程笔记-Android使用Dobby进行InlineHook

4,102 阅读1分钟

HURUWO编程笔记-Android使用Dobby进行InlineHook

前言

原文发布于www.huruwo.top/

同时发布本站做文章备份。

Dobby介绍

Dobby a lightweight, multi-platform, multi-architecture exploit hook framework.

一个支持多架构的inlinehook框架。(原名hookzz)

项目地址:github.com/jmpews/Dobb…

新建JNI工程

我们有一个等待被hook的函数

textView.setText(stringFromJNI());
public native String stringFromJNI();

cpp文件

#include <jni.h>
#include <string>
#include <android/log.h>
#include 

extern "C" JNIEXPORT jstring JNICALL
Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "我没有被hook";
    //__android_log_print(ANDROID_LOG_ERROR, "Tag", "Hooked");
    return env->NewStringUTF(hello.c_str());
}

cmake文件

cmake_minimum_required(VERSION 3.10.2)
project("test_hook")

add_library( # Sets the name of the library.
        test_hook
        SHARED
        native-lib.cpp)
find_library(
        log-lib
        log)
target_link_libraries(
        test_hook
        ${log-lib})

跑起来界面显示的就是

我没被hook

链接Dobby工程

下载Dobby

这一步主要是下载Dobby

我们git clone 下拉整个工程,放到一个目录里面 为了方便我直接拉到了cmakelist的同级目录

修改CmakeList链接Dobby

设置文件路径

# 这里指定静态链接,生成一个so;# 默认为 ON,生成两个

soset(GENERATE_SHARED OFF)# 指定 dobby 库目录

set(DOBBY_SOURCE_DIR Dobby)

add_subdirectory(${DOBBY_SOURCE_DIR} dobby.out)

新增链接库

target_link_libraries(
        test_hook
        dobby  # 新增dobby引用
        ${log-lib})

编写hook逻辑

指hook函数 大概也是分三步走

1.指向原函数地址

//指向原函数地址 方法名价格*oraginstatic jstring 
(*orgin_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI)(JNIEnv* env,jobject /* this */);

2.代替的方法

// 代替的方法
extern "C" JNIEXPORT jstring JNICALL
new_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "我被hook修改了";
    return env->NewStringUTF(hello.c_str());
}

3.hook调用

__attribute__((constructor)) static void ctor() {
    // 构造函数 静态插入hook调用
    // 原函数名
    // 新函数地址
    // 旧函数地址
    DobbyHook((void *) DobbySymbolResolver(NULL, "Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI"), (void *) new_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI,(void **) &orgin_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI);
}
  • _attribute_((constructor)) 先于main()函数调用>
  • _attribute_((destructor))在main()函数后调用

全部代码:

#include <jni.h>
#include <string>
#include <android/log.h>
#include "Dobby/include/dobby.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "我没有被hook";
    //__android_log_print(ANDROID_LOG_ERROR, "Tag", "Hooked");
    return env->NewStringUTF(hello.c_str());
}

//指向原函数地址 方法名价格*oragin
static jstring (*orgin_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI)(JNIEnv* env,jobject /* this */);

// 代替的方法
extern "C" JNIEXPORT jstring JNICALL
new_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "我被hook修改了";
    return env->NewStringUTF(hello.c_str());
}

__attribute__((constructor)) static void ctor() {
    // 构造函数 静态插入hook调用
    // 原函数名
    // 新函数地址
    // 旧函数地址
    DobbyHook((void *) DobbySymbolResolver(NULL, "Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI"), (void *) new_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI,(void **) &orgin_Java_com_huruwo_hookthing_navitehook_NativeHookActivity_stringFromJNI);
}

运行起来

显示

我被hook修改了

最后

更多的示例可以看官方文档 包括hook dlopen

源码地址:github.com/HuRuWo/Andr…