dex怎么编译源码-替代 dex 代码保护方法

本文是看学论坛上的一篇优秀文章

看学论坛作者ID:eastmaster

这是我之前分析过的一个Android APP。 具体的功能并不重要。 我发现它使用了另一种代码保护方法。 虽然原理不是很复杂,但是中间我也折腾了好几天。 过程与大家分享。

1. 第一次会议

运行该APP时,提示需要申请设备管理器权限。 人们很自然地想到,程序代码中应该有一个继承自AccessibilityService类的类,并重载了onAccessibilityEvent方法。 反编译dex代码后发现是这样的:

图1

首先想到的是java层代码是native的。 也就是说,本来应该在java层实现的代码,放到了so库中,用c语言实现了(我以为可能是通过c反射调用java层API来实现的)。 解压apk,到处搜索,没有这个so库! 发现很多类型的代码初始化都会有这样的代码:

图2

进一步追踪发现,程序调用来到了一个so库,该so库负责恢复受保护的代码。 具体调试跟踪过程就不说了,直接揭晓答案。

2、保护原理

这种代码保护可以用一句话来简单概括,那就是隐藏代码倾斜。 具体来说,dex文件中有一个数组记录了代码的倾斜位置,代码保护将其更改为0,另一个文件记录了真实代码的倾斜。 在类的初始化过程中,调用原生函数传入一个类和一个哈希值(如图2所示),程序会通过这两个参数在数据文件中搜索正确的倾斜,并在运行。 事实上,代码一直保存在dex文件中。

此外,受保护的方法属性会更改为本机属性,并且方法属性会在运行时进行修补。

3. 代码修复之路

恢复代码看起来并不困难。 去掉该技术的原生属性(方法属性数组的某个位位置为零),重新将代码倾斜到dex就可以了。

1.直接更改dex文件

熟悉dex文件结构的同事一定知道LEB128数据格式。 这种数据格式要求每个字节的低7位来表示数据。 最低位为1表示后面还有数据,为0表示没有数据。 dex文件的代码倾斜是LEB128数据格式(准确地说是ULEB128,无符号数据)。

问题来了:代码倾斜为0,字段占用1个字节,但实际倾斜一般占用4个字节。 两种方法:一种是中间插入3个字节的数据,另一种是不管其他数据,直接覆盖前3个字节。 由于dex文件的数据结构,插入3个字节使得很多数组都要改变,工作量不说,而且不容易定位问题。 第二种方法是一种偷懒的方法。 尝试了一下,发现几乎所有的代码都无法反编译。

2.编译与反编译工具dex2jar

dex反编译的工具有很多,dex2jar是常用的一个,而且是开源的。 思路是改变它的源码:反编译需要修正的类时,从dex文件中读取到的代码倾斜为0,此时将前面的dex2jar代码改一下,保存dex的变量参数代码倾斜是正确的。 倾斜值,以便受保护的代码可以被反编译。

根据SourceForge中dex2jar的介绍:

()

有两种构建方式:通过 Maven 或 Gradle 编译项目。 根据提示,Git克隆项目代码首先按照Maven的方式进行编译。 配置好maven环境后,在项目根目录下输入mvn clean package,出现编译错误:

图3

粗略分析了一下,提示有找不到的包和类,但显然它们都存在。 从视觉上看,子流程之间的依赖配置是错误的。 谷歌没有找到答案。 我查看了GitHub项目主页上的Issues,发现没有人报告这个问题。 难道是Mac环境的问题?

之前编译android4.4源码时,官方不支持Mac环境,所以改成了Ubuntu。 接下来安装Ubuntu 14.4虚拟机,配置maven环境,git clone源码,mvn clean package,问题依旧! 我对maven的很多配置项都不是很熟悉,所以暂时放弃。

尝试通过Gradle编译,根据官网提示,在项目根目录下输入gradle clean distZip,编译报错:

图4

这是找不到外部资源的错误。 项目通过图4的4个URL未能找到外部资源,手动访问这4个URL确实无效,但尝试访问:

当发现下面有1.7目录时,尝试更改报错的dex-tools子项目下的配置文件:

图5

上图中的红框本来是“23”,改成“1.7”似乎有点离谱,但最终还是编译成功了!

3.修改dex2jar源码

找到子项目dex-reader,修改DexFileReader类的acceptMethod技术。 插入代码如下图:

图6

前面提到dex怎么编译源码dex怎么编译源码,必须通过二进制编辑器去掉方法的原生属性(属性数组是固定长度2字节,所以不需要考虑数据覆盖问题),否则dex2jar仍然不会输出正确的结果。 用修改后的dex2jar反编译,代码就下来了。 如下所示:

- 结尾 -

看雪ID:eastmaster

*本文由看学论坛东大师原创,转载时请注明来自看学社区。

《Android高级研修班》2021年6月班正在招生中!

#之前的推荐

公众号ID:ikanxue

官方微博:看学安全

商务合作:wsc@kanxue.com

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 dex怎么编译源码-替代 dex 代码保护方法 https://www.wkzy.net/game/178443.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务