1. getevent命令
我们首先是根据adb shell getevent命令获取到被点击位置的信息。
这里要说明的是,不同的手机手机获得的点击输出是不一样的。以我的真机为例,输出如下
本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51916845
/dev/input/event0 3 39 3e1 /dev/input/event0 1 14a 1 /dev/input/event0 1 145 1 /dev/input/event0 3 35 406 //x坐标 /dev/input/event0 3 54 1083 //y坐标 /dev/input/event0 0 0 0 /dev/input/event0 3 39 ffffffff /dev/input/event0 1 14a 0 /dev/input/event0 1 145 0 /dev/input/event0 0 0我看到网上很多人的输出很简单,这样分析起来还比较简单。因厂家而异吧,我的输出就有些复杂,通过我的大量点击测试分析,在本机上,上面除了xy坐标,其他指令是固定的,当然我也获得很多其他指令(每一行的倒数第二个数),因为不是必须的,所以没列出来。经过查阅资料,其他信号的对应信息如下。
#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */ #define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */ #define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */ #define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */ #define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */ #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */ #define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */ #define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */ #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */ #define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
2. sendevent实现模拟长按
我很好奇如果把输出的这些指令原封不动地给系统返还回去会有什么结果,我以为会是简单的重复点击,可是把1中获得的信号全部通过shell命令输入,获得的竟然是长按的效果。很意外,具体是因为什么我也不清楚。可能在其他手机上就不是这个效果了。
这里需要注意的是,我们获得的是16进制,输入必须是10进制,需要自行转换一下。
根据不同的分辨率,获得的16进制如何转换为真实的坐标值,这篇博文已经讲述的很详细了。
其他的比如模拟点击,滑动,输入等操作已经在前面使用ADB进行模拟点击的文章里介绍过了。
3. 密码获取
通过2中的链接文,已经介绍过了如何通过代码形式执行Shell命令。
这里当然是将“getevent”作为命令写入脚本啦。注意要开启子线程,否则会引起ANR。
然后就开启了用户点击,我们只要拿到Runtime.getRuntime().exec("su").getInputStream()流并分析“35”以及“36”后的16进制数,即可得到用户的点击位置。这个流是错误流和正确流分开的,注意处理不当会阻塞。可按照以下几种方法避免阻塞。
(1)可以通过将redirectErrorStream 属性设置为true合并错误流和正确流。
(2)显然可以想到两种流,开启两个线程去接收。
(3)在已知输出顺序的情况下,调整处理流的代码顺序。(不通用)
具体的如何从用户大量的点击事件中获取密码。便是根据算法来决定的了,算法越精密,获取到用户密码的可能性越大。
这里可以提供一个思路:
1. 通过Accessibility机制只监听支付宝。具体如何配置已经在Accessibility机制实现模拟点击中介绍过了。
2. 在获取到点击坐标之后,可以通过判断连续6个点均处于屏幕的下方来认为这是一组密码(当然是不准确的),具体的筛选密码的条件可以通过你的聪明才智去实现。
拿到密码之后,便可以通过模拟点击去实现自动转账了。这个前面已经使用ADB Shell命令实现模拟点击中介绍过了。