前言

本文目标:

  1. 工具:介绍反编译需要用到的工具
  2. 原理:反编译基本原理
  3. 实践:替换一个未混淆&未加固apk的启动页面

工具

1.Android Studio

版本:Android Studio Dolphin | 2021.3.1 Patch 1

2.Jadx Class Decompiler。

一个集成了jadx-gui的AndroidStudio/IDEA插件。
优点:dex2jar&jd-gui的结合体,使用更方便。

3.apktool

Android apk文件逆向工具。
https://ibotpeaches.github.io/Apktool/

4. jadx

Dex 到 Java 反编译器,用于从 Android Dex 和 Apk 文件生成 Java 源代码的命令行和 GUI 工具。
优点:dex2jar&jd-gui的结合体,有这一个就够了。
缺点:没有mac的可执行程序。
https://github.com/skylot/jadx

5.LibChecker.apk

此应用程序用于查看设备中应用程序使用的第三方库。它可以查看应用程序本机库的ABI体系结构(通常,无论应用程序是64位还是32位)。它还可以查看由The Rule Repository标记的知名库,甚至可以根据库引用的数量对它们进行排序和查看。

非常好用的Android端app分析软件,主要可以用来分析app的基本结构,查看包名等。
https://github.com/LibChecker/LibChecker

6.dex2jar

把dex文件反编译成jar文件。
https://github.com/pxb1988/dex2jar

7.jd-gui

查看jar源码的可执行程序。
http://java-decompiler.github.io/
mac可执行程序在m1上无法运行,可参考:Mac上打不开JD-GUI解决办法

8.java2smali

可以将java&kotlin代码转为smali的AndroidStudio/IDEA插件。
似乎是只能将纯java&kotlin代码编译成smali,据说AndroidX代码会报错,我自己编译Activity也报错了。

9.smali2java

smali2java是一个将smali代码反编译成java代码的工具。
缺点:没有找到可用mac版本。
http://www.hensence.com/cn/smali2java/

10.J2S2J

java转smali,smali转java工具。
缺点:没有找到可用mac版本。
http://lzonel.cn/3056.html

原理

apk

在AndroidStudio中双击一个apk,打开查看apk内的详情,也可以直接用压缩软件解压。

其中:

  1. META_INF文件夹:储存的是关于apk的签名信息,在安装apk时,系统会校验apk的签名信息,判断程序完整性。
  2. res文件夹:存储着apk用到的资源文件。
  3. assest文件夹:原生资源文件,放在这个文件夹下面的文件不会被R文件编译,dex动态加载等时使用。
  4. lib文件夹:存储着c++编译成的so库。
  5. AndroidManifest.xml:存储着apk程序配置信息的清单文件。
  6. class.dex:DEX文件(DalvikVM executes),顾名思义,是Android Dalvik虚拟机上的执行程序,也就是Dalvik字节码,程序的代码都在里面。
  7. resources.arsc:编译后的二进制资源文件。

apktool

反编译apk的核心工具apktool。

一个逆向工程第三方,封闭,二进制Android应用程序的工具。
它可以将资源解码为接近原始的形式,并在进行一些修改后重新构建它们。
它还使应用程序的工作更容易,因为项目,如文件结构和自动化的一些重复性任务,如构建apk等。

dex作为包含程序代码的文件,Android程序的启动运行都是通过类加载器ClassLoader读取dex中的代码运作的。
因此如何修改dex中的代码是反编译的关键所在,而apktool可以将dex反编译成smali文件,我们通过修改smali文件完成“目标”。
因此反编译的大致流程是:

#mermaid-svg-Z5XnbObiV5Lc0sUN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .error-icon{fill:#552222;}#mermaid-svg-Z5XnbObiV5Lc0sUN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Z5XnbObiV5Lc0sUN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .marker.cross{stroke:#333333;}#mermaid-svg-Z5XnbObiV5Lc0sUN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Z5XnbObiV5Lc0sUN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .cluster-label text{fill:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .cluster-label span{color:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .label text,#mermaid-svg-Z5XnbObiV5Lc0sUN span{fill:#333;color:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .node rect,#mermaid-svg-Z5XnbObiV5Lc0sUN .node circle,#mermaid-svg-Z5XnbObiV5Lc0sUN .node ellipse,#mermaid-svg-Z5XnbObiV5Lc0sUN .node polygon,#mermaid-svg-Z5XnbObiV5Lc0sUN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Z5XnbObiV5Lc0sUN .node .label{text-align:center;}#mermaid-svg-Z5XnbObiV5Lc0sUN .node.clickable{cursor:pointer;}#mermaid-svg-Z5XnbObiV5Lc0sUN .arrowheadPath{fill:#333333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Z5XnbObiV5Lc0sUN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Z5XnbObiV5Lc0sUN .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Z5XnbObiV5Lc0sUN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Z5XnbObiV5Lc0sUN .cluster text{fill:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN .cluster span{color:#333;}#mermaid-svg-Z5XnbObiV5Lc0sUN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Z5XnbObiV5Lc0sUN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

