Android逆向工具简单介绍

一、Android逆向概述

Android APK生成过程
在这里插入图片描述

1、什么是Android逆向

  • 安卓开发中代码和资源文件打包成 APK 的过程主要包括:编译、加密和打包。安卓逆向就是解压、解密和反编译了。
  • 安卓逆向说白了就是重新获取 APK 的源码,甚至有些灰产会修改部分应用内容之后重新打包。
  • 正道用途的话,很多大企业有安卓逆向工程师,负责企业应用的安全工作,“以子之矛,攻子之盾”,测试加强自己应用的安全性。
  • 我们 Android 开发工程师有时候也会用一些逆向小技巧,看看竞品的应用某个功能实现方法之类的。

2、逆向过程

  • 我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包,逆向就是要最大程序地还原出APK打包之前的源码。
  • 逆向需要用到解密、反编译、解压缩等技术,想要100%还原APK的源码几乎是不可能的,所以在实际进行逆向分析的时候,一般都是根据想实现的目的,分析出APK的部分源码和实现逻辑,然后对这一部分源码进行修改后与原始的APK打包在一起,这样就获得了一个实现自己特定目的的APP。

3、逆向用途

1)APP自动化执行程序脚本

比如有这么一个场景:某APP在某天某一时刻将推广一个领代金券的活动,只要登录账号,进入领取页面即可领取一张面额100元的无门槛代金券。很显然,这是一个可以撸羊毛的活动,如果我收集了100个账号,在那天利用某些手段确保每个账号抢到一张代金券,那我就能抢到100*100=10000元的代金券,再利用网络把这些券打7折卖出去,就能赚个7000块,是不是很爽?!通过安卓逆向分析,我就能把登录、领券的动作做成一个自动化执行的插件,我先把所有账号和密码保存起来备用,到了领券的开放时间,立即自动登录、领券,一个账号领券完,自动切换登录另一个账号,一气呵成就把所有账号的券都领到手。这就是安卓逆向的用途之一,可以自动化批量执行APP的一系列动作。类似地,如果想实现批量登录账号、点赞、评论,同样也是可以的。

2)修改APP的功能

不知道大家有没有遇到过,有些APP经常提示要更新,有些必须强制更新才能使用,可我就是不想更新,这时候也可以用逆向技术来实现修改APP的某些功能。通过逆向分析,找到触发更新的代码,然后把它屏蔽掉,这样打开APP后就再也不会提示更新了。

3)APP安全
  • 主要是针对安卓手机APP进行反编译调试分析APP安全性,包括APP漏洞、反编译对抗、防破解及代码注入,根据漏洞及数据来完全一些特定需求,分析市面上的外挂辅助及制作原理。
  • 部分灰色产业会寻找某些应用弱点从而进行攻击,或者对应用植入病毒、添加广告后重新打包分发,鉴于此,安全管家需要通过逆向工程,获取安卓病毒源码等进行分析。

二、常用逆向工具介绍

1、APP抓包工具

1)Fiddler
  • Fiddler是一款强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
  • Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。
  • 代理(中介):代理就是在客户端和服务器之间设置一道关卡,客户端先将请求数据发送出去后,代理服务器会将数据包进行拦截,代理服务器再冒充客户端发送数据到服务器;同理,服务器将响应数据返回,代理服务器也会将数据拦截,再返回给客户端。
  • Fiddler可以抓取支持http代理的任意程序的数据包,如果要抓取https会话,要先安装证书。(注意:ios需要在设置里面信任一下不然有些https包会抓不到)
  • 关键注意点:必须确保安装fiddler的电脑和手机在同一个wifi环境下。
2)Wireshark
  • wireshark是非常流行的网络封包分析软件,功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。
  • 使用wireshark必须熟悉相关网络协议。
  • 为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。
  • wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容,如果是处理HTTP、HTTPS还是用Fiddler抓包工具, 其他协议比如TCP,UDP 就用wireshark抓包工具。
  • Wireshark 的强大之处在于它不仅能捕获数据包,还能对捕获的数据进行进一步的分析。具体来说,对pcap包的分析可以分为:
    • 过滤功能——输入过滤规则,并显示符合规则的分组
    • 统计功能——对所有/部分数据包的情况进行总览
    • 分析功能——将某些字段作为过滤器应用&启用/停用某些协议
    • 查找功能——在所有/部分数据包中查找特定值
    • 查看功能——查看字段/分组/会话的字节流

