也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历


Android安全付费专栏长期更新,本篇最新内容请前往:

  • [车联网安全自学篇] Android安全之APK逆向入门介绍

0x01 前言

2021年注定是一个不平凡的一年,这一年每个人都需要付出更多的努力,一定要脚踏实地,默默努力奋斗

0x02 逆向工程的概念

比如你看到别人写的某个exe程序能够做出某种漂亮的动画效果,你通过反汇编、反编译和动态跟踪等方法,分析出其动画效果的实现过程,这种行为就是逆向工程;不仅仅是反编译,而且还要推倒出设计,并且文档化,逆向软件工程的目的是使软件得以维护。

系统级逆向包括在程序上运行各种不同的工具和操作系统服务获取信息,检查程序可执行文件,并跟踪程序的输入输…等等。这些信息大多数来自操作系统,因为根据定义,一个程序与外部世界的任何交互行为都必须通过操作系统

代码级逆向是从程序的进制码,提取设计理念和算法的复杂过程,它要求软件分析师不但要掌握逆向技术,而且还要对软件开发、CPU以及操作系统有相当深入的认识。

软件的复杂度深不可测,即使有编写良好、文档齐全的源代码,人们也会难以理解软件的内部。而代码级逆向是对低级指令的分析,更是难上加难… …

  • 逆向工程

    • 从任何人造的东西中提取知识或者设计规划的过程
  • 计算机领域的逆向工程

0x03 逆向工程的应用

  • 漏洞挖掘与利用
  • 代码检查
    • 比较代码
    • 查找恶意代码
    • 查找软件BUG
  • 代码软件
  • 破解应用
    • 算法理解与学习
    • 添加新功能
    • 绕过验证

… …

0x04 逆向分析的常见流程

0x05 逆向前置技能

0x06 APK 逆向分析

6.1 工具

  • apktool

是Google提供的APK编译工具。

将资源解码成原来的形式
将解码的资源重新打包成apk/jar
组织和处理依赖于框架资源的APK
Smali调试
执行自动化任务
  • dex2jar

可以把dex文件转换成jar文件,jar文件可以通过JD-GUI工具打开

  • jd-gui

是一个图形化的jar查看工具

  • JADX-GUI

JADX 是apk图形化查看工具,比JD-GUI更加强大,可以直接打开apk,查看java源码和xml源码。

  • IDA Pro

付费的反汇编工具,功能非常强大。是目前最好的一个静态反编译软件。可以用于so文件的静态分析,动态调试。

https://hex-rays.com/ida-free/#download

https://down.52pojie.cn/?query=IDA

  • readelf

是用于对C++机器码的分析,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。

  • Xposed Hook

Xposed 是非常强大的动态逆向分析框架,可以动态获取APP运行时参数,修改数据。

  • Android studio

Android Studio 是开发 Android 应用程序的官方 IDE,基于 Intellij IDEA。

https://developer.android.google.cn/studio

  • AndroidKiller

AndroidKiller官方版是一款非常受欢迎的安卓APK反汇编工具,AndroidKiller官方版界面美观大方,功能强劲实用,集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信等特色功能于一身,使用起来简单便捷。

https://down.52pojie.cn/Tools/Android_Tools/

  • ClassyShark

Google官方为Android开发者推出的独立的二进制文件检查工具,因此其权威性和强大毋庸赘言,且得到较好的维护和更新。其github地址为:https://github.com/google/android-classyshark,其支持多种文件格式的解析,包括:库文件 (.dex, .aar, .so), 可执行文件 (.apk, .jar, .class) 和所有的Android二进制XML格式文件如AndroidManifest, resources, layouts等等。另外,很重要的一点,其能分析得出dex文件里面包含的方法数,这对于Android一个著名的问题(方法数超限65535,见https://developer.android.com/studio/build/multidex.html)的解决很有帮助。

  • AXMLParser

AXMLParser仅仅是用于解析APK里面的二进制AndroidManifest.xml,从而得到与原始工程里的AndroidManifest.xml内容一致的可读xml。较轻量级,适用于只想查看和AndroidManifest.xml里面包含的信息,比如包名package,versionCode和versionName,启动Activity等。其原始链接和下载地址为:https://code.google.com/archive/p/xml-apk-parser/

  • AAPT(aapt)

