Table of Contents
1. Android Hook框架Frida实践Part1-安装和使用
1.1. Hook是什么?
hook是一种技术,与编程语言无关,以下引用维基百科的解释:
钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语, 指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。 处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 钩子编程有多种用途,如调试、扩展功能。 例如在键盘或鼠标事件到达应用程序之前拦截这些事件;拦截应用程序或其他模块的操作系统调用以监督行为、修改功能。
简单的来讲,一个程序执行的顺序为A->B,通过hook对目标程序进行插桩,将执行顺序改为 A->X->B, 这个X过程就是我们hook实现的插桩代码,在X实现过程中,我们可以对A->B之间的数据和逻辑进行接管。 比较常见的应用场景就是各种软件的注册机验证绕过和外挂程序。
1.2. Hook框架介绍
在Android平台,主流的hook框架除了Frida,还包括Xposed和Substrate。 Xposed是一个比较成熟的hook框架,可以完美的在dalvik虚拟机上做到hook任意java方法, 而Substrate则只适用于对native层的hook。
frida 是一款基于 python 和 java 的 hook 框架,是一种动态插桩工具, 可以插入代码到原生App的内存空间中,动态的监视和修改其行行为, 它不但可以hook java层,也能hook nactive层。
在实际安全研究中,我们对 App 进行逆向和动态调试、或自动化分析、需要不断的进行动态调试, Frida 的动态和灵活性对逆向和自动化逆向提供了很大帮助,同时,相较于xposed,frida动态执行不需要重启。
但是如果需要持久化的 Hook 还是需要通过 Xposed 等框架来实现。
1.3. Frida框架介绍
先说下Hook过程中的代码插桩技术,代码插桩可分为两种:
- 源代码插桩[Source Code Instrumentation(SCI)]:额外代码注入到程序源代码中。
二进制插桩(Binary Instrumentation):额外代码注入到二进制可执行文件中。
静态二进制插桩[Static Binary Instrumentation(SBI)]:在程序执行前插入额外的代码和数据,生成一个永久改变的可执行文件。
动态二进制插桩[Dynamic Binary Instrumentation(DBI)]:在程序运行时实时地插入额外代码和数据,对可执行文件没有任何永久改变。
动静态修改内存实现作弊一直是刚需,比如某些外挂程序,本质上frida做的跟它是一件事情,都是通过修改内存在改变程序的执行逻辑,理论上是可以用frida来写外挂(实际上确实存在)。
出于编译型语言的特性,机器码在CPU和内存上执行的过程中,其内部数据的交互和跳转,对用户来讲是看不见的,在逆向的工作中,使用frida可以帮助我们拿到这些不可见的数据。
当然如果手上有源码,甚至哪怕有带调试符号的可执行文件包,也可以使用gbd、ida等逆向工具去快速分析,但是在实际研究过程中,大部分的APP对于我们来说都是黑盒。
frida就提供了动态二进制插桩技术,使我们能够对app进行逆向和动态调试、甚至自动化分析以及规模化收集信息。同时还能够细粒度的流程控制和代码级的可定制体系,以及不断对调试进行动态纠正和可编程调试。
frida使用的是python、JavaScript等“胶水语言”也是它火爆的一个原因,可以迅速将逆向过程自动化,以及整合到现有的架构和体系中去。
frida可运行在Android、iOS、Linux和windows等多个平台,它的安装环境和配置要求都非常简单兼容性也非常好,对于逆向者操作破解来说非常方便,因为你只需要编写一段 Javascript/Python/C 代码就能轻松地对指定的函数进行Hook。
frida架构图如下所示:
通过Frida框架,我们可以做到的事情包括但不限于:
- 访问进程的内存空间
- 改变程序运行逻辑
- 调用目标程序中的函数
- 在堆上查找对象实例并使用这些对象实例
- Hook,动态跟踪、拦截变量和函数
- 记录目标代码块执行覆盖率等
更多的介绍详见官网 firda
1.4. 安装和使用
frida 框架的安装包括客户端和服务端。
Python安装环境,adb工具包,android模拟器请自行安装。
- 客户端安装
运行在本机,用于将要注入的 JS 代码发送到服务端,并接受服务端发来的消息。
客户端安装不分平台,只需要支持Python环境即可,同时需要安装adb工具。
执行pip命令安装frida客户端:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple frida frida-tools
查看版本,如果有类似如下版本输出信息,则客户端安装成功。
╰─ frida version ____ / _ | Frida 15.0.2 - A world-class dynamic instrumentation toolkit | (_| | > _ | Commands: /_/ |_| help -> Displays the help system . . . . object? -> Display information about 'object' . . . . exit/quit -> Exit . . . . . . . . More info at https://frida.re/docs/home/
- 服务端安装
运行在目标设备中,用于注入JS代码到目标进程,操作内存数据,并将相关信息发送至给客户端。
从frida下载页面下载服务端可执行文件,以 frida-server- 开头,注意目标平台CPU架构。
可以通过adb命令查看cpu架构:
adb shell getprop ro.product.cpu.abi
本次实验选用的是 x86-64 的android虚拟机,因此下载包为 frida-server-15.0.2-android-x86_64.xz
解包之后push到目标设备中
unxz frida-server-15.0.2-android-x86_64.xz adb root adb push frida-server-15.0.2-android-x86_64 /data/local/tmp/frida-server adb shell "chmod 755 /data/local/tmp/frida-server" adb shell "/data/local/tmp/frida-server &"
在主机中执行命 frida-ps -U 查看下目标设备中的进程,如果正确显示,则服务端安装成功。
PID Name ---- -------------------------------------------------- 2633 Calendar 2866 Gmail 2270 Google App 2566 Google Play Music 3308 Hangouts 2720 Maps 2756 Messenger 2783 Photos 1943 Settings 3015 YouTube 4938 adbd 2296 android.process.acore ...
1.5. 小试牛刀
frida安装完成后,先用frida提供的cli来测试一下hook能力,如要跟踪Chrome中的open函数.
- 在设备上打开Chrome, cli模式下需要先打开,不然找不到目标进程,后续写脚本可以省略该步骤。
在主机终端中输入追踪命令 frida-trace -U -i open com.android.chrome:privileged_process0
╰─ frida-trace -U -i open com.android.chrome:privileged_process0 Instrumenting... open: Loaded handler at "Frida/__handlers__/libc.so/open.js" Started tracing 1 function. Press Ctrl+C to stop.
- 对设备中的Chrome进行操作,Chrome每次调用函数open的操作就会打印在终端中,输出结果类似如下:
同时我们注意到,跟踪成功后,会在当前路径下创建JavaScript文件 Frida/__handlers__/libc.so/open.js,
Frida会将JavaScript文件中的代码注入到进程中并跟踪指定的函数调用,我们看下js代码:
{
onEnter(log, args, state) {
log('open()');
},
onLeave(log, retval, state) {
}
}
其中,onEnter是open函数即将被执行时会被调用,而onLeave是open函数执行完毕时会被调用,我们可以修改代码来实现Hook功能, 如将open函数的参数args打印出来:
{ onEnter(log, args, state) { log('open called args[0] address: ' + args[0] + ', value: ' + Memory.readUtf8String(args[0], 8)); }, onLeave(log, retval, state) { } }
运行后,就会将参数内容作为字符串输出到控制台,如下所示:
至此,本章内容暂时结束,下一章节计划介绍如何通过编写js代码实现自动hook,通过编写实际的例子,已知的APP漏洞进行风险检测。
Created: 2019-11-29 Fri 09:46
没有评论:
发表评论