构建安卓loader加载so

           近年来,安卓应用加固语法“结实”,加密函数又期初的jar层转向jni,使用IDA等工具将so反编译为arm汇编,再者以OLLVM混淆so机制越发普遍,反写算法已经是一项耗时耗力的事情。本文介绍一种构建loader直接调用so函数。

一、定义Jni参数

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;

二、加载so并获取函数地址

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;
}

typedef int (*JNI_CreateJavaVM_Type)(JavaVM**, JNIEnv**, void*);
JNI_CreateJavaVM_Type JNI_CreateJavaVM_Func = (JNI_CreateJavaVM_Type)dlsym(handle, "JNI_CreateJavaVM");
if(!JNI_CreateJavaVM_Func){
printf("[-] dlsym failed\n");
return 0;
}
res=JNI_CreateJavaVM_Func(&vm,&env,&vm_args);
dlopen("dependence1.so",RTLD_LAZY);//直接加载依赖so
dlopen("dependence2.so",RTLD_LAZY);
soinfo* si= (soinfo *)dlopen("main.so",RTLD_LAZY);
if(si == NULL)
{
	printf("dlopen err!\n");
	return 0;
}

三、调用相应地址函数

typedef char* (*FUN1)(char* plain);
//void *addr=(void*)(*(int*)((size_t)si+0x8c)+your_address);
void *addr=(void*)(si->base+your_address);
printf("%x\n",(size_t)si);
printf("%x\n",si->base);
FUN1 func=(FUN1)addr;
if(func==NULL)
{
	printf("can't find  func\n");
	return 0;
}

char *plain="your_param"
char* ret=func(plain);
printf("%s\n",ret);

开源:代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值