首页
社区
课程
招聘
[讨论][求助]android so壳怎么将源so的soinfo信息导出给系统维护的soinfo
发表于: 2019-7-2 14:09 4885

[讨论][求助]android so壳怎么将源so的soinfo信息导出给系统维护的soinfo

2019-7-2 14:09
4885
根据腾讯bugly的博客得知,androidso加壳的方法,进行实践后,发现在android5.1.1系统下调试不通,主要是由于bugly博客最后一个步骤可能我操作有误,



我先是进行使用dlopen打开了loader,然后对其内存所在位置进行权限的设置,设置为可读可写可执行,然后直接赋值,调试后发现SIGSEGV (signal SIGSEGV: address access protected (fault address: 0xaaf0a348))这个错误,但是这个错误我在夜神模拟器上android4.4并未出现,ps,关于自定义loader我使用的是 liumengde大神提供的自定义的loader

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-7-2 14:30 被Adench编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 4392
活跃值: (881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
求大神指教
2019-7-2 14:10
0
雪    币: 1110
活跃值: (3274)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
请放代码
2019-7-2 20:55
0
雪    币: 4392
活跃值: (881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
char desFile[400];
    char desFile1[400];
    sprintf(desFile, "/data/data/%s/lib/libnative-libs.so", buf);
    sprintf(desFile1, "/data/data/%s/lib/libnative-lib.so", buf);
    DL_ERR("open file is %s", desFile);

    __system_property_get("ro.build.version.sdk", buf);
    int version = 0;
    sscanf(buf, "%d", &version);
    
    //4.4 start
    soinfo4_4 *soinfo4_41 = find_library_internal4_4(desFile);
    if (soinfo4_41 == NULL) {
        DL_ERR("find soinfo fail");
        return JNI_VERSION_1_4;
    }
    DL_ERR("find soinfo success");

//        xor_code(soinfo4_4->base,start_page_address4_4,start_page_filelength4_4);
    jint (*real_JNI_OnLoad4_4)(JavaVM *, void *);
    real_JNI_OnLoad4_4 = (jint (*)(JavaVM *, void *)) (lookup_in_library4_4(soinfo4_41,
                                                                            "JNI_OnLoad"));

    if (real_JNI_OnLoad4_4 == NULL) {
        DL_ERR("cannot find sym %s\n", "JNI_OnLoad");
    } else {
        real_JNI_OnLoad4_4(vm, reserved);
    }
    soinfo4_4* src_so = dlopen(desFile1,0);
    src_so->base=soinfo4_41->base;
    src_so->size=soinfo4_41->size;
    src_so->load_bias=soinfo4_41->load_bias;
    src_so->strtab=soinfo4_41->strtab;
    src_so->symtab=soinfo4_41->symtab;
    src_so->nbucket=soinfo4_41->nbucket;
    src_so->nchain=soinfo4_41->nchain;
    src_so->bucket=soinfo4_41->bucket;
    src_so->chain=soinfo4_41->chain;
    src_so->ARM_exidx=soinfo4_41->ARM_exidx;
    src_so->ARM_exidx_count=soinfo4_41->ARM_exidx_count;
最后于 2019-7-3 09:14 被Adench编辑 ,原因:
2019-7-3 09:14
0
雪    币: 4392
活跃值: (881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Amun 请放代码
代码如下
2019-7-3 09:15
0
雪    币: 4392
活跃值: (881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
或者说除了直接赋值还有什么方法可以把源so的soinfo放在系统linker下的soinfo链表里呢?
2019-7-3 11:17
0
雪    币: 2231
活跃值: (1078)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
同问 mark 
源so的soinfo放在系统linker下的soinfo链表里
2019-7-5 10:48
0
雪    币: 1110
活跃值: (3274)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
Adench 或者说除了直接赋值还有什么方法可以把源so的soinfo放在系统linker下的soinfo链表里呢?

做 SO 壳,一般是两种需求:

  1. 保护自己的库,解密后在 PROT_READ|PROT_EXEC 内存中运行,这种情况下一般不需要生成 soinfo

  2. 保护其他库,要求被加壳的库能够被其他库正确地加载, dlopen/dlsym 也正常工作。这要求 solist 中存在 这库的 soinfo 信息,同时 .dynsym 等信息正常。

    • 方法一

      替换 ELF .init_array 的第一个函数为壳函数流程,在其中执行解密 SO 数据等操作后,再执行原 .init_array 的流程

    • 方法二

      dlopen 加载一个 min.sosolist 中占桩,然后映射解密后的ELF数据,最后将桩 soinfo 的内存页权限改为 PROT_WRITE 赋值后再改回 PROT_READ

2019-7-5 18:24
0
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
自己分配一个soinfo然后插到map里
2020-9-19 21:27
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
麻烦请教一下楼主有没有代码参考一下,现在无从下手啊
2021-4-25 11:16
0
游客
登录 | 注册 方可回帖
返回
//