您的位置:首页 > 移动开发 > Android开发

Android-对抗反编译工具的一种方式

2014-11-11 13:45 357 查看
转载请标明出处:/article/1908015.html

首先我们来看下dex文件的格式:



class_defs的结构:



(1) class_idx 描述具体的 class 类型 ,值是 type_ids 的一个 index 。值必须是一个 class 类型 ,不能是数组类型或者基本类型 。

(2) access_flags 描述 class 的访问类型 ,诸如 public , final , static 等 。在 dex-format.html 里 “access_flags Definitions” 有具体的描述 。

(3) superclass_idx , 描述 supperclass 的类型 ,值的形式跟 class_idx 一样 。

(4) interfaces_off , 值为偏移地址 ,指向 class 的 interfaces , 被指向的数据结构为 type_list 。class 若没有 interfaces ,值为 0。

(5) source_file_idx , 表示源代码文件的信息 ,值是 string_ids 的一个 index 。若此项信息缺失 ,此项值赋值为 NO_INDEX=0xffff ffff 。

(6) annotions_off , 值是一个偏移地址 ,指向的内容是该 class 的注释 ,位置在 data 区,格式为 annotations_direcotry_item 。若没有此项内容 ,值为 0 。

(7) class_data_off , 值是一个偏移地址 ,指向的内容是该 class 的使用到的数据 ,位置在 data 区,格式为 class_data_item 。若没有此项内容 ,值为 0 。该结构里有很多内容 ,详细描述该 class 的 field , method , method 里的执行代码等信息 ,后面有一个比较大的篇幅来讲述 class_data_item 。

(8) static_value_off , 值是一个偏移地址 ,指向 data 区里的一个列表 ( list ) ,格式为 encoded_array_item 。若没有此项内容 ,值为 0 。

重点关注下(5),这一项代表的是源文件的名字。因此,一种可行的方案是往dex中添加一个项目中根本就用不到的类,然后修改source_file_idx,因为用不到,所以运行时不会报错的,但是但编译工具在做静态解析的时候,就会解析不出来而报错!

然后看下头部的具体组成部分:



(1)magic value

这 8 个 字节一般是常量 ,为了使 .dex 文件能够被识别出来 ,它必须出现在 .dex 文件的最开头的位置 。

(2)checksum 和 signature

4字节的文件校验码 ,使用alder32 算法校验文件除去 maigc ,checksum 外余下的所有文件区域 ,用于检查文件错误 。

20个字节的signature , 使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件区域 ,用于唯一识别本文件 。

从上面的结构可以看出来,如果是修改了source_file_idx,那么要同时修改signature 和checksum 。

总结步骤如下:

(1)项目源码打包成jar包(混淆)以后,添加进入一个无用的类x.x.x.x.x.x。

(2)把新的jar包转换成dex

(3)修改dex中x.x.x.x.x.x类的 source_file_idx。

(4)重新计算signature 。

(5)重新计算checksum 。

(6)更新dex。

(7)正常打包签名安装。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: