Android 逆向工程,反编译心得

2023-11-16

前言

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 逆向工程,反编译心得 的相关文章

  • Android 卷页动画

    我对 Android 动画有点陌生 目前我正在开发一个故事活动 需要像 iPhone 中那样使用卷页动画 我发现 iPhone 中有一种方法可以做到这一点 但我仍然找不到在android中做的方法 所以请帮我解决这个问题 谢谢大家 谷歌代码
  • 如何使用 WifiEnterpriseConfig 设置“使用系统证书”

    我想为我的应用程序的用户配置企业 WiFi 网络 因此 用户必须输入用户名和密码 其余的由应用程序处理 身份验证由 RADIUS 服务器 FreeRadius 3 处理 该服务器使用 LetsEncrypt 颁发的证书 因此无需导入我自己的
  • 如何在android中批量插入sqlite

    我正在使用 SQLiteOpenHelper 进行数据插入 我需要插入2500个id和2500个名字 所以花费了太多时间 请任何人帮助我如何减少插入时间 我们可以一次插入多条记录吗 任何人都可以帮助我 先感谢您 代码 public clas
  • app-release-unsigned.apk 未签名

    我在 github 上下载了 Android 应用程序的 zip 文件 并尝试运行它 但出现一个包含此消息的对话框 app release unsigned apk is not signed Please configure the si
  • Android SQLite 从代码中转储数据库以进行错误报告

    我正在为我的一个 Android 程序开发一种诊断工具 本质上 如果用户遇到问题 我想做一些类似 SQLite 的事情dump 参考 http www sqlite org sqlite html http www sqlite org s
  • 在新的菜单提供程序 API 弃用“setHasOptionsMenu”后,隐藏 Fragment 中的菜单项并在导航返回上再次显示它们

    大约一个月前 Android 团队弃用了onCreateOptionsMenu and onOptionsItemSelected 也setHasOptionsItemMenu 不幸的是 这破坏了我所有的代码 我的应用程序有很多片段 当用户
  • android.view.InflateException:二进制 XML 文件行 #11:膨胀类 ImageView 时出错

    我只是尝试制作一个小的 android java xml 应用程序来计算游戏的分数 它给了我这个错误 Error inflateing class ImageView 有人知道解决方案吗 我实际上搜索了 ppl 说添加这个 android
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • ProgressBar.setInminateDrawable() 不起作用

    当我尝试更改我的 indeteminateDrawable 进度条就消失了 我必须更改我的进度条的可绘制对象 我尝试了invalidate requestLayout等 我不知道如何解决它 谢谢 这里的代码 progressBar setI
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • 如何使用 MotionLayout 调整 TextView 的大小

    我正在尝试创建一个CollapsingToolbar动画使用MotionLayout 我已经成功地将所有内容设置为动画 使其表现得像CollapsingToolbar具有高度的灵活性 这意味着我可以轻松创建很棒的动画 而无需编写大量代码 我
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • 如何为 flutter 绘图应用实现橡皮擦功能

    有一个关于通过 flutter 创建绘图应用程序的视频 YouTube https www youtube com watch v yyHhloFMNNA 它支持当用户点击屏幕时绘制线 点 但我找不到像 Android 本机那样擦除用户绘制
  • 通知操作而不启动新活动?

    我计划提供一个包含两个操作的提醒通知 一个用于批准登录请求 一个用于拒绝登录请求 通过单击这些操作中的任何一个 我希望向我的服务器发出 HTTP 请求 最重要的是 我不想启动新的 Activity 或根本不想将用户重定向到我的应用程序 Co
  • 如何向开关对象添加/更改波纹效果

    下面是我自定义的开关 红圈是默认的波纹效果 我发现设置一个波纹可绘制作为开关的背景 控制波纹的颜色
  • 如何从图库动态卸载图像?

    我有自定义 ImageView public class ShadowedImageView extends ImageView private Paint mPaint public Bitmap bitmap null private
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • 应用程序关闭时单击 Firebase 通知后打开特定活动/片段

    我知道这个问题似乎重复 但根据我的要求 我在网上搜索了很多帖子 但没有任何对我有用 我的要求 我正在使用 Firebase 来获取推送通知 当应用程序打开时意味着一切正常 但我的问题是 如果有任何推送通知出现 应用程序处于后台 关闭意味着我

