最近一直在研究百度壳,发现网上这方面的资料非常少。所以我把自己做的发出来跟大家分享,共同学习进步。
下面开始:
一、init_array
我们发现init_array中存在多个函数地址,JNI_Onload为加密状态
动态调试在init_array上下断跟着进入一个大循环。发现他在此处对so进行了抹头操作。
之后遇到反调试崩溃退出。后来发现反调试检测了以下字段:
android_server
gdbserver
gdb
TracePid:
/proc/self/task/%s/status
isDebuggerConnected等。。
二、bypass
编写了一个loader程序调用该so中的JNI_Onload函数bypass壳代码和反调试。#include
#include
#include
#include
int main()
{
JavaVM* vm;
JNIEnv* env;
jint res;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=.";
vm_args.version=0x00010002;
vm_args.options=options;
vm_args.nOptions =1;
vm_args.ignoreUnrecognized=JNI_TRUE;
printf("[+] dlopen libdvm.so\n");
void *handle = dlopen("/system/lib/libdvm.so", RTLD_LAZY);//RTLD_LAZY RTLD_NOW
if(!handle){
printf("[-] dlopen libdvm.so failed!!\n");
return 0;
}
//这里我先创建一个java虚拟机。