转载请标明出处:http://blog.csdn.net/u011546655/article/details/46410687

爱加密Android APK加壳原理解析
一、什么是加壳?
加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。

二、加壳作用
加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。

三、Android Dex文件加壳原理
PC平台现在已存在大量的标准的加壳和解壳工具,但是Android作为新兴平台还未出现APK加壳工具。Android Dex文件大量使用引用给加壳带来了一定的难度,但是从理论上讲,Android APK加壳也是可行的。
在这个过程中,牵扯到三个角色:
1、加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据
2、解壳程序:解密解壳数据,并运行时通过DexClassLoader动态加载
3、源程序:需要加壳处理的被保护代码根据解壳数据在解壳程序DEX文件中的不同分布,本文将提出两种Android Dex加壳的实现方案。

(一)解壳数据位于解壳程序文件尾部
该种方式简单实用,合并后的DEX文件结构如下。

加壳程序工作流程:

1、加密源程序APK文件为解壳数据
2、把解壳数据写入解壳程序Dex文件末尾,并在文件尾部添加解壳数据的大小。
3、修改解壳程序DEX头中checksum、signature 和file_size头信息。
4、修改源程序AndroidMainfest.xml文件并覆盖解壳程序AndroidMainfest.xml文件。

(二)解壳数据位于解壳程序文件头
该种方式相对比较复杂, 合并后DEX文件结构如下:

解壳DEX程序工作流程:

1、从0x70处读取解壳数据长度。
2、从DEX文件读取解壳数据,解密解壳数据。以文件形式保存解密数据到a.APK
3、通过DexClassLoader动态加载a.APK。
 
爱加密实现步骤:
1.把原来的classex.dex 用未知的加密算法实现加密成assets/ijiami.dat
2.把事先写好的jni代码和相应的classex.dex替换到原有的位置
3.程序安装完运行起来以后,先运行爱加密的加壳程序,在jni里面动态加载原 来的classex.dex代码,从而达到加壳保护的目的.
4.源classex.dex 隐藏起来了,在静态的时候就没有办法对其破解。
5.至于动态运行,最好还是在自己代码里面下工夫了。比如内存加密啦。
 
APK高级保护的方法(一)
        运行时验证运行时验证,主要是指在代码启动的时候本地获取签名信息,然后对签名信息进行检验来判断自己的应用是否是正版,如果签名信息不是正版则提示盗版或者直接崩溃。
        它的原理:APK的唯一识别是根据包名+签名,包名信息是写死在Android Manifest.xml里面的,但是签名则是与APK绑定的,一旦APK被反编译后签名会自动消失。APK的签名需要签名文件,签名文件的md5值基本上是无法伪造成一样的。
签名验证的方法也可以细分为3种:
1) Java 层验证
        获取签名信息和验证的方法都写在android 的java层。这种保护方法保护的意义并不大,因为反编译出源码后通过关键字搜索很快就能够找到验证的代码块,稍微一修改这验证保护就完全无效了。
2) 服务器验证
       在android 的java层获取签名信息,上传服务器在服务端进行签名然后返回验证结果。这种保护还不如在纯java层验证有用,一旦没有网络验证保护就无效了。用android方法获取的签名信息用java方法也可以获取,验证存放在服务器上也是为了把保护正确的签名信息值,但是保护的意义其实没有任何作用,同样破解后全局搜索关键字然后伪造一个正确的签名信息就可完美破解了。
3) NDK技术底层获取签名和验证
        通过把Context,Activity,PackageManager,PackageInfo四个对象中的一个作为参数参入底层,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。不过通过java层的hook技术一样可以把这种保护完美破解。但是相比于前两种,此保护的意义和价值就更大了。
4)爱加密APP安全保护
        它采用指纹校验保护APK中的文件,加密后APK中所有的文件都对应一个唯一的指纹。每次运行时,APK内部会再次进行指纹生成,如果生成的指纹和原本指纹不相同,则判断为被二次打包过的APK,程序就会自动退出或直接崩溃。该方法可以防止资源文件、主配置文件被修改或删除等操作,完全保证APK的安全。
 
APK高级保护的第二种方法——文件夹混淆(二)
        文件夹混淆主要指的是利用Windows,Linux,Android 三个系统环境下的文件夹名的特殊性来对源码文件夹进行混淆,让混淆后的文件夹在Window看起来失去原有的逻辑性,但是完全不影响其在Android系统上的运行。
它的原理是:在Windows和Linux下文件夹的名字是不区分大小写的,但是在Android环境下它却要区分大小写。.2在Linux算一个特殊符号,所以文件夹名字里面添加的.2会被忽略,但是windows下.2却是一个很普通的字符串。
具体方法:反编译开发完成的APK,找到包目录下的最后一层文件夹(例如:包名是com.example.test2222,找到test2222所在的文件夹),修改test2222文件夹名字为test2222.2并创建文件夹Test2222,然后随意存放一个有效的smali文件在Test2222里面,然后重新重写打包成APK签名。 如下图:
这种方法可以达到不错的保护效果,但是开发者一般都没有额外的时间和精力做加固保护。基本时间、技术等原因,爱加密为APK开发者提供免费的技术支持,对APK加壳隐藏源代码,从而防止反编译。它可以对XML 主配文件进行二次签名保护,保护SO文件不被破解和应用,同时可以保护APK不被二次打包!
 
