安卓基于Frida HOOK传感器 实现虚拟运动跑步

安卓基于Frida HOOK传感器 实现虚拟运动跑步

(本文运行环境:WIN10 + Pythom 3.6)

众所周知,安卓HOOK是十分厉害的的,所以有一天,我突发奇想能不能动态HOOK安卓的传感器函数实现伪运动,于是经过查阅资料发现是可以的,于是就决定用 Frida + Python 实现动态传感器HOOK java层

什么是Frida

Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。
frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行系统机器上。
frida上层接口支持js、python、c等。
Frida官方github地址为:frida官方github地址
详细内容请参考:

frida入门总结 - 『移动安全区』 - 吾爱破解

实现原理

如果你不太了解传感器,请点击Android Manager之SensorManager(传感器)—基础知识

如果你开发过安卓传感器类软件,应该了解到关于传感器调用和读取的方法android.hardware.SystemSensorManager$SensorEventQueue这个类是用于读取传感器数据的一个类。所以,我们只要HOOK这个类,就可以实现传感器的HOOK
那么到底那一个才是传感器读取的方法呢?方法到底该如何传参呢?我们需要分析一下。
我的分析方法如下,同样也用适用于其他的HOOK:

  1. 首先下载 ZenTracer

  2. 然后用Python运行,若提示缺少库用pip补齐安卓基于Frida HOOK传感器 实现虚拟运动跑步

  3. 选择Action->Match RegEx,在弹出的窗口输入android.hardware.SystemSensorManager这个类,然后点击add,之后关闭即可。安卓基于Frida HOOK传感器 实现虚拟运动跑步

  4. 然后点击Action->Start,就可以看到HOOK结果了安卓基于Frida HOOK传感器 实现虚拟运动跑步

ZenTracer是一个万能全类HOOK工具,详细食用方法请参考:基于Frida的工具介绍——ZenTracer

结果不难看出,implementation这个方法可以读取到传感器内容,返回4个变量分别是传感器类型(整数型)、传感器结果(数组【一般为double】)、不知道是啥、不知道是啥。所以,我们开始编写HOOK用的JS

var Sensor_class = Java.use("android.hardware.SystemSensorManager$SensorEventQueue");
Sensor_class.dispatchSensorEvent.implementation = function (type,value,c,d){}

这两段的意思是HOOK到传感器类。
之后我们要虚拟跑步,HOOK加速度传感器,通过上面的采集结果了解到,加速度传感器类型是0,所以我们进行一个判断。然后创建一个数组保存修改数据,之后将数据回传即可。

var Sensor_class = Java.use("android.hardware.SystemSensorManager$SensorEventQueue");
    Sensor_class.dispatchSensorEvent.implementation = function (type,value,c,d) 
    {
        if(type == 0){
            value[0] = 1 ; //X
            value[2] = 2 ; //Y
            value[1] = 3 ; //Z
        }
        var result = this.dispatchSensorEvent(type,value,c,d);
        return result;
    }

这样运行之后的结果就是X轴加速度为1、Y轴加速度为2、Z轴加速度为3,但是这不是我们要的效果,我们要通过Python动态实现传感器的数值变化,实现跑步效果。
于是我们需要将JS于PY联动。下面是我的联动方案

JS代码

var Sensor_class = Java.use("android.hardware.SystemSensorManager$SensorEventQueue");
    var acceleration_x = 0 ;
    var acceleration_y = 0;
    var acceleration_z = 0;
    Sensor_class.dispatchSensorEvent.implementation = function (type,value,c,d) 
    {
        if(type == 0){
            send("a");//通知py是加速度传感器
            recv(function (received_json_object) {
                acceleration_x = received_json_object.acceleration_x;
                acceleration_y = received_json_object.acceleration_y;
                acceleration_z = received_json_object.acceleration_z;
            }).wait();//等待PY将传感器数据回传
            value[0] = acceleration_x ; //0
            value[2] = acceleration_y ; //1
            value[1] = acceleration_z ; //2
        }
        var result = this.dispatchSensorEvent(type,value,c,d);
        return result;
    }

Python代码

def acceleration_void():
    global last_Run_State
    # 生成随机偏差值
    acceleration_x = random.randint(-3999, 3999)
    acceleration_y = random.randint(-3999, 3999)
    acceleration_z = random.randint(-3999, 3999)
    # 单位转换
    acceleration_x = acceleration_x/1000
    acceleration_y = acceleration_y/1000
    acceleration_z = acceleration_z / 1000
    # 加速度转跑步
    if last_Run_State == False:
        acceleration_y = acceleration_y + 30
        acceleration_x = acceleration_x + 20
        last_Run_State = True
    else:
        last_Run_State = False

    # 参数回传
    try:
        script.post({"acceleration_x": acceleration_x,
                     "acceleration_y": acceleration_y, "acceleration_z": acceleration_z})
    except Exception as err:
        print("错误")
        
def on_message(message, data):
    if message['payload'] == "a":
        acceleration_void()

last_Run_State = False
process = frida.get_usb_device()
process_attach = process.attach('run.xbud.android')
script = process_attach.create_script(hookjscode)
script.on('message', on_message)
cript.load()

运行效果安卓基于Frida HOOK传感器 实现虚拟运动跑步

写在最后

因为学业繁重没有太多时间谨慎撰写文案,可能会出现错误,还请海涵,多谷歌,多阅读官方英文文档。如有发现错误或者有项目需求可以私信我,随时等着你。谢谢大家!

上一篇:httprunner学习12-hook 机制实现setup和teardown


下一篇:React Hook 入门使用