-
-
[原创]另类的dex代码保护方法
-
发表于:
2021-4-27 14:45
10987
-
这是之前在分析一款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了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)