同系列文章:
使用Cydia Substrate 从Native Hook Android Java世界
使用Cydia Substrate Hook Android Java世界
一、建立工程
手机端配置见之前文章,强调一句,手机必须root。
本文展示如何hook libc里的删除文件函数remove。建立工程同使用Cydia Substrate 从Native Hook Android Java世界。
只有Main.cy.cpp代码不同。代码如下:
#include <stdio.h> #include <substrate.h> #include <jni.h> #include <unistd.h> #include <android/log.h> #define TAG "CydiaHook" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型 //指明要hook的lib MSConfig(MSFilterLibrary, "/system/lib/libc.so") //储存旧函数地址 int (* oldremove)(const char* path); //自定义的新函数地址 int newremove(const char* path) { LOGI("%s",path); if (strstr(path, "htc") != NULL) { //这里可以hook住,禁止删除关键字中有htc的文件 return 0; } //调用旧函数 return oldremove(path); } //初始化时进行hook MSInitialize { LOGI( "Substrate initialized."); MSImageRef image; //获得模块地址 image = MSGetImageByName("/system/lib/libc.so"); if (image != NULL) { //找到待hook函数的地址 void * hookremove=MSFindSymbol(image,"remove"); if(hookremove==NULL) { LOGI("error find remove "); } else { MSHookFunction(hookremove,(void*)&newremove,(void **)&oldremove); } } else { LOGI("ERROR FIND LIBC"); } }
二、编译代码
在ndk环境变量配置好的前提下,cmd下进入jni目录,输入ndk-build 如果一切正常会有类似如下的输出,并且libs目录下有对应平台的so文件。