首页 > 技术文章 > 使用Cydia Substrate 从Native Hook Android Native世界

Reyzal 2016-04-28 10:32 原文

同系列文章:

使用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文件。

image

 

三、测试结果:

image

四、相关下载

代码

推荐阅读