首页 > 代码库 > 使用cydia substrate 来进行android native hook

使用cydia substrate 来进行android native hook

?

cydia不仅可以hook java代码,同样可以hook native代码,下面举一个例子来进行android native hook

我是在网上找到的supermathhook这个项目,在他基础上修改的,本来是为了仓促应对阿里的ctf

这个项目位置:

这个项目是用来hook jni 代码的,而我是用来hook dvmDexFileOpenPartial这个函数的,所以必须使用

Mshookfunction这个函数,这个函数在libsubstrate.so中,自己去官网下载就可以了。

接下来将如何hook。

首先:

  1. 指明要hook的lib :

MSConfig(MSFilterLibrary,"/system/lib/libdvm.so")

  1. 在初始化的时候进行hook,具体如下:

    MSInitialize

    {

    ????

    ????__android_log_print(ANDROID_LOG_ERROR, TAG, "Substrate initialized.");

    ????MSImageRef image;

    ????image = MSGetImageByName("/system/lib/libdvm.so"); 载入lib

    ????if (image != NULL)

    ????{

    ????????//注意这个是个c++函数,可以通过objdump来获取

    ????????void * dexload=MSFindSymbol(image,"_Z21dvmDexFileOpenPartialPKviPP6DvmDex");

    ????????if(dexload==NULL)

    ????????{

    ????????????LOGD("error find _Z21dvmDexFileOpenPartialPKviPP6DvmDex ");

    ????????}

    ????????else{

    ????????????MSHookFunction(dexload,(void*)&mydvmdexfileopen,(void **)&olddexfileopen);·

    ????????}

    ????}

    ????else{

    ????????LOGD("ERROR FIND LIBDVM");

    ????}

    }

    ?

    相关其他的函数:

    int (* olddexfileopen)(const void * addr,int len,void ** dvmdex); 保留原来的地址

    int mydvmdexfileopen(const void * addr,int len,void ** dvmdex) 新的函数

    {

    LOGD("call my dvm dex!!:%d",getpid());

    { //write to file

    ???? char buf[200];

    ???? sprintf(buf,"/sdcard/dex.%d",random()); 导出dex文件

    ???? FILE * f=fopen(buf,"wb");

    ???? if(!f)

    ???? {

    ???????? LOGD("error open sdcard file to write");

    ???? }

    ???? else{

    ???????? fwrite(addr,1,len,f);

    ???????? fclose(f);

    ???? }

    ?

    }

    return olddexfileopen(addr,len,dvmdex); 进行原来的调用,不影响程序运行

    }

使用cydia substrate 来进行android native hook