Android连点器技术分析

APP连点

常用技术

app外部控制
  1. 无障碍服务 AccessibilityService
  2. monkey框架
  3. ADB控制
    1. shell sendEvent

      1
      2
      3
      4
            eg:229就是menu的type值
      sendevent /dev/input/event0 1 229 1
      sendevent /dev/input/event0 1 229 0
      这两句需要一起执行,因为一个点击事件包含down和up,不然不能执行操作
    2. shell input tap

      1
      adb shell input tap [x y]
APP内部控制
1. 通过Window注入MotionEvent
1
2
3
4
5
6
7
8
9
10
11
12
long downTime = SystemClock.uptimeMillis();

final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,
MotionEvent.ACTION_DOWN, x, y, 0);

downTime += 1000;

MotionEvent upEvent = MotionEvent.obtain(downTime, downTime,
MotionEvent.ACTION_UP, x, y, 0);

getWindow().injectInputEvent(downEvent);
getWindow().injectInputEvent(upEvent);
2 . Instrumentation 发送事件

最大支持到android12 ,不受Activity限制,在任意屏幕可执行

1
2
3
    对window有效 ,子线程调用
  instrumentation.sendPointerSync(keyCode);
   
3 . getDecorView dispatchTouchEvent
1
针对window有效,无版本适配问题

连点器实现思路

  1. 找到需要注入点击事件的Activity
  2. 根视图添加空白的ViewGroup对touch点的拦截记录
  3. 最后对记录点进行点击模拟
兼容性测试
1. window.injectInputEvent
1
2
android 13 mi10 
   android 14 模拟器
2. instrumentation.sendPointerSync
1
2
3
4
5
6
android 6 模拟器
android 9 vivo
   android 10 模拟器
android 11 oppo
   android 12 模拟器
   

小7手游连点器分析

  1. 通过 window setCallback 进行事件分发的回调处理
  2. 构造MotionEvent 通过 window getDecorView dispatchTouchEvent 完成事件的分发
  3. window getDecorView addView 添加连点器的画布FrameLayout,在frameLayout中完成画布的构建

android开发者工具app找到【执行】按钮所在布局的空间id,name 图1

反编译apk,全局搜索使用到当前id的代码,因为当前空间可点击,重点关注onclick事件 图2


step1:点击事件肯定是执行流程的开始,跟踪它。代码逻辑分支太多,发现PlanDetailBean里面保存了记录点和touch点

step2:看那些地方使用到这些点

通过对recordEventList调用查询,定位到ensm#arsm,发现了MotionEvent,继续追踪此函数的调用方追踪到Window.Callback回调了dispatchTouchEvent。

通过给window添加callback实现了touch事件分发的拦截进行打点。

step3: 根据touchSpotList寻找无果,转变思路找cycleInterval 通过猜测是按钮点击的间隔,继续找,

step4:
定位到absm#alsm,此函数通过timer#schedule 执行定时任务,找到这个task,定位到absm#aosm函数有处理TouchSpotBean列表,猜测是点击点集合。追踪定位到bwsm#agsm,此函数有handler处理任务,定位到handleMessage,发现是不断循环的延迟任务处理自身。猜测:是执行定时点击的循环处理。

step5: 根据handleMessage定位到 absm#afsm ,发现有log输出坐标信息,打开手机运行游戏进行验证,right 图3

step6: 又根据logcat额外的信息定位到asm#asm,验证了图3的调用。此函数构造了MotionEvent,根据事件分发相关知识,关注此event如何被分发出去. 见图4

step7:
this.asm.get().dispatchTouchEvent(obtain); 查看asm.get()是什么,发现asm.get在当前class构造函数被初始化,见图5





参考:
Android代码模拟物理、屏幕点击事件

阿里云android点击事件研究