APP连点
常用技术
app外部控制
- 无障碍服务 AccessibilityService
- monkey框架
- ADB控制
shell sendEvent
1
2
3
4eg:229就是menu的type值
sendevent /dev/input/event0 1 229 1
sendevent /dev/input/event0 1 229 0
这两句需要一起执行,因为一个点击事件包含down和up,不然不能执行操作shell input tap
1
adb shell input tap [x y]
APP内部控制
1. 通过Window注入MotionEvent
1 | long downTime = SystemClock.uptimeMillis(); |
2 . Instrumentation 发送事件
最大支持到android12 ,不受Activity限制,在任意屏幕可执行
1 | 对window有效 ,子线程调用 |
3 . getDecorView dispatchTouchEvent
1 | 针对window有效,无版本适配问题 |
连点器实现思路
- 找到需要注入点击事件的Activity
- 根视图添加空白的ViewGroup对touch点的拦截记录
- 最后对记录点进行点击模拟
兼容性测试
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手游连点器分析
- 通过 window setCallback 进行事件分发的回调处理
- 构造MotionEvent 通过 window getDecorView dispatchTouchEvent 完成事件的分发
- 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