头条的_signature这个如何_如何彻底防止反编译,dex加密怎么做
**面试官: 如何彻底防止反编译,dex加密怎么做 **心理分析:面试官想知道你是否有过对dex加固相关的经验,该题想考的是dex加固流程,dex编码有没有了解**求职者:**应该从dex加固流程 ,从项目中开始,dex加固--打包--验证 说起。接下来给大家讲解dex原理分析原理解析下面看一下Android中加壳的原理: [ 在加固过程中需要三个对象:需要加密的APK(源程序APK)壳程序APK
**面试官: 如何彻底防止反编译,dex加密怎么做 **
心理分析:面试官想知道你是否有过对dex加固相关的经验,该题想考的是dex加固流程,dex编码有没有了解
**求职者:**应该从dex加固流程 ,从项目中开始,dex加固--打包--验证 说起。接下来给大家讲解dex原理分析
原理解析
下面看一下Android中加壳的原理: [
在加固过程中需要三个对象:
- 需要加密的APK(源程序APK)
- 壳程序APK(负责解密APK工作)
- 加密工具(将源APK进行加密和壳程序的DEX合并)
主要步骤 用加密算法对源程序APK进行加密,再将其与壳程序APK的DEX文件合并生成新的DEX文件,最后替换壳程序中的原DEX文件即可。得到新的APK也叫做脱壳程序APK,它已经不是一个完整意义上的APK程序了,它的主要工作是:负责解密源程序APK,然后加载APK,让其正常运行起来。 在这个过程中需要了解的知识是:如何将源程序APK和壳程序APK进行合并 这需要了解DEX文件的格式,下面简单介绍一下:
addressnamesize/bytevalue0magic[8]80x6465 780a 3033 35008checksum40xc136 5e17csignature[20]2020file_size40x02e424header_size40x7028endian_tag40x123456782Clink_size40x0030link_off40x0034map_off40x024438string_ids_size40x0e3cstring_ids_off40x7040type_ids_size40x0744type_ids_off40xa848proto_ids_size40x034Cproto_ids_off40xc450field_ids_size40x0154field_ids_off40xe858method_ids_size40x045Cmethod_ids_off40xf060class_defs_size40x0164class_defs_off40x011068data_size40x01b46Cdata_off40x0130
现在只要关注其中三个部分:
- checksum(文件校验码)使用alder32算法校验文件,除去magic、checksum外余下的所有文件区域,用于检查文件错误。
- signature 使用SHA-1算法hash出去magic、checksum和signature外余下的所有文件区域,用于唯一识别本文件。
- file_size DEX文件大小。
我们需要将加密之后的源程序APK文件写入到DEX中,那么就需要修改checksum,因为它的值和文件内容有关。signature也是一样,也是唯一识别文件的算法,还有DEX文件的大小。 还需要一个操作,就是标注加密之后的源程序APK文件的大小,因为运行解密的时候,需要知道APK的大小,才能正确得到源程序APK。这个值直接放到文件的末尾就可以了。 修改之后的DEX文件的格式如下:
知道了原理,下面就是代码实现了。这里有三个工程:
- 源程序项目(需要加密的APK)
- 壳项目(解密源程序APK和加载APK)
- 对源APK进行加密和壳项目的DEX的合并
项目案例
下面先来看一下源程序 1.需要加密的源程序项目:SourceApk [
需要一个Application类,这个到后面说为什么需要: MyApplication.java
package com.example.sourceapk;public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Log.i("demo
更多推荐
所有评论(0)