首页
社区
课程
招聘
[原创]另类的dex代码保护方法
发表于: 2021-4-27 14:45 10986

[原创]另类的dex代码保护方法

2021-4-27 14:45
10986

这是之前在分析一款Android APP,具体功能是什么不重要,发现它采用了一种另类的代码保护方法,虽然原理不是很复杂,但中间反反复复折腾了好几天,在此把研究过程分享给大家。

运行这款APP,提示会申请设备管理器权限,自然想到程序代码中应该有类继承自AccessibilityService类,并重载了onAccessibilityEvent方法,反编译dex代码,发现是这样的:
图片描述
图1
第一感觉是java层代码native化了,换句话说,本来应该在java层实现的代码,放到了so库中通过c语言实现了(当时想可能是通过c反射调用java层API来实现)。把apk解压缩,找了一圈,竟然没有这样的so库!发现很多类代码初始化都会有这样的代码:
图片描述
图2
进一步跟踪发现程序调用,来到一个so库,这个so库负责恢复被保护的代码。具体调试和跟踪的过程不说了,直接公布答案。

这种代码保护简单概括成一句话,就是隐藏代码偏移。具体说呢,在dex文件里有一个字段记录着代码的偏移位置,代码保护把它修改为0,另有一个文件记录着真正的代码的偏移,在类的初始化过程中,调用native函数传入一个class和一个hash值(如图2),程序通过这两个参数在数据文件中搜索到正确的偏移,在运行时恢复。实际上,代码仍然保存在dex文件中。另外,被保护的方法属性被修改为native,方法属性也会在运行时修复。

还原代码看起来就不难了,把方法的native属性去掉(方法属性字段的某个bit位置零),把代码偏移重写到dex就ok了。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 4
支持
分享
最新回复 (5)
雪    币: 6573
活跃值: (3873)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
2
强! 
2021-4-29 10:23
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害 可是像这样的 直接脱壳不是更方便
2021-4-29 12:01
0
雪    币: 614
活跃值: (883)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
万里星河 厉害 可是像这样的 直接脱壳不是更方便
不是常规壳的逻辑
2021-4-29 14:07
0
雪    币: 209
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
请问可以提供一下样本吗
2021-4-30 18:02
0
雪    币: 614
活跃值: (883)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
ba1yu2 请问可以提供一下样本吗
黑样本,不大方便发哈
2021-5-6 10:42
0
游客
登录 | 注册 方可回帖
返回
//