Android SDK中自带的appt工具(位于%ANDROID_HOME%\build-tools%Android version%\aapt.exe,API Level 24及以后版本新增了aapt2,即%ANDROID_HOME%\build-tools%Android version%\aapt2.exe。其中%ANDROID_HOME%是Android SDK的安装目录,%Android version%表示构建版本,完整示例比如"F:\Android\sdk\build-tools\27.0.0\aapt.exe"),其实构建APK的过程中,aapt工具起到了非常关键的作用,比如将原始资源等进行编译,生成R.id等。

反过来,APPt也可以用于解析APK,包括清单文件AndroidManifest.xml中的信息。appt工具的功能很强大,子命令和参数非常丰富。

  • jeb

jeb 静态分析APK

  • Visual Studio Installer

用来分析代码用

  • FernFlower

idea自带的fernflower好用,相比较之下java-decompiler无法反编译lambda表达式,而这个fernflower可以,所以在有lambda表达式的情况下,还是选择fernflower比较好。

https://github.com/fesh0r/fernflower

  • CFR

CFR是一个反编译工具,有时我们开发的时候可能会用到反编译.

http://www.benf.org/other/cfr/

  • IntelliJ IDEA

IntelliJ IDEA 被认为是当前 Java 开发效率最快的 IDE 工具

6.2 反编译流程

1)apk反编译得到程序的源代码、图片、XML配置、语言资源等文件

下载上述工具中的apktool,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的APK文件放到apktool 所在目录下,

打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:

apktool.bat d -f  test.apk  testorapktool.bat d   test.apk

也可以


apktool.bat d  test.apk  objectFolderPath

其中,objectFolderPath为可选项,如果此项不存在,软件将会在apktool文件夹下新建一个apk文件名的文件夹,否则存储到目标文件夹;

(命令中test.apk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为:apktool.bat d -f [apk文件 ] [输出文件夹])

  • classes.dex

classes.dex是java源码编译后生成的java字节码文件(非传统JVM解释执行的class字节码)。

但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。

Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex(或者从压缩文件取出dex文件,直接在PC上面找到dexdump.exe的路径,然后执行命令)。

