Android Apk反编译及加密教程

作者:张英爱 时间:2022-01-13 01:01:25 

这几天在上海出差,忙里偷闲学习了一下Apk的反编译工具的基本使用。下面就简单介绍一下如何将我们从网上下载的Apk文件进行反编译得到我们想要获得的资源文件和源码。

一、Apk文件组成

Android的应用程序APK文件说到底也是一个压缩文件,那么可以通过解压缩得打里面的文件内容,不过很显然,当你去解压完去查看的时候,发现里面的很多东西和你想象中的不太一样。资源文件等xml文件基本打不开,即使打开了也都是乱码(而这正是Android进行加密过),有些应用会将图片资源等的也加密(如qq音乐)。

Android Apk反编译及加密教程

Android Apk反编译及加密教程

而既然直接解压无法看到正常的应用程序,那么就需要借助反编译软件来实现APK的反编译。

二、反编译必备工具及使用

Android工程文件主要有资源文件和源代码组成。而为了查看资源文件需要借助一个工具,本文使用的是apktool工具进行反编译,经过编译后能够正确查看XML文件和其他的非XML的资源文件,这对于汉化而言有着巨大的意义。而为了查看源码,则需要借助于dex2jar和jd-gui这两个工具,其中dex2jar工具负责将dex文件转化为jar文件,而jd-gui则用于查看jar文件。

1)apktool

一次失败的经历-----使用apktool时报错

Android Apk反编译及加密教程

原因:apktool的版本过低,无法解析当前版本的apk。

修正:

更新最新的apktool版本后正常,本文使用的最新apktool版本为2.2.2.

然后就可以发现资源文件等xml文件可以正常打开。

Android Apk反编译及加密教程

Android Apk反编译及加密教程

Android Apk反编译及加密教程

2)Dex2jar 

接下来就需要对source code进行反编译。

需要借助工具Dex2jar和jd-gui。其中Dex2jar,顾名思义就是将dex文件反编译为jar文件。而jd-gui则用于直接查看jar包中的源代码。

具体步骤就是将apk文件解压,得到其中的classes.dex,它就是java文件经过编译而后通过dx工具打包而成的,而后解压下载的dex2jar,将classes.dex复制到dex2jar根目录下,在命令行下定位到该目录下,运行d2j-dex2jar.bat classes.dex classes.dex

Android Apk反编译及加密教程

可以发现得到一个classes-dex2jar.jar文件。这个文件就是我们需要得到的source code。

Android Apk反编译及加密教程

3)jd-gui

接下来需要在jd-gui中浏览该文件,这个就是最终的结果

Android Apk反编译及加密教程

当然,你也发现了这些源码都是被混淆了的,即用无意义的字母来重命名类、成员变量、方法和属性以及删除没用的注释。

三、Apk的加密过程

既然都提到了这里了,我们也顺便了解一下Android Apk的加密过程。

由于Java字节码的特殊性,使得它非常容易被反编译,(正如刚才我们进行的那些操作,借助一下工具就反编译了一个QQ音乐的Apk),因此,显然我们会有一些保护措施,对编译好的Class文件进行一些保护。通常我们都会使用ProGuard来对Apk进行混淆处理,用无意义的字母俩重命名类、成员变量、方法和属性。(当然它能删除一些无用的类、成员变量、方法和属性以及删除没用的注释,最大程度优化字节码文件)

而现在我们一般都采用Android Studio作为开发平台,在该平台下可以很方便的使用ProGuard,在Gradle Script文件夹下,打开build.gradle(Module:app)文件,显示如下:

Android Apk反编译及加密教程

这里的minifyEnable即为控制是否启动ProGuard的开关,设置为true则开启ProGuard进行混淆和优化。

而proguardFiles分为两部分,前半部分是一个系统默认的混淆文件,位于SDK目录下的tools/proguard/proguard-android.txt,一般情况下使用这个默认的文件即可,另一部分是项目中自定义的混淆文件,可以在项目中的App文件夹中找到这个文件,在这个文件夹中可以定义引入的第三方依赖包的混淆规则。配置好ProGuard后,只要使用AS导出Apk,即可生成混淆后的字节码文件。

来源:https://www.cnblogs.com/zhangyingai/p/7087373.html

标签:Android,Apk,反编译,加密
0
投稿

猜你喜欢

  • Android Studio实现仿微信APP门户界面详解及源码

    2022-06-29 20:08:52
  • RocketMQ broker文件清理源码解析

    2022-04-28 07:09:12
  • C#枚举类型与位域枚举Enum

    2023-03-02 06:52:27
  • java中动态 代理的实现

    2023-11-17 16:16:25
  • Android开发工程中集成mob短信验证码功能的方法

    2022-12-15 06:37:02
  • 详解Guava中EventBus的使用

    2021-09-13 07:36:34
  • JAVA面试题 从源码角度分析StringBuffer和StringBuilder的区别

    2023-07-24 07:29:07
  • Java分布式锁的概念与实现方式详解

    2022-07-11 19:33:57
  • java8新特性将List中按指定属性排序过滤重复数据的方法

    2023-06-16 17:57:42
  • 详解Spring 中如何控制2个bean中的初始化顺序

    2023-05-06 13:43:18
  • JAVA内存溢出解决方案图解

    2023-07-22 14:57:23
  • WinForm实现仿视频播放器左下角滚动新闻效果的方法

    2021-11-04 19:43:41
  • 教你怎么用Java开发扫雷游戏

    2023-07-22 09:49:26
  • C#实现SMTP邮件附件发送功能详解

    2022-08-14 10:09:38
  • 关于c#中单例模式的一些问题

    2022-01-21 08:56:18
  • Springboot处理配置CORS跨域请求时碰到的坑

    2023-12-20 11:40:45
  • 教你怎么在IDEA中创建java多模块项目

    2023-05-28 19:25:58
  • SpringBoot 配合 SpringSecurity 实现自动登录功能的代码

    2023-07-22 04:58:22
  • Java8简单了解Lambda表达式与函数式接口

    2022-11-07 00:22:31
  • 浅析Spring Boot中的spring-boot-load模块

    2023-11-23 02:39:31
  • asp之家 软件编程 m.aspxhome.com