有很多游戏玩家会用到按键精灵类软件,通过定制脚本来完成任务

也有很多人恶意作弊,通过定时脚本多线程触发第一时间抢到礼包 红包

有不少公司利用按键精灵自动化操作来完成各种商业目的

也有很多公司为了防住按键精灵等软件苦思各种对策

等等

这篇文章的目的:纯讨论技术,不涉及灰色黑色产业,特此申明。

有哪一些方式可以实现?

Instrumentation? 需要系统签名,这就明你只能自行编译android系统。并且只能在你点击软件处于前台的时候才能处理,切换到别的app成为后台后就无法处理了。

IWindowManager? IWindowManager里面的模拟按键和触摸事件的api,这类方法在很早版本就被google屏蔽了,想尝试通过反射绕过java的权限限制非常麻烦,而且很可能最后又被系统权限给拦住了。

按键精灵类软件。它们都是在root环境下使用的,不需要系统签名,不需要运行在前台,完美满足通过代码来模拟点击的行为。

按键精灵的触摸原理分析

Android的touch系统架构简图(省略了一些过程,包括windowManagerService的一些过程,有兴趣同学可以查看相关实现)

观察整个Android的touch分发流程,在最开始的时候,用户触摸屏幕,对/dev/input/event写入信号量。Android系统循环读取里面的输出,在进行向下分发。那么我们站在黑客的角度思考下,按键精灵类软件是root过的,最好的方式就是自定义linux的触摸事件,不断发送到/dev/input/event,从而顺理成章的模拟了android系统的点击行为。

Linux命令 getevent sendevent 备好一台root过的android手机

一、getevent

1 在adb shell下面输入 getevent后,我们就能看到设备输入的硬件信息

dwlovehcy@bogon:~/OpenSource$ adb devices

List of devices attached

192.168.82.226:5555 device

dwlovehcy@bogon:~/OpenSource$ adb shell

shell@OnePlus2:/ $ getevent

add device 1: /dev/input/event8

name: "msm8994-tomtom-mtp-snd-card Headset Jack"

add device 2: /dev/input/event7

name: "msm8994-tomtom-mtp-snd-card Button Jack"

add device 3: /dev/input/event4

name: "qpnp_pon"

add device 4: /dev/input/event2

name: "STM VL6180 proximity sensor"

could not get driver version for /dev/input/mouse1, Not a typewriter

add device 5: /dev/input/event1

name: "fpc1020tp"

could not get driver version for /dev/input/mouse0, Not a typewriter

add device 6: /dev/input/event0

name: "fpc1020"

could not get driver version for /dev/input/mice, Not a typewriter

add device 7: /dev/input/event6

name: "gpio-keys"

add device 8: /dev/input/event3

name: "synaptics,s1302"

add device 9: /dev/input/event5

name: "synaptics,s3320"

2 尝试点击一次屏幕,看看shell的输出:

/dev/input/event5: 0003 0039 0000001c

/dev/input/event5: 0001 014a 00000001

/dev/input/event5: 0003 0035 00000220

/dev/input/event5: 0003 0036 0000059e

/dev/input/event5: 0003 0030 00000006

/dev/input/event5: 0000 0000 00000000

/dev/input/event5: 0003 0039 ffffffff

/dev/input/event5: 0001 014a 00000000

/dev/input/event5: 0000 0000 00000000

分析:此手机的event5负责了这个单点事件,这里面包含了1个touchdown、1到多个touchmove和1个touchup。

3 按一下手机的锁屏键:

/dev/input/event4: 0001 0074 00000001

/dev/input/event4: 0000 0000 00000000

/dev/input/event4: 0001 0074 00000000

/dev/input/event4: 0000 0000 00000000

分析:此手机的event4负责了这个锁屏按钮,里面包含一个按键的按下和放开

从上面2处可以看到,我们只要定义出类似的动作,就可以完成Android的单点点击和锁屏 {具体实现请具体看下文}

4 getevent的详细用法

shell@OnePlus2:/ $ getevent -h

Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]

-t: show time stamps

-n: don't print newlines

-s: print switch states for given bits

-S: print all switch states

-v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)

-d: show HID descriptor, if available

-p: show possible events (errs, dev, name, pos. events)

-i: show all device info and possible events

-l: label event types and names in plain text

-q: quiet (clear verbosity mask)

-c: print given number of events then exit

-r: print rate events are received

其中-l可显示event的定义,把刚才的输入翻译成指令集,我们使用-l并点击一下屏幕获得输出:

/dev/input/event5: EV_ABS ABS_MT_TRACKING_ID 00000022

/dev/input/event5: EV_KEY BTN_TOUCH DOWN