2、jadx反编译工具

  • jadx 是一款功能强大的反编译工具,使用起来简单方便(拖拽式操作),不光提供了命令行程序,还提供了 GUI 程序。一般情况下,我们直接使用 GUI 程序就可以了。
  • jadx 支持 Windows、Linux、 macOS,能够帮我们打开.apk.dex.jar.zip.class等格式的文件。
  • 如果需要反编译一个 jar 包查看其源码的话,直接将 jar 包拖入到 jadx 中就可以了;如果想看看某个 apk 的源码,我们拿到 apk 之后直接拖入进 jadx 中就可以了。
  • jadx:命令行版本;jadx-gui:图形操作界面版本。
  • 常用功能:
    • 搜索功能:jadx 自带强大的搜索功能,支持多种匹配模式。通过 Navigation 即可打开搜索功能,我们可以选择搜索指定的类,方法,属性,代码,文件,甚至是注释。
    • 查看类、变量或者方法使用情况:对于某个类、变量或者方法,我们还可以查看哪些地方使用了它。直接选中对应的类、变量或者方法,然后点击右键选择 Find Usage 即可。很快,jadx 就会帮你找出整个项目有哪些地方使用了它。
    • 添加注释:我们还可以自定义注释到源代码中。选中对应的位置之后,点击右键选择 Comment 即可。
    • 反混淆:一般情况下,为了项目的安全,我们在打包发布一个 apk 之前都会对其代码进行混淆加密比如用无意义的短变量去重命名类、变量、方法,以免代码被轻易破解泄露。经过混淆的代码在功能上是没有变化的,但是去掉了部分名称中的语义信息。为了代码的易读性,我们可以对代码进行反混淆。在 jadx 中,我们通过 Tools -> Deobfuscation 即可开启反混淆功能。

3、APKDB

APKDB是一款针对Android OS系统的APK反编译修改程序,集合了当今最强悍,最犀利的APK及Dex文件编译工具。正常安装后,它直接在【鼠标右键】创建快捷菜单,非常方便汉化工作者对APK或Dex文件进行简易的反编译回编译操作。

主要使用场景:

  • 查看xml资源文件,主要是AndroidManifest.xml
  • 针对apk和zip文件增加签名操作,只要【鼠标右键】点击,选择【签名XX文件】即可!签名前无需删除原来的【META-INF】签名数据,本工具会判别apk还是zip并自动删除签名数据。
  • Windows下显示APK自身图标,便于区分待反编译的APP.

4、Frida之Hook工具

frida是一款基于python + java 的hook框架,是一个开源、免费、跨平台的Hook工具,可运行在Windows、iOS、Linux、Android等各平台,主要使用动态二进制插桩技术。

Android平台上的Hook工具有像Xposed这一类的,它们通常只能对Java层进行Hook,每次修改逻辑代码,都要更新目标设备上的Apk,使用起来,总让人感觉有些不方便。而Frida就不一样了,不仅支持对Java层的Hook,还支持对 Native层的so库文件进行Hook,并且每次修改逻辑,也不需要安装新的Apk到目标设备上,因为它的Hook逻辑不需要打包成Apk,写好逻辑就能直接运行看效果,非常方便,节省了很多折腾的时间,提升了工作效率。另外Xposed只能Hook安卓系统,而Frida是所有系统通吃,可谓是Hook最佳选择。

  • 主要特点:

    • 平台支持 Android、IOS、Windows、Linux、MacOS 等
    • 在Android系统上,不仅支持对Java层的Hook,还支持对 so库文件Native层的Hook
    • 支持 Python 语法或 js 语法编写Hook脚本
    • 有VSCode扩展,支持Frida语法智能感知,敲代码无忧
  • 插桩技术
    插桩技术是指将额外的代码注入程序中以收集运行时的信息,可分为两种:

    • 源代码插桩[Source Code Instrumentation(SCI)]:额外代码注入到程序源代码中。
    • 二进制插桩(Binary Instrumentation):额外代码注入到二进制可执行文件中。
      • 静态二进制插桩[Static Binary Instrumentation(SBI)]:在程序执行前插入额外的代码和数据,生成一个永久改变的可执行文件。
      • 动态二进制插桩[Dynamic Binary Instrumentation(DBI)]:在程序运行时实时地插入额外代码和数据,对可执行文件没有任何永久改变。
  • DBI使用
    (1)访问进程的内存
    (2)在应用程序运行时覆盖一些功能
    (3)从导入的类中调用函数
    (4)在堆上查找对象实例并使用这些对象实例
    (5)Hook,跟踪和拦截函数等等

