也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大
少走了弯路,也就错过了风景,无论如何,感谢经历
转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球
感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步
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 test
or
apktool.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 恶意软件分析工具
- 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/
你以为你有很多路可以选择,其实你只有一条路可以走
版权归原作者 橙留香Park 所有, 如有侵权,请联系我们删除。