asLody / AndHook

Android dynamic instrumentation framework
MIT License
756 stars 213 forks source link

Hook Native问题 #33

Closed nnjun closed 6 years ago

nnjun commented 6 years ago

在VirtualApp上面进行Hook Native操作,无法Hook被启动软件内的Native函数。 AKHookFunction无报错正常执行,只是绑定Hook的方法不执行 尝试着Hook系统的open,fopen等函数,都可以可正常Hook。 最后把AndHook加自己编写的so植入进软件,不依赖双开框架。发现可以正常Hook。

Rprop commented 6 years ago

试下主动调用被Hook的方法, 如果仍未执行请将内存dump给我, 反之表明可能存在其它问题.

nnjun commented 6 years ago

已经确定是没有走的了,Dump文件我给百度云。https://pan.baidu.com/s/1yjehze4yRwPq0AqWakEoog @Rprop

Rprop commented 6 years ago

你测试调用时的函数地址和传入AKHookFunction的是否一致? inline hook结构简单, 不太可能出现不走的情况, 另外你把所hook的函数在hook前、后的1kb内存范围给我即可

nnjun commented 6 years ago

不太妥,备份方法是可用的,但是就是无法Hook方法

Rprop commented 6 years ago

什么不妥?有很多原因导致hook不成功,这里很难直接指出,比如地址是否选对等等

nnjun commented 6 years ago

指针获取的不一样,测试环境是这样的 我在被Hook的demo上面获取了一下被Hook方法的指针。 在双开框架上面获取了demo上面被Hook的指针,so在同一个位置,获取指针代码相同 两个指针地址不相同。

换了一种验证的方法: 我在demo上面获取系统dlopen的指针,然后再双开框架上面也获取了dlopen的指针。 两个指针地址是相同的 输出日志https://pan.baidu.com/s/1COa0NdEu-jKs7c_Tphq6cA @Rprop

Rprop commented 6 years ago

指针获取不一样结论很明显了, so不是同一个so, 所以即使hook也没走

nnjun commented 6 years ago

include

include

include

include <android/log.h>

include

include <sys/stat.h>

include

include "include/AndHook.h"

define LOG_TAG "dexer"

define ALOGE(...) ((void)android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS))

//-------------------------------------------------------------------------

int(*old_get)() = NULL; int new_get() { ALOGE("Hook Success"); return 123456; }

//------------------------------------------------------------------------- void lookup_symbol(char libraryname, char symbolname) { //获取so库的句柄 void handle = dlopen(libraryname, RTLD_GLOBAL | RTLD_NOW ); if (handle != NULL) { //根据so库句柄和符号名(即函数名)获取函数地址 void *symbol = dlsym(handle, symbolname); if (symbol != NULL) { return symbol; } else { ALOGE("symbol is null"); return NULL; } } else { ALOGE("handle is null"); return NULL; } } //-------------------------------------------------------------------------

//------------------------------------------------------------------------- //------------------------------------------------------------------------- //-------------------------------------------------------------------------

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM vm, void reserved) { JNIEnv *env; if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) { return JNI_EVERSION; } ALOGE("Start Load");

void handle = lookup_symbol("/data/data/io.virtualapp/virtual/data/app/com.nnj.coverhookl/lib/libnative-lib.so","getKey"); void handleee = lookup_symbol("/system/lib/libc.so","dlopen"); ALOGE("hook_get_open_handle : %p",handleee);

if(handle == NULL){ ALOGE("handle is null"); }else{ ALOGE("hook_get_key_handle : %p",handle);
AKHookFunction( (const void )(handle), // hooked function (const void )(new_get), // our function ( void **)(&old_get)); // backup function pointer
}

return JNI_VERSION_1_6; }

上面是Hook加载so执行的代码

nnjun commented 6 years ago

include

include

include

include <android/log.h>

include

include <sys/stat.h>

include

include <android/log.h>

define LOG_TAG "dexer"

//#define AKLog(...) android_log_print(ANDROID_LOG_VERBOSE, FUNCTION, VA_ARGS__)

define ALOGE(...) ((void)android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS))

extern "C" int getKey() { ALOGE("getKey"); return 123123; }

void lookup_symbol(char libraryname, char symbolname) { //获取so库的句柄 void handle = dlopen(libraryname, RTLD_GLOBAL | RTLD_NOW); if (handle != NULL) { //根据so库句柄和符号名(即函数名)获取函数地址 void *symbol = dlsym(handle, symbolname); if (symbol != NULL) { return symbol; } else { ALOGE("symbol is null"); return NULL; } } else { ALOGE("handle is null"); return NULL; } }

extern "C" JNIEXPORT int

JNICALL Java_com_nnj_coverhookl_MainActivity_stringFromJNI( JNIEnv env, jobject / this /) { void handle = lookup_symbol("/data/data/io.virtualapp/virtual/data/app/com.nnj.coverhookl/lib/libnative-lib.so","getKey"); void *handleee = lookup_symbol("/system/lib/libc.so","dlopen");

ALOGE("demo_get_key_handle : %p",handle);
ALOGE("demo_get_open_handle : %p",handleee);
return getKey();

}

上面是demo内执行的代码。麻烦作者看看是不是写的有问题。

Rprop commented 6 years ago

主要问题在于lookup_symbol返回的地址不唯一, so多次加载了, 你Hook的只是其中一个副本. AndHook本身提供了AKGetImageByName("libnative-lib.so"), 你可以试试这系列API

nnjun commented 6 years ago

谢大哥