第三种方式——花指令
        花指令是程序中有一些指令,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。“花指令”这个词来源于汇编语言,它的思想是非常不错的,它的另一个目的就是利用反编译工具漏洞,来使工具无法使用。
接下来,我们就在JAVA代码处制“花指令”,让反编译工具(jd-gui)无法反编译查询你的JAVA代码。jd-gui的bug其实挺多了,很多特殊代码块或者字段集都能够让其崩溃无法反编译出源码。
比如:
private static final char[] wJ = "0123456789abcdef".toCharArray();
public static String imsi = "204046330839890";
public static String p = "0";
public static String keyword = "电话";public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";
        在每个类里面加入如上字段,你会发现反编译的类通过jd-gui查看后的结果如下:
我们再来看一下爱加密的三层保护技术,即DEX加壳保护、DEX指令动态加载保护、高级混淆保护,可以保证APP的动态安全和静态安全,黑客将没有机会进行任何破解。
经过加密的APK我们反编译依稀看看是否有效果!

爱加密Android APk 原理解析相关推荐

  1. 爱加密Android APk 原理解析

    转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025 爱加密Android APK加壳原理解析 一.什么是加壳? 加壳是在二 ...

  2. 如何加密Android apk

    经过了忙碌的一周终于有时间静下来写点东西了,我们继续介绍android apk防止反编译技术的另一种方法.前两篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blo ...

  3. Android APK文件解析

    Android的.apk文件实际上就是一个zip文件 可以直接用winrar打开 如下图所示: 包括了一个META-INF目录 一个res目录 一个AndroidManifest.xml 一个clas ...

  4. java php rsa加密解密算法_PHP rsa加密解密算法原理解析

    php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 1.加密解密的 ...

  5. Android APK文件解析

    Android的.apk文件实际上就是一个zip文件 可以直接用winrar打开 如下图所示: 包括了一个META-INF目录 一个res目录 一个AndroidManifest.xml 一个clas ...

  6. Android—Gson原理解析

    JsonElement 抽象类 代表json串的某一个元素 某一个元素: JsonObject JsonArray JsonPrimitive(基本类型) JsonNull JsonElement的四 ...

  7. Android livedata原理解析之自己实现一个简单的LiveData

    LiveData其实就是通过管理生命周期来实现当视图不可见时不渲染数据,当视图可见时再渲染数据.当在一个Activity发送一个网络请求后,立马切到另一个界面或都按下Home键,使得视图不可见..这个 ...

  8. android asynctask,Android AsyncTask原理解析

    想要启动一个AsyncTask,首先需要创建一个AsyncTask对象然后调用execute方法.例如: new DownloadFilesTask().execute(); DownloadFile ...

  9. BAT大量裁人,快35岁的程序员该何去何从,Android并发原理解析

    行业前景 首先我给大家分析一下,现在行业的一个情况. 2018年IT界规模最大的裁员事件了.近日,面对难看的财务报表,美国最大的通讯运营商.市值2200亿美金的Verizon,遣散了4.4万名老员工. ...

  10. Android APK反编译及逆向工程

    一. 分析已经打好的apk. 首先来简单的说明下Apk文件本质上其实是一个zip包.我们直接进行解压就能看到其中的目录. 1. 目录说明 AndroidManifest.xml:应用的全局配置文件 c ...

最新文章

  1. Python实现单链表
  2. Silverlight 4正式版发布
  3. Python中变量作用域问题
  4. 通过 User-Agent 请求头判断设备类型
  5. 【Spring】HttpMessageNotWritableException No converter found for return value of type
  6. 使用springboot + druid + mybatisplus完成多数据源配置
  7. mqtt 客户端和服务端搭建及基本使用详解
  8. Hive教程(08)- JDBC操作Hive
  9. Keil MDK5 STM32F401CCU6开发环境配置
  10. php m3u8cms,苹果cms V8和V10整合Dplayer播放器插件支持mp4和m3u8格式播放
  11. 利用Tsai-lenz算法实现手眼标定
  12. 关于AD19常用功能和使用技巧的总结
  13. Eureka Server的REST端点
  14. FP7195大功率内部转模拟全程无频闪调光DC-DC恒流芯片
  15. 【Django】Django 的员工信息系统
  16. shell入门学习笔记-12-命令详解: echo与printf
  17. LeetCode-1758-生成交替二进制字符串的最少操作数
  18. ad如何设置pcb板子形状_一招教你学会使用AD更改PCB板子尺寸!
  19. 筹码集中度的判断方法
  20. Bitwig Studio 4 v4.3 WiN-MAC-Linux 跨多平台音乐制作软件

热门文章

  1. 等差数列计算机函数公式大全,等差数列公式大全
  2. Brain Predicted Age (一)
  3. 人的一生,到底在追求什么?
  4. 用大白话聊聊JavaSE -- 如何理解Java Bean(一)
  5. 基于javaweb+jsp的晚会抽奖系统(java+Jdbc+Servlet+Ajax+mysql)
  6. LZJ流体质量计算机价格,LZJ-ⅢC型流体质量计算机选编.doc
  7. 视频物体检测(VID) FGFA:Flow-Guided Feature Aggregation for Video Object Detection
  8. BZOJ3772精神污染——可持久化线段树+出栈入栈序
  9. Dell EMC PowerEdge R740 服务器的驱动程序和固件更新
  10. Manjaro 配置指南