小小滑块可笑可笑-安卓滑块验证码通杀方案研究(4)

说明

文章首发于HURUWO的博客小站,本平台做同步备份发布。

如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论回复。

原文链接 小小滑块可笑可笑-安卓滑块验证码通杀方案研究4直接点击即可前往访问。

更多技术文章访问本人博客HuRuWo的技术小站,包括Android 逆向 app,闲鱼爬虫 微信爬虫 抖音爬虫 群控 等相关知识

也可关注公众号 'wan_coder' 第一时间收到文章更新

前言

之前已经研究完生成路径这件事了,现在测试如何按照生成的轨迹与时间跑起来。

测试轨迹代码

使用无障碍测试实战某红薯

无障碍多段滑动测试

简易代码如下

private void swipe(List<PathBean> pathBeans) {

        Observable observable = Observable.just("");

        for (PathBean pathBean : pathBeans) {

            Path path = new Path();
            path.moveTo(pathBean.getX1(), pathBean.getY1());
            path.lineTo(pathBean.getX2(), pathBean.getY2());

            observable = observable.concatMap((Function<String, ObservableSource<String>>) o -> Observable.create(new ObservableOnSubscribe<String>() {
                @Override
                public void subscribe(@NonNull ObservableEmitter<String> emitter) {
                    service.dispatchGesture(new GestureDescription.Builder()
                            .addStroke(new GestureDescription.StrokeDescription(path, 0, pathBean.getDua()))
                            .build(), new AccessibilityService.GestureResultCallback() {
                        @Override
                        public void onCompleted(GestureDescription gestureDescription) {
                            super.onCompleted(gestureDescription);
                            emitter.onNext("");
                        }
                    }, null);
                }
            }));
        }

        observable.subscribe((Consumer<String>) o -> ToastUtils.showLong("滑动结束"));

    }

实测发现 只能移动前面短短的一段子,后面的直接算是抬起了。

也就是即使加了多端path 也是一个

按下--滑动--抬起
按下--滑动--抬起
按下--滑动--抬起
按下--滑动--抬起
按下--滑动--抬起
...
的循环,直接第一段算是结束了。

核心在于path的 moveTo是需要抬起更换新的起始点的。

无障碍path添加多段lineTo测试

想到如果添加多段lineTo呢,不断地lineTo lineTo lineTo lineTo lineTo

Path path = new Path();
                        path.moveTo(pathBean.getX1(), pathBean.getY1());
                        path.lineTo(pathBean.getX2(), pathBean.getY2());
                        path.lineTo(pathBean.getX2(), pathBean.getY2());
                        path.lineTo(pathBean.getX2(), pathBean.getY2());
                        path.lineTo(pathBean.getX2(), pathBean.getY2());
                        path.lineTo(pathBean.getX2(), pathBean.getY2());
                        path.lineTo(pathBean.getX2(), pathBean.getY2());

                        service.dispatchGesture(new GestureDescription.Builder()
                                .addStroke(new GestureDescription.StrokeDescription(path, 0, pathBean.getDua()))
                                .build(), new AccessibilityService.GestureResultCallback() {
                            @Override
                            public void onCompleted(GestureDescription gestureDescription) {
                                super.onCompleted(gestureDescription);
                            }
                        }, null);

可惜也是失败的,因为分析GestureDescription的源码可以得出

mPathMeasure.setPath(mPath, false);
            mStartTime = startTime;
            mEndTime = startTime + duration;
            mTimeToLengthConversion = getLength() / duration;
            mId = sIdCounter++;

这里直接PathMeasure测量了整个path的长度后除以持续时长

也就是即使是分段的加入path,在最后还是匀速的运行。也就回到了第一章节遇到的问题。

匀速无法通过滑块的校验。

转来转去又回到最初的起点了。

测试其他滑动方案

adb方案连续的

adb shell input swipe 250 250 300 300 100
adb shell input swipe 250 250 300 300 100
adb shell input swipe 250 250 300 300 100
adb shell input swipe 250 250 300 300 100
adb shell input swipe 250 250 300 300 100
adb shell input swipe 250 250 300 300 100
adb shell input swipe 250 250 300 300 100

也是会拿起又放下 依然错误

appium/airtest 的连续滑动方案

http://airtest.netease.com/
http://appium.io/

swipe_along

swipe_along(* args,** kwargs )[源代码]
依次在多个点上执行滑动事件。

参数:
坐标列表–坐标列表:[(x1,y1),(x2,y2),(x3,y3)]
持续时间–滑动持续时间的时间间隔,默认值为0.8
步骤–滑动步骤的大小,默认为5
返回:
没有

swipe

swipe(* args,** kwargs )[源代码]
执行滑动事件。

参数:
tuple_from_xy –起点
tuple_to_xy –终点
持续时间–滑动持续时间的时间间隔,默认值为0.8
步骤–滑动步骤的大小,默认为5
返回:
没有

分析两个可以用的滑动事件 都不能做连续不抬起手的滑动操作.

同样的appium也不能做到。

我们究竟想要怎样的滑动呢

总结一句话就是 连续不抬起手的滑动可以控制速度的操作

1.连续 不抬起手 -- 不能分解为多段路径进行
2.控制速度 -- 不能是匀速的 太傻太呆 容易被检测

体现在我们的view事件捕获结果就是:

--按下事件
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
--消耗一些时间移动到新的位置(距离和时间都要可调节)
。。。。
。。。。
。。。。
。。。。
--抬起手事件

显然我们目前的框架无法达到如此高精度的滑动操作,只能机械的全匀速。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注