安卓基于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地址
详细内容请参考:
实现原理
如果你不太了解传感器,请点击Android Manager之SensorManager(传感器)—基础知识
如果你开发过安卓传感器类软件,应该了解到关于传感器调用和读取的方法android.hardware.SystemSensorManager$SensorEventQueue
这个类是用于读取传感器数据的一个类。所以,我们只要HOOK这个类,就可以实现传感器的HOOK
那么到底那一个才是传感器读取的方法呢?方法到底该如何传参呢?我们需要分析一下。
我的分析方法如下,同样也用适用于其他的HOOK:
-
首先下载 ZenTracer
-
然后用Python运行,若提示缺少库用pip补齐
-
选择Action->Match RegEx,在弹出的窗口输入
android.hardware.SystemSensorManager
这个类,然后点击add,之后关闭即可。 -
然后点击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()
运行效果
写在最后
因为学业繁重没有太多时间谨慎撰写文案,可能会出现错误,还请海涵,多谷歌,多阅读官方英文文档。如有发现错误或者有项目需求可以私信我,随时等着你。谢谢大家!