我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 指令类型 >

DEX保护之指令抽取

归档日期:06-28       文本归类:指令类型      文章编辑:爱尚语录

  首先我们需要了解一代壳的原理,一代壳是对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文件解析的博客。

  2、解析class段下的每个类的类数据,也就是解析每个classItemData中的方法字段。

  4、上面代码解析出指令数组后,使用了set_instru2null方法将指令偏移处指定大小的字节流置0,来返回一个指令集为0的dex文件的字节流。

  上面的代码主要都是对dex文件格式的解析,需要对dex文件格式有了解,可以参考我github上的工具readdex.jar。然后将下图中所示的指令集置0,也就隐藏了代码。

  下面通过Jadx打开经过更改的dex文件的对比,可以从图中明显看出改过指令的dex文件方法内部的代码全部被隐藏了。

  dex文件头中有两个字段,随着dex文件格式的修改是要进行改变的,否则安装apk的时候,会通不过系统校验。

  checksum:文件校验码,除 magic 和此字段之外的文件剩下内容的 adler32 校验和,用于检测文件损坏情况;

  本文只是一种对类方法的一种隐藏,如果你对dex文件有一定了解的话还可以做到对类字段、静态字段隐藏、类方法的重复定义。

本文链接:http://f-taiken.net/zhilingleixing/111.html