Android 逆向工程,反编译心得

news2024/12/23 13:48:51

前言

apk的反编译是我们在Android开发中绕不开的一个坎,对于反编译这门技术,我们应该抱着学习的态度,学的越多,也越能防备别人反编译我们,这就是所谓的知己知彼吧,哈哈

需要准备的工具

  • Apktool,解包和重新打包都需要它
  • dex-tools,可以直接把apk中的classes.dex文件反编译为.jar文件
  • jd-gui,直接查看.jar文件中的java文件
  • JEB,同时满足dex-tools和jd-gui的功能,但反编译出来的代码不太一样,可以互相对照
  • Notepad++,非常强大的文档编辑器,用来查看各种文件,修改.smali我用的就是它
  • Android SDK target版本的build-tools中的apksigner,用于给打包好的apk签名

具体实现

apktool

Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps.

用来解包和重新打包apk的工具,命令最多只用得到几行,可以反编译出AndroidManifest.xml和各种资源文件。

解包

这句命令是指在D:\tools\apk_tool_2.7.0文件夹中有一个test.apk文件,这个test.apk文件反编译到同路径下的test文件夹中,该操作会反编译AndroidManifest.xml和res的资源文件

apktool d D:\tools\apk_tool_2.7.0\test.apk -o D:\tools\apk_tool_2.7.0\test

但需要注意的是,重新打包时不能用反编译过res和AndroidManifest.xml的文件夹打包,不然会报错,不会反编译AndroidManifest.xml和res的命令如下:

apktool -r d test.apk

这句命令省略了当前文件路径和输出文件夹路径,和上面的命令相差只是在d前面多加了一个-r

该操作不会反编译AndroidManifest.xml和res的资源文件,可以被重新打包

重新打包

把apktool相同路径下的test文件夹重新打包为test.apk

apktool b test

 dex-tools

github地址:

GitHub - pxb1988/dex2jar: Tools to work with android .dex and java .class files

 我们把需要反编译的apk准备好,例如我这里准备了一个test.apk,现在我们需要获取这个apk中的classes.dex文件。

有两种办法:

方法一是右键用xx压缩软件打开

 直接解压这两个文件出来即可。

方法二是把.apk文件的后缀名改为.rar或是.zip,然后再用压缩软件打开,剩下的步骤是一样的。

注:一定要解压所有名为classes.dex和classes[n].dex的文件,n是数字

 这个时候,我们就可以把下好的dex-tools解压出来,并且把我们刚刚解压出来的classes.dex文件丢进来,如图所示:

