欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

DEX保护之指令抽取

来源:本站整理 作者:佚名 时间:2019-06-11 TAG: 我要投稿

首先我们需要了解一代壳的原理,一代壳是对dex文件进行加密,反编译只能看见壳程序的代码,只能通过IDA动态调试或者使用Xposed等HOOK框架,hook相关API在App运行时dump出解密后的dex文件,这两种方法都是通过内存dump出解密后的dex文件来进行脱壳的。
针对上面一代壳的简单描述,我们引出二代壳的功能:防止内存dump出dex文件
指令抽取概念
将需要保护的源码隐藏起来,通过的就是修改dex文件结构来删除指令集,这样即使dump出的dex文件也是不完整的。
这里需要了解dex文件结构,这里大概说一下,dex文件结构中的倒数第二个class def段存储着源码中类的各种详细信息,我们关注和修改的就是其中encode_method结构体,这个结构体保存中类中方法的详细信息,也是源码的逻辑结构,需要保护起来的,这个结构体里的的code_item就是这个方法中的代码信息,我们只要把指令集(指令集构成的每一行代码)置空,也就是删除了这个方法内部逻辑代码,这个方法也就成了空方法,即使dump出来也没什么作用。
具体实现
指令抽取
进行下面dex文件格式解析过程,需要对dex文件格式有一定的了解,可以看尼古拉斯赵四的dex文件解析的博客。
1、首先需要遍历dex文件的class段
public static void parseClassIds(byte[] srcByte){
        int idSize = ClassDefItem.getSize();
        int countIds = classIdsSize;
//        System.out.println("Total " + String.valueOf(countIds) + " classes(自定义类)\n");
        for(int i=0;inew ClassDefItem();
            byte[] classItemByte = Utils.copyByte(srcByte, classIdsOffset+i*idSize, idSize);
            byte[] classIdxByte = Utils.copyByte(classItemByte, 0, 4);
            item.class_idx = Utils.byte2int(classIdxByte);
            byte[] accessFlagsByte = Utils.copyByte(classItemByte, 4, 4);
            item.access_flags = Utils.byte2int(accessFlagsByte);
            byte[] superClassIdxByte = Utils.copyByte(classItemByte, 8, 4);
            item.superclass_idx = Utils.byte2int(superClassIdxByte);
            byte[] iterfacesOffByte = Utils.copyByte(classItemByte, 12, 4);
            item.iterfaces_off = Utils.byte2int(iterfacesOffByte);
            byte[] sourceFileIdxByte = Utils.copyByte(classItemByte, 16, 4);
            item.source_file_idx = Utils.byte2int(sourceFileIdxByte);
            byte[] annotationsOffByte = Utils.copyByte(classItemByte, 20, 4);
            item.annotations_off = Utils.byte2int(annotationsOffByte);
            byte[] classDataOffByte = Utils.copyByte(classItemByte, 24, 4);
            item.class_data_off = Utils.byte2int(classDataOffByte);
            byte[] staticValueOffByte = Utils.copyByte(classItemByte, 28, 4);
            item.static_value_off = Utils.byte2int(staticValueOffByte);
            classIdsList.add(item);
        }
2、解析class段下的每个类的类数据,也就是解析每个classItemData中的方法字段。

//directMethods
            EncodedMethod[] staticMethodsAry = new EncodedMethod[item.direct_methods_size];
            for(int i=0;i/**
                 *  public byte[] method_idx_diff;
                    public byte[] access_flags;
                    public byte[] code_off;
                 */
                EncodedMethod directMethod = new EncodedMethod();

[1] [2] [3] [4] [5] [6]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载