仿造linker加载了android so,在init函数里做了重定向,soinfo的替换等操作,加载器可以调用被加载so的jni函数,但是如果有异常的话,无法捕获会导致崩溃,还有哪里需要处理呢?
详情:
替换了soinfo后只能使用被加载so的方法,在被加载的so导出了匹配loader包名的StringFromJni函数,不做其他操作,返回一个jstring字符串是可以正常运行的,屏幕显示的也是被加载so中返回的字符串。但是有两个问题。
问题一:
在这个函数里抛异常是接不住的会导致崩溃,被加载so单独运行只会打印一下"error eeeeee"这条信息,这个问题不知道怎么解决
extern "C" void test2(){
try {
throw " error eeeee";
}catch (const char* msg){
__android_log_print(6,"sss","%s",msg);
}
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_lyq_selfloader_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
test2();
std::string hello = "woshibeijiazaideso";
return env->NewStringUTF(hello.c_str());
}
报错如下:
问题二:
无法在 StringFromJni中使用dlopen自己,dlopen的时候报错:
A/libc: bionic/linker/linker_phdr.cpp:172: Load CHECK 'did_read_' failed
这个我正在查。
已解决!flags里面把is_linked标志位替换掉了。大佬们关注下问题一
处理的重定位项:
R_AARCH64_RELATIVE,R_AARCH64_IRELATIVE
R_AARCH64_ABS64,R_AARCH64_ABS32,R_AARCH64_ABS16,R_AARCH64_GLOB_DAT,R_AARCH64_JUMP_SLOT
R_AARCH64_PREL64,R_AARCH64_PREL32,R_AARCH64_PREL16
soinfo替换的内容:
重定位前:
st_dev,st_ino,file_offset_
重定位后:
load_size_,load_base_,load_bias_
phdr_table_,phdr_num_
nbucket_,nchain_,bucket_,chain_
strtab_,sym_table_,strtab_size_
rela_,rela_count_
init_func_,fini_func_,init_array_,init_array_count_,fini_array_,fini_array_count_,preinit_array_,preinit_array_count_
versym_,verdef_ptr_,verneed_ptr_,verneed_cnt_
偏移是从把当前手机的linker拉出来自己在IDA里面对的。
大佬们,带带我!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-5-26 13:59
被Circ1e编辑
,原因: 解决了问题二