安卓基于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补齐在这里插入图片描述

  3. 选择Action->Match RegEx,在弹出的窗口输入android.hardware.SystemSensorManager这个类,然后点击add,之后关闭即可。在这里插入图片描述

  4. 然后点击Action->Start,就可以看到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()

运行效果传感器HOOK效果

写在最后

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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Frida是一个强大的动态分析工具,可以用于对应用程序进行hookFrida提供了多种hook方式,包括在应用程序启动前注入代码、通过USB连接和远程连接等。通过在应用程序启动前注入代码,可以在应用程序启动时即实现hook的效果。可以使用frida.get_usb_device()方法连接待调试的USB设备,并使用frida.get_device()方法指定调试的设备。此外,也可以通过远程连接方式进行hook,使用frida -U -f 包名 -l xxx.js --no-pause指令进行注入。以上是使用Frida进行hook的一些基本操作方式。需要根据具体的场景和需求选择合适的方法和参数进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Frida hook零基础教程](https://blog.csdn.net/cyjmosthandsome/article/details/120906998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [pythonfrida安卓逆向之hook大法好](https://blog.csdn.net/weixin_51111267/article/details/125109497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值