同系列文章:
使用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文件。