Cydia Substrate 初尝试:刷计步软件数据


  • Cydia Substrate 初尝试刷计步软件数据

    • Cydia
    • 设备准备
    • 探索
    • 思路
      • 监听器注册
      • 事件分发
    • 进行Hook

Cydia

Cydia Substrate是一个代码修改工具,可以修改IOS、Android系统代码,从而实现自己的奇思妙想。Cydia的使用方法教程不再赘述,下面直接进入实战。

设备准备

一台Root过得Android设备,Android系统版本2.3-4.3。我当初不信邪,以为Android4.4肯定也可以,结果搞了半天发现是真的不行,所以还是谨遵官网指导,版本最高4.3,不能再高了。不知道怎么准备手机,可以看我的这篇文章如何搞机。

探索

现在比较流行的是微信运动。微信做的真的很完善了,本希望反编译它的apk来找一个切入点,结果有两大难点让我无法进行下去:

  1. 代码量大:里面用了很多工具包,加上腾讯自己开发的代码,代码量着实不小。但是我们关注的点很明确,所以可以根据包名、类名来寻找,所以还是可以克服的。
  2. 代码名称混淆:里面好多类名和方法名反编译不出来,只能边看边猜,阅读难度略大。还有一些类直接反编译失败,所以我也是无能为力了,看的云里雾里,没找到正确的切入点。

这两点着实让我心灰意冷,如果哪位仁兄研究过,还请你赐教。还有,我不太清楚微信怎么自己统计步数的。

最后我找了一款比较流行的计步软件,是哪一款我就不说了,这个APP通过加速度传感器数据来计算步数。

我同样也是先反编译这个APP,结果问题和微信一样,暂时无法解决。最后,我选择了不Hook应用,而是Hook Android的API。这款软件采用了加速计数据统计步数,我则着眼于系统的加速计事件的产生过程,从中选择可以Hook的点。

思路

Android系统事件的收发机制很有意思,下面我们来研究一下一个系统事件,从注册监听到接收事件的过程。这里我只关注加速计事件。

监听器注册

Android应用开发,想要利用系统事件,则需要构造一个Listener,这里就是SensorEventListener。首先,你需要得到系统的SensorManager,然后从中获得想要的传感器,然后让SensorManager将该传感器注册入自己的Listener。

//获得传感器管理器
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//获得加速度传感器
Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注册监听器
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

我写的代码里的this就是这个Activity,我让Activity实现了SensorEventListener接口,监听器需要实现的方法如下:

    @Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){double ax=event.values[0];double ay=event.values[1];double az=event.values[2];Log.d("YOULOG", ax+" "+ay+" "+az);}}@Overridepublic void onAccuracyChanged(Sensor sensor, int i) {}

看完APP里的代码,让我们深入一层,看一下Android Framework里,监听器是怎么注册进系统的。与传感器相关的API放置于android.hardware包中,SensorManager是一个基本类,具体实现在SystemSensorManager中。其中registerListener函数在SensorManager中,具体实现为SystemSensorManager的函数registerListenerImpl:

