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