zl程序教程

您现在的位置是:首页 >  其他

当前栏目

关于hcaptcha (vm wasm ob)三合一

2023-02-25 18:27:52 时间

该文章主要提供交流学习使用,请勿利用其进行不当行为!

如本篇文章侵犯了贵公司的隐私,请联系我立刻删除!

如因滥用解密技术而产生的风险与本人无关!

1

Hcaptcha

hCaptcha 旨在解决机器学习中最劳动密集型的问题:以及时、负担得起且可靠的方式标记大量数据。在训练机器学习模型中,更多数据通常会产生更好的结果。深度模型的最新成功导致了越来越大的数据集,几乎总是需要人工审查。但是,通过 Mechanical Turk、Figure 8 等创建大型的人工检查数据集既缓慢又昂贵。hCaptcha 允许网站在满足这种需求的同时,阻止机器人和其他形式的滥用,并赢取回报。

阻止机器人和其他形式的滥用,并赢取回报。

并赢取回报。

2

示例网站

https://dashboard.hcaptcha.com/signup

2.1

无感

无感操作比较方便,九宫格还需要点击。而且。九宫格不参与此加密的计算,所以和咱们讲的毫无关系!

3

开始操作

首先,证明自己是个人。点击后,发送了一个包。

然后发包!!

太长了,,截图装不下来研究下这些参数!!

{

v: 版本号,

sitekey: 验证码的一个 key,

hl: ,

host: ,

motionData: 包含鼠标的移动轨迹,以及一大堆乱七八糟的参数,

n: 全环境校验的值,由 hsw.js 脚本生成,c: 返回的

}

4

n 值

我们就来看下 n 值是怎么生成的。

至于 motionData。鼠标放在点击那里,尽可能的不要移动鼠标,然后刷新网页,然后点击。

以此来减少 motionData 收集你的鼠标移动轨迹。

这个参数没啥说的,写死就行,不影响后面的流程(当然大量并发除外)

不说这个了。

接着来看 n 值。

长度 9666。。。。。。(low,,没有 5s 盾长。嘲笑他)

大约在 4 月份。。长度还是 4000 多。。半年不看,,长度就翻倍了。。。。。

啦啦

我们此处根据堆栈来尝试找找 n 值!!

点击发包。

然后看右边堆栈,

我们找到了此处。

这个我们不就看到了 n 值 赋值的地方吗

下断点,刷新,点击,

得了,还在上层。,接着看堆栈。。。

此处我们就看到了疑点。。异步执行

意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题。

语法:promise.then(onCompleted, onRejected);

那我们此处就要看 Cn 里面的东西了。

然后看到 solved = vn

哪个 vn??

然后就全局搜索 vn 吧。

此处疑点只有一个。

看到了 req 和 vn 还有异步。。。。那我们就得这样下断点。

come

然后 刷新

断点断下。。。然后三目、、、然后 false

然后 e 函数。。

然后他就来了呀。。。

hsw.js 文件。。。

一份 2000 行的 vm 代码

此处,,直接拿下来补环境吧!!!!

5

hsw.js 环境

先看这份代码。

有很多的都是以环境参数名字命名的函数,可以更直观的看出他想要校验什么东西。

不过此处注意一点。看他们写的代码就知道。到处都是异步。。

不。。整个代码都是异步。所以要处处小心。

此处举个例子:::

如 :RTCPeerConnection createOffer

官方说明:

https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection/createOffer

当然,需要你自己更改重新定义。。

此处异步代码:

对下面的补环境帮助非常大哟!!

async function make_Promise_s() {
    let results = new Promise((resolve, reject) => {
        resolve(undefined)
    });
    return await results;
};

RTCPeerConnection = function RTCPeerConnection(){};
RTCPeerConnection.prototype = {
    createOffer: function createOffer(){
        return make_Promise_s()
    }
};
a = new RTCPeerConnection();
console.log(a.createOffer());

好了,接着走。看眼 wasm。。。看一眼就行。。

接着看OB代码。

当然,,等你环境补到 Request 的时候,,那么 ob 也就来了。。

请求了一个 e 的文件,,,是文件。。

当然。。这个文件的命可以从 req 这个值得知。

此处讲解:

除了传给 fetch() 一个资源的地址,你还可以通过使用 Request() 构造函数来创建一个 request 对象,然后再作为参数传给 fetch().

然后请求成功。ok

我们看下这个文件,乱七八糟的,,他M都不认识!!!

然后获取他的文件流。

诶,,问题来了,此处难道我们也要每次请求一下这个文件来获取他的文件流吗。。

答案是,no no no no

我们这样做。。

请求这个文件,,然后把他 base64 ,省去编码的麻烦。。

然后,嘿嘿嘿嘿嘿嘿代码如下。


function strToArrayBuffer (str) {
    var array = new Uint8Array(str.length);
    for(var i = 0; i < str.length; i++) {
        array[i] = str.charCodeAt(i);
    }
    return array.buffer
}

b = "b64编码"

atob = function(r) {
    e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o = String(r).replace(/=+$/, "");
    if(o.length % 4 == 1) throw new t("'atob' failed: The string to be decoded is not correctly encoded.");
    for(var n, a, i = 0, c = 0, d = ""; a = o.charAt(c++); ~a && (n = i % 4 ? 64 * n + a : a, i++ % 4) ? d += String.fromCharCode(255 & n >> (-2 * i & 6)) : 0) a = e.indexOf(a);
    return d
}

console.log(new Uint8Array(strToArrayBuffer(atob(b))))

然后又要说,,得到的结果怎么用起来呢???

嗯???

我前面的异步代码白发了????

你懂我意思吗????

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

5.1

ob 环境

然后我们就来到了 ob 环境里面,,

如上,,直接复制 ob 环境代码。。。

然后如图。。更改为这样。。

然后你就开始补环境吧。。

然后唠唠嗑。。。

调试的时候当然要在 try catch 下下断点咯。。。

然后根据报错信息找问题,,,

当然,,,少不了他们钟爱的异步代码。这个很蛋疼。。。。。。。

以及里面大量的 Object.getOwnPropertyNames Object.keys

我看到的时候,,还以为这是 5s 盾呢。。这太 Tm 难受了。。然后。。。

然后我就看到。。

好家伙,,你真 TM 省事,,直接截取了 25 个。。。。。。。。

我****

其实这里面也一样。有很多的环境都暴露出来了。

而且最方便的是,,,

前面我让你们改的代码。。

打印下。。。

然后浏览器打印下

至于怎么补环境。这个就人人有自己的想法了。。就是怎么把代码给跑通。。

肝出来。。也就 2000 行代码(ps:我不肝了)

当然还有怎么返回结果

还有就是本地返回的方法。。

当然最后成功就是返回 generated_pass_UUID 这个字段。

然后就是结果了。。当然,,你生成出来的,也要是 9666 。。(每个浏览器不一样,具体看你的浏览器以及你的电脑)有时候会上下浮动两位。。9664 9668.。具体原因,,,不详。。

自己摸索吧。。。