5、IDA反汇编工具

IDA Pro 是一款交互式的反汇编器和调试器,用于对可执行二进制文件做静态分析和动态分析。IDA Pro 可以分析各种平台的各种格式的可执行二进制文件,比如:ELF、windows PE、Android dex、Java .class、Python .pyc 等等。IDA 的核心处理器模块甚至可以通过 SDK 扩展,用于支持自定义格式的二进制文件分析。

1)为何反汇编
  • 分析恶意软件。
  • 分析闭源软件的漏洞。
  • 分析闭源软件的实现方式和交互操作。
  • 分析编译器生成的代码,以验证编译器的优化选项和正确性。
  • 配合调试器显示程序指令。
2)如何反汇编

大致的流程:

  • 确定需要进行反汇编的代码区域。(并不像看起来这么简单,指令和数据通常混杂在一起)
  • 逐条读取指令,查表,输出汇编语言描述符。(需处理:指令长度可变、指令前缀影响指令行为、指令操作数确定等问题)
  • 确定各个函数的起始和结束位置。

反汇编常用的方法有两种:

  • 线性扫描法。
  • 递归下降法。

相对来说,线性扫描法实现起来比较容易,objdump 就是使用此种方法。线性扫描法的主要缺点,是无法有效的将指令和数据分离,有时会错误的把数据部分反编译成指令。递归下降法强调控制流的概念,控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编,很大程度上克服了线性扫描法带来的缺点,IDA Pro 使用递归下降法进行反汇编。

3)IDA Pro 的基本功能:
  • 对可执行文件进行静态分析。
  • 修改可执行文件,生成 patch。
  • 调试可执行文件。(动态分析)
4)IDA目录结构

在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容

  • cfg:包含各种配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用户界面配置文件idatui.cfg,
  • idc:包含IDA内置脚本语言IDC所需要的核心文件
  • ids:包含一些符号文件
  • loaders:包含用于识别和解析PE或者ELF
  • plugins:附加的插件模块
  • procs:包含处理器模块
5)常用快捷键

IDA中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上你只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个常用的:

  • a:将数据转换为字符串
  • f5:一键反汇编
  • 空格:流程图 与 线性表之间转换
  • Tab:C语言与汇编之间转换
  • esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
  • shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
  • ctrl+w:保存ida数据库
  • ctrl+s:选择某个数据段,直接进行跳转
  • ctrl+鼠标滚轮:能够调节流程视图的大小
  • x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
  • g:直接跳转到某个地址
  • n:更改变量的名称
  • y:更改变量的类型
  • /:在反编译后伪代码的界面中写下注释
  • \:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
  • ;:在反汇编后的界面中写下注释
  • ctrl+shift+w:拍摄IDA快照
  • u:undefine,取消定义函数、代码、数据的定义
6)常用设置
  • 拍摄快照

    由于IDA不提供撤销的功能,如果你不小心按到某个键,导致ida数据库发生了改变,就得重新来过,所以要记得在经常操作的时候,加上快照:file–>take database snapshot

    加完快照后,会生成一个新的ida数据库文件,本质上是有点像另存的操作

    快捷键:ctrl+shift+w

  • view–>open subviews: 可以恢复你无意中关闭的数据显示窗口

  • windows–>reset desktop: 可以恢复初始ida布局

  • option–>font: 可以改变字体的相关属性

猜你喜欢

转载自blog.csdn.net/johnWcheung/article/details/127507686