android逆向工程反编译指南(详细教程)

article/2025/10/24 9:27:11

要反编译一定要用到工具。
apktool是谷歌官方推出的反编译软件,只能说还能用。而且至今没有好用的IDE。android反编译就是通过apktool这个工具来实现的。其他的GUI环境,例如AndroidKiller都是给apktool套了一个壳而已。不过不得不提的是AndroidKiller这个软件还是非常的好用的,虽然已经不再更新,里面的提供的一些小工具还是非常的实用。

最简单反编译

使用AndroidKiller可以非常简单反编译apk(只是例子简单)。
首先我们用Android Studio创建一个HelloWorld,不做任何的事情,我们要实现的功能就是修改App的名字。
打开apk,AndroidKiller会自动帮我们反编译成下面的这些文件,底层使用的apktool.jar这个工具。App的名字定义在res/values/strings.xml文件里面,里面有一个name="app_name"的字段。把值修改为“被反编译了”。
然后点击左上角的编译,AndroidKiller会自动帮我们打包并加签名。如果成功的话,会在日志的最后一行告诉你生成的apk的位置。这个就是我们反编译的文件了。把这个文件安装到模拟器或者真机上就可以了。
修改Apk名字就这几个步骤,非常的简单。
这里我推荐是用windows的模拟器,不要用Android Studio自带的模拟器,因为不能安装第三方应用。安装应用的时候,不要用AndroidKiller提供的安装功能,因为windows老是找不到设备,非常的难用,还要用adb查找连接,后面会介绍。编译完成后,手动将apk拖到模拟器安装。

在这里插入图片描述
在这里插入图片描述

反编译步骤

第一步:反编译
通过apktool反编译apk,生成反编译代码。
第二步:修改想要修改的代码或者资源
这是最重要也是最难的地方,99%的工作量都在这。
第三步:重新打包
修改后的资源和代码重新打包
第四步:签名
重新打包后的apk是没有签名的,不能够安装,安装的话会卡住或者报错。AndroidKiller这个工具可以帮我们一键打包签名。手动也是可以的,后面会介绍。

注意,如果是android studio开发的debug apk实际上也是不能安装的,在android studio里面能安装是因为android studio帮我们做了一些事情,直接安装是不行的。都是需要签名的。

最传统最原始的反编译方式

或者说是最基础的反编译方式就是用apktool.jar这个工具来进行反编译。
通过下面的命令可以直接反编译一个apk。

java -jar apktool.jar d test.apk
PS C:\Android\reverse> java -jar apktool.jar d test.apkI: Using Apktool 2.6.1 on test.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Administrator\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

编译完会生成下面的目录和文件。
在这里插入图片描述
和第一个例子一样,我们修改res/values/strings.xml文件里面,里面有一个name="app_name"的字段。把值修改为“被反编译了”。
然后通过下面的代码重新打包:

 java -jar apktool.jar b test 

默认情况下会在反编译目录下生成一个dist目录,里面就是重新打包的akp。
在这里插入图片描述
因为变到不同的目录还是有点不方便,我们可以指定重新打包的生成位置
下面的代码指定重新打包的位置为当前位置,这样方便调试。

 java -jar apktool.jar b test -o release.apk

虽然我们重新打包了apk,但是这个apk是不能安装的,因为没有签名会安装失败。
下一步我们需要重新签名。签名有很多种方式,下面的这种比较简单,需要用到signapk.jar这个文件,testkey.x509.pem testkey.pk8这些文件都是signapk.jar附带的,直接百度就能搜索到这些文件。有了这些文件后,调用下面的代码就可以给apk签名了。
如果签名成功,就可以直接安装了。

java -jar signapk.jar testkey.x509.pem testkey.pk8 release.apk release-signed.apk

实战:修改TextView文本

如果TextView的文本不是写死在xml中的,而是通过setText()方法设置的,那么反编译的难度就不是一个级别的,这就需要懂安装的汇编代码。
源码如下。

public class MainActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView=findViewById(R.id.textview);textView.setText("This is a Text");}
}