反编译
编译
apktool d test.apk
将dex转换为smali
修改smali
apktool b test
未签名的新apk
重新签名apk

Smali

Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。
其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)。

修改Smali有三种方式:

  1. 懂Smali语法,打开直接撸。
  2. 用上述提到的工具转为java代码后修改。
  3. 创建一个新AndroidStudio项目,包名与目标apk完全一致,添加想要类的代码,修改完后打包成debug apk,然后使用apktool反编译拿到对应的smali文件,复制到目标apk的反编译文件中替换对应的smali。

实践

由于我不会smali语法,也没有找到适合mac的smali转换工具,因此采用上述第三种修改Smali的方式。

首先自己打包一个未混淆&未加固的apk作为目标apk。

1.用AndroidStudio打开

在AndroidStudio打开目标apk,打开AndroidManifest.xml,读取包名&启动Activity。

如上图可知:
包名为:com.demon.demonnewest
启动Activity为:com.demon.demonnewest.module.StartActivity

2.根据上述包名创建一个AndroidStudio新项目

添加测试代码:

TestActivity.kt

package com.demon.demonnewestimport android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class TestActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val layout = LinearLayout(this)layout.orientation = LinearLayout.VERTICALval text = TextView(this)val button = Button(this)button.text = "Click"layout.addView(text)layout.addView(button)setContentView(layout)val sb: StringBuilder = StringBuilder()sb.append("TestActivity\n")intent.extras?.run {keySet().forEach {sb.append("$it=${get(it)}\n")}}text.text = sb.toString()button.setOnClickListener {Toast.makeText(this@TestActivity,"Button~",Toast.LENGTH_SHORT).show()startActivity(Intent(this@TestActivity, TestJavaActivity::class.java))}}
}

TestJavaActivity.java

package com.demon.demonnewest;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class TestJavaActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView tv = new TextView(this);tv.setText("TestJavaActivity");Button btn = new Button(this);btn.setOnClickListener(view -> Toast.makeText(TestJavaActivity.this,"Button~",Toast.LENGTH_SHORT).show());LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);layout.addView(tv);layout.addView(btn);setContentView(layout);}
}

3.将新项目打包

直接gradle---Tasks---other---assembleDebug双击运行,打debug包。

然后在app/build/outputs/apk/debug/app-debug.apk找到打包后的apk。

命令行执行apktool d app-debug.apk反编译,找到需要添加的smali。

4.用apktool对目标apk进行反编译

得到反编译后的app文件夹。

apktool d app.apk

5.修改目标apk反编译后AndroidManifes.xml

编辑器直接打开修改即可。

//...
//修改启动Activty为TestActivity
<activity android:exported="true" android:name="com.demon.demonnewest.TestActivity" android:theme="@style/Theme.Start"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity>
//添加TestJavaActivity
<activity android:name="com.demon.demonnewest.TestJavaActivity"/>
//...

6.添加新增的smali

将第三步中我们新增加代码后得到smali复制到smali_classes文件夹中。
随便找一个包含目标包名:com.demon.demonnewest的目录即可。

7.apktool重新编译

如下指令将修改后的反编译文件夹,编译成new.apk。

apktool b app -o new.apk

得到的apk是未签名的是无法安装的,需要签名。

8.重新签名new.apk

不推荐使用旧版的jarsigner进行签名,只能进行v1签名,高版本手机可能无法安装。
新版的v1&v2 签名工具apksigner在版本>25的SDK\build-tools\中。

//windows
java -jar apksigner.jar sign  --ks 你的密钥  --ks-key-alias 别名  --ks-pass pass:密钥密码  --key-pass pass:别名密码  --out 签名后的apk路径  待签名的apk
//mac
./apksigner sign --ks 你的密钥  --ks-key-alias 别名  --ks-pass pass:密钥密码  --key-pass pass:别名密码  --out 签名后的apk路径  待签名的apk

