吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2896|回复: 25
收起左侧

[Web逆向] 某讯点选纯算识别可能性(抛砖引玉)

  [复制链接]
hygzs 发表于 2025-1-3 10:22
本帖最后由 hygzs 于 2025-1-3 15:26 编辑

目标

使用纯代码进行识别AI生成图

网址

aHR0cHM6Ly9hY2NvdW50cy5xcS5jb20vbG9naW4vbGltaXQ=

原因

最近企鹅号大批量封号,还有误封,导致账号封禁,所以想写个自动查是否封号和封号多久的,但是由于他是AI生成图片,进行点选,所以另辟赛道实现一下算出点选,不借助模型去识别

先说思路


QQ20250103-095230.png

刷新了多张图片可以发现,他会生成6张图片,其中有2张图片孤立于其他4张,并且这2张相似,所以,我只需要对比所有图片的相似度,然后找出图片相似,但是孤立的,就很大可能是我所需要的,然后我任选其一点击即可

准备工作


[HTML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>喵呜</title>
    <script src="https://captcha.gtimg.com/TCaptcha.js"></script>
    <script type="text/javascript">
      window.TCaptchaId = "2028665724";
      window.TCaptchaApiDomain = "https://t.captcha.qq.com";
      window.TCaptchaTaskId =
        new URLSearchParams(location.search).get("id") || "";
      window.TCaptchaCallback = async function (t = {}) {
        console.log(t);
      };
    </script>
  </head>
  <body>
    <script>
      const id = window.TCaptchaTaskId;
      if (!id) {
        document.body.style.margin = "20px";
        document.body.innerHTML = "<h1>?</h1>";
      } else {
        new window.TencentCaptcha(window.TCaptchaId, window.TCaptchaCallback, {
          type: "full",
          showHeader: false,
          enableAged: true,
          enableDarkMode: "force",
        }).show();
      }
    </script>
  </body>
</html>

QQ20250103-095944.png

搭建一个html,不去他的网页,防止出现不好的影响

这里选择node作为开发语言,为了节省时间,就不去分析他的图片来源的完整流程使用puppeteer来进行获取图片这一步骤

尝试使用puppeteer直接打开,发现网页有检测所以



[JavaScript] 纯文本查看 复制代码
1
2
3
const puppeteer = require("puppeteer-extra");
const pluginStealth = require("puppeteer-extra-plugin-stealth");
puppeteer.use(pluginStealth());

使用puppeteer-extra 绕过检测


接下来编写代码

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(async () => {
 const browser = await puppeteer.launch({
        // headless: "new",
        headless: false,
        args: ["--disable-site-isolation-trials"]
    });
//创建一个浏览器,headless: false,展示出来
 const page = await browser.newPage();
    page.on('response', async (response) => {
const responseUrl = response.url();
        if (responseUrl.includes("t.captcha.qq.com/cap_union_new_getcapbysig?img")) {
            const picBuf = await response.buffer();
//这里拿到图片
        }
    });
    await page.goto("", { waitUntil: "networkidle0" });
//这里图片地址
await page.waitForSelector("#tcaptcha_iframe_dy");
    const frame = await page.frames()[1];
    await frame.waitForSelector("#slideBg");
    const slideBg = await frame.evaluate(() => {
        const img = document.querySelector("#slideBg");
        const rect = img.getBoundingClientRect();
        const width = rect.width / 3;
        const height = rect.height / 2;
        const centers = [];
        for (let i = 0; i < 2; i++) {
            for (let j = 0; j < 3; j++) {
                const x = rect.left + width * (j + 0.5);
                const y = rect.top + height * (i + 0.5);
                centers.push({ x, y });
            }
        }
        return centers;
    });
//把图片分割6份返回坐标的位置
})();

开始研究

图片相似算法有很多,例如 感知哈希(pHash)、结构相似性指数(SSIM)、余弦相似度等,我这里为了测试一下可能性,简单写一个通过色系判断,试试可能性



[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
async function extractImageParts(imagePath) {
    const verifyImg = sharp(imagePath).extract({
        left: 0,
        top: 34,
        width: 672,
        height: 480 - 34,
    });
    const verifyList = [];
    let index = 1;
    for (let i = 0; i < 2; i++) {
        for (let j = 0; j < 3; j++) {
            const left = j * 226;
            const top = i * 226;
            const task = verifyImg.extract({
                left: left,
                top: top,
                width: 220,
                height: 220,
            });
            const buf = await task.toBuffer();
            fs.writeFileSync(`d:\\验证码\\${index}.jpg`, buf);
            verifyList.push(buf);
            index++;
        }
    }
    return verifyList;
}
async function calculateAverageColors(verifyList) {
    return await Promise.all(
        verifyList.map(getAverageColor)
    );
}
 
async function getAverageColor(buffer) {
    const { data, info } = await sharp(buffer)
        .resize({ width: 12, height: 12 })
        .raw()
        .toBuffer({ resolveWithObject: true });
 
    let totalR = 0, totalG = 0, totalB = 0;
    for (let i = 0; i < data.length; i += 3) {
        totalR += data[i];
        totalG += data[i + 1];
        totalB += data[i + 2];
    }
    const numPixels = info.width * info.height;
    return [
        Math.round(totalR / numPixels),
        Math.round(totalG / numPixels),
        Math.round(totalB / numPixels),
    ];
}

使用sharp进行对图片分割,分割成3*2的220*220的图片,然后缩小图片,获得缩略图
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function calculateColorDistance(color1, color2) {
    const [r1, g1, b1] = color1;
    const [r2, g2, b2] = color2;
    return Math.sqrt(
        Math.pow(r1 - r2, 2) + Math.pow(g1 - g2, 2) + Math.pow(b1 - b2, 2)
    );
}
 
function generateSimilarityMatrix(averageColors) {
    const similarityMatrix = [];
    for (let i = 0; i < averageColors.length; i++) {
        const row = [];
        for (let j = 0; j < averageColors.length; j++) {
            if (i === j) {
                row.push(1);
            } else {
                const distance = calculateColorDistance(averageColors[i], averageColors[j]);
                row.push(1 - distance / 441.67);
            }
        }
        similarityMatrix.push(row);
    }
    return similarityMatrix;
}

初始化:创建一个空的相似度矩阵 similarityMatrix。
双重循环:遍历 averageColors 数组,构建矩阵的每一行和每一列。
对角线处理:当 i === j 时,将对角线元素设为1。
计算相似度:对于非对角线元素,调用 calculateColorDistance 函数计算颜色距离,并根据公式 1 - distance / 441.67 计算相似度。
返回结果:最终返回生成的相似度矩阵。

(index) 0 1 2 3 4 5
0 1 0.9197588917215598 0.8420127694937893 0.7422663723537234 0.6638008992328004 0.7710088553130863
1 0.9197588917215598 1 0.9214048726075587 0.8207755344292046 0.7423558925559035 0.8489804048665086
2 0.8420127694937893 0.9214048726075587 1 0.8928177111549833 0.8190108552384238 0.9242952725007336
3 0.7422663723537234 0.8207755344292046 0.8928177111549833 1 0.915132724368912 0.9568624563967268
4 0.6638008992328004 0.7423558925559035 0.8190108552384238 0.915132724368912 1 0.8926027013323846
5 0.7710088553130863 0.8489804048665086 0.9242952725007336 0.9568624563967268 0.8926027013323846 1




经过测试,只使用色系来进行识别的成功率有50以上,如果优化相似度算法,应该能达到80以上



上个gif图
20250103_152018.gif

免费评分

参与人数 4威望 +1 吾爱币 +23 热心值 +3 收起 理由
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
allspark + 1 + 1 用心讨论,共获提升!
jaffa + 1 谢谢@Thanks!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

ps520 发表于 2025-1-8 14:00
currentdirect 发表于 2025-1-7 14:09
请教下大佬,你这里用豆包识别完成之后,拿到那段文字然后要怎么处理呢?

用kimi,进一步优化提示词,根据图片中引号的内容,对引号内容下方的6个独立小图片内容进行标注,需要列明每张小图的行列关系和图中内容,准确选出符合引号文字描述的图片。返回结果格式为{[x1,y1]...},其中x1为第几行,y1为第几列。
这样返回的就是
根据您提供的描述,您需要选择与“美丽的茶园”最符合的图片。在您提供的6张小图中,我们需要找出描绘茶园的图片。

第一行第一列:孔雀
第一行第二列:飞翔的鸟
第一行第三列:飞翔的鸟
第二行第一列:飞翔的鸟
第二行第二列:茶园风景
第二行第三列:茶园风景
根据这些描述,符合“美丽的茶园”描述的图片是第二行第二列和第二行第三列的茶园风景图片。

因此,返回结果格式为:{[2,2],[2,3]}。


这样提取{}里的数据就知道是第几张图片了。
ps520 发表于 2025-1-3 13:45
本帖最后由 ps520 于 2025-1-3 13:59 编辑

那我也来抛个砖吧,既然是AI的题,那就交给AI做。
打开豆包,上传图片,给予引导词“根据图中引号内的文字内容,标识图片内容”
QQ浏览器截图20250103133511.png 截了下你的图。

image.png

图中的文字内容是 “美丽的茶园”。
图片内容标识如下:
第一行第一列:一只孔雀开屏的图片。
第一行第二列:一只鸟展翅飞翔的图片。
第一行第三列:一只鸟展翅飞翔的图片。
第二行第一列:一只鸟展翅飞翔的图片。
第二行第二列:一片绿色的山坡,可能是茶园。
第二行第三列:一片绿色的山坡,可能是茶园。

列的位置是固定的。

PS:企鹅那张图我试过,能识别出图里有2只,但第二只位置给定到了第一列第二行,不知道为啥。

------------------------------------update-----------------------------------------------------------------------------
重新测试了下,这次换个AI,kimi,引导词“根据图片中引号的内容,对下方的6个小图片内容进行标注,需要列明每张小图的行列关系和图中内容,准确选出符合引号文字描述的图片。
这下2张图都能一次性识别出来并且精准给出第几张了。
剩下的工作就是如何给程序接入AI并实现对话调用了。(豆包确实有点菜)
虚幻魔王 发表于 2025-1-3 13:26
这从哪来的勇气说百分之50以上?换一个背景马上让你跌到30%都不到。
 楼主| hygzs 发表于 2025-1-3 13:31
虚幻魔王 发表于 2025-1-3 13:26
这从哪来的勇气说百分之50以上?换一个背景马上让你跌到30%都不到。

自己去测,测了再来说,我死点一个位置成功率都是33%,数学不好吗,这个又不是必须全选
tomliu 发表于 2025-1-3 14:19
识别率这么高吗
xueye612 发表于 2025-1-3 14:36
ps520 发表于 2025-1-3 13:45
那我也来抛个砖吧,既然是AI的题,那就交给AI做。
打开豆包,上传图片,给予引导词“根据图中引号内的文字 ...

还是大佬会玩,~思路新颖,学习了
cxk6681 发表于 2025-1-3 15:05
膜拜大佬
 楼主| hygzs 发表于 2025-1-3 15:18
ps520 发表于 2025-1-3 13:45
那我也来抛个砖吧,既然是AI的题,那就交给AI做。
打开豆包,上传图片,给予引导词“根据图中引号内的文字 ...

一开始也想给ai去处理的例如 yolo world的成功率很高,而且只需要一个点中就行,但是ai的返回值用提示词去处理效果不太好,所以直接用技巧纯算感觉也行,他的这个验证码有点规律,而且基本上色系也很相近,想出来这种抽象方案
qnom8Tos 发表于 2025-1-3 17:46
冻结了就是冻结了,还跪tian,想炫技术也不用这么玩吧
lxyi 发表于 2025-1-3 17:59
过来看看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-11 07:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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