/dev/input/event5: EV_ABS ABS_MT_POSITION_X 000001f2

/dev/input/event5: EV_ABS ABS_MT_POSITION_Y 0000058a

/dev/input/event5: EV_ABS ABS_MT_TOUCH_MAJOR 00000006

/dev/input/event5: EV_SYN SYN_REPORT 00000000

/dev/input/event5: EV_ABS ABS_MT_TRACKING_ID ffffffff

/dev/input/event5: EV_KEY BTN_TOUCH UP

/dev/input/event5: EV_SYN SYN_REPORT 00000000

点击一下锁屏键获得输出:

/dev/input/event4: EV_KEY KEY_POWER DOWN

/dev/input/event4: EV_SYN SYN_REPORT 00000000

/dev/input/event4: EV_KEY KEY_POWER UP

/dev/input/event4: EV_SYN SYN_REPORT 00000000

我们得到了更加详细的输出,而这些输出跟linux的input.h的定义方式一样,从字面上我们得出各种类型的含义,具体解释可以参考linux的input.h

二、sendevent

1、sendevent这个命令可以使我们可以向root手机发送触摸信号量,我们再次观察下刚才getevent情况下锁屏的输出:

/dev/input/event4: 0001 0074 00000001

/dev/input/event4: 0000 0000 00000000

/dev/input/event4: 0001 0074 00000000

/dev/input/event4: 0000 0000 00000000

命令行输入sendevent -h:

1|shell@OnePlus2:/ $ sendevent

use: sendevent device type code value

命令行提示我们需要发送device type 和 取值,根据观察device type就是/dev/input/event4, 而value就是后面的例如:0001 0074 00000001(我们可以翻译成十进制来使用)

实际操作:

shell@OnePlus2:/ $ sendevent /dev/input/event4 1 116 1

shell@OnePlus2:/ $ sendevent /dev/input/event4 0 0 0

shell@OnePlus2:/ $ sendevent /dev/input/event4 1 116 0

shell@OnePlus2:/ $ sendevent /dev/input/event4 0 0 0

屏幕并没有被锁屏了,why,因为咋们输入速度不够快,中间有别的事件发生了或者超过了一系列时间的最大间隔~~~

咋们直接一起执行这4个命令:

shell@OnePlus2:/ $ sendevent /dev/input/event4 1 116 1 & /dev/input/event4 0 0 0 & /dev/input/event4 1 116 0 &/dev/input/event4 0 0 0

屏幕顺利被锁定,HOHO,我们完成了最简单的一个HACK

2、测试下触摸,选择桌面上一个app,打开getevent,记录下这个过程中的信号量

/dev/input/event5: 0003 0039 00000030

/dev/input/event5: 0001 014a 00000001

/dev/input/event5: 0003 0035 00000225

/dev/input/event5: 0003 0036 000003b4

/dev/input/event5: 0000 0000 00000000

/dev/input/event5: 0003 0039 ffffffff

/dev/input/event5: 0001 014a 00000000

/dev/input/event5: 0000 0000 00000000

回到桌面,开始用sendevent来执行,大家可以动手自己把这段用sendevent组合起来,一样如预期,打开了刚才那个app。

Good job,我们能控制Android的单点点击了

如何完成各种Android机型的适配?

1. 在完成上面的过程后,有想彻底搞懂的同学你会有以下几个问题要问:

a、各种android手机对应的单点event居然不一样,甚至同厂家也是,怎么处理?

b、android手机多点触摸怎么处理?

c、 android手机滑动怎么处理?

等等各种问题

2. 统一为这些问题做一个解答:

仔细阅读linux input.h,里面定义了所有触摸定义,包括最基本的触摸坐标,压力值,触摸面积,按键,物理键,虚拟键盘等。然后继续对比getevent的输出。比如从上面的例子你就可以发现ABS_MT_POSITION_X,ABS_MT_POSITION_X是触摸的x和y坐标的代表位,并且他们值一定是0x35和0x36

每个手机都有不同的/dev/input/event,你需要找到一种探测方式,逐一探测所有event锁定你需要的event

Android有好几种多点触摸协议,同二你可以在源码中找到实现方式,滑动也是如此

其他:如何应对按键精灵等软件作弊

纯从技术层面,不考虑其他辅助策略,现有的按键精灵等软件在对外的接口中只注重了对一部分参数的关注(点击坐标,位置,滑动时间等),而另一些参数没有做过处理,用代码点出来跟真人点击会产生很大的区别。抓取此行为可以提高对按键精灵类软件识别准确率