@Overrideprotected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,int delay, Handler handler){// Invariants to preserve:// - one Looper per SensorEventListener// - one Looper per SensorEventQueue// We map SensorEventListener to a SensorEventQueue, which holds the looperif (sensor == null) throw new IllegalArgumentException("sensor cannot be null");// Trigger Sensors should use the requestTriggerSensor call.if (Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT) return false;synchronized (mSensorListeners) {//确定该listener是否已经注册过,如果注册过,则已经有event queue与之对应   SensorEventQueue queue = mSensorListeners.get(listener);if (queue == null) {//第一次注册,需要创建一个event queueLooper looper = (handler != null) ? handler.getLooper() : mMainLooper;queue = new SensorEventQueue(listener, looper, this);//将这种sensor放入queue中,告诉系统,这种sensor我需要进行监听。if (!queue.addSensor(sensor, delay)) {queue.dispose();return false;}mSensorListeners.put(listener, queue);return true;} else {//已经有event queue,所以直接将sensor放入queuereturn queue.addSensor(sensor, delay);}}}

由此可知,SensorListener和SensorEventQueue一一对应,但是一个SensorListener可以监听多个Sensor。比如,一个Activity实现了监听加速计的,也实现了监听网络连接的接口,所以它可以监听多个Sensor。如图所示:

queue.addSensor(sensor, delay)函数中,它将sensor放入mActiveSensors,让其准备好接受该sensor的事件。同时,调用了enableSensor函数,它会调用native方法,将SensorEventQueue和这个sensor告知底层的传感器服务。

事件分发

在传感器事件产生时,native方法会调用SensorEventQueue的dispatchSensorEvent函数来发出Event:

  // Called from native code.@SuppressWarnings("unused")@Overrideprotected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,long timestamp) {final Sensor sensor = sHandleToSensor.get(handle);SensorEvent t = mSensorsEvents.get(handle);if (t == null) {Log.e(TAG, "Error: Sensor Event is null for Sensor: " + sensor);return;}// Copy from the values array.System.arraycopy(values, 0, t.values, 0, t.values.length);t.timestamp = timestamp;t.accuracy = inAccuracy;t.sensor = sensor;switch (t.sensor.getType()) {// Only report accuracy for sensors that support it.case Sensor.TYPE_MAGNETIC_FIELD:case Sensor.TYPE_ORIENTATION:// call onAccuracyChanged() only if the value changesfinal int accuracy = mSensorAccuracies.get(handle);if ((t.accuracy >= 0) && (accuracy != t.accuracy)) {mSensorAccuracies.put(handle, t.accuracy);mListener.onAccuracyChanged(t.sensor, t.accuracy);}break;default:// For other sensors, just report the accuracy onceif (mFirstEvent.get(handle) == false) {mFirstEvent.put(handle, true);mListener.onAccuracyChanged(t.sensor, SENSOR_STATUS_ACCURACY_HIGH);}break;}mListener.onSensorChanged(t);}

该函数参数handle指明了传感器种类,values则是值。这里加速计传感器的hanlde为0(Sensor中有public static final int TYPE_ACCELEROMETER = 1;和该值不对应,原因还未细究)。这里就是我们需要利用Cydia修改的地方。

进行Hook

经过输出values可以发现,设备在不停的发送加速计事件,我不确定是因为加速计值一直在变还是因为周期采样的原因,总之该类事件在不断发送中。应用通过一定的算法来将这些数据进行处理,辨别出其中是否有步行导致的加速变化。我尝试过生硬的让该值不断发生跳变,发现应用没有做出反应。不难发现,人的行走是有规律且成周期性变化的,因此加速计采样值也应该有一定的周期性变化,所以,最后代码如下:

package com.tianchi.hellocydia;import android.hardware.Sensor;
import android.util.Log;
import com.saurik.substrate.MS;
import java.lang.reflect.Method;/*** Created by Tianchi on 16/7/12.*/public class Main {static int count = 0;//每次变化角度为60°static int step=60;static void initialize() {MS.hookClassLoad("android.hardware.SystemSensorManager$SensorEventQueue", new MS.ClassLoadHook() {public void classLoaded(Class<?> resources) {Method method2;try {method2 = resources.getDeclaredMethod("dispatchSensorEvent", int.class, float[].class, int.class, long.class);} catch (NoSuchMethodException e) {method2 = null;}if (method2 != null) {method2.setAccessible(true);final MS.MethodPointer old = new MS.MethodPointer();MS.hookMethod(resources, method2, new MS.MethodHook() {public Object invoked(Object resources, Object... args) throws Throwable {int handle = (int) args[0];float[] values = (float[]) args[1];if (handle == 0) {count += step;count = count % 360;double rd=Math.toRadians((double)count);//利用sin函数,使其呈现周期性变化float dev=(float) (Math.random()-0.5)*2;values[0] = 10*(float) Math.sin(rd)+dev;values[1] = 20*(float) Math.cos(rd)+dev;values[2] = 9.8f+10*(float) Math.sin(rd)+dev;}args[1] = values;old.invoke(resources, args);return null;}}, old);}}});}
}

经测试,该方法可行。

Cydia Substrate 初尝试:刷计步软件数据相关推荐

  1. 安卓固件修改工具_最大刷机软件关闭,安卓用户必备技能没用了吗?

    曾几何时,刷机是每个智能手机用户的必修科目之一,只要你希望手机有更多的个性化选项.更多的自定义功能,那么就得通过刷机来实现. 于是各类手机论坛变得人头攒动,还催生了一系列刷机为主题的站点,也出现了专门 ...

  2. SQLSERVER2012里的扩展事件初尝试(上)

    SQLSERVER2012里的扩展事件初尝试(上) SQLSERVER2012里的扩展事件初尝试(下) 周未看了这两篇文章: 扩展事件在Denali CTP3里的新UI(一) 扩展事件在Denali ...

  3. Python小屋在线练习与刷题软件重要升级

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  4. Python小屋刷题软件2425道题目分类速查表

    "Python小屋"编程比赛正式开始 Python小屋刷题软件客户端使用说明(视频讲解) Python小屋刷题神器最近升级的新功能介绍 每次录入新题目时都会更新下面的分类表,请注意 ...

  5. C语言二级题库(刷题软件+60套真题+填空题+大题)2022年9月份新题第三套

    文章只能发选择题,刷大题去刷题软件效果会更好 刷题软件 gongzhonghao:露露IT 选择题 1.下面选项中不是关系数据库基本特征的是_______. A. 不同的列应有不同的列名 B. 不同的 ...

  6. 微信尝试刷掌支付;苹果 WWDC 将于 6 月 6 日开幕;Qt Creator 10 发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. python二级题库 第四套 附刷题软件

    刷 题软件(模拟python二级考试) 操作题刷题软件 公众h:露露IT 回复:python二级 一.选择题 1. 描述数据库系统中全局数据逻辑结构.且为全体用户公共数据视图的是(). A. 概念模式 ...

  8. pythone二级题库 + 刷题软件 (超详细解析,看完必过) 第十一套

    刷题软件(模拟python二级考试) 操作题刷题软件 1.计算机完成一条指令所花费的时间称为一个(). A.指令周期 B.存取周期 C.执行速度 D.执行时序 一般把计算机完成一条指令所花费的时间统称 ...

  9. 怎么找回删除的文件?尝试下这些恢复数据的方法

    我们使用电脑时,总会产生各种各样的文件数据.这些文件保存在电脑里面,但是有时不免手滑误删重要的文件.这些文件被删除.被清空了,还可以恢复回来吗?怎么找回删除的文件?建议你尝试下这些恢复数据的方法. 一 ...

最新文章

  1. java子类对象和成员变量的隐写方法重写
  2. 大数据精准营销:买水培栀子花该推送啥
  3. @insert 对象_python中列表插入append(), extend(), insert()
  4. github 上传代码_leetcode爬虫:爬取代码;生成readme;上传github
  5. LeetCode 473. 火柴拼正方形(回溯)
  6. 计算机模拟与生态工程,2018年环境生态工程专业分析及就业前景
  7. python对以后的就业方向_Python的四个就业方向
  8. python md5解密方法与技巧_python ---- 爬取 md5解密结果 的小脚本
  9. request与response的笔记梳理
  10. 悲伤的时候总会想起什么
  11. 谈读《三国志》之话说关羽——【istrangeboy精品史评】
  12. 微信测试号中被动消息回复的测试
  13. 图像处理技术-基本运算
  14. Tapestry的使用
  15. 多行文本溢出隐藏省略号
  16. 170817 WarGames-Natas(15)
  17. php transfer-encoding: chunked,“Transfer-Encoding: chunked” header in PHP
  18. Shell语言(一)
  19. 三剑客 文本处理awk
  20. cat5和cat5e的区别_具有功能以及CAT5与CAT6的CAT5电缆标准是什么?

热门文章

  1. 给小朋友讲什么是计算机ppt,计算机是什么给小学生讲计算机知识ppt.ppt
  2. COUNT计算机公式,EXCEL的计数公式/excle 公式 count
  3. vue解决ios橡皮筋回弹
  4. 【VA 最终用户许可协议】(英)
  5. Android 各大厂面试题汇总与详解(持续更新)
  6. C++ Decltype 关键字
  7. Safari浏览器(苹果)时间格式不能识别的坑
  8. Greedy Fly's Crackme
  9. 初学者学Java应该安装什么软件?
  10. Robomaster基于传统算法的视觉识别教程