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

爱加密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文件结构例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

解壳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层。这样的保护方法保护的意义并不大,由于反编译出源代码后通过keyword搜索非常快就行找到验证的代码块。略微一改动这验证保护就全然无效了。

2) server验证

       在android 的java层获取签名信息。上传server在服务端进行签名然后返回验证结果。

这样的保护还不如在纯java层验证实用,一旦没有网络验证保护就无效了。

用android方法获取的签名信息用java方法也能够获取。验证存放在server上也是为了把保护正确的签名信息值,可是保护的意义事实上没有不论什么作用,相同破解后全局搜索keyword然后伪造一个正确的签名信息就可完美破解了。

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. Unity编译Android的原理解析和apk打包分析

    作者介绍:张坤 最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用Android的部分原理进 ...

  2. 如何加密android apk

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

  3. Android中的Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  4. Android中的Apk的加固(加壳)原理解析和实现(转)

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  5. 【转】Android中的Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  6. android黑科技系列——Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  7. android加固系列—6.仿爱加密等第三方加固平台之动态加载dex防止apk被反编译

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5402599.html ] 此方案的目的是隐藏源码防止直接性的反编译查看源码,原理是加密编译好的 ...

  8. Android中插件开发篇之----应用换肤原理解析

    一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...

  9. android apk 自我保护技术-加密apk

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

随机推荐

  1. 异步IO简介

    最近想学习一下libevent,就先翻译一下libevent的官方文档吧. 英文原文链接:http://www.wangafu.net/~nickm/libevent-book/01_intro.ht ...

  2. ecshop 嵌入地图加载不了问题

    在ecshop 添加一个标识商家地理位置信息. 百度地图,加载不出来,查了下发现跟 js/transport.js 与 js/utils.js 两个文件有关在需要插入地图的地方去掉这两个文件的引用 地 ...

  3. dedecms织梦二级菜单的实现方法

    首先,复制代码: 程序代码 {dede:channelartlist typeid='top' cacheid='channelsonlist'} {dede:channel type='son' n ...

  4. 解决xp共享的批处理文件

    在空白地方点右键选择新建一个文本文档,将默认的“新建 文本文档.txt”文件名改名为以下红色加粗字体内容,再复制红色内容以下的黑字部分到改名后的文档.其他文件生成的方法相同.完成后根据需要双击CMD扩 ...

  5. cygwin编译ffmpeg移植到android平台问题集锦

    编译环境: windows xp Cygwin 1.1.3.1 NDK r9 1.提示各种command not found 比如 ./config.sh: line 6: $'--arch=arm\ ...

  6. EasyUI篇の日期控件

    页面代码: <input type="text" id='astartTime' class="easyui-datebox" style="w ...

  7. Oracle问题解决(sqlplus无法登陆)

    命令行 sqlplus 无法登陆,常常是用户名/密码错误.监听配置错误或未启动.数据库服务名丢失等等原因. 用户名/密码错误 找到自己设的密码 这全靠自己创建数据库实例时,备份或记住相关信息 若最后没 ...

  8. myeclipse spket spket-1.6.23.jar 破解安装教程

    一年前安装文档就写过了,今天写破解文档,本来开发js/ext是想用aptana的,但是安装包100多M,我还是用spket吧(才11M),这个需要破解一下license,否则用不了. 一 安装教程如下 ...

  9. C#程序设计基础——字符串

    C#字符串使用string关键字声明,且由一个或多个字符构成的一组字符. 串联字符串 串联字符串是将一个字符串追加到另一个字符串末尾的过程.使用“+”或“+=”运算符串链字符符文本或字符串常量.串联字 ...

  10. Android Studio使用远程依赖时下载不了jar包的解决方法

    使用AS很大的一个好处就是可以使用在线jar包,只需在引用jar包的时候在版本后加上+,比如: compile 'com.facebook.fresco:fresco:0.1.0+' 这样不用在jar ...