浅谈Android应用安全防护和逆向分析之apk反编译
作者:handsome黄 发布时间:2022-07-08 01:15:21
概述
这里是Mac环境,如果是window环境的同学,在环境搭建和工具上可以选择Window环境的。先看看需要到的工具;
1、apktool:https://ibotpeaches.github.io/Apktool/install/
2、dex2jar:https://github.com/pxb1988/dex2jar
3、jd-gui:http://jd.benow.ca
注意:工具一定要是当前最新版本的,否则很容易出现一些莫名其妙的错误。
先看一下项目的包结构
然后在简单看MainActivity中的内容。(这里给出该类的内容,只是为了后期和反编译出来的内容做个对比)
好了,下面开始我们的反编译之路了 。我们一个一个工具来说。
安装apktool
当我们下载好apktool.jar以后,可能有的人会有后缀名,都改为apktool.jar,然后终端输入命令open /usr/local/bin,然后将apktool和apktool.jar移到/usr/local/bin文件夹下,就OK了,判断apktool是否安装成功,可以通过命令:apktool 来判断
如果出现红色圈的这一大片,则说明安装成功。
注意:dex2jar和jd-gui不需要安装,直接解压即可。
使用apktool反编译
1、首先使用命令:cd xxx/xxx/xxx (xxx/xxx/xxx代表apk的存放路径)
2、使用命令:apktool d app-debug.apk (app-debug.apk是你的apk名称)
到这一步以后,会在你存放apk包的路径下生成一个文件夹
进入文件夹,你会发现,有我们项目的资源文件和xml文件。那么代码呢???没有看到,别急
在执行一个命令:apktool b xxx (xxx代表刚刚我们生成的文件夹的名称)
执行完上面的命令以后,可以看到文件夹中多了一个build文件夹,而这个build文件夹下的classes.dex文件就是我们最终需要的。
好了,apktool的工作到这里就结束了,下面我们需要另外两个工具dex2jar,jd-gui。
dex2jar
1、使用命令:cd xxx/xxx/xxx (xxx/xxx/xxx代表dex2jar的路径)
2、使用命令:sh d2j-dex2jar.sh -f xxx/xxx/xxx (xxx/xxx/xxx代表classes.dex的路径)
然后在dex2jar文件夹下会生成classes-dex2jar.jar的架包,这个包,就是我们的Java文件代码。
那么怎么看代码呢?jd-gui上场了。打开jd-gui,直接将classes-dex2jar.jar拖进来,就可以可以看到了。
对比一下最前面的MainActivity代码全部被反编译出来了。
很多人就会说,你这个项目是demo,并没有做混淆,所以可以反编译出来??但是,需要知道的是,如果做了混淆,一样可以反编译出来,只不过说里面的很多类名,方法名,变量名等等都是以a,b,c这样的形式存在,但是这种并不影响能过看出你的代码逻辑,只是给阅读增加了一丝的难度而已。所以,项目做混淆,只是最基础的一种方式,还有很多很多我们需要考虑的。
来源:https://www.cnblogs.com/huangjialin/p/10039704.html


猜你喜欢
- 问题现象今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析数据格式:"[1677660600000, 167766
- 动手写一个java版简单云相册,实现的功能是: 用户可以一次上传一个至多个文件。 用户可以下载其他人上传的图片。 用户可以查看其他所有人的图
- 很多方法请看官网地址:hutool官网地址脚本之家下载:https://www.jb51.net/softs/549331.html简介Hu
- 初识LinkedHashMap大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭
- 一、隐藏标题栏 //隐藏标题栏 &
- URL(Uniform Resource Locator)是统一资源 * ,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,
- 本文实例讲述了Android编程使用Fragment界面向下跳转并一级级返回的实现方法。分享给大家供大家参考,具体如下:1.首先贴上项目结构
- @Autowired注解在抽象类中失效最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是
- 题目描述原题链接 :88. 合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m
- 在linux下开发,使用的是C语言。适用于需要定时的软件开发,以系统真实的时间来计算,它送出SIGALRM信号。每隔一秒定时一次c语言定时器
- OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截
- java 引用类型的数据传递的是内存地址java中引用类型的数据,传递的是内存地址,像类,数组,接口,String等等都是引用类型!看下面的
- 在Java的线程执行中,不管是直接继承Thread的方式,还是实现Runnable接口的方式,都不会获取到线程执行的返回结果。这样如果线程在
- Service是什么 Service是一个android 系统中的应用程序组件,它跟Activity的级别差不多,但是他没有图形化界面,不能
- ftp/sftp概念及搭建ftp是一种文件传输协议,让客户端和服务端能够互相传递文件,图片等数据;方便快捷;sftp是ssh file tr
- let 和 var(a): let 声明的变量只在 let 命令所在的代码块内有效(b): let 是在代码块内有效,var 是在全局范围内
- 单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式。单例模式的实现分为两种:饿汉式和
- Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为fi
- 这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信。注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中
- 关于java中遍历map具体哪四种方式,请看下文详解吧。方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 M