安卓逆向(五) —— Hook框架Frida介绍

Hook框架Frida介绍

仅用于研究和学习使用,禁止将相关技术应用到不正当途径,如侵犯隐私或权益,请联系我立即删除

文章目录

        • 一、前言
        • 二、Frida概述
        • 三、准备事项
        • 四、安装
          • 1、安装frida
          • 2、安装frida-tools
          • 3、手机安装frida server(需要注意手机CPU型号、不要安装最新版Bug多)
          • 4、测试是否成功
          • 5、注意
        • 五、基础使用(官网案例)
          • 1、创建一个文件 hello.c
          • 2、编译
          • 3、启动程序并记下`f()`(`0x400544`在以下示例中)的地址:
          • 4、挂钩功能
          • 5、修改进程内部函数参数
          • 6、函数调用

一、前言

Hook改变程序执行流程的一种技术 在函数/方法被调用前,通过HOOK技术,先得到该函数/方法的控制权,实现该函数/方法的逻辑改写。常用的Hook框架有xposed和frida。xposed是Java语言开发的,只能hook应用层(Java),开发经常需要重启设备,开发效率低,与安卓能无缝对接。frida是C语言开发的, 能Hook 安卓 iOS windows 应用层 native层,可以使用JS和Python代码完成Hook,不需要重启设备,开发效率高。与安卓的数据类型转换麻烦。

二、Frida概述

Frida是一款轻量级HOOK框架, 可以在Windows、macOS、GNU/Linux、iOS、Android、QNX平台上使用。Frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。可以通过C、Node.js, Python, Swift, NET, Qml等语言进行开发。

三、准备事项

准备一台root的安卓 或 安卓模拟器(推荐夜神模拟器)

python 版本 3.7

python 模块 Frida、Frida-tools

Frida官方文档: https://www.frida.re/docs/javascript-api

四、安装

1、安装frida
pip install frida
2、安装frida-tools
pip install frida-tools
3、手机安装frida server(需要注意手机CPU型号、不要安装最新版Bug多)

我自己上传的资源:Frida-server-12.8.10-android-arm64.xz

下载后将资源推送到手机 /data/local/tmp/ 目录下

adb push frida-server-12.8.10-android-arm64 /data/local/tmp/

进入到手机

adb shell

切换root用户

su root

进入到对应目录

cd /data/local/tmp

修改文件权限

chmod 777 frida-server-12.8.10-android-arm64

启动服务

./frida-server-12.8.10-android-arm64
4、测试是否成功
frida-ps -U 

安卓逆向(五) —— Hook框架Frida介绍_第1张图片

输出如图就成功了

5、注意

windows运行 端口转发到PC

adb forward tcp:27043 tcp:27043

adb forward tcp:27042 tcp:27042

五、基础使用(官网案例)

如何使用Frida在调用函数时检查它们,修改其参数以及对目标进程内部的函数进行自定义调用。

1、创建一个文件 hello.c
#include 
#include 

void
f (int n)
{
     
  printf ("Number: %d\n", n);
}

int
main (int argc,
      char * argv[])
{
     
  int i = 0;

  printf ("f() is at %p\n", f);

  while (1)
  {
     
    f (i++);
    sleep (1);
  }
}

2、编译
$ gcc -Wall hello.c -o hello
3、启动程序并记下f()0x400544在以下示例中)的地址:
f() is at 0x400544
Number: 0
Number: 1
Number: 2
…
4、挂钩功能

以下脚本显示了如何在目标进程中挂接对函数的调用,以及如何输出函数参数。创建一个hook.py 包含以下内容的文件:

from __future__ import print_function
import frida
import sys

session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
    onEnter: function(args) {
        send(args[0].toInt32());
    }
});
""" % int(sys.argv[1], 16))
def on_message(message, data):
    print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()

运行脚本

$ python hook.py 0x400544

输出

{
     u'type': u'send', u'payload': 531}
{
     u'type': u'send', u'payload': 532}
5、修改进程内部函数参数

我们要修改传递给目标进程内部函数的参数。创建modify.py具有以下内容的文件:

import frida
import sys

session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
    onEnter: function(args) {
        args[0] = ptr("1337");
    }
});
""" % int(sys.argv[1], 16))
script.load()
sys.stdin.read()

针对hello进程(应该仍在运行)运行此命令:

$ python modify.py 0x400544

此时,运行的终端hello process应停止计数并始终报告1337,直到您单击Ctrl-D脱离它为止。

Number: 1281
Number: 1282
Number: 1337
Number: 1337
Number: 1337
Number: 1337
Number: 1296
Number: 1297
Number: 1298
…
6、函数调用

使用Frida在目标进程内部调用函数。创建call.py包含以下内容的文件 :

import frida
import sys

session = frida.attach("hello")
script = session.create_script("""
var f = new NativeFunction(ptr("%s"), 'void', ['int']);
f(1911);
f(1911);
f(1911);
""" % int(sys.argv[1], 16))
script.load()

运行脚本

$ python call.py 0x400544

注意正在运行的终端hello

Number: 1879
Number: 1911
Number: 1911
Number: 1911
Number: 1880
…

下一讲将使用Frida做个案例








坐得住板凳,耐得住寂寞,守得住初心!

你可能感兴趣的:(安卓逆向,python)