随机推荐

  • 脑电EEG常用的特征

    最近学习有关脑电的一些基础知识 基于深度学习对脑电信号进行分类时 首先需要对脑电信号进行预处理 滤波等 这时一般不能将其作为数据进行学习 更常见的是提取脑电信号的特征 然后再用深度学习发掘特征与不同情绪的关联 脑电信号常见的特征有 时域中
  • CLR 完全介绍

    From http msdn microsoft com zh cn magazine cc164193 aspx http msdn microsoft com en us magazine cc164193 aspx Code down
  • 刷脸支付服务商提供极致的用户体验

    刷脸支付正在攻占人们生活中的各个场景 在北京 可能依靠刷脸就可乘坐地铁了 据报道 北京地铁部门已开始测试面部识别技术 目前正在机场线内部测试中 一旦验证成功 将会在全路网铺开 最近一个月 垃圾分类成了热点 全国开始进入生活垃圾强制分类新时代
  • Myabtis_Plus

    一 自动填充 准备工作 添加新的字段create time update time 在实体类中需要进行自动填充的字段添加注解 TableField fill FieldFill INSERT private Date createTime
  • Unity 获取Animtor Controller 动画控制器的参数,层级

    获取Animator中的Parameters参数 Trigger Int Float等类型 UnityAPI Animator parameters 获取所有参数 获取Layer层 UnityAPI Animator layerCount
  • sql 自定義百分比轉換小數函數

    CAST 和 CONVERT 函数 Percentage DECLARE dec decimal 5 3 var varchar 10 hun decimal 5 1 set dec 0 025 set hun dec 100 set va
  • 通过vue和element-ui框架写前台

    首先我们运维一般写web界面很多都会使用bootstrp jquery 现在vue其以简单 不用直接操作dom 深受广大非前端爱好者的喜欢 前端只用写界面 后台关注界面就可以了 实现前后台分离 flask如何引入vue js和element
  • shell脚本启动java类或者jar包实践

    1 直接在shell脚本中执行class文件 代码目录如下 在目录下执行bash test sh命令 shell脚本test sh的代码如下 java Xmx2048m Xms2048m XX MaxNewSize 2048m XX Max
  • 第二篇,ESP8266烧录固件 各种版本解决方案 mqtt 安信可固件 记录于2021年6月30日

    1 硬件连接准备 1 1对于esp8266 01和esp8266 01s 特别需要进行注意 RX接TX TX接RX 3 3V接3 3V GND接GND IO0接GND 一定要注意这一步 烧录的时候如果不行话 直接重新上电就可以 反复几次 就
  • Windows server 服务器com安全编辑限制选项灰色

    在一次Windows server 系统运维中 项目实施方搭建OPC时遇到了com 安全编辑限制选项灰色的问题 当时百度查找了很多但是也没查到 但是能确定应该是组策略和注册表中用户administrator权限不够的问题 查找资料中发现Dc
  • 2021->2022

    也就随便写写了 记得去年的年终和期望目标 我写了好多个方面的自我剖析 可能大概有三四千字吧 再回去看看 还是水了一些 这很正常 大多数人都是这样的 况且我比较佛系 复盘还是要的 期望还是要提的 虽然明知一年过后 可能达成的不多 但这也是一次
  • 医疗知识中台白皮书

    该白皮书显示 医疗行业平均医护人员供给不足 优质医疗资源过于聚集 医疗资源质量短期难以大幅提高等问题突出 与此同时 遵循医疗逻辑的智能化开放平台 医疗知识中台 正在成为解决这一难题的突破口 关注公众号 互联互通社区 回复 ZTZL053 获
  • 通用网关接口(摘录)

    维基百科 自由的百科全书 通用网关接口 Common Gateway Interface CGI 是一种重要的互联网技术 可以让一个客户端 从网页浏览器向执行在 Web 服务器 上的程序 请求数据 CGI 描述了客户端和这个程序之间传输数据
  • 【Python-利用动态二维码传输文件(四)】使用pyautogui库录屏(连续截图),然后利用OpenCV逐张读取截图,识别当中的二维码信息,并把信息重组成原文件

    程序示意图 目录 一 使用pyautogui库 对电脑屏幕进行录屏 二 使用OpenCV库对100帧截图进行识别 并与原29帧二维码图片内含信息进行比对 三 把获取的100帧二维码信息去重 并保持原来顺序 重组成原来的文件 四 小结和完整代
  • Java前后端分离动态国际化(动态配置扩展性高)

    介绍 主要是针对前后端分离场景国际化系统设计 亮点 1 动态国际化配置 2 可维护性 3 国际化数据池化 性能高 4 后端数据内容动态国际化 5 提供前台动态国际化数据 6 后台异常国际化处理 7 可动态添加国际化的语种 8 国际化配置集中
  • React中路由组件的lazyLoad

    1 通过React的lazy函数配合import 函数动态加载路由组件 gt 路由组件代码会被分开打包 const Login lazy gt import pages Login 2 通过
  • 生成一定相关性的二元正态分布

    生成一定相关性的二元正态分布 摘要 二元正态分布 二元正态分布概率密度函数 二元正态分布随机数的生成 程序实现 多元正态分布的情况 生成服从 N
  • 【http】10,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]

    1 概述 本日使用http远程连接获取远程接口信息报错 10 000 milliseconds timeout on connection http outgoing 0 ACTIVE 022 12 23 09 54 15 181 ERRO
  • C潜规则篇之防止重定义

    C程序编译时常出现类似xxx redefinition错误 除了模块间的命名冲突 命名污染及static 问题多数与头文件管理有关 大型C工程的头文件管理很麻烦 C源文件往往包含很多头文件 头文件又包含其他头文件 形成复杂的嵌套包含 C没有
  • Android 逆向工程,反编译心得

    前言 apk的反编译是我们在Android开发中绕不开的一个坎 对于反编译这门技术 我们应该抱着学习的态度 学的越多 也越能防备别人反编译我们 这就是所谓的知己知彼吧 哈哈 需要准备的工具 Apktool 解包和重新打包都需要它 dex t