使用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); 進行原來的調用,不影響程序運行

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM