安卓加密壳APK Protect分析——… 分类: Android开发 2014-05-30 10:55 298人阅读 评论(0) 收藏

http://www.apkbus.com/android-139096-1-1.html

之前发过一个帖子,是说5种常用的APK保护技术的,详细可参阅:http://www.apkbus.com/android-138130-1-1.html. 帖子提到过在线加密加壳,也就是APKProtect:http://www.apkprotect.com/.于是我就做了一个测试,看看这个在线加密加壳是否真的有效。

下面是我的测试步骤:
分析工具: dex2jar + jd-gui  + ida 6.1+ ExamDiff Pro
加壳选择的 1 个类:
Lcn/com/fmsh/cube/a/a;
用dex2jar后在jd-gui中看到该类只有两个函数调用 a 和 b;
然后是上传到网站www.apkprotect.com,这个要注册账号,不过是全部都是免费的,加密后将APK包下载回来,我们先看看最主要的classes.dex 文件变了没有:
加密前 classes.dex 文件大小: 2,925,772字节 
加密后 classes.dex 文件大小: 2,926,676 字节
接下来就开始动手分析代码了:
首先,我们使用ida逆向加密后的 dex 文件。以 "cn.com.fmsh.cube.a.a.a("字符串在IDA中查找到函数入口,看看我们选择的类的名为a的函数字节码有变化没有:
加密前:

安卓加密壳APK <wbr>Protect分析——在线加密加壳保护的有效性分析ZZ 

加密后:
安卓加密壳APK <wbr>Protect分析——在线加密加壳保护的有效性分析ZZ 

加密后的代码IDA无法完整逆向,如此我们可以确定,该壳确实加密了classes.dex 中的字节码。
然后,让我们看看加密后的包多了什么,使用 ExamDiff对加密后apk解压出来目录和未加密apk解压出来的目录进行匹配,发现只多了libapkprotect.so的库文件。
接着,让我们用 ida 对 libapkprotect.so 库进行分析,发现只有 5 个 jni 层入口函数, JNI_OnLoad、_d、_a、Java_com_apkprotect_Init、Java_com_apkprotect_Version,通过查看jni层函数代码的汇编码,可以确信该库是加过壳的,so的壳以前尚未见过,脱壳方法也有待探寻,所以我只能暂时先绕道,但是通过这个库,我们可以做如下猜测:
如果Java层要调用这个库,那么必然会存在 System.loadLibrary 的函数调用,于是我使用IDA对加密后的 dex文件分析查找,发现了名为 apkprotect  的 Java类,而这个类的代码只有 与 函数,不存在其它函数,如此我们就可以确定该类的代码应该是这样的:
public class apkprotect{
    static   {
       System.loadLibrary("apkprotect");   
}
    public native intInit(); 
   public native intVersion();
}

从以上代码的函数名,我们又可以猜测出最大的可能调用的函数应该是 Init,因此我们使用"apkprotect.Init("字符串来搜索dex代码,共搜索到以下几处调用点:
1. com.lakala.android.bll.receiver.AlarmReceiver.onReceive函数
2. com.lakala.android.bll.receiver.BroadcastReceiver.onReceive函数
3. com.lakala.android.bll.receiver.LoginoutReceiver.onReceive函数
4. com.lakala.android.bll.receiver.StatisticReceiver.onReceive函数
5. com.lakala.android.common.ApplicationExtension.函数
6. com.lakala.android.common.service.DownloadAppService.onCreate函数
7. com.lakala.android.common.service.DownloadFileService.onCreate函数8.com.zch.safelottery.broadcast.SafelotteryBroadcastReceiver.onReceive函数


个人猜测如下:
要使程序正常执行,那么必然需要将加密的字节码在运行前就解密回来或者是接管系统的执行接口在执行加密类的时候使用自己的方法去执行,这个壳可能偏向于前者,因为它附带的libapkprotect.so库文件并不是很大,要自己解密执行,肯定不止这么一点代码才是。
由此可见,该在线加壳加密确实有效,让破解难度增大不少。
以下是我的测试用例的下载地址:
http://pan.baidu.com/share/link?shareid=1355314020&uk=3157398793
分析深度尚浅,望高手绕道! 
posted @ 2014-05-30 10:55  leansmall  阅读(212)  评论(0编辑  收藏  举报