IO操作Dex文件加密,APK加固项目实战,Android开发必须会的技能

本文介绍了Android应用加固的过程,包括替换classes.dex文件、修改AndroidManifest.xml以指定ProxyApplication,以及壳程序加载原dex文件的工作原理。通过分析attachBaseContext和onCreate方法,详细阐述了如何在壳程序中加载和解密加密的dex文件,确保应用安全运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这一阶段,我们首先将apk解压,会看到如下图的6个文件和目录。其中,我们需要修改的只有2个文件,分别是classes.dex和AndroidManifest.xml文件,其他文件和文件加都不需要改动。

首先,我们把解压后apk目录下原来的classes.dex文件替换成我们在0x02上一步合成的新的classes.dex文件。然后,由于我们程序运行的时候,首先加载的其实是壳程序里的ProxyApplication类。所以,我们需要修改AndroidManifest.xml文件,指定application为ProxyApplication,这样才能正常找到识别ProxyApplication类并运行壳程序。这里,需要注意的是。

完成上述两个文件的替换后,我们就重新打包apk并签名。到此,我们就完成了dex文件的整体加固。

image

0x04 运行壳程序加载原dex文件

通过上面3个步骤,我们了解了dex文件整体加固的流程。那么,当这个加固后的dex文件加载到Dalvik虚拟机中,它又是如何工作的呢?下面我们就来讲解下壳程序在这里面发挥的重要作用。

首先,Dalvik虚拟机会加载我们经过修改的新的classes.dex文件,并最先运行ProxyApplication类。在这个类里面,有2个关键的方法:attachBaseContext和onCreate方法。ProxyApplication显示运行attachBaseContext再运行onCreate方法。

在attachBaseContext方法里,主要做两个工作:

  1. 读取classes.dex文件末尾记录加密dex文件大小的数值,则加密dex文件在新classes.dex文件中的位置为:len(新classes.dex文件) – len(加密dex文件大小)。然后将加密的dex文件读取出来,加密并保存到资源目录下

  2. 然后使用自定义的DexClassLoader加载解密后的原dex文件

在onCreate方法中,主要做两个工作:

  1. 通过反射修改ActivityThread类,并将Application指向原dex文件中的Application

  2. 创建原Application对象,并调用原Application的onCreate方法启动原程序

image

具体的app启动过程可以回看第2章的内容。

2 APK加固实现

====================================================================================

2.1 加固Demo源程序


源程序我们使用NDK开发一个简单的demo,并在assets目录存放一个txt文件读取。这样,我们就可以得到跟10.1.1一样的文件结构,也可以检测下加固后的文件是否影响lib文件的和资源目录下文件的操作。

工程结构如下:

image

MyApplication.java关键代码:

  1. public class MyApplication extends Application{

  2. @Override

  3. public void onCreate() {

  4. // TODO Auto-generated method stub

  5. super.onCreate();

  6. }

  7. @Override

  8. protected void attachBaseContext(Context base) {

  9. // TODO Auto-generated method stub

  10. super.attachBaseContext(base);

  11. }

  12. }

MainActivity.java关键代码:

  1. public class MainActivity extends Activity

  2. {

  3. /** Called when the activity is first created. */

  4. public native void test();

  5. @Override

  6. public void onCreate(Bundle savedInstanceState)

  7. {

  8. super.onCreate(savedInstanceState);

  9. setContentView(R.layout.main);

  10. System.loadLibrary(“demo1”);

  11. test();

  12. Log.v(“demo”, getFromAssets(“

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值