使用起来非常简单,在未配置环境变量时(默认不配置),打开命令行进入到当前目录(快捷方法是按住shift键,在当前目录右键空白处

输入命令:d2j-dex2jar.bat [文件名]

d2j-dex2jar.bat classes.dex

如果提示如下信息:

 则在命令前面加上".\"即可

.\d2j-dex2jar.bat classes.dex

这条命令仅仅只是反编译1个classes.dex文件,如果有多个classes.dex文件,我们需要依次反编译

因为这里我有两个classes.dex文件,所以最后我能反编译出两个.jar文件

jd-gui 

下载地址:

Java Decompiler

想要阅读.jar文件我们就需要jd-gui,下载完成后解压出来如图所示,我们双击运行jd-gui.exe即可

 

打开刚刚我们反编译出来的两个.jar文件 ,就可以阅读源码!此时的源码一般都是被混淆过的

 JEB

官网文档地址:

下载地址和激活教材在参考博客中,但可能并不存在时效性

JEB Decompiler

JEB是一个非常强大的逆向工程工具,我仅仅只会粗略的使用,更加进阶的使用请查阅官方文档或其他博客,本文仅做浅显的使用

JEB下载好之后直接双击运行jeb_wincon.bat即可

 语言设置

我们可以在Edit->Language->中文(中文)把JEB设置为中文界面,设置完后需要重启才能生效

在JEB中,我们可以直接打开.apk文件,会自动帮我们反编译,既可以查看java源码也可以对照查看smali

打开.apk时,会弹出以下界面,我们可以进行一些反编译的设置,但默认就足够用了,我们直接点击确定即可 。等待一会

 点击转换后,可以看java代码和smali对照

注:JEB的横向查看代码需要按住shift+鼠标滚轮,就可以横向滑动了 

 JEB的debug调试

JEB还有一个非常实用的功能,就是把一个apk重新打包为可调式的包,并且可以在JEB中打断点进行调试,具体步骤如下:

如果你的apk文件是可调式的安装包,则可以直接进行第3步

  1. 重新打包为可调试的apk
  2. 为apk重新签名
  3. 打断点,使用JEB进行debug调试

 重新打包为可调试的apk

jeb自带一个makeapkdebug的命令可以帮助我们直接重新打包出可以调试的apk

在有jeb_wincon.bat的文件夹下,打开cmd或power shell窗口,test.apk中的test是apk名称

命令如下:

jeb_wincon.bat -c --makeapkdebug -- test.apk

为apk重新签名 

 重新打包出来的apk需要重新签名才能够安装和调试,所以找到我们安装Android SDK的目录,找到build-tools文件夹,目前我的最新安装版本为13,因此我使用的是33.0.0的构建工具,找到文件夹中存在apksigner.bat即可

 然后我们随意准备一个签名文件,我这里使用的是Android Studio新建一个签名,步骤如图所示:

随意打开一个工程,点击Build-> Generate Signed Bundle / APK

 

选啥都行,点next 

点击create new 

key store path 是保存签名文件的路径

第二行Password 是签名文件的密码

然后来到Key标签页

第一行 Alias 是秘钥的名称

第二行 Password 是秘钥的密码

Validity是签名有效期

Certificate标签页是提供你的个人信息证明

第一行是名称

第二行是组织单位名称

第三行是组织名称

第四行是所在城市或区域

第五行是所在州或省份

第六行是所在的国家代码

 

 填写完之后就在刚刚填写路径的地方生成好了一个.jks的签名文件

这里为了方便省事,我把这个签名文件和重新打包后可以调试的apk文件,直接复制到apksigner.bat所在的文件夹,同样的,在这个文件夹打开命令行(方法同上),运行命令进行签名

--ks后跟的是签名文件的名称,test_debuggable.apk是我们重新打包可以调试的apk文件,运行命令之后,我们还需要输入签名文件的密码别忘了!这里输入密码是看不到的,输完直接回车即可

apksigner sign --ks 123456.jks test_debuggable.apk

更多命令详见官方文档  

 apksigner  |  Android 开发者  |  Android Developers

签名好之后,我们就可以用这个apk在JEB上进行断点调试了! 

打断点,使用JEB进行debug调试

手机或模拟器连接好之后,我们把刚刚签名好的apk重新打开,打好断点,点击开始调试

断点只能打在smali文件中,快捷键为ctrl+B

官方调试文档说明:Debugging - JEB Decompiler

 点击开始后,会让你选择需要调试的设备和需要调试的包,选中设备和包之后点击attach/附上就可以开始调试了

至此,我们进行到了最后一步,找到关键代码后,我们需要进行修改并重新打包为可以我们自己使用的apk

在第一步中,想要重新打包,就必须得使用apktool的这个解包命令,然后修改对应的.smali文件

apktool -r d test.apk

修改完.smali文件后,记得保存!然后使用apktools重新打包,最后再去签名,签名完就可以使用我们修改后的apk了! 

参考博客

JEB动态调试Smali-真机/模拟器(详细,新手必看) - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos下Harbor的安装(超详细+避坑)

前提 这篇文章讲的是在我的本地虚拟机上安装Harbor的一些过程和中途所遇到的一些问题和排除问题的情况说明;安装好的harbor的访问信息如下:http://192.168.45.146:8033/harbor(admin/Harbor12345)环境 本次所使用的环境和软件的各…

国外APP外包开发及上线流程

现在很多APP都做成全球通用版,尤其是一些小游戏类的APP,玩法全球基本都类似,在多个国家上线多个销售渠道。今天和大家分享一下Google Play上线流程及注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

ChatGPT:AI时代的创造力激活

《你好,ChatGPT》是一本深入探索人工智能(AI)领域的畅销书籍,它以ChatGPT为切入点,系统地介绍了AI和AIGC的基础概念、技术原理、应用领域和未来展望。这本书通俗易懂,由浅入深,层层递进&#xf…

WMS仓储管理系统解决方案能帮助电子企业解决哪些问题

WMS仓储管理系统解决方案是一种针对仓库管理的软件系统,它能够有效地解决电子企业在仓储管理方面的问题。在电子行业,由于产品的生命周期较短,且需求变化快速,WMS仓库管理系统的应用对于电子企业的管理有着重要的意义。本文将探讨…

DATAV通过配置nginx代理实现https访问

DATAV通过配置nginx代理实现https访问 首先要确保你的 datav 和 datav_proxy 的界面能用http正常访问 在nginx中添加datav配置 server {listen 8181 ssl;server_name localhost;ssl_certificate server.crt;ssl_certificate_key server.key;ssl_session_cache …

“来此加密“:轻松在线申请多域名和泛域名SSL证书

启用SSL证书是网站安全的关键。它加密数据传输,防止黑客窃听和篡改。SSL证书提升网站可信度,增加用户信任。搜索引擎更青睐启用SSL证书的网站,提高可见性和流量。此外,SSL证书还防止钓鱼和恶意软件威胁,保护用户安全。…

A-21S吸金树脂在金矿尾水、镀金废水中回收金的应用

吸金树脂Tulsimer A-21S 一、技术介绍 传统上使用活性碳吸附金子,珍贵的金会被活性碳吸附于表面,再藉由洗涤或直接焚烧以回收金。使用离子交换树脂回收贵金属比活性碳还具有多方面的优势, 因为藉由特殊制造过程中, 我们可以在其结…

python---动态类型

动态类型:是指在程序运行过程中,变量的类型可能会发生改变。 a的类型随着程序运行过程中会发生改变。 后面写不写类型是无所谓的! 相比之下静态类型的语言是更好的! 代码注释 可以使用’‘’ ‘’‘ / #来对代码进行注释

03_堆+MAT工具

堆栈方法区的关系: HotSpot是使用指针的方式来访问对象: Java堆中会存放访问类元数据的地址 reference存储的就是对象的地址 三种JVM: Sun公司的HotSpotBEA公司的JRockitIBM公司的J9 VM 一、堆体系概述 Java7之前 Heap 堆:一个…

LabVIEWCompactRIO 开发指南36 确定“Clock Ticks”或模拟时间

LabVIEWCompactRIO 开发指南36 确定“Clock Ticks”或模拟时间 桌面执行节点可以控制模拟时间,因此开发人员可以使用模拟I/O在开发计算机上执行期间更改关键点的激励。要成功使用此功能,需要测量FPGA VI完成所需的时间,或者需要以直观地知道…

将矩阵各行顺序进行反排numpy.flipud()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将矩阵各行顺序进行反排 numpy.flipud() [太阳]选择题 请问关于以下代码的表述错误的是? import numpy as np a np.array([[1,2,3],[4,5,6],[7,8,9]]) print("【显示】a: \…

PLC/DCS系统中电磁干扰的来源及解决办法

自动化系统中所使用的各种类型DCS/PLC等自动化设备,有的是集中安装在控制室,有的是安装在生产现场和各种电机设备上,它们大多处在强电电路和强电设备所形成的恶劣电磁环境中。要提高这类控制系统可靠性,必须消除各种干扰才能有效保…

lwIP更新记08:TCP 回调函数中调用 tcp_abort 终于安全了

从 lwIP-1.4.0 开始,tcp 回调函数中调用 tcp_abort 函数终于安全了。 在此之前,如果从 tcp 回调函数中调用 tcp_abort,则会访问未分配的内存。 应用程序关闭连接,正常情况下是调用 tcp_close 函数,经过 4 次握手安全的…

XSS - 跨站脚本攻击

一、XSS简介。 XSS跨站脚本(Cross-Site Scripting,XSS)自1996年诞生以来,如今已经历十多年的演化。由于和另一种网页技术-层叠样式表(Cascading Style Sheets,CSS)的缩写一样,为了防…

Netty和Tomcat的区别、性能对比

文章目录 一、Netty和Tomcat有什么区别?二、为什么Netty受欢迎?三、Netty为什么并发高 ? 一、Netty和Tomcat有什么区别? Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基…

【AI创作】用AI创作助手写的文章--提问Git系列

目录 解释 Git 的基本概念和使用方式。Git 的使用方式如下: git常用命令有哪些?git异常报错解决方法最后 解释 Git 的基本概念和使用方式。 Git 是一种分布式版本控制系统,它通过记录文件的变化来管理文件版本,可以保存文件的历史…

在树莓派上控制GPIO常用的编程语言有哪些

在树莓派上控制GPIO(General Purpose Input Output,通用输入输出接口),比较常用和简单的编程语言有: 1. Python 这是树莓派官方推荐语言,控制GPIO只需要导入RPi.GPIO库,简单易学,代码如下: import RPi.GPIO as GPIOGPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.…

​路由器端口映射怎么设置?内网IP不能映射怎么办?​

使用路由器后,Internet用户无法访问到局域网内的主机,因此不能访问内网搭建的Web、FTP、Mail等服务器。路由器 端口映射功能可以实现将内网的服务器映射到Internet,从而实现服务器对外开放。 建议在设置路由器端口映射之前,确认以…

ServletOutputStream下载文件名中文乱码或不显示

废话不多说,直接上代码。。。 下载文件名中文乱码或不显示情况 下载文件名是一道下滑线 改造代码 pdfName是下载文件的名字,带后缀。 String s URLEncoder.encode(pdfName, "utf-8").replaceAll("\\", "%20"); Stri…

生成式人工智能(generative AI)对公共部门的影响

作者:Leanne Link, Dave Erickson 在过去的几个月里,我们看到了对生成式人工智能 (generative artificial intelligence - GAI) 的极大兴趣。 人们正在试用 ChatGPT 等 GAI 应用程序,企业正在思考它对客户体验、会计、营销等方面的影响。 鉴于…