9.安装运行签名后的apk

安装后启动app,启动页已经正常替换,按钮可以正常跳转,初步反编译实践成功。

参考

Android反编译简单实战

Android 反编译初探-基础篇相关推荐

  1. #Android反编译#零基础脱掉360加固包的“外衣”

    我们在开发App的过程中为了保护自己的劳动成果不被剽窃,也为了保证接口不被暴露,通常在上架之前做一些混淆或者加固的处理,市面上也有不少加固工具,更有甚者在某些平台上线App必须使用该平台的加固工具进行 ...

  2. Android 反编译初探 应用是如何被注入广告的

    本文由我的微信公众号:鸿洋(hongyangAndroid)原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/53370 ...

  3. java反编译之 基础篇(class未加密未混淆)

    常用的工具有两个:jd-jui,DJ java Decomplier , 第一个工具最为常用,但有时候,译的也不准备,第二个工具不认带有中文的目录.两个一起用,可以减少语法错误. 从class文件到j ...

  4. Android反编译odex然后重新打包

    #Android反编译odex然后重新打包 最近不知道怎么回事,突然把我那刷了氧OS的root了,然后就开始好奇起来氢OS所带有的那些本地化的东西,比如通话录音就是典型的一个之一.其中也做了很多的尝试 ...

  5. 【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx )

    文章目录 一.apktool 1.apktool 简介 2.直接解压 3.使用 apktool 反编译 4.使用 apktool 重新打包 二.dex2jar 1.dex2jar 简介 2.dex2j ...

  6. Android面试题Java基础篇

    Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech 系列文章目录: ...

  7. Android 反编译整理

    Android 反编译需要用到以下几个工具: Apktool: 这个工具的作用是: It is a tool for reverse engineering 3rd party, closed, bi ...

  8. Android反编译工具的使用(保姆级教程)

    Android反编译工具的使用(保姆级教程) 网上关于Android反编译的文章很多,但是好多都比较杂,就打算自己写一下,顺便也能加深一下印象. 一.常用反编译文件的介绍 apktool apktoo ...

  9. Android 反编译Apk提取XML文件

    Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...

最新文章

  1. 新建silverlight项目提示未将对象设置到实例解决方案
  2. 如何迭代pandas dataframe的行
  3. Codeforces Round #165 (Div. 2) A - Fancy Fence
  4. c语言程序设计字节,C语言程序设计-数据类型
  5. SAP Spartacus UI Duplicated keys has been found in the config of i18n chunks
  6. 739. Daily Temperatures - LeetCode
  7. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
  8. STL应用--SORT自定义排序
  9. SpringBoot日常游玩---当你需要在一个静态方法中使用一个带有其他@Autowried的实现类的时候怎么办
  10. python 身份证验证系统_用Python写一个身份证号码校验系统
  11. IB驱动包下载 : Ubuntu 16.04 的 IB驱动 iso、source包、tgz包
  12. 气死电信 有时用联创宽带上网助手你登不上就改一下MAC地址挺灵 Windows xp 下修改mac地址
  13. 操作电脑时弹出 UAC被禁用 的解决方法
  14. windows vista本该有却没有的功能
  15. xp计算机重启记录,Windows XP中查看计算机开关机记录
  16. 深入浅出matplotlib(9):知道两点坐标画直线
  17. 第二周:1.逆序的三位数(5分)(题目来源中国大学MOOC)
  18. 行测-图形推理-5-一笔画类
  19. 最新!「大象机器人」即将推出双臂人形机器人,智能机器人时代可期!
  20. xx-job任务管理平台

热门文章

  1. POCO C++库入门指南(翻译)
  2. DA18B20 MSP430单片机程序
  3. The APK file does not exist on disk
  4. 浏览器首页被劫持,被迫跳转到360,hao123等页面。。。
  5. 区块链在改善网络安全方面的潜力?
  6. 计算机水平考试三叶草,三叶草学考模拟系统
  7. 数据层面降低NLU误召-构造误召语料
  8. ansilbe模块幂等性
  9. android 即时通讯 xmpp,基于xmpp实现android端实现即时通讯
  10. 网站站点地图SiteMap生成程序(PHP)