反编译后汇编代码在smali目录下面,我们的目标是修改MainActivity里面的setText()方法。
在这里插入图片描述
打开MainActivity.smali,发现下面这些奇怪的代码(片段)。虽然看不太懂,不过没关系,是有关键字表格的,后面会提到,这里我们发现了一些我们非常熟悉的代码,比如findViewById,setText,这不就是我们想要的代码吗?

   invoke-virtual {p0, v0}, Lcom/example/apktooldemo/MainActivity;->findViewById(I)Landroid/view/View;move-result-object v0check-cast v0, Landroid/widget/TextView;iput-object v0, p0, Lcom/example/apktooldemo/MainActivity;->textView:Landroid/widget/TextView;.line 17const-string v1, "This is a Text"invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

很明显,我们需要关系的是下面这三行代码,setText需要传入参数,v1参数就是文本内容,这时候我们就可以手动修改这些文本内容了。我们把 “This is a Text"改为"This is a Dog”

    .line 17const-string v1, "This is a Text"invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

然后通过上面已经提过的打包,签名,就完成对setText文本的修改了。
大致步骤如下

 第一步:java -jar apktool.jar d change_text.apk第二步:修改smali代码第三步:java -jar apktool.jar b change_text -o change_text_b.apk第四步:签名java -jar signapk.jar testkey.x509.pem testkey.pk8 change_text_b.apk change_text_b_signed.apk

确实修改成功了!
在这里插入图片描述


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

相关文章

(史上最全)C语言快速入门宝典(一)

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️欢迎关注:👍点赞🙌收藏✍️留言       今天给大家分享C语言中…

C语言入门(一):初识C程序

C语言入门&#xff08;一&#xff09;&#xff1a;初识C程序 网址&#xff1a;C语言入门 1-2 C程序结构 简单来说&#xff0c;一个C程序就是由若干头文件和函数组成。 #include <stdio.h> // 包含头文件&#xff0c;预处理 int main() // 在最新的C…

C语言入门这一篇就够了!!!-万字长文(前半部分)

C语言-万字长文总结 前言一、C语言-简介二、C语言-程序结构2.1 程序结构2.2 无头文件-错误解析 三、C语言-基本语法3.1 关键字3.2 标识符3.3 注释 四、C语言-数据类型4.1 整数类型4.2 浮点类型4.3 void 类型 五、C语言-变量5.1 变量类型5.2 变量的定义、声明5.3 Lvalues和Rvalu…

C语言入门教程合集

目录 第一章 初识C语言 1.C语言基础知识 2.C语言的构成 3.第一个C语言程序 4.数据类型 5.C的标识符 5.1标识符的命名规则 5.2标识符的分类 6.变量 6.1定义变量的方法 6.2变量的分类 6.3变量的使用 6.4变量的作用域和生命周期 7.常量 7.1符号常量 7.2字符串常量…

简单c语言入门

