Closed nnjun closed 6 years ago
试下主动调用被Hook的方法, 如果仍未执行请将内存dump给我, 反之表明可能存在其它问题.
已经确定是没有走的了,Dump文件我给百度云。https://pan.baidu.com/s/1yjehze4yRwPq0AqWakEoog @Rprop
你测试调用时的函数地址和传入AKHookFunction的是否一致? inline hook结构简单, 不太可能出现不走的情况, 另外你把所hook的函数在hook前、后的1kb内存范围给我即可
不太妥,备份方法是可用的,但是就是无法Hook方法
什么不妥?有很多原因导致hook不成功,这里很难直接指出,比如地址是否选对等等
指针获取的不一样,测试环境是这样的 我在被Hook的demo上面获取了一下被Hook方法的指针。 在双开框架上面获取了demo上面被Hook的指针,so在同一个位置,获取指针代码相同 两个指针地址不相同。
换了一种验证的方法: 我在demo上面获取系统dlopen的指针,然后再双开框架上面也获取了dlopen的指针。 两个指针地址是相同的 输出日志https://pan.baidu.com/s/1COa0NdEu-jKs7c_Tphq6cA @Rprop
指针获取不一样结论很明显了, so不是同一个so, 所以即使hook也没走
//-------------------------------------------------------------------------
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执行的代码
//#define AKLog(...) android_log_print(ANDROID_LOG_VERBOSE, FUNCTION, 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内执行的代码。麻烦作者看看是不是写的有问题。
主要问题在于lookup_symbol返回的地址不唯一, so多次加载了, 你Hook的只是其中一个副本.
AndHook本身提供了AKGetImageByName("libnative-lib.so")
, 你可以试试这系列API
谢大哥
在VirtualApp上面进行Hook Native操作,无法Hook被启动软件内的Native函数。 AKHookFunction无报错正常执行,只是绑定Hook的方法不执行 尝试着Hook系统的open,fopen等函数,都可以可正常Hook。 最后把AndHook加自己编写的so植入进软件,不依赖双开框架。发现可以正常Hook。