chrome расширение, чтобы обойти reCAPATCHA от Google - PullRequest
1 голос
/ 27 марта 2020

видел это: Есть ли расширение Chrome для обхода Googl ReCAPTCHA или даже для его решения? но это стоит денег, и я хотел сделать это сам.

Google reCAPTCHA работает, генерируя токен ответа на стороне клиента (хотя вполне уверен, что фактический токен генерируется на серверах Google после прохождения вызова), а затем отправляется на сервер пользователей с помощью запроса POST из который передается со вторым запросом с сервера вместе с секретом клиента на серверы Google, чтобы проверить это.

Я не уверен, но я почти уверен, что скрипт, найденный на https://www.gstatic.com/recaptcha/releases/P6KLRNy7h3K160ZmYNUOAce7/recaptcha__en.js

, делает кучу запросов к серверу Google через iframe. создается по URL-адресу, например:

https://www.google.com/recaptcha/api2/anchor?ar=1&k=6LclXeQUAAAAAM-ERgucg4FfAtRm7HREwKQcvMj6%0A&co=aHR0cDovL2xvY2FsaG9zdDo3NzA.&hl=en&v=P6KLRNy7h3K160ZmYNUOAce7&size=normal&cb=7m1b79j6yz5s

, и я почти уверен, что это работает (т. е. генерирование токена ответа на запрос в Google серверов) через iframe, потому что iframe имеет тот же источник, что и серверы Google, на которые он отправляет запрос, поэтому я предполагаю, что на стороне сервера он проверяет, с какого домена поступает запрос, чтобы люди не могли просто отправить тот же запрос, который отправляет Google, из своих собственных javascript.

Дело в том, что расширения chrome позволяют вводить javascript, который теоретически может работать во всех фреймах на странице, поэтому теоретически можно отправлять на серверы Google те же запросы, что и текущий API, только после решения проблемы; только без решения задачи.

Значение (поправьте меня, если я ошибаюсь), я почти уверен, что когда вы выполните задание, которое генерируется и управляется этим файлом javascript, этот файл отправляет какой-то запрос к серверам Google, чтобы он сказал, что мы прошли и получили токен обратно, но теперь я говорю, что теоретически то же самое должно быть в состоянии сделать с нашим собственным скриптом с введенным контентом (для iframe) через расширение chrome, и если мы сможем найти тот же URL-адрес запроса в исходном коде файла API js, то сможем отправить точно такой же запрос, который обычно вызывается по завершении вызова, только без завершения Задача.

Дело в том, что я пытаюсь go просмотреть исходный код, чтобы выяснить, где происходит этот запрос и каково его значение, но я не могу расшифровать его и хотел бы получить некоторую помощь. Я подумал, что эта часть вызывается, когда установлен флажок (строка 8225, когда украшен ):

op = function(y, T, t, C, k, c, q, H, P, R, g, B) {
            return $z(function(N) {
                if (1 == N.Z) {
                    for (g = (R = A((P = ((q = (c = ($h((C = new(t = new l, J3), C), pg(y.Z,
                            p6)), k = [E.bK, E.Th, E.uK, function(Q) {
                            for (var K = 0, w = []; K < arguments.length; ++K) w[K - 0] = arguments[K];
                            return E.Qe.apply(E, [].concat(CF(w), [ND(T.Z, T.Z.has(RV) ? RV : aV)]))
                        }, E.L_, E.wG, E.vC, E.ps, E.Gh, E.Wm, function(Q) {
                            for (var K = 0, w = []; K < arguments.length; ++K) w[K - 0] = arguments[K];
                            return E.W5.apply(E, [].concat(CF(w), [T.OG]))
                        }, E.vq, E.uX, E.YU, E.Fe, E.dG, function(Q) {
                            for (var K = 0, w = []; K < arguments.length; ++K) w[K - 0] = arguments[K];
                            return E.Wq.apply(E, [].concat(CF(w), [C]))
                        }, E.bX, E.$U, E.m$, E.hY, E.NP, E.hG, E.r8, Go, E.Xe, function(Q) {
                            return E.tG(Q,
                                F_(100))
                        }], F_)(2E3), Promise).resolve(Lj()), H = 0, E).bh(), {}), k)), R.next()); !g.done; P = {
                            gK: P.gK
                        }, g = R.next()) P.gK = g.value, q = q.then(function(Q) {
                        return function(K) {
                            return Q.gK.call(T, K, c, H)
                        }
                    }(P)).then(function(Q) {
                        return (Q.bc(t), Q).aJ()
                    }), H += 1;
                    return Y(N, q, 2)
                }
                return (B = LD((Ea(t), T).L), N).return(new Id(B, yE(t)))
            })
        }

, поэтому я думаю, что что-то в этой функции вызывает какую-то другую функцию, которая запускает вызов и в конечном итоге делает запрос на завершение на сервер Google, но я не знаю, что.

Кстати, причина, почему я знаю, что эта функция вызывается после того, как флажок установлен, потому что раньше " событие «определено» (строка 8157, когда оно улучшено):

dA = function(y, T, t, C, k) {
            return q6((k = (C = pM(T, (t = void 0 === t ? 2 : t, x7(y.L), y)), y.L.render(C, q7(y.id), String(H$(y)), uk(cQ, y.Z)), y).L.L, C), k, new Map([
                    ["j", y.I3],
                    ["e", y.P5],
                    ["d", y.ih],
                    ["i", y.Ax],
                    ["m", y.qC],
                    ["o", y.MC],
                    ["a", function(c) {
                        return op(c, y)
                    }],
                    ["f", y.xE]
                ]),
                y, 2E4).catch(function(c, q) {
                if (y.OG.contains(k)) {
                    if (0 < (q = t - 1, q)) return dA(y, T, q);
                    y.L.sy(EB(y), q7(y.id), !0)
                }
                throw c;
            })
        }

, как вы можете видеть, есть событие «a», которое вызывает функцию «op», и отправляется это событие «a» ( строка 6658):

function() {
                    F((VN.V.$.call(this), this)).H(["before_checked", "before_unchecked"], this.q0, W(function(y) {
                        ("before_checked" == y.type && this.dispatchEvent("a"), y).preventDefault()
                    }, this)).H("focus", document, function(y) {
                        y.target && 0 == y.target.tabIndex || this.q0.M().focus()
                    }, this)
                }

что я догадываюсь - это то, что вызывается при нажатии флажка, так как у него есть preventDefault, что подразумевает его функцию события.

Итак, мы добираемся куда-то, но все еще должны помочь выяснить , как именно делается запрос на серверы Google для завершения, т. Е. Какой точный URL и какие точные заголовки / тело. Любые идеи?

Я почти уверен, что фактический запрос сделан здесь (строка 8439):

(null != (((((Hn.call(this, "/recaptcha/api2/userverify", cn(gl), "POST"), qp)(this, y, "c"), qp(this, T, "response"), null) != t && qp(this, t, "t"), null) != C && qp(this, C, "ct"), null) != k && qp(this, k, "bg"), c) && qp(this, c, "dg"), null) != q && qp(this, q, "mp")

И для контекста, функция Hn, которая, кажется, делает Запрос, здесь определяется (строка 5973):

Hn = function(y, T, t) {
            (FK((y = (this.I = new(this.L = (this.Z = (this.Y = (this.O = T, t || "GET"), new m3), e$(y, this.Z), null), D6), yW)(), this.Z), "k", y), qp)(this, "P6KLRNy7h3K160ZmYNUOAce7", "v")
        }

, но IDK значения заголовков et c. есть.

...