前段时间听说有一个APK加密网站,可以帮开发商将APK程序自动加密,遂上去试了一下。
加密后的APK将原程序的dex(java代码)加密后放在了assest目录下(aijiami.dat),并新增两个so:libexec.so,libexemainc.so,AndroidManifest.xml中将入口Application修改为爱加密的Application,在OnCreate调用so的init和load方法完成原程序运行的目的。相当于在原始dex执行前加了一个loader,这个loader运行时解密dex后启动。
加密后APK中java部分(dex)解密后只有两个类:
public class NativeApplication
{
static
{
System.loadLibrary("exec");
System.loadLibrary("execmain");
}
public static native boolean load(Application paramApplication, String paramString);
public static native boolean run(Application paramApplication, String paramString);
public static native boolean runAll(Application paramApplication, String paramString);
}
public class SuperApplication extends Application
{
protected void attachBaseContext(Context paramContext)
{
super.attachBaseContext(paramContext);
NativeApplication.load(this, "com.oxygenant.tools");
}
public void onCreate()
{
NativeApplication.run(this, "android.app.Application");
super.onCreate();
}
}
原以为是简单通过DexClassLoader 实现的,后仔细研究测试了一下发现不是那么简单:
1、经测试通过DexClassLoader,原程序将来无法找到应用的资源(layout、drawable),并且Service和Receiver也失效了;
2、libexec.so+libexecmain.so加起来有500kb左右(看来还是有不少代码)
很好奇爱加密是如何加载dex的,且能够保证原dex中资源、Service、Receiver均可用,有那位大大了解的么,指点一下。
附加密前后的apk文件,加密网站地址:www.ijiami.cn
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)