吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1465|回复: 4
收起左侧

[其他转载] 关于安卓请求中的滑动验证码的处理

[复制链接]
Zhili.An 发表于 2021-11-28 19:52
本人第一次写帖子,前段时间跟朋友为了抢学校的羽毛球场,写了一个python的脚本,但是本人又想写一个有ui的。但是呢,我们的频繁请求被学校发现了,同学被老师叫去约谈了,也增加了滑动验证码。所以本次针对滑动验证码处理一下。
首先,进行验证码请求抓包!!
image.png
其中
[Asm] 纯文本查看 复制代码
"backImg":"/9j/4AAQSkZJRgABAQEAYABgAAD........
,这里是验证码的大图片。
[Asm] 纯文本查看 复制代码
"captureImg":"/9j/4AAQSkZJRgABAQEAYABgAAD.....
这里是可滑动图片
这里的图片加密编码是base64,为什么呢?因为它的编码方式是以==结尾的,同时BASE64编码加密过的验证码图片应该怎样获取?依照他的方法验证了,确实可行。下面代码可以将base64编码转为图片

public static String GetImageStr(String imgFilePath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] data = null;

    // 读取图片字节数组
    try {
        InputStream in = new FileInputStream(imgFilePath);
        data = new byte[in.available()];
        in.read(data);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 对字节数组Base64编码
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(data);// 返回Base64编码过的字节数组字符串
}

public static boolean GenerateImage(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片
    if (imgStr == null) // 图像数据为空
        return false;
    BASE64Decoder decoder = new BASE64Decoder();
    try {
        // Base64解码
        byte[] bytes = decoder.decodeBuffer(imgStr);
        for (int i = 0; i < bytes.length; ++i) {
            if (bytes[i] < 0) {// 调整异常数据
                bytes[i] += 256;
            }
        }
        // 生成jpeg图片
        OutputStream out = new FileOutputStream(imgFilePath);
        out.write(bytes);
        out.flush();
        out.close();
        return true;
    } catch (Exception e) {
        return false;
    }
}


上面是验证码的获取,现在我们进行处理:
Android Studio 新建一个项目:
activity_main.xml文件代码如下(b为大图片,c为小图片验证):
[XML] 纯文本查看 复制代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    <ImageView
        android:id="@+id/iv_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/b"/>
    <ImageView
        android:id="@+id/iv_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/c"/>
</RelativeLayout>


MainActivity.java代码如下:
[Java] 纯文本查看 复制代码
package cs.cs;
//你的包名

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends Activity {
    private ImageView iv_main;
    private RelativeLayout parentView;
    private int lastX;
    private int lastY;
    private int maxRight;
    private int maxBottom;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_main =findViewById(R.id.iv_main);
        parentView = (RelativeLayout) iv_main.getParent();

 // int right = parentView.getRight(); //0
  //int bottom = parentView.getBottom(); //0
  //Toast.makeText(this, right+"---"+bottom,Toast.LENGTH_SHORT).show();

        //设置touch监听
        iv_main.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int eventX = (int) event.getRawX();
                int eventY = (int) event.getRawY();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //得到父视图的right/bottom
                        if(maxRight==0) {//保证只赋一次值
                            maxRight = parentView.getRight();
                            maxBottom = parentView.getBottom();
                        }
                        //第一次记录lastX/lastY
                        lastX =eventX;
                        lastY = eventY;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //计算事件的偏移
                        int dx = eventX-lastX;
                        int dy = eventY-lastY;
                        //根据事件的偏移来移动imageView
                        int left = iv_main.getLeft()+dx;
                        int top = iv_main.getTop()+dy;
                        int right = iv_main.getRight()+dx;
                        int bottom = iv_main.getBottom()+dy;
                        //限制left >=0
                        if(left<0) {
                            right += -left;
                            left = 0;
                        }
                        //限制top
                        if(top<0) {
                            bottom += -top;
                            top = 0;
                        }
                        //限制right <=maxRight
                        if(right>maxRight) {
                            left -= right-maxRight;
                            right = maxRight;
                        }
                        //限制bottom <=maxBottom
                        if(bottom>maxBottom) {
                            top -= bottom-maxBottom;
                            bottom = maxBottom;
                        }
                        iv_main.layout(left, top, right, bottom);
                        //再次记录lastX/lastY
                        lastX = eventX;
                        Log.e("X",String.valueOf(left*221/600));
//这里的600为这里控件的真实长,221为验证码真实长
//225和83同理
                        lastY = eventY;
                        Log.e("Y",String.valueOf(top*83/225));
                        break;
                    default:
                        break;
                }
                return true;//所有的motionEvent都交给imageView处理
            }
        });
    }


}

打包测试:
2385eab28ce45485f80fa642b0a08c3.png

免费评分

参与人数 2吾爱币 +11 热心值 +2 收起 理由
苏紫方璇 + 10 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
fenghl + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Zhili.An 发表于 2021-11-28 19:54
同时BASE64编码加密过的验证码图片应该怎样获取?的地址为:https://www.teamczyx.com/thread-404-1-1.html   不小心弄掉了
头像被屏蔽
cmbslgn 发表于 2021-11-29 09:15
Pwaerm 发表于 2021-11-29 09:37
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 23:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表