另外Dedexer是一个反编译dex文件的开源工具,需要自己编译源代码。而当前,还有比如dex2jar(https://github.com/pxb1988/dex2jar)甚至封装好的GUI的工具(比如安卓逆向助手等等,可网上搜索下载)可以反编译dex文件为jar文件,再利用jd-gui(http://jd.benow.ca/)工具打开jar文件,就可以阅读java源代码了。

  • resources.arsc

编译Android资源文件后的生成的二进制文件,resources.arsc有固定的格式,包括了资源索引和字符串资源池等。

  • AndroidManifest.xml

清单文件,该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。

在apk中的AndroidManifest.xml是经过编译的,即是二进制格式,如果直接用编辑器打开,显示会是乱码。因此需要先进行反编译处理,得到原始的AndroidManifest.xml文件。可以通过AXMLPrinter2或aapt工具解开或解析,具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml

  • assets

assets目录可以存放一些配置文件(比如webview本地资源、图片资源、音视频等等),不会经过编译,和原始工程里面的文件是一致的,这些文件的内容在程序运行过程中可以通过相关的API(android.content.res.AssetManager)获得。

  • lib

lib目录下的子目录存放的是一些与手机CPU架构对应的C/C++代码编译生成的so文件,一般用于JNI开发。

  • META-INF

META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。

比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。

  • res

res目录存放经过编译后的资源文件,虽与原始工程目录下的res目录层次结构类似,但是实际上是经过编译处理的,只有图片资源和原始工程是一致,其他类型的资源则是编译处理过,无法直接查看。

从上面对APK内部文件的分析来看,要想反编译或者逆向工程获取信息,其实主要涉及两个方面,一是对classes.dex反编译,转换成jar或者smali等,可以利用dex2jar(https://github.com/pxb1988/dex2jar)等工具生成jar,二是结合resources.arsc和res对资源进行反编译,从而得到原始的资源文件。

用apktool反编译apk得到图片、XML配置、语言资源等文件,然后使用dex2jar反编译apk得到Java源代码

将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar 文件夹内

在命令行下定位到dex2jar.bat所在目录,输入"d2j-dex2jar classes.dex",命令执行完成之后,在当前目录下就可以看到生成的Jar文件了

反编译classes.dex得到classes-dex2jar.jar文件之后,就可以使用【jd-gui】工具将class文件反编译成java源代码了

6.3 分界线

  • MalwareLab_VM-Setup

  • 为我的恶意软件分析 VM 设置脚本

https://github.com/f0wl/MalwareLab_VM-Setup

  • Linux 恶意软件分析工具

https://remnux.org/

https://tsurugi-linux.org/

  • windows 脚本安装逆向分析工具

https://github.com/fireeye/flare-vm

https://github.com/SentineLabs/SentinelLabs_RevCore_Tools

(1)静态分析工具

PE分析工具:pestudio、PE-bear、StudyPE、DiE、DependencyWalker、PEid、

ResourceHacker、CFF Explorer、eXeScope

ELF分析工具:readelf

Mach-O分析工具:MachOView

PDF分析工具:PdfStreamDumper

NET分析工具:de4dot、NetMegaDumper、UnConfuserEx

Office文档分析工具:SSView、OffVis、oletools、rtfdump、VBAPass、objdump

反汇编分析工具:IDA、Radare2、Cutter、jd-gui、JEB、dnSpy、ILSpy、Apktool、ApkIDE

二进制编辑工具:010Editor、XVI32、HxD、WinHex、Hexplorer

(2)动态分析工具

动态调试工具:Ollydbg、Windbg、X64DBG、EDB、gdb、lldb、dnSpy、Radare2、IDA、JEB

网络抓包工具:WireShark、TcpDump、Charles、BrupBuite、Microsoft Network Monitor 3.4

进程监控工具:ProcMon、ApiMonitor、ProcessHacker

6.4 Java 代码静态扫描工具

  • Fortify SCA

  • VCG

https://sourceforge.net/projects/visualcodegrepp/

  • FindBugs 与 FindSecBugs 插件

  • SpotBugs

参考链接:

https://cstsinghua.github.io/2017/02/21/Android%20APK%E9%80%86%E5%90%91%E8%A7%A3%E6%9E%90/


你以为你有很多路可以选择,其实你只有一条路可以走


[免费专栏] Android安全之APK逆向入门介绍相关推荐

  1. [免费专栏] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  2. [免费专栏] Android安全之APK应用程序分析「附带Smali基础语法解析」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  3. [免费专栏] Android安全之检测APK中调试代码是否暴露敏感信息

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  4. [免费专栏] Android安全之Android Xposed插件开发,小白都能看得懂的教程

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  5. [免费专栏] Android安全之Android so文件分析「详细版」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  6. [免费专栏] Android安全之Android APP应用程序的汉化功能 (修改so中的字符串内容)

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  7. [免费专栏] Android安全之数据存储与数据安全「详解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  8. [免费专栏] Android安全之Android Fragment注入

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  9. [免费专栏] Android安全之动态调试APP的一些技巧「Android Studio调试」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

最新文章

  1. pybind11介绍
  2. 单行子查询 多行子查询 关联子查询 笔记
  3. Windows 2000 Active Directory FSMO 角色
  4. SCCM 2007系列教程之六使用组策略实现SCCM客户端
  5. jupyternotebook虚拟环境无法连接服务_详解pycharm连接远程linux服务器的虚拟环境的方法_python...
  6. C#中A a=new B()的意义
  7. JavaScript数组对象简介及其常用方法介绍
  8. Scrum立会报告+燃尽图(Final阶段第四次)
  9. oracle下的数据库实例、表空间、用户及其表的区分
  10. 常用 MySQL 操作
  11. 1991【19CSPS提高组】树的重心 信奥赛Kirito(本人)
  12. 联通将推自有品牌手机沃Phone 基于Android
  13. 国产BI报表工具中低调的优秀“模范生”——思迈特软件Smartbi
  14. 基于android手机实时监控ipcam视频之二:mediastream2
  15. 5G无线网络关键技术
  16. C# 数据操作系列 - 13 SugarSql初探
  17. x*=3+5**2的计算结果python_下面代码的执行结果是________ x = 2 x *= 3 + 5**2
  18. git cherry-pick branch 与 git rebase branch 的区别
  19. ThreadPoolExecutor详解及线程池优化
  20. 2022-2028年中国汽车后市场连锁行业发展策略分析及投资前景研究报告

热门文章

  1. 三大运营商2G—4G网络制式分别是什么
  2. ps入门教程高阶教程各工作领域视频教程合集
  3. 常见web漏洞及防范(转)
  4. 悦享数据-企业级API数据服务
  5. 高分辨轨道阱液质联用质谱仪-HFX
  6. 高效的JSON转换工具
  7. 基于C#的书店零售管理系统#窗体#cs
  8. linux定时任务提示没权限,Linux添加定时任务提示权限不够
  9. Excel文档导出-后端返回文件流,前端实现下载功能
  10. 地理信息系统软件工程与应用开发实验报告