[TOC](目录 ## 前言 内容 ​​# 1.第一个C程序 # 2.标识符 # 3.变量 # 4.数据类型 ### 1.1整型 ### 1.2浮点型 ### 1.3字符型 # 5.运算符 # 6.符号常量 # 7.标准化输入输出 # 8.语句结构 ## 1.1顺序结构 ## 1.2择结构 ## 1.3循环结构 ## 9.break和continue语句…

零基础学C语言(C语言入门)

C语言入门&#xff08;初识C语言&#xff09; 初识C语言 前言什么是C语言为什么要选择C语言作为学习的第一门语言一.第一个C语言程序1.1 #include1.2 int main()1.3 printf1.4 return 01.5小结 二.C语言的数据类型三.C语言的常量与变量3.1常量3.2变量 总结 前言 什么是C语言 …

C语言入门教程,C语言自学教程(2022年)

一、C语言入门教程&#xff0c;C语言自学教程 经过多年的时间洗礼&#xff0c;C语言俨然已成为“第一”语言&#xff0c;出色的性能使之成为高级语言中的性能王者。这么牛的语言&#xff0c;你是不是想知道怎样学习和掌握它呢&#xff1f;接下来请看经过小编整理过的C语言入门…

C语言从入门到精通

文章目录 C语言1.helloworld1.1 pause1.2 cls清屏1.3 加法运算1.4 hello 2 常量变量和数据类型2.1 常量2.2 变量2.3 sizeof数据类型大小2.4 无符号整型2.5 字符类型2.5.1 字符类型简介2.5.2 字符类型运算 2.6 实数型2.7 进制和转换2.8 数据溢出 3. 运算符和分支循环语句3.1 字符…

单片机及C语言入门

一、什么是单片机&#xff1f; 将CPU芯片、存储器芯片、I/O接口芯片和简单的I/O设备&#xff08;小键盘、LED显示器&#xff09;等装配在一块印刷电路板上&#xff0c;再配上监控程序&#xff08;固化在ROM中&#xff09;&#xff0c;就构成了一台单片微型计算机&#xff08;简…

【零基础】入门C语言这一篇就够了

初识C语言 1. 什么是C语言&#xff1f;2. 第一个C语言程序2.1 如何写代码2.2 运行代码 3. 数据类型3.1 为什么出现这么多类型&#xff1f;3.2 如何使用数据类型3.3 数据类型的大小 4. 变量、常量4.1 定义变量的方法4.2 变量的命名4.3 全局变量和局部变量4.4 变量的使用4.4.1 sc…

C语言入门学习(入门级C语言)

一、初识C语言 【定义】C语言&#xff1a;一种通用的计算机语言&#xff08;人和计算机交互的语言&#xff09;&#xff0c;广泛用于底层软件开发。 C语言是一门面向过程的编程语言。 【如何写语言代码】 第一步&#xff1a;写出主函数&#xff08;main函数&#xff09; C…

C语言入门教程(一)

C语言入门教程&#xff08;一&#xff09;&#xff1a;输入输出函数、程序中的数据 本文为初学 C语言的学习日志篇一。 实验环境 Ubuntu 16.04 终端gccgedit 代码如下&#xff1a; #include<stdio.h> int main() {int a,b,c;printf(" Please enter a value: &q…

c语言零基础入门(完整版)

1软件下载 官网下载: https://sourceforge.net/projects/orwelldevcpp/ 百度网盘&#xff1a;https://pan.baidu.com/s/1mhHDjO8 提取密码&#xff1a;mken 推荐用百度网盘&#xff0c;官方下载太慢了 开始安装 首先双击打开刚刚下载的软件 点击0k 因为在安装过程中不能使用…

【C语言】 基础知识入门

目录 一&#xff1a;C语言结构 二&#xff1a;C标准库 三&#xff1a;C程序执行过程 编写过程 四&#xff1a;数据类型 五&#xff1a;变量在内存中的存储 六&#xff1a;C基本数据类型 一&#xff1a;C语言结构 1.1 C语言允许分割代码和数据 可以使用具有局部&#xff0…

《零基础看得懂的C语言入门教程 》——(一)脱离学习误区

本节视频连接&#xff1a; https://www.bilibili.com/video/BV1Qv411t7ae 新手C语言学习有些误区你应该知道&#xff0c;这样学习起来事半功倍~ 一、前言 距离上一次编写C语言的教程是5年前了&#xff08;2015年&#xff09;&#xff0c;由于自己是从初一时开始学习编程&…

c语言入门这一篇就够了-学习笔记(一万字)

内容来自慕课网&#xff0c;个人学习笔记。加上了mtianyan标签标记知识点。 C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C语言结构体 https://www.imooc.com/course/programdetail/pid/37 c语言入门 C语言一经出现就以其功能丰…

C语言基础知识快速入门(全面)

目录 什么是C语言 计算机语言发展 写第一个C语言代码 基本格式 数据类型 单位 变量 作用域 生命周期 常量 函数 数组 数组初始化 操作符 位操作 赋值 单目操作 关系/逻辑/条件 逗号表达式 关键字 字符串 定义 结束标志 局别 求字符串长度 转义字符 注释…

初识C语言———C语言基础入门

目录 一.什么是C语言 二.第一个C语言程序 三.数据类型 四.常量、变量 1.常量 2.变量 2.1定义变量的方法&#xff1a; 2.2变量的分类&#xff1a; 2.3变量的作用域和生命周期 五、字符串转义字符注释 1.字符串 2.转义字符 3.注释 六、选择语句 七、循环语句 八、…

2021年最新C语言教程入门,C语言自学教程(最全整理)

一、c语言教程入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语言教…

C语言程序入门(零基础入门)

C语言一面世就以其简洁紧凑、灵活方便。运算方便、数据结构丰富、适用范围广、执行效率高等特点在全世界迅速推广。c语言也是其他众多高级语言的鼻祖语言&#xff0c;所以学习c语言是进入编程世界的必修课。 一 C语言的书写规则 &#xff08;1&#xff09;一个说明或一个语句…