反编译

article/2025/10/1 13:54:05

反编译

我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译,一个是对资源的反编译,我们马上来逐个学习一下。
在开始学习之前,首先我们需要准备一个APK文件,为了尊重所有开发者,我就不拿任何一个市面上的软件来演示了,而是自己写一个Demo用来测试。
这里我希望代码越简单越好,因此我们建立一个新项目,在Activity里加入一个按钮,当点击按钮时弹出一个Toast,就这么简单,代码如下所示:

package com.example.killerdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button text = findViewById(R.id.text);text.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this,"我是汉字",Toast.LENGTH_SHORT).show();}});}
}

activity_main.xml中的资源如下所示:
 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/text"android:layout_width="match_parent"android:layout_height="100dp"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

然后我们将代码打成一个APK包,再把它安装到手机上,到这里准备工作就已经基本完成了,接下来就让我们开始对这个Demo程序进行反编译吧。

反编译代码

要想将APK文件中的代码反编译出来,我们需要用到以下两款工具:(下载地址:https://gitee.com/dou1/decompiler-tool.git)

  1. dex2jar 这个工具用于将dex文件转换成jar文件

  2. jd-gui 这个工具用于将jar文件转换成java代码

将这两个工具都下载好并解压,然后我们就开始对Demo程序进行反编译。解压dex2jar压缩包后,你会发现有很多个文件,如下图所示:

其中我们要用到的是d2j-dex2jar.bat这个文件,当然如果你是linux或mac系统的话就要用d2j-dex2jar.sh这个文件。
然后我们将Demo.apk文件也进行解压,如果不知道怎么直接解压的可以先将文件重命名成Demo.zip,然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件,如下图所示:

这个classes.dex文件就是存放所有java代码的地方了,我们将它拷贝到dex2jar解压后的目录下,并在cmd中也进入到同样的目录,然后执行:

d2j-dex2jar classes.dex

执行结果如下图所示:

没有报任何错误,这就说明我们已经转换成功了。现在观察dex2jar目录,你会发现多了一个文件,如下图所示:

可以看到,classes-dex2jar.jar这个文件就是我们借助工具之后成功转换出来的jar文件了。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成java代码。
下面就很简单了,使用jd-gui工具打开classes-dex2jar.jar这个文件,结果如下图所示:

 

OK,由此可见,我们的代码反编译工作已经成功了,MainActivity中的代码非常清晰,基本已经做到了90%以上的还原工作。但是如果想要做到100%的代码还原还是非常有难度的,因为像setContentView()方法传入的参数,其实就是一个资源的id值而已,那么这里反编译也就只能将相应的id值进行还原,而无法变成像R.layout.activity_main这样直观的代码展示。
另外,除了MainActivity之外,还有很多其它的代码也被反编译出来了,因为当前项目有引用support-v4和support-v7的包,这些引用的library也会作为代码的一部分被打包到classes.dex文件当中,因此反编译的时候这些代码也会一起被还原。
好的,学完了反编译代码,接下来我们看一下如何反编译资源。

 

反编译资源

其实细心的朋友可能已经观察到了,刚才Demo.apk的解压目录当中不是已经有资源文件了吗,有AndroidManifest.xml文件,也有res目录。进入res目录当中,内容如下图所示:

这不是所有资源文件都在这里了么?其实这些资源文件都是在打包的时候被编译过了,我们直接打开的话是看不到明文的,不信的话我们打开AndroidManifest.xml文件来瞧一瞧,内容如下图所示:

由此可见,直接对APK包进行解压是无法得到它的原始资源文件的,因此我们还需要对资源进行反编译才行。
要想将APK文件中的资源反编译出来,又要用到另外一个工具了:(https://bitbucket.org/iBotPeaches/apktool/downloads/)

 

  • apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。

关于这个工具的下载我还要再补充几句,我们需要的就是apktool.bat和apktool.jar这两个文件。目前apktool.jar的最新版本是2.0.3,这里我就下载最新的了,然后将apktool_2.0.3.jar重命名成apktool.jar,并将它们放到同一个文件夹下就可以了,如下图所示:

接下来的工作就很简单了,我们将Demo.apk拷贝到和这两个文件同样的目录当中,然后cmd也进入到这个目录下,并在cmd中执行如下命令:

apktool d Demo.apk

其中d是decode的意思,表示我们要对Demo.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:

  • -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
  • -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
  • -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
  • -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。

常用用法就这么多了,那么上述命令的执行结果如下图所示:

这就说明反编译资源已经成功了。
当然即使你在和我执行一模一样的操作,也有可能会在这里反编译失败,比如说会报如下错误:

出现这个错误的原因很有可能是你之前使用过apktool的老版本进行过反编译操作,然后apktool就会在你系统的 C:\Users\Administrator\apktool\framework这个目录下生成一个名字为 1.apk的缓存文件,将这个缓存文件删除掉,然后再重新执行反编译命令应该就可以成功了。
现在你会发现在当前目录下多了一个Demo文件夹,这个文件夹中存放的就是反编译的结果了。我们可以打开AndroidManifest.xml来瞧一瞧,如下图所示:

怎么样?这样就完全能看得懂了吧,然后可以再到res/layout中看一下activity_main.xml文件,如下图所示:

 

可以看到,activity_main.xml中的内容基本和源代码中的内容是一致的,外层是一个RelativeLayout,里面则是一个Button。你可以再到其它目录中去看一看别的资源,基本上都是可以正常还原的,这样我们就把反编译资源的方法也已经掌握了。

 

重新打包

那么对于反编译出来的文件夹,我们能不能重新把它打包成APK文件呢?答案是肯定的,只不过我实在想不出有什么义正言辞的理由可以让我们这么做。有的人会说汉化,没错,汉化的方式确实就是将一个APK进行反编译,然后翻译其中的资源再重新打包,但是不管怎么说这仍然是将别人的程序进行破解,所以我并不认为这是什么光荣的事情。那么我们就不去讨论本身这件事情的对或错,这里只是站在技术的角度来学习一下重新打包的相关知识。
首先我们来看一下通过apktool反编译后的包目录情况,如下图所示:

其中,original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言,语法结构大概如下所示:

看上去有点晕头转向是吗?但是如果你一旦能够看得懂smali文件的话,那么你就可以做很恐怖的事情了——你可以随意修改应用程序内的逻辑,将其进行破解!
不过我对这种黑技术并没有什么太大的兴趣,因此我也没有去做具体研究,但即使是这样,也已经可以对程序的逻辑做一定程度的修改了。比如说当我们点击按钮时会弹出 you clicked button这样一句Toast,逻辑是写在MainActivity按钮点击事件的匿名类当中的,因此这段代码反编译之后一定就会在MainActivity$1.smali这个文件当中,让我们打开瞧一瞧,部分代码如下所示:

 

虽说多数的代码我是看不懂的,但其中第47行实在太明显了,Toast显示的内容不就是在这里定义的么,那么如果我们想把Demo程序hack掉,就可以将这段字符串给改掉,比如说我把它改成 Your app is been hacked
关于smali的语法,网上的资料也非常多,如果你对这门技术十分感兴趣的话可以直接上网去搜,这里我只是简单介绍一下,就不再深入讲解相关知识了。
改了一处代码后我们再来改一处资源吧,比如这里想要把Demo的应用图标给换掉,那么首先我们要准备好一张新的图片。

然后从AndroidManifest.xml文件中可以看出,应用图标使用的是ic_launcher.png这张图片,那么我们将上面篮球这张图片命名成ic_launcher.png,然后拷贝到所有以res/mipmap开头的文件夹当中完成替换操作。
在做了两处改动之后,我们现在来把反编译后的Demo文件夹重新打包成APK吧,其实非常简单,只需要在cmd中执行如下命令:

apktool b Demo -o New_Demo.apk

其中b是build的意思,表示我们要将Demo文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作New_Demo.apk。执行结果如下图所示:

现在你会发现在同级目录下面生成了一个新的APK文件:

不过不要高兴得太早了,目前这个New_Demo.apk还是不能安装的,因为它还没有进行签名。那么如果这是别人的程序的话,我们从哪儿能拿到它原来的签名文件呢?很显然,这是根本没有办法拿到的,因此我们只能拿自己的签名文件来对这个APK文件重新进行签名,但同时也表明我们重新打包出来的软件就是个十足的盗版软件。这里大家学学技术就好了,希望不要有任何人去做什么坏事情。
那么这里我就用一个之前生成好的签名文件了,使用Android Studio或者Eclipse都可以非常简单地生成一个签名文件。
有了签名文件之后在cmd中执行签名命令就可以进行签名了,命令格式如下:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名

其中jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量当中才可以在任何位置执行此命令。
签名之后的APK文件现在已经可以安装到手机上了,不过在此之前Android还极度建议我们对签名后的APK文件进行一次对齐操作,因为这样可以使得我们的程序在Android系统中运行得更快。对齐操作使用的是zipalign工具,该工具存放于<Android SDK>/build-tools/<version>目录下,将这个目录配置到系统环境变量当中就可以在任何位置执行此命令了。命令格式如下:

zipalign 4 New_Demo.apk New_Demo_aligned.apk

其中4是固定值不能改变,后面指定待对齐的APK文件名和对齐后的APK文件名。运行这段命令之后就会生成一个New_Demo_aligned.apk文件

好的,我们把反编译代码、反编译资源、重新打包这三大主题的内容都已经掌握了,关于反编译相关的内容就到这里


http://chatgpt.dhexx.cn/article/u2yq3NLX.shtml

相关文章

解决openai.error.APIConnectionError: Error communicating with OpenAI

一、问题描述 可以fanqiang&#xff0c;但是使用openai的接口还是报错如下的openai.error.APIConnectionError: Error communicating with OpenAI问题&#xff1a; File "D:\Anaconda3\envs\gms\lib\site-packages\openai\api_resources\abstract\engine_api_resource.py…

【Nginx应用】1.理解正、反向代理和负载均衡

在讲解Nginx之前&#xff0c;我们首先要理解什么是正向代理和反向代理。因为Nginx作为负载均衡的作用时&#xff0c;扮演的就是一个代理的角色&#xff0c;理解了正反向代理&#xff0c;对我们接下来学习Nginx会很有帮助1.正向代理 在我们的日常生活中其实就已经使用到了正向代…

软件安全实验——局域网DDoS攻击

文章目录 实验任务实验过程DoS攻击与DDoS攻击ping命令参数实施DDoS攻击 实验任务 对局域网内IP地址为10.12.186.186的主机&#xff08;已关闭防火墙&#xff09;发起基于网络流量的DDoS攻击。 实验过程 DoS攻击与DDoS攻击 DoS是Denial of Service的简称&#xff0c;即拒绝服务…

kali局域网攻击(一)

前言 很久以前的博客才发现&#xff0c;发布一下。 这个系列以后有时间再做。 arp攻击 arp路由链表,感兴趣的自行百度,我的博客我的笔记. 路由指向 介绍两个东西. echo 0 >/proc/sys/net/ipv4/ip_forward #让经过的数据不留通 echo 1 >/proc/sys/net/ipv4/ip_forward…

嗅探欺骗之Ettercap局域网攻击

嗅探欺骗 ——Ettercap局域网攻击 最近在练习使用ettercap工具&#xff0c;下面来介绍一下用ettercap实施嗅探以及欺骗的实验过程。 嗅探&#xff1a; 首先&#xff0c;我们把虚拟机作为攻击者&#xff0c;物理机作为受害者。①在虚拟机中打开一个终端&#xff0c;输入命令ett…

当代局域网攻击软件到底带来了什么

20世纪00年代晚期21世纪初&#xff0c;计算机网络技术及其安全技术得到了迅速发展&#xff0c;出现了一系列新的局域网攻击工具&#xff0c;如Metasploit&#xff0c;它是一款强大的局域网渗透测试开发框架&#xff1b;NetWox&#xff0c;它可以扫描网络中的漏洞&#xff1b;Wi…

局域网arp攻击_ARP局域网攻防浅析

ARP官方释意&#xff1a;地址解析协议&#xff0c;即ARP(Address Resolution Protocol)&#xff0c;是根据获取的一个。发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确定目标的物理地址(MAC)&#xff1b;收到返回…

局域网断网攻击 (arp攻击)

ARP攻击能够实现的技术前提有两个&#xff0c;一是作为攻击者的计算机需要和被攻击者的计算机在一个局域网中&#xff0c;二是作为攻击者的计算机需要知道被攻击者计算机的局域网IP。 环境&#xff1a;安装在VMware Workstation中的Kali Linux&#xff0c;我们需要在VMware的设…

局域网arp攻击_如何排查ARP网络攻击

ARP攻击危害:众所周知,ARP攻击变得日益猖狂,局域网内频繁性区域或整体掉线、IP地址冲突;网速时快时慢。极其不稳定,严重影响了网络的正常通讯。 那么如何排查ARP网络攻击呢? 首先诊断是否为ARP病毒攻击 1、当发现上网明显变慢,或者突然掉线时,我们可以用arp -a命令来检…

从交换机安全配置,看常见局域网攻击

前言 构建零信任网络&#xff0c;自然离不开网络准入(NAC)&#xff0c;这就涉及到交换机的一些安全测试&#xff0c;于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击&#xff0c;那么下面提到的各种攻…

Kali linux 局域网arp断网攻击

Kali linux 局域网arp断网攻击 什么是arp断网攻击&#xff1a; ARP断网攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生大量的ARP通信量使网络阻塞&#xff0c;攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目&…

局域网攻击——基于kali的arp欺骗

大致原理: 大家都知道,在一个局域网中,主机是通过路由器向公网进行发送信息,而路由器则是通过主机的MAC地址来给主机传递信息。 每一个主机都有一个arp缓存表来记录ip地址与对应mac地址, 如果我们的攻击机伪造成别的MAC地址,即可欺骗主机或者局域网网关的arp缓存表,他…

局域网攻击之ARP网关欺骗

目录 1、工具2、原理3、实验4、总结 1、工具 IPOP&#xff08;仅能指定某一台主机攻击&#xff09;、科来 2、原理 恶意用户仿冒网关发出ARP报文&#xff0c;导致网络中其他用户学习到错误的网关ARP表项。 3、实验 第一步&#xff1a;选择网卡&#xff0c;查看网关IP 第…

ARP局域网攻击

/*linux 、unix 下简单的ARP局域网攻击 */ #include<string.h> #include<unistd.h> #include<stdlib.h> #include<net/if_arp.h> #include<net/ethernet.h> #include<sys/types.h> #include<sys/socket.h> #define ARP_LEN 30 //ARP…

局域网断网攻击

一、直接实现局域网某ip断网 arpspoof -i eth0 -t 192.168.183.14 192.168.183.1 其中192.168.183.14为要攻击的ip地址&#xff0c;192.168.183.1为默认网关地址&#xff0c;eth0为自己的网卡&#xff0c;其实就是相当于让流经192.168.183.14的流量经过自己的网卡(本质是arp欺…

Kali Linux 学习日记6 - 局域网攻击

文章目录 交换机工作原理MAC地址泛洪攻击MAC地址欺骗攻击DHCP工作原理DHCP攻击ARP攻击 交换机工作原理 1、交换机中有一个MAC地址表&#xff0c;里面是端口与MAC的对应。初始状态下&#xff0c;交换机的MAC地址表为空。 2、当局域网中主机A与B欲通信时&#xff0c;A先向B发出A…

网络攻击测试软件,局域网攻击软件如何检测

局域网攻击软件通常会导致局域网网速下降&#xff0c;甚至断网的情况发生。对此们可以通过以下学习啦小编介绍的方法来检测并防范此类攻击对网速的影响。 局域网攻击软件的检测方法 可以借助“聚生网管”来检测局域网攻击类软件。直接在百度中搜索下载此工具。 从打开的程序主界…

局域网常见攻击方式原理

文章目录 前言一、ARP欺骗1.查看arp表2.arp原理3.arp欺骗过程 二、DNS欺骗三、DDos攻击总结 前言 简单介绍了常见的局域网攻击方式 一、ARP欺骗 局域网不是根据ip地址&#xff0c;而是根据MAC地址进行传输。破坏MAC地址&#xff0c;会影响传输。例如&#xff0c;MAC地址在A上…

网络安全——局域网内网络攻击手段(MAC地址攻击、ARP攻击、DHCP攻击)

网络安全一直是信息安全的重要内容&#xff0c;而局域网安全又往往是网络安全的一个重要组成部分。局域网内有哪些攻击攻击手段呢&#xff1f;今天主要介绍MAC地址攻击、ARP攻击、DHCP攻击等攻击的原理。要看懂本文&#xff0c;需要有一定的局域网内交换知识、DHCP原理等的理解…

Unity解包提取资源/AssetStudio的简单使用

前言 最近特别想要一款游戏里的语音包&#xff0c;但是原游戏是 Unity 做的&#xff0c;就想到了解包&#xff0c;找了一番发现可以使用 AssetStudio 这款强大的可视化工具。 项目地址&#xff1a;Perfare / AssetStudio 使用 直接在 releases 下载 下载自己需要的版本&…