HURUWO编程笔记-Android使用Dobby进行InlineHook
前言
原文发布于www.huruwo.top/
同时发布本站做文章备份。
Dobby介绍
Dobby a lightweight, multi-platform, multi-architecture exploit hook framework.
一个支持多架构的inlinehook框架。(原名hookzz)
新建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