没有合适的资源?快使用搜索试试~ 我知道了~
首页Android中的Apk的加固(加壳)原理解析和实现
Android中的Apk的加固(加壳)原理解析和实现
需积分: 38 43 下载量 119 浏览量
更新于2023-05-25
收藏 1.01MB DOCX 举报
Android中的Apk的加固(加壳)原理解析和实现Android中的Apk的加固(加壳)原理解析和实现
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10408727/bg1.jpg)
一、前言
今天又到周末了,憋了好久又要出博客了,今天来介绍一下 Android 中的如何对 Apk 进
行加固的原理。现阶段。我们知道 android 中的反编译工作越来越让人操作熟练,我们
辛苦的开发出一个 apk,结果被人反编译了,那心情真心不舒服。虽然我们混淆,做到
native 层,但是这都是治标不治本。反编译的技术在更新,那么保护 Apk 的技术就不能
停止。现在网上有很多 Apk 加固的第三方平台,最有名的应当属于:爱加密和梆梆加固了。
其实加固有些人认为很高深的技术,其实不然,说的简单点就是对源 Apk 进行加密,然后
在套上一层壳即可,当然这里还有一些细节需要处理,这就是本文需要介绍的内容了。
二、原理解析
下面就来看一下 Android 中加壳的原理:
我们在加固的过程中需要三个对象:
1、需要加密的 Apk(源 Apk)
2、壳程序 Apk(负责解密 Apk 工作)
3、加密工具(将源 Apk 进行加密和壳 Dex 合并成新的 Dex)
主要步骤:
我们拿到需要加密的 Apk 和自己的壳程序 Apk,然后用加密算法对源 Apk 进行加密在将
壳 Apk 进行合并得到新的 Dex 文件,最后替换壳程序中的 dex 文件即可,得到新的
Apk,那么这个新的 Apk 我们也叫作脱壳程序 Apk.他已经不是一个完整意义上的 Apk 程
序了,他的主要工作是:负责解密源 Apk.然后加载 Apk,让其正常运行起来。
在这个过程中我们可能需要了解的一个知识是:如何将源 Apk 和壳 Apk 进行合并成新的
Dex
这里就需要了解 Dex 文件的格式了。下面就来简单介绍一下 Dex 文件的格式
具体 Dex 文件格式的详细介绍可以查看这个文件:http://download.csdn.net/detail/
jiangwei0910410003/9102599
主要来看一下 Dex 文件的头部信息,其实 Dex 文件和 Class 文件的格式分析原理都是一
样的,他们都是有固定的格式,我们知道现在反编译的一些工具:
1、jd-gui:可以查看 jar 中的类,其实他就是解析 class 文件,只要了解 class 文件的
格式就可以
2、dex2jar:将 dex 文件转化成 jar,原理也是一样的,只要知道 Dex 文件的格式,
能够解析出 dex 文件中的类信息就可以了
当然我们在分析这个文件的时候,最重要的还是头部信息,应该他是一个文件的开始部分,
也是索引部分,内部信息很重要。
我们今天只要关注上面红色标记的三个部分:
1) checksum
![](https://csdnimg.cn/release/download_crawler_static/10408727/bg2.jpg)
文件校验码 ,使用 alder32 算法校验文件除去 maigc ,checksum 外余下的所有文
件区域 ,用于检查文件错误 。
2) signature
使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件
区域 ,用于唯一识别本文件 。
3) "le_size
Dex 文件的大小 。
为什么说我们只需要关注这三个字段呢?
因为我们需要将一个文件(加密之后的源 Apk)写入到 Dex 中,那么我们肯定需要修改文件
校验码(checksum).因为他是检查文件是否有错误。那么 signature 也是一样,也是唯一
识别文件的算法。还有就是需要修改 dex 文件的大小。
不过这里还需要一个操作,就是标注一下我们加密的 Apk 的大小,因为我们在脱壳的时
候,需要知道 Apk 的大小,才能正确的得到 Apk。那么这个值放到哪呢?这个值直接放
到文件的末尾就可以了。
所以总结一下我们需要做:修改 Dex 的三个文件头,将源 Apk 的大小追加到壳 dex 的末
尾就可以了。
我们修改之后得到新的 Dex 文件样式如下:
那么我们知道原理了,下面就是代码实现了。所以这里有三个工程:
1、源程序项目(需要加密的 Apk)
2、脱壳项目(解密源 Apk 和加载 Apk)
3、对源 Apk 进行加密和脱壳项目的 Dex 的合并
三、项目案例
下面先来看一下源程序
1、需要加密的源程序 Apk 项目:ForceApkObj
需要一个 Application 类,这个到后面说为什么需要:
MyApplication.Java
[java]&view plain©
1. packagecom.example.forceapkobj;
2.
3. importandroid.app.Application;
4. importandroid.util.Log;
5.
6. publicclassMyApplicationextendsApplication{
7.
8. @Override
9. publicvoidonCreate(){
![](https://csdnimg.cn/release/download_crawler_static/10408727/bg3.jpg)
10. super.onCreate();
11. Log.i("demo","sourceapkonCreate:"+this);
12. }
13.
14. }
就是打印一下 onCreate 方法。
MainActivity.java
[java]&view plain©
1. packagecom.example.forceapkobj;
2.
3. importandroid.app.Activity;
4. importandroid.content.Intent;
5. importandroid.os.Bundle;
6. importandroid.util.Log;
7. importandroid.view.View;
8. importandroid.view.View.OnClickListener;
9. importandroid.widget.TextView;
10.
11. publicclassMainActivityextendsActivity{
12.
13. @Override
14. protectedvoidonCreate(BundlesavedInstanceState){
15. super.onCreate(savedInstanceState);
16.
17. TextViewcontent=newTextView(this);
18. content.setText("IamSourceApk");
19. content.setOnClickListener(newOnClickListener(){
20. @Override
21. publicvoidonClick(Viewarg0){
22. Intentintent=newIntent(MainActivity.this,SubActiv
ity.class);
23. startActivity(intent);
24. }});
25. setContentView(content);
26.
27. Log.i("demo","app:"+getApplicationContext());
28.
29. }
30.
31. }
也是打印一下内容。
![](https://csdnimg.cn/release/download_crawler_static/10408727/bg4.jpg)
2、加壳程序项目:DexShellTools
加壳程序其实就是一个 Java 工程,因为我们从上面的分析可以看到,他的工作就是加密源
Apk,然后将其写入到脱壳 Dex 文件中,修改文件头,得到一个新的 Dex 文件即可。
看一下代码:
[java]&view plain©
1. packagecom.example.reforceapk;
2.
3. importjava.io.ByteArrayOutputStream;
4. importjava.io.File;
5. importjava.io.FileInputStream;
6. importjava.io.FileOutputStream;
7. importjava.io.IOException;
8. importjava.security.MessageDigest;
9. importjava.security.NoSuchAlgorithmException;
10. importjava.util.zip.Adler32;
11.
12.
13. publicclassmymain{
14. /**
15. *@paramargs
16. */
17. publicstaticvoidmain(String[]args){
18. //TODOAuto-generatedmethodstub
19. try{
20. FilepayloadSrcFile=newFile("force/ForceApkObj.apk");
//需要加壳的程序
21. System.out.println("apksize:"+payloadSrcFile.length());
22. FileunShellDexFile=newFile("force/ForceApkObj.dex");
//解客 dex
23. byte[]payloadArray=encrpt(readFileBytes(payloadSrcFile)
);//以二进制形式读出 apk,并进行加密处理//对源 Apk 进行加密操作
24. byte[]unShellDexArray=readFileBytes(unShellDexFile);//
以二进制形式读出 dex
25. intpayloadLen=payloadArray.length;
26. intunShellDexLen=unShellDexArray.length;
27. inttotalLen=payloadLen+unShellDexLen+4;//多出 4 字节是
存放长度的。
28. byte[]newdex=newbyte[totalLen];//申请了新的长度
29. //添加解壳代码
![](https://csdnimg.cn/release/download_crawler_static/10408727/bg5.jpg)
30. System.arraycopy(unShellDexArray,0,newdex,0,unShellDex
Len);//先拷贝 dex 内容
31. //添加加密后的解壳数据
32. System.arraycopy(payloadArray,0,newdex,unShellDexLen,p
ayloadLen);//再在 dex 内容后面拷贝 apk 的内容
33. //添加解壳数据长度
34. System.arraycopy(intToByte(payloadLen),0,newdex,totalLe
n-4,4);//最后 4 为长度
35. //修改 DEXfilesize 文件头
36. fixFileSizeHeader(newdex);
37. //修改 DEXSHA1文件头
38. fixSHA1Header(newdex);
39. //修改 DEXCheckSum 文件头
40. fixCheckSumHeader(newdex);
41.
42. Stringstr="force/classes.dex";
43. Filefile=newFile(str);
44. if(!file.exists()){
45. file.createNewFile();
46. }
47.
48. FileOutputStreamlocalFileOutputStream=newFileOutputStr
eam(str);
49. localFileOutputStream.write(newdex);
50. localFileOutputStream.flush();
51. localFileOutputStream.close();
52.
53.
54. }catch(Exceptione){
55. e.printStackTrace();
56. }
57. }
58.
59. //直接返回数据,读者可以添加自己加密方法
60. privatestaticbyte[]encrpt(byte[]srcdata){
61. for(inti=0;i<srcdata.length;i++){
62. srcdata[i]=(byte)(0xFF^srcdata[i]);
63. }
64. returnsrcdata;
65. }
66.
67. /**
68. *修改 dex 头,CheckSum校验码
69. *@paramdexBytes
剩余29页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)