android 使用shell模拟触屏_Android按键精灵 触摸精灵 触动精灵等软件模拟屏幕点击的基本原理...相关推荐

  1. android 使用shell模拟触屏_android命令行模拟输入事件(文字、按键、触摸等)

    前言 通过adb shell input可以模拟android各种输入事件,比如文字.按键.触摸等等. adb shell input Usage: input [] [...] The source ...

  2. android 使用shell模拟触屏_Android随笔之——用shell脚本模拟用户按键、触摸操作...

    之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...

  3. android 使用shell模拟触屏_Appium常用操作之「微信滑屏、触屏操作」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.滑屏操作 1.访问之后,马上就滑屏可以吗? 2.连续实现 2 次滑屏 3.代码 二.模拟触屏 ...

  4. shell 截屏 android,Android 使用Shell脚本截屏并自动传到电脑上

    Android 使用Shell脚本截屏并自动传到电脑上 Android设备用久了,截屏是个麻烦事.更麻烦的是通过qq传到电脑上,倒腾半天.其实用adb命令就可以截屏,然后写个pull的语句就可以拉到电 ...

  5. 安卓sendevent模拟触屏问题求解

    uinput模拟触屏 需要创建虚拟设备才不会与手指触屏冲突但网上并没有相关的示例,教学这类 但是sendevent多指操作时与触摸相冲突,导致闪屏/断触 经测试 在3-4根手指触屏时,sendeven ...

  6. Android 中Touch(触屏)事件传递机制

    版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...

  7. android gps 轨迹记录仪,触屏轨迹定位记录仪 惠普F800G道路实测

    1触屏轨迹记录仪出现 对于具有"视频车险"的行车记录仪来说,高端产品往往更能得到的用户的信赖和青睐,因为高端的产品具有更加稳定的品质和丰富功能,能够为车主带来更为全面的行车记录保护 ...

  8. win10触屏输入法_IT之家学院:一招让Win10屏幕键盘回归经典

    感谢IT之家网友晨风的投稿 在Win10中,如果使用自带的输入法,屏幕键盘的样式看起来很简约,虽然布局和实体键盘如出一辙,但少了很多功能键,毕竟屏幕键盘的用途和实体键盘还是有差别的.一般来说,使用屏幕 ...

  9. Android自动化测试之Shell脚本一——模拟触屏事件

    摘自:http://guolin.guosfamily.com/2012/02/15/android-automated-test-by-shell-touch-event/ Android自动化测试 ...

  10. android怎样实现手机触屏,Android触屏过程详解和实现view随手指移动而移动功能

    一.前言 在Android开发中,大家可能会遇到控件会随着点击或者滑动而改变,控件的滑动和大小改变上一章的animation动画效果已经讲过了,那么如何实现控件随着手势的移动而移动呢? 二.概述 1. ...

最新文章

  1. 新书来了!《ActionScript 3.0游戏设计基础(第2版)》
  2. CSS中Float概念相关文章
  3. C#的多线程(2)——机制探索
  4. 汤家凤高等数学基础手写笔记-极限与连续
  5. 3月19日 打卡
  6. 鲸鱼优化算法_盘点 35 个 Java 代码优化细节
  7. Oracle数据库重启后密码失效的问题(r12笔记第91天)
  8. 决策树 结构_决策树模型是什么?5步了解好看模型图
  9. AJAX-----02远古时期的ajax
  10. 编译android 7.1 jdk版本,ubuntu14.04 安装 open-jdk-1.8,下载编译 android nougat 7.1.1
  11. 动手试试Android Studio插件开发
  12. Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
  13. 铁路售票系统_城轨交通自动售检票(AFC)实训系统中心_地高铁车站票务实训如何建设...
  14. Java递归算法经典实例
  15. 常见的应用层协议都有哪些?【面试官可能会问系列】
  16. Html5开发工具介绍
  17. 网站怎么做SEO优化操作?
  18. kafka connector使用(Docker一键启动版)
  19. 拥有WiFi 6+的华为路由 AX 3 Pro 到底香不香
  20. 转行程序员日记---2020-10-16【最近有点累】

热门文章

  1. LinkedIn第三方登录(JavaScript SDK)
  2. Java——Eclipse快捷键大全
  3. 基于RV1126平台imx291分析 --- 写在开始
  4. 汽车企业售后业务数字化转型,究竟有多卷
  5. ascii码01100001_ASCII 码对照表详解 - 文章
  6. 用计算机考试时怎么返回桌面快捷键,win10系统如何使用返回桌面快捷键?快速返回到电脑桌面的方法...
  7. Centos7 完全卸载mysql5.7
  8. C语言俄罗斯方块代码(成功版)
  9. C#俄罗斯方块代码完整版带部分注释
  10. 信号和通信系统第三版(PDF)