首页 > 代码库 > 使用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。
首先:
- 指明要hook的lib :
MSConfig(MSFilterLibrary,"/system/lib/libdvm.so")
- 在初始化的时候进行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