<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Q</title><generator>teletype.in</generator><description><![CDATA[Q]]></description><link>https://teletype.in/@it_hueta?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/it_hueta?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/it_hueta?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 14 Apr 2026 19:40:45 GMT</pubDate><lastBuildDate>Tue, 14 Apr 2026 19:40:45 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@it_hueta/tQB6CERLNsc</guid><link>https://teletype.in/@it_hueta/tQB6CERLNsc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/tQB6CERLNsc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Yandex smart captcha на заросеках</title><pubDate>Fri, 19 Apr 2024 12:54:16 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/dc/f8/dcf8357e-d7c6-4c73-a8fc-31d144d6a5e5.png"></media:content><category>выебано</category><description><![CDATA[<img src="https://img4.teletype.in/files/77/85/77859c0f-a8a9-4900-9bb3-833decffbeb0.png"></img>Вбивал я тихонько дорки в яд, никого не трогал. И тут хуяк.. Капча!]]></description><content:encoded><![CDATA[
  <figure id="3vf1" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/77/85/77859c0f-a8a9-4900-9bb3-833decffbeb0.png" width="1280" />
    <figcaption>Капчи.. бесят.</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="oeck">Введение</h2>
  </section>
  <p id="NU9o">Вбивал я тихонько дорки в яд, никого не трогал. И тут хуяк.. Капча!</p>
  <figure id="NX6c" class="m_original">
    <img src="https://img3.teletype.in/files/6b/3b/6b3b53ab-757a-4289-812f-6034cbe868b4.png" width="460" />
  </figure>
  <p id="t0wc">Капчи средь бело дня это ужос.</p>
  <figure id="OtuQ" class="m_original">
    <img src="https://img1.teletype.in/files/47/1f/471fe5d1-2676-4ca2-8748-6917c39e705a.gif" width="560" />
  </figure>
  <p id="MU00">И как же меня она уже заебала.. Я часто юзаю яд в инкогнито, а там она вылезает постоянно.</p>
  <figure id="jYQR" class="m_original">
    <img src="https://img4.teletype.in/files/be/a6/bea68ff9-eb0c-43ff-ad81-42c22ebebc98.png" width="1366" />
  </figure>
  <p id="ecMH"><strong>Чё по капче?</strong></p>
  <p id="pnAN">Я уже несколько раз разбирал Яндекс капчу на канале, но в последний не затащил. И вот почему:</p>
  <p id="NbC9">Сначала у яда был просто фингер и xor по ключу, который прилетал с сервера.</p>
  <figure id="4xl1" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d8/3d/d83db33a-f331-4af6-bf1b-c05f038e6c38.png" width="547" />
    <figcaption>Максимально банальная защита.</figcaption>
  </figure>
  <p id="yUNN">Позднее они добавили обфускацию, ключевое слово уже генерилось каким-то гига массивом в кучей сдвигов. Тоесть хуй поймешь как оно кастует ключ. Только вот массив при каждой загрузке кода капчи был разный. </p>
  <figure id="Osi0" class="m_original">
    <img src="https://img1.teletype.in/files/4b/f8/4bf8ee2c-222e-4221-b796-73d6790f6404.png" width="468" />
  </figure>
  <p id="R1PK">Довольно долго ручками пытался деобфусцировать то, что по факту, как оказалось, является динамической хуйней (примерно как у твиттера).</p>
  <figure id="yw28" class="m_original">
    <img src="https://img1.teletype.in/files/c4/ce/c4ce9e93-6dd0-4d62-8a63-b6c6f9467fe8.gif" width="540" />
  </figure>
  <figure id="G2Bw" class="m_original">
    <img src="https://img4.teletype.in/files/fd/06/fd065ae1-8cfd-4026-9288-048ef84eb5d7.png" width="945" />
  </figure>
  <p id="9qhO">Тоесть шифрование (енкод) в каждом файле новое, новые цифры в циклах, как и их количество. Забегая вперед скажу, что итогу я порешал, его нужно целиком из файла пиздить, но об этом чуточку позже)</p>
  <figure id="uzhv" class="m_original">
    <img src="https://img2.teletype.in/files/5e/41/5e418838-a856-471a-90e5-114b1dbf0361.png" width="555" />
  </figure>
  <p id="SSi5">С появлением сурсов самой капчи (взлома яндекса), имея открытый список большей части проверок, выебать их теперь не составит большого труда. <strong>Похуярили!</strong></p>
  <figure id="hRij" class="m_original">
    <img src="https://img3.teletype.in/files/65/66/6566faf2-395a-4f1f-bf82-3dd97135b0a7.gif" width="480" />
  </figure>
  <p id="n97L"></p>
  <h2 id="9qGe">Подготовка</h2>
  <p id="h865">Проведем поверхностный прочек, чтобы просто понимать чё куда. </p>
  <p id="nUph">В запросе много всяких параметров, но самый интересный, имхо, фингер. Поэтому разберемся с ним.</p>
  <figure id="1JGS" class="m_original">
    <img src="https://img4.teletype.in/files/fd/d5/fdd57862-3da1-449c-afb1-3f6656e0fd27.png" width="1055" />
  </figure>
  <p id="YF4n">Как я уже сказал, сурсы яда были слиты. </p>
  <figure id="mElG" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/62/81/6281cf74-2764-4539-b361-14864c7c264c.png" width="1171" />
    <figcaption>Не хорошо конечно, что яд взломли, мои им соболезнования. Но раз сурсы есть, чё бы их не почекать. Кстати удивительно, но там самый обычный код, типо максимально обычный. И все приколы довольно стандартные и ожидаемые.</figcaption>
  </figure>
  <h3 id="Qmm5"><strong>Чего там есть интересного? </strong></h3>
  <p id="aL3g">Ну например то, как устроен антифрод на этой капче. С всякими схемами и пояснениями, всей внутрянкой и документацией. В чатике мы это когда-то уже обсуждали.</p>
  <figure id="CF2Z" class="m_original">
    <img src="https://img1.teletype.in/files/8c/c1/8cc1555a-1d41-4f9f-9d5b-c64bcdf51c4b.png" width="1407" />
  </figure>
  <p id="a8Lg">Даже код генерации текстовой капчи был, со списком блек слов.</p>
  <figure id="FTW7" class="m_original">
    <img src="https://img3.teletype.in/files/61/d9/61d9b105-3539-490f-94cd-2fa741fd2e87.png" width="601" />
  </figure>
  <h3 id="xsMy"><strong>Сурсы капчи</strong></h3>
  <p id="UVp9">Но меня больше интересовали сурсы Yandex SmartCaptcha, потому перейдем сразу к ним. И как же дохуя там всяких папок, версий, инструкций..</p>
  <figure id="BfWq" class="m_original">
    <img src="https://img4.teletype.in/files/38/83/3883d789-d664-4246-ada6-8a2895f03575.gif" width="520" />
  </figure>
  <p id="RA9Y">Берем просто какую-то демку и чекаем с небольшим допилом..</p>
  <figure id="iIbm" class="m_original">
    <img src="https://img2.teletype.in/files/dd/c6/ddc6d03f-7575-4382-98cf-825305b57c7a.png" width="1309" />
  </figure>
  <p id="MPxD">Фингер собирается, отлишна.</p>
  <figure id="eyHq" class="m_original">
    <img src="https://img3.teletype.in/files/6a/40/6a40e6e5-ca64-42d8-a0da-39d9dd9090e4.gif" width="480" />
  </figure>
  <p id="G8f9">Инициатор сбора одна из этих функций. Делают они примерно одно и то же.</p>
  <figure id="nL9d" class="m_original">
    <img src="https://img3.teletype.in/files/61/72/6172400c-b9f7-4abf-9bdf-c48d4b747e99.png" width="1034" />
  </figure>
  <p id="P8M9">Судя по сурсам, у нас просто есть куча функций фингера. При вызове мы дергаем каждую и результаты сейвим в жсончег. Подход довольно базированный. <strong>i6</strong> я докинул от себя, про это будет в конце.</p>
  <figure id="i0HL" class="m_original">
    <img src="https://img2.teletype.in/files/dd/f2/ddf22549-ad6a-4ef6-89db-e8d23eb9a8c0.png" width="1191" />
  </figure>
  <p id="xtoX">А вот и сами функции под каждый параметр фингера. Зная что собирают, не трудно потом это подменить.</p>
  <figure id="S8iu" class="m_original">
    <img src="https://img2.teletype.in/files/50/d1/50d180ea-38c5-49ef-8918-2c121be583ef.png" width="876" />
  </figure>
  <p id="7oEw">Без обфускаиции все так хорошо читается. Удобно иметь ориг сурсы)</p>
  <figure id="P4Br" class="m_original">
    <img src="https://img2.teletype.in/files/dc/90/dc906226-9172-444d-a8ec-3b3457e25e1b.png" width="478" />
  </figure>
  <p id="9ew5">На самом деле, как таковой необходимости в сурсах прям небыло, это чисто интерес почитать как оно там в проде. По факту, тут те же самые сурсы, что и раньше на дзене или яндексе, прост обфускации докинули и новый енкод, что меняет примерно ничего. Сурсы это просто приятный бонус.</p>
  <figure id="Pzd3" class="m_original">
    <img src="https://img3.teletype.in/files/a4/d2/a4d20bf7-46ff-4a9b-90e7-6cea996d9a40.gif" width="384" />
  </figure>
  <h3 id="javs"><strong>Продакшн</strong></h3>
  <p id="jrdF">Раз все примерно ясно, потыкаем её в проде, хоть и <a href="https://captcha-api.yandex.ru/demo" target="_blank">на демо страничке</a>.</p>
  <p id="SNeB">В проде они вызывают сбор фингера через <code>window.PGreed.safeGet()</code></p>
  <figure id="TDUH" class="m_original">
    <img src="https://img1.teletype.in/files/0d/18/0d184da3-0f50-491e-8899-c972832f6031.png" width="1677" />
  </figure>
  <p id="yZph">С капчей на поиске всё также. После получения значения мы его ксорим с миксованным массивом. В целом, с фингером все ясно, нужно только придумать че делать с этим массивом ебучим.</p>
  <figure id="v6P1" class="m_original">
    <img src="https://img4.teletype.in/files/f0/e8/f0e8638b-97a8-4408-9077-bbb96fa554b5.png" width="1680" />
  </figure>
  <p id="Fp4Y"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="2dV3">Picasso (canvas)</h2>
  </section>
  <p id="aKro">Хорошо, чё делать теперь примерно ясно. Будем собирать по чуть-чуть скрипт для решения. А начнем с чего-то простого, с хедера <strong>picasso</strong>.</p>
  <figure id="YdlB" class="m_original">
    <img src="https://img2.teletype.in/files/5d/79/5d7958e9-9e70-4e79-8602-799bd95f684c.png" width="1045" />
  </figure>
  <p id="TZNo">Енкод у всех заголовков обычный base64, кроме фингера. И по названию параметров не сложно найти сами функции и докинуть брек. Единственное, входной параметр тут какой-то <strong>seed</strong>.</p>
  <figure id="2LTT" class="m_original">
    <img src="https://img2.teletype.in/files/d5/54/d5544f25-445f-40c2-b202-11cf1902524c.png" width="1679" />
  </figure>
  <p id="ukhW">Оказалось, це простой рандомчег. Тоест 2 рандом числа от 1 до 1000.</p>
  <figure id="d22R" class="m_original">
    <img src="https://img1.teletype.in/files/43/d2/43d260eb-3246-4a52-a274-33a38de66b46.png" width="1317" />
  </figure>
  <p id="svvW">А потом на оба массива вызывают асинхронную функцию для рисования канваса (как не трудно заметить). Функция на самом деле довольно небольшая и относительно простая. Удобно, что в этом файле 0 обфускации.</p>
  <figure id="3iLH" class="m_original">
    <img src="https://img2.teletype.in/files/52/74/5274e412-bb0a-40ae-bb6a-a9dd52441bd2.png" width="1680" />
  </figure>
  <p id="vdY4">Мне показалось, что я увидел что-то знакомое, поэтому я просто вбил в поиск по гиту. </p>
  <figure id="hXrR" class="m_original">
    <img src="https://img4.teletype.in/files/ba/76/ba768af9-1f61-4b42-bfe1-3728fb3818bd.gif" width="1920" />
  </figure>
  <p id="Koyc">Да, это же мой любимый <a href="https://en.wikipedia.org/wiki/MurmurHash#MurmurHash3" target="_blank">мур мур хэш</a>) Тот самый хэш, который юзается в популярной либе сбора фингера <a href="https://github.com/fingerprintjs/fingerprintjs" target="_blank">fingerprintjs</a>, а потому есть на куче сайтов и в множестве всяких защит (фанкапча, яху и тд).</p>
  <figure id="mnM4" class="m_original">
    <img src="https://img2.teletype.in/files/1d/47/1d4784a9-4121-4164-8053-94dc13653f11.png" width="1679" />
    <figcaption>Github +1</figcaption>
  </figure>
  <p id="IO43">Если внимательно сравнить, то <a href="https://github.com/xtekky/funcaptcha/blob/e316b5a24c7cd4b5340759c26528cbe1331303d3/src/static/fingerprint.js" target="_blank">коду буквально оно</a>.</p>
  <figure id="ofyS" class="m_original">
    <img src="https://img1.teletype.in/files/43/62/436299c2-91e9-4c13-bee8-7f9813e92ae4.png" width="2223" />
  </figure>
  <p id="GjiM">Оки, еще у нас есть вот это. </p>
  <figure id="Mqp7" class="m_original">
    <img src="https://img4.teletype.in/files/37/1b/371b8db2-732c-4456-9fc8-be315568edd3.png" width="108" />
  </figure>
  <p id="tP7l">Это функция псевдо рандома.</p>
  <figure id="SGcO" class="m_original">
    <img src="https://img1.teletype.in/files/0f/95/0f9558e1-b003-4b07-b945-dbc347087af1.png" width="1530" />
  </figure>
  <p id="AcoY">На <a href="https://github.com/medialab/iwanthue/blob/fbd31bb4b031ca4ffa299a3253c8443810a3fb18/npm/rng.js#L20" target="_blank">гите была ровно та же хуйня</a> с подписью рандом. Так шо еще раз Github +1.</p>
  <figure id="eU32" class="m_original">
    <img src="https://img3.teletype.in/files/ee/e9/eee9b482-f15d-487c-8fcd-1e35798cec36.png" width="830" />
  </figure>
  <p id="ANQf">Ещё были функции: <em>So, xo, ko, Oo</em>. Они рисуют на канвасе, но мне уже как-то похуй, просто копировать вставить и фсе, канвас же.</p>
  <figure id="1lFE" class="m_original">
    <img src="https://img3.teletype.in/files/2e/c5/2ec5ec76-4572-45d6-afa9-aefbf9b62552.png" width="1465" />
  </figure>
  <p id="SpJ3">Акей, получаем вот такой код. Зачекаем его валид.</p>
  <figure id="SDdy" class="m_original">
    <img src="https://img2.teletype.in/files/17/94/1794139d-da25-46d9-867a-5b72607fabd9.png" width="1125" />
  </figure>
  <p id="gU19">Хешик в яде.</p>
  <figure id="6umM" class="m_original">
    <img src="https://img2.teletype.in/files/11/9e/119e5954-4ab9-4c9a-9ac5-95d8831e8b84.png" width="1679" />
  </figure>
  <p id="3DJC">Хешик в моём коде. Ну и они совпадают, что не удивительно. Значит, эту штуку я разъебал.</p>
  <figure id="ptzT" class="m_original">
    <img src="https://img4.teletype.in/files/31/0d/310d6f84-c0e6-488c-ac6d-ea0d72998d33.png" width="1679" />
  </figure>
  <p id="Vkm2">Вообще, рисуют они вот такую ебень, если кому интересно.</p>
  <figure id="COyf" class="m_original">
    <img src="https://img3.teletype.in/files/a9/a9/a9a941c5-05a5-45fe-8a62-a78d2225fad3.png" width="300" />
  </figure>
  <p id="bqe7">Если представить, что уник канвасов в мире 156 078, отталкиваясь от <a href="https://browserleaks.com/canvas" target="_blank">canvas</a>, получается, им нужно хранить 156 078 000 канвасов на 1 фильтр, а фильтра у них 2 (2 разных настройки рисовалки канваса). Вряд ли они столько хранят. </p>
  <figure id="XRpx" class="m_original">
    <img src="https://img1.teletype.in/files/42/d4/42d4bade-0a29-4dcd-892c-d9183653a372.gif" width="320" />
  </figure>
  <p id="BwTZ">Закономерно предположить, что можно было бы пихать и рандом, но мне показалось удобным просто сделать по 1к канвасиков (на каждый фильтр) на свое железо и тянуть рандомно.</p>
  <figure id="3cyt" class="m_original">
    <img src="https://img2.teletype.in/files/d1/66/d1661557-0dae-47e6-8fd3-1cc2406fa7ac.png" width="1679" />
  </figure>
  <p id="eelN">По итогу это выглядит вот так.</p>
  <figure id="n91t" class="m_original">
    <img src="https://img3.teletype.in/files/a7/29/a72948fd-73e0-4746-a54e-f6b2c5c6189c.png" width="789" />
  </figure>
  <p id="GmZC"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="cInJ">Proof Of Work</h2>
  </section>
  <p id="DS4X">Перейдем к следующей хуйне, к <s>pov</s> pow.</p>
  <figure id="tAX4" class="m_original">
    <img src="https://img4.teletype.in/files/70/2a/702a533b-e17e-4b4a-9f39-58bd0e3241b2.png" width="1055" />
  </figure>
  <figure id="DyIX" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/49/df/49dfbd3c-e731-4eb6-b032-1257323db8b7.png" width="391" />
    <figcaption>POV, Яндекс капчи на самом деле</figcaption>
  </figure>
  <p id="8xVv">Как обычно, имеем powPrefix и powComplexity. Тоесть ключ и сложность.</p>
  <figure id="WR55" class="m_original">
    <img src="https://img3.teletype.in/files/ac/3a/ac3a2025-f6a3-4a24-b2a4-350e73979f17.png" width="1679" />
  </figure>
  <p id="aHVQ">Они передаются в отдельную функцию.</p>
  <figure id="b3S9" class="m_original">
    <img src="https://img2.teletype.in/files/93/80/93803198-ba39-4838-b088-7b8dccab1c3f.png" width="1679" />
  </figure>
  <p id="WfQ6">И эта функция - воркер.</p>
  <figure id="Q31Y" class="m_original">
    <img src="https://img3.teletype.in/files/24/32/2432ccf2-25aa-493b-a9ba-785fe3c52e7d.png" width="1679" />
  </figure>
  <p id="sQJF">Ну оки, дернем че за код и зачекаем его.</p>
  <figure id="456l" class="m_original">
    <img src="https://img4.teletype.in/files/b9/43/b9434122-a930-4bbf-9c50-34a81d022b95.png" width="1442" />
  </figure>
  <p id="LM8N">Применим убийственный примём из серии серьезных - серьезный поиск по гитхабу.</p>
  <figure id="zvoF" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/eb/e4/ebe47224-43a2-48fe-99ca-65893f0e470e.png" width="1677" />
    <figcaption>По коменту сразу находим код на гите.</figcaption>
  </figure>
  <p id="a5Gc">Github vs Yandex: 3:0 </p>
  <figure id="ClQl" class="m_original">
    <img src="https://img1.teletype.in/files/46/f3/46f35bf7-351d-486e-8342-8a1c076de1f4.gif" width="500" />
  </figure>
  <p id="DxRh">Это буквально, <a href="https://github.com/indutny/proof-of-work/tree/ee360bbeead6afda611079a16e30125c3de07f34" target="_blank">самый </a><a href="https://github.com/indutny/proof-of-work/" target="_blank">дефолтный </a><a href="https://github.com/indutny/proof-of-work/tree/ee360bbeead6afda611079a16e30125c3de07f34" target="_blank">пов</a>. В текстовик я закинул отформатированный код воркера. Код совпадает с <a href="https://github.com/cchamilt/notabug/blob/d9c70677a024fde6d5f7de58405113b716e7c4a7/src/proof-of-work/pow/solver.js" target="_blank">решалкой в сурсах с гита</a>.</p>
  <figure id="O2zc" class="m_original">
    <img src="https://img4.teletype.in/files/3a/26/3a26b72f-6512-4f58-bc9b-4b9315ca0ba3.png" width="1679" />
  </figure>
  <p id="zkl3">Ну типа <a href="https://www.npmjs.com/package/proof-of-work" target="_blank">ставим либу и фсе</a>. Отличия в том, что яндекс к коду либы пару строк от себя наговнял для удобства.</p>
  <figure id="7i5b" class="m_original">
    <img src="https://img3.teletype.in/files/64/ce/64ce3087-d52f-4660-ba88-6d1140979377.png" width="1435" />
  </figure>
  <p id="Vlks">В итоге я форматнул под вид яда. Ну и этот хедер тож выебан, получается.</p>
  <figure id="8wZY" class="m_original">
    <img src="https://img3.teletype.in/files/2c/83/2c833c7c-fdd5-4eb4-aaa9-a6791c1dc8b2.png" width="666" />
  </figure>
  <p id="VEMQ">Ебём дальше.</p>
  <figure id="wuvG" class="m_original">
    <img src="https://img1.teletype.in/files/c3/c7/c3c72942-7e07-481b-8640-1fb71a6faed2.gif" width="540" />
  </figure>
  <p id="ylEy"></p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="dUj4">Новая капча</h2>
  </section>
  <p id="cqXW">В процессе тестов, на <a href="https://captcha-api.yandex.ru/demo" target="_blank">демо страничке</a> столкнулся с новой капчей. Я её чуть потыкал, в целом разобрался как оно работает, но решил забить, тк кроме демки её ни где больше нету.</p>
  <figure id="S9bp" class="m_original">
    <img src="https://img1.teletype.in/files/0c/ee/0cee9743-201e-424c-8e1e-047b9ff3e54a.png" width="1679" />
  </figure>
  <p id="On56">Ладно, пока я писал эту хуйню, она появилась на яндексе.</p>
  <figure id="0Rwf" class="m_original">
    <img src="https://img4.teletype.in/files/31/bf/31bf4fe8-bcec-479a-9ae3-a24d8fe45142.png" width="1403" />
  </figure>
  <p id="2paq">Ну и..</p>
  <figure id="tmC9" class="m_original">
    <img src="https://img3.teletype.in/files/2d/59/2d5901c6-230b-4e50-829f-876a51858451.png" width="566" />
  </figure>
  <p id="zBcf"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="lbNx">Rdata (fingerprint)</h2>
  </section>
  <p id="ArF3">И так, а теперь всё-таки разберется с самым интересным, с фингером, в котором хуева туча мелких параметров. </p>
  <figure id="7KdL" class="m_original">
    <img src="https://img1.teletype.in/files/4f/36/4f36e3e1-14d0-49de-af18-64ffbc3e722d.gif" width="640" />
  </figure>
  <p id="BlFk">У нас есть динамический кусок хуйни для енкода.</p>
  <figure id="QcmE" class="m_original">
    <img src="https://img1.teletype.in/files/c1/14/c114f6a8-3bfc-4d38-87aa-f3b0a841e5ca.png" width="1677" />
  </figure>
  <p id="SCXz">Тоесть идет сбор фингера и его енкод.</p>
  <figure id="uo2f" class="m_original">
    <img src="https://img2.teletype.in/files/52/0c/520c27f8-3c78-40bf-a5cf-5bcebfebde84.png" width="1269" />
  </figure>
  <p id="xyva">Если спиздить енкод, шифрануть самому, то будет такая же хуйня. Ладно, надо подумать как фул код енкода подрезать.</p>
  <figure id="cIgo" class="m_original">
    <img src="https://img2.teletype.in/files/d1/b8/d1b88b2d-3d54-45b4-b6c2-542f50938e54.png" width="959" />
  </figure>
  <p id="44K1">Также, в фингере помимо обычных есть еще парочку значений:</p>
  <p id="NLDf"><strong>pgrd </strong>- ключ версии файла?</p>
  <p id="RJuZ"><strong>pgrdt </strong>- тайм штамп времени сбора фингера</p>
  <figure id="97iQ" class="m_original">
    <img src="https://img4.teletype.in/files/b4/c3/b4c38f17-cb82-485c-b00e-1c86d83b5e99.png" width="1677" />
  </figure>
  <p id="DfBQ"><strong>pgrd </strong>всегда есть где-то в файле. Над будет придумать как его спиздить.</p>
  <figure id="ZZB1" class="m_original">
    <img src="https://img3.teletype.in/files/66/8f/668f3367-ab3a-4340-b97b-195316622b7d.png" width="1675" />
  </figure>
  <p id="wwgR">Я решил сравнить фингер собранный с демки и &quot;самодельный&quot;. </p>
  <figure id="UbFM" class="m_original">
    <img src="https://img2.teletype.in/files/d3/d3/d3d354ef-4120-4155-8aee-d870a4a71556.gif" width="495" />
  </figure>
  <p id="uE5W">Отличается только одна хуйня функция <strong>i6</strong>.</p>
  <figure id="RkIE" class="m_original">
    <img src="https://img1.teletype.in/files/81/a5/81a5aee5-58f1-4763-981c-dd4e26937dc0.png" width="1677" />
  </figure>
  <p id="tvKp">По имени зачекаем чего она делает.</p>
  <figure id="A1L3" class="m_original">
    <img src="https://img2.teletype.in/files/97/57/975708c8-d30d-44a1-9c4c-8b708b09bf31.png" width="1677" />
  </figure>
  <p id="zgIw">Видим сам код. Else никогда не сработает, поэтому сразу чекаем наши 3 строчки.</p>
  <figure id="L5SX" class="m_original">
    <img src="https://img1.teletype.in/files/cd/d3/cdd35f6a-6b95-48a5-a0aa-63d9695f32bc.png" width="1677" />
  </figure>
  <p id="7hAN">Если потыкать чуть ручками код, становится очевидно, что он чекает <a href="https://developer.mozilla.org/en-US/docs/Web/API/Performance/memory" target="_blank">Performance. memory</a>. Видимо, просто проверяет наличие этих функций.</p>
  <figure id="dKvO" class="m_original">
    <img src="https://img2.teletype.in/files/9c/8b/9c8bb6b4-b26a-44f2-ae99-5131431d0b04.png" width="588" />
  </figure>
  <p id="KocR"><strong>Сравним фингеры</strong></p>
  <figure id="oVAF" class="m_original">
    <img src="https://img2.teletype.in/files/9d/57/9d57fc39-6ee3-4e17-9cb3-f6509ab91b4f.gif" width="540" />
  </figure>
  <p id="wAar">Штош, тогда обновим код, а потом сравним значения фингера с сайта и с сборщика. </p>
  <figure id="fcM5" class="m_original">
    <img src="https://img2.teletype.in/files/1a/cd/1acdbf6f-0b0b-42a9-bbbd-8c614fc5b4fd.png" width="1295" />
  </figure>
  <p id="tIT0">Тк мне лень глазками все это чекать, добавил вывод тех что отличаются.</p>
  <figure id="RZNH" class="m_original">
    <img src="https://img4.teletype.in/files/35/10/3510e6d2-3702-488e-a8b1-f422c7598675.png" width="394" />
  </figure>
  <p id="HN2q">Подчеркнул, чтоб было проще ориентироваться.</p>
  <figure id="9LKv" class="m_original">
    <img src="https://img3.teletype.in/files/a5/74/a5744e8c-202a-4675-8369-d9267e99735b.png" width="1295" />
  </figure>
  <p id="brbu">Старый скрипт яда скипает <strong>d1 </strong>и <strong>c9</strong>, новый отсутствие значения сейвит как null.</p>
  <p id="SJYP"><strong>a8 </strong>пихает в боди рекламный блок. Думаю, похуй на <strong>а8</strong>)</p>
  <figure id="j0NH" class="m_original">
    <img src="https://img4.teletype.in/files/f2/f0/f2f0155c-c5ad-4058-a9ca-4c085da08eaa.png" width="1673" />
  </figure>
  <p id="mEiG"><strong>c7</strong> чекает возможность установки куки. Тк у меня не сервер, ясен хуй оно не работает.</p>
  <figure id="8Eh0" class="m_original">
    <img src="https://img3.teletype.in/files/af/55/af55f7d9-a09b-4372-ae3f-1d431c63d466.png" width="1675" />
  </figure>
  <p id="NdSw"><strong>x,y</strong> чисто ошибки таймаута в асинхроне, скорее всего из за бреков, тк фингер с сайта стянул криво. </p>
  <p id="SK2z">В фингере есть 2 хэша: <strong>z1 </strong>и <strong>z2</strong>. </p>
  <p id="FCaE"><strong>z1</strong> хэш от шрифтов, в проде совпадает с моим.</p>
  <figure id="MPey" class="m_original">
    <img src="https://img4.teletype.in/files/74/12/7412968a-2d0d-4366-a6a2-f6c5427fa162.png" width="1366" />
  </figure>
  <p id="8a05">А вот <strong>z2</strong> мой ему поему-то не нравился. Ну а это какбэ канвас.</p>
  <figure id="okNY" class="m_original">
    <img src="https://img3.teletype.in/files/a6/6f/a66fe594-8b93-470d-b380-c2583b9d2884.png" width="1859" />
  </figure>
  <p id="zxVR">Чуть потыкав код я понял, что наебался вот с этой строкой.</p>
  <figure id="S7vf" class="m_original">
    <img src="https://img3.teletype.in/files/64/99/64992c98-fba9-4449-b2cf-ad6e6d27b6d7.png" width="763" />
  </figure>
  <p id="wMIE">В норм виде тут смайлики должны быть. </p>
  <figure id="TBLV" class="m_original">
    <img src="https://img4.teletype.in/files/b8/55/b855adba-218f-4693-9dfd-bc9d3afc7291.png" width="1391" />
  </figure>
  <p id="pwYR">Но в файле ведь у меня все правильно было.. А не работало потому, что я не указал кодировку у своей демо html странички. Кароч, фикс и все воркает как надо.</p>
  <figure id="142H" class="m_original">
    <img src="https://img1.teletype.in/files/87/ce/87ce31df-3dca-4bbc-b8f8-ee5c3489f618.png" width="708" />
  </figure>
  <p id="cGx2">С фингером в целом разобрались, ебошим дальше.</p>
  <figure id="pXQb" class="m_original">
    <img src="https://img2.teletype.in/files/15/70/15705746-ade0-4fcf-b8de-c56bb85bce2d.gif" width="800" />
  </figure>
  <p id="PLV7"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="mLCE">Капча</h2>
  </section>
  <p id="70gv">Для капчи у нас целых 3 заголовка:</p>
  <p id="MDXS"><strong>rep </strong>- координаты ответов.</p>
  <p id="3Ef0"><strong>tsdata</strong> - тайминги ответов.</p>
  <p id="K3GB"><strong>tdata </strong>- инфа о кликах по экрану относительно старт тайминга и позиции относительно фул экрана. Кароч, чисто для статки инфа. <em>pointerPositions </em>и <em>clickPositions </em>на мобилке одинаковые.</p>
  <figure id="bcBy" class="m_original">
    <img src="https://img2.teletype.in/files/99/d5/99d5101b-9dfe-4ee3-bd5e-ec986f8429a8.png" width="1336" />
  </figure>
  <p id="CM1y">Не сложно заметить, что <strong>rep </strong>действительно инфа об ответах.</p>
  <figure id="SZKL" class="m_original">
    <img src="https://img1.teletype.in/files/ce/07/ce079c9c-fb14-4b85-8d4c-6087a748ee9e.png" width="1295" />
  </figure>
  <p id="NWmS">А тут видно, как формируется статка по кликам.</p>
  <figure id="nb4I" class="m_original">
    <img src="https://img1.teletype.in/files/cf/13/cf1363de-e10e-457a-bb2c-ec8380e4e149.png" width="1679" />
  </figure>
  <p id="RyJD">Сравним первый поинт и ответ. Разница 28. Шаг от края экрана до картинки у нас тоже 28.</p>
  <figure id="n5Qv" class="m_original">
    <img src="https://img1.teletype.in/files/07/9a/079a6e5a-c49f-4da7-bd08-dec0bb01e438.png" width="927" />
  </figure>
  <p id="n169">Ну раз тут все ясно, можно накидать простой код для генерации всей даты. Я кастую от момента запуска генератора до минус сколько то секунд (на каждый клик), а потом разворачиваю тайминги типо я гадал в риалтайм.</p>
  <figure id="tv1I" class="m_original">
    <img src="https://img3.teletype.in/files/22/82/2282d254-3506-4ede-8aaa-e8e5179026e6.png" width="420" />
  </figure>
  <p id="aokR">Помимо очевидного, тут используется ахуительная функция, чтобы слить массивы в 1, упомянутая ранее в материале про перевочики. <code>Array.prototype.slice.call(arguments)</code></p>
  <p id="LlbL"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="ELMl">Итог</h2>
  </section>
  <h3 id="TTcU"><strong>Фингер</strong></h3>
  <p id="XuuT">Сначала порешаем до конца с фингером. Я искал наиболее простой путь, поэтому мне не хотелось писать деобфускацию. </p>
  <figure id="kiTX" class="m_original">
    <img src="https://img3.teletype.in/files/a5/c5/a5c515d8-692b-4165-bf9d-ef02c57ed4f0.gif" width="498" />
  </figure>
  <p id="iBVL">В процессе заметил, что по дефолту у скрипта все функции сбора фингера сейвятся в глобальную переменную.</p>
  <figure id="G9nO" class="m_original">
    <img src="https://img3.teletype.in/files/6f/e7/6fe7a88e-1860-47e8-a2e3-cec87c5350e4.png" width="1008" />
  </figure>
  <p id="fpBH">Поэтому я решил просто взять и запихать туда фингер с функцией оберткой, которая превратит ключи в функции. И это сработало в браузере, а потом и в бас ноде.</p>
  <figure id="qkrA" class="m_original">
    <img src="https://img1.teletype.in/files/8a/de/8ade0307-673a-49aa-8f08-bc6edd447ec7.png" width="553" />
  </figure>
  <p id="FS26">В итоге получился вот такой код, который полностью работал.</p>
  <figure id="N8lt" class="m_original">
    <img src="https://img1.teletype.in/files/86/b7/86b79579-a6ef-4bec-be32-64d6ee0f8f81.png" width="846" />
  </figure>
  <h3 id="e5Zt"><strong>Капча</strong></h3>
  <p id="qezA">Дальше я пытался сделать решалку под яд, по аналогии с гитестом, но выходило говнище, ебучие иконки хуй выдернешь. </p>
  <figure id="ymNr" class="m_original">
    <img src="https://img2.teletype.in/files/dc/c0/dcc05177-053d-4af7-bd6f-9ae86f4fd4c9.gif" width="600" />
  </figure>
  <p id="6V01">Фильтр по белому помогал только в 10% случаев и в итоге валид решение получалось примерно 1 из 100.</p>
  <figure id="3935" class="m_original">
    <img src="https://img4.teletype.in/files/74/65/746514d6-b025-4dd5-bdbf-d8ad8a77ab3c.png" width="1280" />
  </figure>
  <p id="tCiV">Поэтому я сделал форматирование картинки и выбрал сервис с ручными индусами.</p>
  <figure id="FMaY" class="m_original">
    <img src="https://img2.teletype.in/files/d8/96/d896e0e3-a91d-4235-bb57-850289f225ba.png" width="451" />
  </figure>
  <p id="Tvhn">Ресайз.</p>
  <figure id="YHBQ" class="m_original">
    <img src="https://img3.teletype.in/files/e8/65/e865b59d-da82-4fee-b78a-28aac0a76330.png" width="445" />
  </figure>
  <p id="pjj5">Не так конечно круто, как без сервисов, но зато решалось.</p>
  <figure id="aM35" class="m_original">
    <img src="https://img3.teletype.in/files/22/19/2219faf6-efb6-44d7-8587-ddf5f879c29a.png" width="479" />
  </figure>
  <h3 id="XzxO"><strong>Соберем все вместе</strong></h3>
  <p id="d9bk">Запрашиваем капчу.</p>
  <figure id="Qy6O" class="m_original">
    <img src="https://img2.teletype.in/files/10/e3/10e37896-62ab-4158-b0ac-7c40df4418a7.png" width="1033" />
  </figure>
  <p id="PW5O">Через eval сейвим данные капчи в переменную.</p>
  <figure id="6jwG" class="m_original">
    <img src="https://img2.teletype.in/files/1d/7e/1d7ec7c9-bc4d-497b-95a8-2f7acc38c875.png" width="449" />
  </figure>
  <p id="V412">Так как у яда на самом деле просто при клике на иконку тоже шлет фул данные (установка чекбокса тоже типо капча), добавляю проверку нужно ли решать капчу. Тоесть <strong>pow </strong>в любом случае нам надо будет проходить 2 раза. </p>
  <figure id="ane3" class="m_original">
    <img src="https://img4.teletype.in/files/7f/0d/7f0da6a4-51e4-4f64-a07f-38da1267b93f.gif" width="540" />
  </figure>
  <p id="f5Es">И так, если капча есть, решаем её и чекаем, что мы его точно получили.</p>
  <figure id="kPpI" class="m_original">
    <img src="https://img4.teletype.in/files/74/55/7455dba9-b84a-4ad0-a1ea-0528a5c501ed.png" width="351" />
  </figure>
  <p id="CgAt">Независимо от капчи шифруем фингер, кастуем <strong>pow </strong>и <strong>picasso</strong>. Если капчи небыло, то шлем пустой <strong>tdata</strong>, как это было и у яд в запросах.</p>
  <figure id="kkvk" class="m_original">
    <img src="https://img3.teletype.in/files/a9/6d/a96d995e-1e58-423e-a5b0-838755babd9f.png" width="1011" />
  </figure>
  <p id="Hvqa">Если капча была решена, шлем запрос с её хэдерами.</p>
  <figure id="rV1I" class="m_original">
    <img src="https://img2.teletype.in/files/51/cb/51cb2cee-ba57-4346-a994-d3eba0d22f1b.png" width="1030" />
  </figure>
  <p id="jKy1">Идем чекать.</p>
  <figure id="4tFT" class="m_original">
    <img src="https://img1.teletype.in/files/85/84/8584642c-7ddf-4021-a7e2-fdf3778386c7.gif" width="540" />
  </figure>
  <p id="oPPr">И.. в итоге все работает.</p>
  <figure id="FE04" class="m_original">
    <img src="https://img4.teletype.in/files/fb/f9/fbf9385b-77ec-4def-bd18-c489093dc038.png" width="1591" />
  </figure>
  <p id="34T4">В случае верного решения также вертаем куку <strong>spravka</strong>.</p>
  <figure id="eq2o" class="m_original">
    <img src="https://img3.teletype.in/files/ad/83/ad8361e1-7ee4-4fec-9c31-8e3267abfb2b.png" width="1149" />
  </figure>
  <p id="j8Wy">Проведем малюсенький тест)</p>
  <figure id="5tXW" class="m_original">
    <img src="https://img4.teletype.in/files/f7/a6/f7a63360-ad58-411f-9c30-935cea0ab688.gif" width="498" />
  </figure>
  <p id="H4te">Выебано.</p>
  <figure id="OPNP" class="m_original">
    <img src="https://img2.teletype.in/files/d2/de/d2de9e8d-36b2-45fe-8054-abd8ae051961.png" width="1680" />
  </figure>
  <p id="YVZ1">Это было слишком просто..</p>
  <figure id="Sf4k" class="m_original">
    <img src="https://img1.teletype.in/files/0a/eb/0aeb4bf6-233a-4b5a-a96e-de1af8ace2f7.png" width="783" />
  </figure>
  <p id="IKqX"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="2DDa">Дополнение (Новая капча)</h2>
  </section>
  <p id="PL73">Лан, я решил её добить, тк получилось всё слишком легко, но капча не без сервисов. Напоминаю <a href="https://captcha-api.yandex.ru/demo" target="_blank">https://captcha-api.yandex.ru/demo</a></p>
  <figure id="o52p" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/be/c1/bec1a998-09db-44c6-bd6c-f47f58f0c11a.gif" width="500" />
    <figcaption>Без сервисов скорость решалки уже не будет ограничена)</figcaption>
  </figure>
  <p id="YGcA">И так, не трудно заметить, что в качестве данных решения всегда передается положение.</p>
  <figure id="HREe" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/12/1c/121cf732-c19f-4d41-b637-3045a73df96d.png" width="1243" />
    <figcaption>Тоесть новая тут всего 1 хуйня.</figcaption>
  </figure>
  <p id="mPKz">Ну, это и так на самом деле видно. Крайнее правое положение 13, а начальное 0.</p>
  <figure id="s7D2" class="m_original">
    <img src="https://img3.teletype.in/files/ac/3f/ac3f8622-b3a1-4b75-baa0-fa23f25fb9af.png" width="1425" />
  </figure>
  <figure id="HL05" class="m_original">
    <img src="https://img4.teletype.in/files/73/f4/73f4c7aa-fd6a-48aa-935f-7ec170ff7d19.png" width="1424" />
  </figure>
  <p id="epzZ">При каждом движении слайдера капча перерисовывается и надо бы найти как и почему она это делает. Заранее стоит пояснить, что капча прилетает вот в таком виде. Судя по всему, таск это порядок перемешивания  картинок в каком-то уебанском виде.</p>
  <figure id="ibGw" class="m_original">
    <img src="https://img2.teletype.in/files/52/18/5218b4a6-8621-4e9f-a63c-11042b12a5af.png" width="903" />
  </figure>
  <p id="Z8RM">Ну акей, я поставил брек на модификации поддерева, чуть потыкал и попал сюды.</p>
  <figure id="nmGQ" class="m_original">
    <img src="https://img2.teletype.in/files/51/c3/51c3da39-3aaa-494d-8fb6-52426ba059b3.png" width="973" />
  </figure>
  <p id="3VUf">Чуть ниже мы видим код перерисовки. Синее - сама перерисовка. А вот зеленое, то что нам нужно, это выполнение функции <strong>v</strong>, начало которой я подчеркнул красной линией. В неё мы передаем наш массив <strong>task</strong> (параметр <strong>t</strong>) и шаг на слайдере, чтобы получить порядок картинок в норм виде, нарезать их и перемиксовать. Параметр <strong>e</strong> в функции это просто массив размера 9 элементов (3 на 3), тоесть 0-8. Выглядит непривычно, но на деле код не страшный.</p>
  <figure id="G2gq" class="m_original">
    <img src="https://img4.teletype.in/files/72/43/72437295-bc3c-44a3-b371-57983afa8895.png" width="1677" />
  </figure>
  <p id="Vmpy">Для красоты я поставил логпоинт и в процессе двигания слайда было видно как оно просчитывает переменную <strong>v</strong>. Правильным решением было 4. Как видно по решенной капче, кусочки стоят в порядке, соответствующем цифрам кусочков с ориг капчи. </p>
  <figure id="Gm8G" class="m_original">
    <img src="https://img3.teletype.in/files/25/cd/25cdc7b7-53ec-4bc0-96b0-4da1eccd9813.png" width="1675" />
  </figure>
  <p id="VOMe">Я спиздил функцию, убрал чуть мусора, который нихуя не делал, и получил тот же результат, тот же порядок при указанной позиции слайдера.</p>
  <figure id="pTso" class="m_original">
    <img src="https://img1.teletype.in/files/4b/55/4b550753-717b-4645-b86f-c7ad0225feae.png" width="1045" />
  </figure>
  <p id="kPXJ">Хорошо, раз с этим ясно, нужно разобраться с самим решением. Для начала просто нарежем капчу на кусочки.</p>
  <figure id="rKGC" class="m_original">
    <img src="https://img3.teletype.in/files/e0/39/e0395a09-be1b-464c-bb50-e772d61777ed.png" width="1680" />
  </figure>
  <p id="eGSI">Смешная нарезка яндыкса работаит.</p>
  <figure id="vTag" class="m_original">
    <img src="https://img4.teletype.in/files/30/4c/304cab6c-4970-4e2a-a51f-be199c434b22.png" width="1200" />
  </figure>
  <p id="pcHV">Если разрезать картинку на 2 части, то пиксельная линия в месте разреза на обоих картинках будет иметь на 99% схожий рисунок. Как уже говорил в материале по тиктоку, я <a href="https://intsystem.org/captcha/vzlom-keycaptcha/" target="_blank">подсмотрел эту идею когда-то туть</a>. Картинок у нас много, разрезов может быть 4, поэтому докинем к прошлому скрипту пару блоков. По итогу нарезки теперь у нас будет 9 массивов в каждом по 4 картинки (края стороны).</p>
  <figure id="3T7A" class="m_original">
    <img src="https://img2.teletype.in/files/57/55/575521f9-e02c-4ba4-9507-7a18cf038b31.png" width="1926" />
  </figure>
  <p id="T8gm">Ну а теперь их нужно как-то сравнить. Очевидно, что верх одной мы можем соединить только с низом другой и наоборот, также и со сторонами. Код я взял из материала по iconcaptcha, чуть перенес циклы и добавил выходы из цикла в соответствии с условиями выше.</p>
  <figure id="v3QT" class="m_original">
    <img src="https://img4.teletype.in/files/73/cb/73cba895-3a2a-4b00-970f-bae1a0c0ef91.png" width="1191" />
  </figure>
  <p id="wU04">Потом чуть допилил код, добавив кастом порог для приемлемой степени совпадения.</p>
  <figure id="xhxH" class="m_original">
    <img src="https://img4.teletype.in/files/30/45/30458f33-0ab0-4a90-8fdc-1bb436ad8a60.png" width="738" />
  </figure>
  <p id="72sM">Акей, оно решает и получает ровно то что я ожидаю. Теперь у нас есть каждый кусочек пазла и мы знаем его соседей. Нужно понять как превратить это в собранный пазл и желательно без хардкода.</p>
  <figure id="P4r9" class="m_original">
    <img src="https://img1.teletype.in/files/c5/3e/c53e65a9-58db-4ea6-a2d0-aba0505abdba.png" width="511" />
  </figure>
  <p id="GskI">Я пришел к следующей мысли: берем и дергаем левый верхний угол и идем от него сначала влево получая каждый элемент, а потом от него же спускаемся вниз и опять собираем все левые, так повторяем до конца.</p>
  <figure id="BjaY" class="m_original">
    <img src="https://img1.teletype.in/files/01/7c/017ccfab-acb1-47aa-822b-87466f6138ff.png" width="591" />
  </figure>
  <p id="bpuT">А потом закодил это. Вроде всё работает как надо, результат тот же.</p>
  <figure id="1yEs" class="m_original">
    <img src="https://img4.teletype.in/files/78/3f/783f12f6-0418-4517-bec7-6bca48f9e2c1.png" width="1015" />
  </figure>
  <p id="RQuI">Так это выглядит по итогу в бас</p>
  <figure id="q0eW" class="m_original">
    <img src="https://img3.teletype.in/files/a4/9c/a49c161e-ee7a-4aa2-82bb-e2eba8650109.png" width="621" />
  </figure>
  <p id="Arti">Остается только найти на какой позиции слайдера при входных данных будет давать такой порядок. Ну эт изи, грубый перебор, всего ведь 12 вариантов положения. Изе. Не забываем учесть проёб если оно какого-то хуя не нашло решения.</p>
  <figure id="ftVW" class="m_original">
    <img src="https://img3.teletype.in/files/26/1f/261f7721-6254-465c-b43c-c512176d1065.png" width="502" />
  </figure>
  <p id="zqG7">Для удобства я также сделал рисовалку. Делал на основе нарезки, докинул только перестановку по небольшому набору правил.</p>
  <figure id="Nsau" class="m_original">
    <img src="https://img4.teletype.in/files/f4/5a/f45a3d85-7d41-456b-a6b5-bc9866834845.png" width="1527" />
  </figure>
  <p id="s9JZ">Сделал скрипт аналогичный тому что в прошлой капче. Тут разве что <strong>picasso </strong>отсутствует.</p>
  <figure id="vEB5" class="m_original">
    <img src="https://img1.teletype.in/files/05/0c/050cb942-e431-4103-ab16-bcabe6cccba4.png" width="1585" />
  </figure>
  <p id="a1VV">Ну и запрос типа text/plain;charset=UTF-8.</p>
  <figure id="VMYk" class="m_original">
    <img src="https://img2.teletype.in/files/5c/7a/5c7ad176-4e93-41a7-91ed-d8fee804bb91.png" width="516" />
  </figure>
  <p id="Biru">Поэтому енкод тела сделать пришлось лапками.</p>
  <figure id="MAvA" class="m_original">
    <img src="https://img1.teletype.in/files/81/4f/814fc845-2198-49dc-8173-0a6783484d33.gif" width="320" />
  </figure>
  <p id="AnQa">Решалку перенес из тестового скрипта, заодно пару мелочей пофиксил, чтобы ошибки давало если не решило.</p>
  <figure id="2qOa" class="m_original">
    <img src="https://img4.teletype.in/files/7e/61/7e614594-027c-4924-acb8-a44fd113fc7e.png" width="1787" />
  </figure>
  <p id="ykA3">На тестах всё ебошит по красоте.</p>
  <figure id="rBGM" class="m_original">
    <img src="https://img2.teletype.in/files/92/f9/92f9b33b-bd5f-4a17-a45f-e50a69752b21.png" width="1547" />
  </figure>
  <p id="MXNK">Забавно, что у яда картинки повторяются. Зная этот факт можно сделать решалку сильно пизже по качеству. Тоесть ищем фон по базе, потом режем его и чекаем пару.</p>
  <figure id="9r51" class="m_original">
    <img src="https://img1.teletype.in/files/c3/5f/c35f1f14-d792-4109-88f0-b169e7df303d.png" width="1503" />
  </figure>
  <p id="CIBY">Да, звучит неплохо, мож когда-то сделаю(нет).</p>
  <figure id="LWpg" class="m_original">
    <img src="https://img1.teletype.in/files/8e/22/8e22c537-ca3f-4abd-aefa-fc53c7b526b6.png" width="640" />
  </figure>
  <p id="jLTq">Есть основания полагать, что яд юзает нейронку. Нинаю, це байт на классы или чисто прикол, при том что фоны повторяются..</p>
  <figure id="ebq6" class="m_original">
    <img src="https://img3.teletype.in/files/a6/fa/a6faae20-2710-4ffa-bdf5-da29f39ca928.png" width="605" />
  </figure>
  <p id="GwfW">В целом, на 100 тестах качество решалки картинок вышло примерно 80%. Результат неплохой, но если есть база картинок, будет точно сильно лучше.</p>
  <figure id="3cZ7" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/55/a5/55a51711-0b5a-4579-9f53-75512b0e21a7.png" width="1255" />
    <figcaption>Картинок на 100 тестах дало 55, успешное решение было 43 из них.</figcaption>
  </figure>
  <p id="ixtQ">Эта капча была уже чуток интереснее. Но у неё даже обфускации небыло.</p>
  <figure id="vAWN" class="m_original">
    <img src="https://img3.teletype.in/files/ae/fd/aefda2d9-f7db-492a-b806-1f8d34e006f0.gif" width="500" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/aEl0FFqhThA</guid><link>https://teletype.in/@it_hueta/aEl0FFqhThA?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/aEl0FFqhThA?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>FunCaptcha bda реверс. Github.</title><pubDate>Tue, 16 Apr 2024 12:43:52 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5e/1d/5e1d56ab-16e4-4de0-9668-1dae4add1348.png"></media:content><category>выебано</category><description><![CDATA[<img src="https://img2.teletype.in/files/12/96/12966658-44da-4628-ab2a-fb2db85abb90.png"></img>В оффтоп чатике опять предлагали потыкать чет интересное и скинули funcaptcha.]]></description><content:encoded><![CDATA[
  <figure id="7p3A" class="m_original">
    <img src="https://img2.teletype.in/files/dd/d7/ddd78f32-f53a-4c53-857f-508fcd69abd9.png" width="417" />
  </figure>
  <p id="OsuK">В оффтоп чатике опять предлагали потыкать чет интересное и скинули funcaptcha.</p>
  <p id="G7YK">Я решил чекнуть на примере гита.</p>
  <figure id="evhe" class="m_original">
    <img src="https://img3.teletype.in/files/20/91/20913edb-f674-4523-ad99-fa1f5fec2a8b.png" width="613" />
  </figure>
  <p id="wnmG">Начало положено. Когда есть точка входа, дальше все идет на много проще.</p>
  <figure id="tK9Q" class="m_original">
    <img src="https://img2.teletype.in/files/92/f7/92f7856b-df97-4653-ae68-a3fb7653d345.png" width="800" />
  </figure>
  <p id="yVqC">Я где-то близко.</p>
  <figure id="w77F" class="m_original">
    <img src="https://img3.teletype.in/files/68/0a/680a4d6b-8039-4765-b80f-5be5cca7c93d.png" width="937" />
  </figure>
  <p id="OJv3">А вот опять цикл c перебором фингера и шифрованием. Как у qrator.</p>
  <figure id="rsI7" class="m_original">
    <img src="https://img1.teletype.in/files/4f/84/4f84102c-fdd7-406d-b08a-556233dc246a.png" width="1048" />
  </figure>
  <figure id="4Tk9" class="m_original">
    <img src="https://img4.teletype.in/files/3c/c5/3cc532e5-9fa4-4436-8a52-301e70571917.png" width="1016" />
  </figure>
  <figure id="hfiN" class="m_original">
    <img src="https://img4.teletype.in/files/32/f0/32f04d76-e417-4d76-a1e5-28a68945de74.png" width="987" />
  </figure>
  <figure id="226Q" class="m_original">
    <img src="https://img2.teletype.in/files/16/93/169368f0-e562-4148-a9c9-66b1e30ce3e6.png" width="397" />
  </figure>
  <p id="fHWE">Тоесть по итогу получаем вот такую красоту с шифрованным фингером</p>
  <figure id="4I9C" class="m_original">
    <img src="https://img2.teletype.in/files/99/87/9987a95a-2c9c-451a-9ae0-937f7ae64ef8.png" width="1048" />
  </figure>
  <p id="WyU3">Они действительно чекают движение мыши, забавно</p>
  <p id="fdRI"><a href="https://www.arkoselabs.com/explained/behavioral-biometrics/" target="_blank">https://www.arkoselabs.com/explained/behavioral-biometrics/</a></p>
  <figure id="kbH5" class="m_original">
    <img src="https://img1.teletype.in/files/0d/ca/0dcaf7f9-fd74-42d4-895d-48672a81572e.png" width="499" />
  </figure>
  <p id="CmJr">Ну вот и всё, вот наше шифрование. </p>
  <figure id="R03q" class="m_original">
    <img src="https://img4.teletype.in/files/3b/5f/3b5fd5b7-23c6-43f9-b7ab-e05af2315ee2.png" width="1600" />
  </figure>
  <p id="oKPw">Согласны, узнали? это же <a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt" target="_blank">дефолт crypto AES-CBC</a></p>
  <figure id="UrrL" class="m_original">
    <img src="https://img2.teletype.in/files/19/c4/19c434e6-87c2-4fdd-b35d-ccb8041b8f39.png" width="1031" />
  </figure>
  <p id="b1eI">Что примечательно, сам ключ et (строка 10654), эт хэш от ua+h, где h по итогу мы передаем как s. </p>
  <figure id="lP0h" class="m_original">
    <img src="https://img4.teletype.in/files/76/47/76478ee8-27b9-44ea-8943-baf023e4c8d1.png" width="595" />
  </figure>
  <p id="qClY">А запрос мы и шлем какбэ с нашим юа, вот такая вот защит очка. Но сам алго пришлось чуть потыкать.</p>
  <figure id="oitn" class="m_original">
    <img src="https://img1.teletype.in/files/c3/79/c37930dd-f065-489c-9824-a63351a08f7e.png" width="1027" />
  </figure>
  <p id="zY7N">Что забавно, Ar прост кастом массив с парой дефолт чисел</p>
  <figure id="NLvu" class="m_original">
    <img src="https://img2.teletype.in/files/59/a8/59a8c19c-8cc6-4a15-be8b-80de07d90aad.png" width="1248" />
  </figure>
  <p id="i3u5">А hashBinary вот так просто md5. По итогу имеем</p>
  <p id="D9GS"><code>function md5ToEnc(t) {<br />    var e, n = [],<br />        r = t.length;<br />    for (e = 0; e &lt; r - 1; e += 2)<br />        n.push(parseInt(t.substr(e, 2), 16));<br />    return String.fromCharCode.apply(String, n)<br />}<br />hashBinary = function (t, e) {<br />    var n = md5(t);<br />    return e ? md5ToEnc(n) : n<br />}<br />zr = function (t, e) {<br />    var i = t + function (t) {<br />        for (var n, c = t.length, u = &quot;&quot;, s = 0; c &gt; 1;)<br />            e = t.charAt(s++).charCodeAt(0),<br />                n = t.charAt(s++).charCodeAt(0),<br />                u += String.fromCharCode((Ar[e] &lt;&lt; 4) + Ar[n]),<br />                c -= 2;<br />        return u<br />    }(e),<br />        a = [];<br />    a[0] = hashBinary(i, !0);<br />    for (var c = a[0], u = 1; u &lt; 3; u++)<br />        a[u] = hashBinary(a[u - 1] + i, !0),<br />            c += a[u];<br />    return function (t) {<br />        for (var r = new Uint8Array(t.length), o = 0, i = t.length; o &lt; i; ++o)<br />            r[o] = t.charCodeAt(o);<br />        return r<br />    }(c.substring(0, 32));<br />}<br />var Ar = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];<br />var t = &quot;Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.11701108000&quot;;<br />var e = &quot;bb3d08ee6011a8e9&quot;;<br />log(zr(t, e))</code></p>
  <p id="rO7D">И так, зная всё  мы можем собрать наш скрипт шифрования и дешифрования фингера.</p>
  <figure id="2U4g" class="m_original">
    <img src="https://img1.teletype.in/files/c0/ed/c0edb6d4-ee54-46cf-94b2-97a6889e55f6.png" width="1159" />
  </figure>
  <figure id="zVXv" class="m_original">
    <img src="https://img4.teletype.in/files/b8/88/b888bfd6-48de-4511-89bd-8fe8298700cb.png" width="1170" />
  </figure>
  <p id="RBxI"><code>var MD5 = function(d){var r = M(V(Y(X(d),8*d.length)));return r.toLowerCase()};function M(d){for(var _,m=&quot;0123456789ABCDEF&quot;,f=&quot;&quot;,r=0;r&lt;d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_&gt;&gt;&gt;4&amp;15)+m.charAt(15&amp;_);return f}function X(d){for(var _=Array(d.length&gt;&gt;2),m=0;m&lt;_.length;m++)_[m]=0;for(m=0;m&lt;8*d.length;m+=8)_[m&gt;&gt;5]|=(255&amp;d.charCodeAt(m/8))&lt;&lt;m%32;return _}function V(d){for(var _=&quot;&quot;,m=0;m&lt;32*d.length;m+=8)_+=String.fromCharCode(d[m&gt;&gt;5]&gt;&gt;&gt;m%32&amp;255);return _}function Y(d,_){d[_&gt;&gt;5]|=128&lt;&lt;_%32,d[14+(_+64&gt;&gt;&gt;9&lt;&lt;4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n&lt;d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}function md5_cmn(d,_,m,f,r,i){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}function md5_ff(d,_,m,f,r,i,n){return md5_cmn(_&amp;m|~_&amp;f,d,_,r,i,n)}function md5_gg(d,_,m,f,r,i,n){return md5_cmn(_&amp;f|m&amp;~f,d,_,r,i,n)}function md5_hh(d,_,m,f,r,i,n){return md5_cmn(_^m^f,d,_,r,i,n)}function md5_ii(d,_,m,f,r,i,n){return md5_cmn(m^(_|~f),d,_,r,i,n)}function safe_add(d,_){var m=(65535&amp;d)+(65535&amp;_);return(d&gt;&gt;16)+(_&gt;&gt;16)+(m&gt;&gt;16)&lt;&lt;16|65535&amp;m}function bit_rol(d,_){return d&lt;&lt;_|d&gt;&gt;&gt;32-_}</code></p>
  <p id="Aggx"></p>
  <p id="l0Qz">Вспомогательные функции</p>
  <p id="M883"><code>function arrayBufferToBase64(arrayBuffer) {<br />    var byteArray = new Uint8Array(arrayBuffer);<br />    var byteString = &#x27;&#x27;;<br />    for(var i=0; i &lt; byteArray.byteLength; i++) {<br />        byteString += String.fromCharCode(byteArray[i]);<br />    }<br />    var b64 = window.btoa(byteString);<br />    return b64;<br />}</code></p>
  <p id="D5Y3"><code>function base64ToArrayBuffer(b64) {<br />    var byteString = window.atob(b64);<br />    var byteArray = new Uint8Array(byteString.length);<br />    for(var i=0; i &lt; byteString.length; i++) {<br />        byteArray[i] = byteString.charCodeAt(i);<br />    }<br />    return byteArray;<br />}</code></p>
  <p id="c6KM"><code>const fromHexString = function(hexString){return Uint8Array.from(hexString.match(/.{1,2}/g).map(function(byte){return parseInt(byte, 16)}))};</code></p>
  <p id="pdSm"><code>const toHexString = function(bytes){return bytes.reduce(function(str, byte){return str + byte.toString(16).padStart(2, &#x27;0&#x27;)}, &#x27;&#x27;)};</code></p>
  <p id="9Q3k"></p>
  <p id="XyXL">Тестовый код</p>
  <p id="SyUU"><code>const crypto = require(&#x27;crypto&#x27;);<br />const { Crypto } = require(&quot;@peculiar/webcrypto&quot;);<br />const crypt = new Crypto();<br />const atob = (base64) =&gt; {return Buffer.from(base64, &#x27;base64&#x27;).toString(&#x27;binary&#x27;);}<br />const btoa = (text) =&gt; {return Buffer.from(text, &#x27;binary&#x27;).toString(&#x27;base64&#x27;);}<br />const md5 = data =&gt; crypto.createHash(&#x27;md5&#x27;).update(data).digest(&quot;hex&quot;);<br />function md5ToEnc(t) {<br />    var e, n = [],<br />        r = t.length;<br />    for (e = 0; e &lt; r - 1; e += 2)<br />        n.push(parseInt(t.substr(e, 2), 16));<br />    return String.fromCharCode.apply(String, n)<br />}<br />function hashBinary(t, e) {<br />    var n = md5(t);<br />    return e ? md5ToEnc(n) : n<br />}<br />const Ar = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];<br />function keyEnc(t, e) {<br />    var i = t + function (t) {<br />        for (var n, c = t.length, u = &quot;&quot;, s = 0; c &gt; 1;)<br />            e = t.charAt(s++).charCodeAt(0),<br />                n = t.charAt(s++).charCodeAt(0),<br />                u += String.fromCharCode((Ar[e] &lt;&lt; 4) + Ar[n]),<br />                c -= 2;<br />        return u<br />    }(e),<br />        a = [];<br />    a[0] = hashBinary(i, !0);<br />    for (var c = a[0], u = 1; u &lt; 3; u++)<br />        a[u] = hashBinary(a[u - 1] + i, !0),<br />            c += a[u];<br />    return function (t) {<br />        for (var r = new Uint8Array(t.length), o = 0, i = t.length; o &lt; i; ++o)<br />            r[o] = t.charCodeAt(o);<br />        return r<br />    }(c.substring(0, 32));<br />}<br />const fromHexString = function(hexString){return Uint8Array.from(hexString.match(/.{1,2}/g).map(function(byte){return parseInt(byte, 16)}))};<br />const base64ToArrayBuffer = function(b64) {var byteString = atob(b64);var byteArray = new Uint8Array(byteString.length);for(var i=0; i &lt; byteString.length; i++) {byteArray[i] = byteString.charCodeAt(i);}return byteArray;}<br />async function decryptMessage(ua,data){<br />    const encMessage = JSON.parse(data);<br />    const key = await crypt.subtle.importKey(&#x27;raw&#x27;, keyEnc(ua,encMessage.s), { name: &#x27;AES-CBC&#x27; }, false, [&#x27;decrypt&#x27;]);<br />    const decryptedData = await crypt.subtle.decrypt({ name: &quot;AES-CBC&quot;, iv:fromHexString(encMessage.iv) }, key, base64ToArrayBuffer(encMessage.ct));<br />    return new TextDecoder().decode(decryptedData);<br />}<br />const ua = &quot;Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.11701108000&quot;;<br />[[BDA_DECRYPT]]=await decryptMessage(ua,[[MESSAGE]])</code></p>
  <p id="ug85"></p>
  <p id="kJiS">В итоге на ноде (12) декрипт нихуя не работал, а в браузере блять работал. Ну и хуй с ним тогда.</p>
  <figure id="I1yT" class="m_original">
    <img src="https://img2.teletype.in/files/55/01/5501bdc9-a964-4aed-ac9f-672aed2b4f7f.png" width="320" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/SG8MYfJZLMI</guid><link>https://teletype.in/@it_hueta/SG8MYfJZLMI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/SG8MYfJZLMI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Ебём весь Geetest без сервисов и нейронок (bypass free).</title><pubDate>Mon, 15 Apr 2024 21:25:37 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/43/30/43303477-e803-4e55-acab-f1452c4cd160.png"></media:content><category>выебано</category><description><![CDATA[<img src="https://img4.teletype.in/files/fb/36/fb367179-c9be-4d48-a3da-5942925af7a0.png"></img>Сегодня разберемся как решать все гитесты с этой странички https://www.geetest.com/en/adaptive-captcha-demo]]></description><content:encoded><![CDATA[
  <figure id="k7MR" class="m_original">
    <img src="https://img4.teletype.in/files/fb/36/fb367179-c9be-4d48-a3da-5942925af7a0.png" width="1769" />
    <figcaption>Гитест, гигатест, гейтест, гиктест</figcaption>
  </figure>
  <p id="rcqC">Сегодня разберемся как решать <strong>все гитесты</strong> с этой странички <a href="https://www.geetest.com/en/adaptive-captcha-demo" target="_blank">https://www.geetest.com/en/adaptive-captcha-demo</a></p>
  <p id="uRGK">Для начала накидаем на эмуляции, а потом посмотрим запросеки.. Похуярили!</p>
  <p id="AWkZ"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="iSAV">Slide (эмуляция)</h2>
  </section>
  <figure id="qUsX" class="m_original">
    <img src="https://img2.teletype.in/files/54/8d/548de8f5-5765-468a-b66e-cdd023f5ac65.png" width="341" />
  </figure>
  <p id="GoXW">И так, <s>скутеры</s> слайдеры.</p>
  <figure id="ymv7" class="m_original">
    <img src="https://img2.teletype.in/files/df/2d/df2d4d25-7329-4f99-8e36-f842fd9fdd7f.png" width="480" />
  </figure>
  <p id="vsxm">Разумеется, на много пизже работает на контурах, как я делал до этого.</p>
  <figure id="C4xi" class="m_original">
    <img src="https://img2.teletype.in/files/9c/d8/9cd82215-7ccc-48af-8d5c-99f13028181a.png" width="369" />
  </figure>
  <p id="xZzn">Но для разнообразия, накидаю попсовым вариантом, как было <a href="https://habr.com/ru/articles/508690/" target="_blank">в статье на хабре</a>, с заготовкой фоной. Это ещё пригодится для последней, клик капчи)</p>
  <figure id="Ujoa" class="m_original">
    <img src="https://img3.teletype.in/files/a6/40/a640f380-be0f-4333-811f-886002abc995.png" width="360" />
  </figure>
  <h3 id="sLM9"><strong>Генерация фонов</strong></h3>
  <p id="62Tc">Сначала нужно как-то получить фоны. Руками мне лепить их лень, потому я сделал генератор. Напарсил фоны, а потом замерджил по phash. phash выбрал чисто потому, что оно по имени сортируется в папке, выглядит красиво) </p>
  <p id="cLsk">А еще, хеш - готовая строка, поэтому сравнение картинок по схожести по нему будет работать сильно быстрее, чем каждую картинку друг с другом сравнивать.</p>
  <figure id="zCAU" class="m_original">
    <img src="https://img4.teletype.in/files/b6/7b/b67bdb19-84d4-4514-81f9-898b53c205c4.png" width="904" />
  </figure>
  <p id="kgeV">Парсинг в общую папку. Хотя на скринах я уже паршу тесты, но суть та же.</p>
  <figure id="Zibw" class="m_original">
    <img src="https://img2.teletype.in/files/51/f0/51f0e959-7879-48c0-89df-143717e6b703.png" width="894" />
  </figure>
  <p id="sdY7">В ответе и запросе есть колбек &quot;geetest_&quot; + Date.now(), так как эт фикса по длине, по ней я ответ и подрезал через slice.</p>
  <figure id="wS52" class="m_original">
    <img src="https://img1.teletype.in/files/49/fc/49fc52cc-a8a3-4499-9d35-5e75da1141dd.png" width="845" />
  </figure>
  <p id="HRhj">Итак, напарсил чуток фонов с дыркой. Все картинки, кстати, с шумами, но как будет видно позже, это не проблема)</p>
  <figure id="Fymi" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/92/9e/929e8e71-b4d3-4d8a-a35f-d22ea743ff0e.png" width="1541" />
    <figcaption>Я ж говорил, сортированная хуйня выглядит красиво.</figcaption>
  </figure>
  <p id="oYDM">Сортировку делал отдельно по hash, как в скрипте по seosprint.</p>
  <figure id="qI5q" class="m_original">
    <img src="https://img4.teletype.in/files/f3/0f/f30f7353-14a7-43b7-897f-1f55fda2ccae.png" width="456" />
  </figure>
  <p id="MWnc">В результате получаем фон с дыркой в разных местах. Остается только мердж.</p>
  <figure id="7GcJ" class="m_original">
    <img src="https://img2.teletype.in/files/95/7c/957c1d7a-39bf-4b51-be10-b7619d011f47.png" width="1453" />
  </figure>
  <p id="EJCP">А мердж довольно простой и логичный.</p>
  <figure id="tyD4" class="m_original">
    <img src="https://img3.teletype.in/files/21/04/21044dbd-656f-4131-b16d-50a5c43bed7c.png" width="1341" />
  </figure>
  <p id="JUHD">Мы у всех сортированных картинок из папки берем пиксель по индексу, сейвим в массив, а потом голосованием выбираем какой это пиксель. Если 1 и 2 вариант одинаковы по количеству голосов, берем случайно либо 1, либо 2, чтобы разнообразить шумы.</p>
  <figure id="b49w" class="m_original">
    <img src="https://img4.teletype.in/files/36/8f/368f8f53-1635-41ab-9b97-5acc2d7c1257.png" width="331" />
  </figure>
  <p id="SmUH">Да, массив RGBA я сохраняю как строку, чтобы проще сравнивать схожесть.</p>
  <figure id="aQmc" class="m_original">
    <img src="https://img2.teletype.in/files/53/c2/53c2b5b7-2ec8-4588-91f4-d0cf7deab86d.png" width="604" />
  </figure>
  <h3 id="LOUn"><strong>Решение</strong></h3>
  <p id="HLax">Так как при мердже часть фонов вышла с мусором, я их ручками удалил. Всеравно ведь удалить пару картинок проще, чем сидеть и собирать их по частям)</p>
  <figure id="cMeX" class="m_original">
    <img src="https://img1.teletype.in/files/07/7d/077d5951-178a-46ba-a428-cc9b8ed53dd5.png" width="1138" />
  </figure>
  <p id="Aezv">Имея базу &quot;чистых&quot; фонов, берем картинку капчи и ищем какой фон имеет наибольшую схожесть с нашей используя нативный метод баса &quot;поиск картинки в картинке&quot;. </p>
  <figure id="OFnt" class="m_original">
    <img src="https://img3.teletype.in/files/ed/ca/edca2a23-1510-4183-938c-ddbee3c96942.png" width="742" />
  </figure>
  <p id="08lN">А потом удаляем все лишнее с картинки либой pixelmatch, как делалось в статье с хабра или материале на форуме зенки. </p>
  <p id="t4i7">Благодаря либе, шумы, которые есть на каждом фоне, в итоге отсутствуют на нашем итоговом изображении.</p>
  <figure id="HQBE" class="m_original">
    <img src="https://img3.teletype.in/files/64/39/6439f1d4-8a40-4c4d-bae9-1aebbcdde10a.png" width="1449" />
  </figure>
  <p id="8yXD">Имея позицию по Y и фон, найдем позицию скриптом Sadzurami (с парой строк моего говнокода) для тестов. Как я сказал ранее, подход не самый удачный, но для эмуляции решил поэкспериментировать. Для запросов сделал уже нормально.</p>
  <figure id="vpLX" class="m_original">
    <img src="https://img1.teletype.in/files/8c/11/8c11b95a-7fef-4c08-9a21-a9730c53caf9.png" width="1344" />
  </figure>
  <p id="0HS6">Ну и оно работает, что не удивительно, ищет дырку по пазлу.</p>
  <figure id="dUwy" class="m_original">
    <img src="https://img3.teletype.in/files/a1/25/a1251834-efd5-428a-b48a-a1e6313c00cd.png" width="310" />
  </figure>
  <h3 id="vUE2"><strong>Эмуляция</strong></h3>
  <p id="Ypsy">Ну а тут будут причины почему мне не нравится эмуляция.</p>
  <p id="Lybg">1) Я запускаю сайт и он грузится, а капча не успевает прогрузиться. Хорошо, я ставлю ждать полной загрузки. В итоге выбивает ошибку ожидания загрузки, ведь ждало больше минуты, но что-то вот как-то не пошло. Ну окей, и чего мне тогда делать? Мне нужна обычная, самая обычная, нормальная загрузка страницы и нужно просто ее дождаться. Но нет, мне приходится городить какие-то костыли.. Поэтому я убрал ожидание загрузки страницы и добавил ожидание именно капчи.</p>
  <figure id="Rkcf" class="m_original">
    <img src="https://img2.teletype.in/files/5b/09/5b098634-68e3-4f7b-8287-192a36a80e23.png" width="1526" />
  </figure>
  <p id="szji">Но проблемы на этом не заканчиваются, они только начинаются.</p>
  <p id="VYb1">2) При решении слайдера мне нужно зажать кнопочку и переместить по координатам. И вот я беру и... вместо правильного движения мышка резко улетает куда-то в ебеня. Это наверное не проблема баса, а сайта, но мне такие приколы не нравятся.</p>
  <p id="I7AZ">Более того, сайт еще имеет и горизонтальный, сука, скрол.</p>
  <figure id="rsxM" class="m_original">
    <img src="https://img1.teletype.in/files/48/3f/483fce55-7853-470c-9f7a-4f7bbafd70ff.png" width="1013" />
  </figure>
  <p id="9ydU">Поэтому я ручками пошукал, сделал удаление стилей, которые делали эту хуйню. Тем самым сломав верстку нахуй.</p>
  <figure id="NFFu" class="m_original">
    <img src="https://img4.teletype.in/files/b4/52/b45270e7-738f-4070-bec5-fb876b3f7861.png" width="1526" />
  </figure>
  <p id="ZR5s">Только вот это нихуя не помогло. Оно опять кликало не туда и мышка улетала в ебеня. Костыльным решением, которое спасло ситуацию, стал юз режима капчи попап.</p>
  <figure id="tobR" class="m_original">
    <img src="https://img1.teletype.in/files/4b/3b/4b3b2535-b55d-45d4-8719-d94058ba989d.png" width="519" />
  </figure>
  <p id="VBd2">Еще, зачем-то пришлось добавить сдвиг в 10 пикселей к позиции ответа.</p>
  <figure id="790V" class="m_original">
    <img src="https://img1.teletype.in/files/40/5e/405e5b46-9dbc-465c-9fed-c45525f76afb.png" width="362" />
  </figure>
  <p id="LmiO">3) Картинки дергал через кеш, с этим проблем не возникло. Хотя нет, возникло блять. Капча без задачек автоматически решалась при загрузке страницы, поэтому в кеш попадала хуйня. Чтоб этого небыло, пришлось добавить ожидание перед переключением режима капчи, тк именно при переключении режима оно сразу дергает получение задания на капчу. Хотя, можно было фильтр кеша делать по типу задания, он ведь тоже в урле.</p>
  <figure id="WWnb" class="m_original">
    <img src="https://img4.teletype.in/files/bd/6f/bd6f0c65-e9be-4b42-8f54-e8064a58fd6d.png" width="1074" />
  </figure>
  <p id="oiGx">Но хотя бы теперь я смог протестить, что все работает правильно. Слайдер есть слайдер, потому не удивительно, что оно пиздато решается. Вообще, я применил поиск картинки в картинке для определения позиции, но тк у нас и тк есть онли пазл, можно было дернуть через маску, тк наша картинка по сути маска готовая. Но даже так, за все время тестирования вроде всего 1 ошибка была.</p>
  <figure id="Kl1v" class="m_original">
    <img src="https://img4.teletype.in/files/f2/59/f2595616-ba29-465b-b373-7a203220a592.png" width="1680" />
  </figure>
  <p id="P6cR"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="eMUm">IconCrush (эмуляция)</h2>
  </section>
  <figure id="FPIg" class="m_original">
    <img src="https://img2.teletype.in/files/95/da/95dace2a-6f08-4eaa-b9f4-2a09ec3a8c01.png" width="347" />
  </figure>
  <p id="ujpv">Эта капча очень простая и решается чисто математикой. Я не очень умный, по-этому сделал так как смог. </p>
  <figure id="kbtU" class="m_original">
    <img src="https://img3.teletype.in/files/a5/34/a5342bbe-1991-4df7-b84f-b2860b091397.png" width="400" />
  </figure>
  <p id="AoB9">Тем более, задачка прилетает просто массивом</p>
  <figure id="vjLx" class="m_original">
    <img src="https://img1.teletype.in/files/08/49/084977d4-eece-47c1-99a0-8873cb78fc80.png" width="825" />
  </figure>
  <h3 id="x1p0"><strong>Решение</strong></h3>
  <p id="0PCR">По сути, наша задача найти какие-то 2 картинки, флип которых даст линию из 3х совпадающих элементов, причем если флип горизонтальный, линия - решение получится вертикальной и наоборот. Например, мы флипаем 2 красных квадратика, а решение получится в одном из зеленых столбцов.</p>
  <figure id="v4Wl" class="m_original">
    <img src="https://img1.teletype.in/files/83/44/8344230f-5d4c-4b04-b23a-7115113b3874.png" width="348" />
  </figure>
  <p id="Voop">Я не знаю как это решается по нормальному, но раз нужно найти какую-то пару, которая приведет к решению, я просто возьму и забручу все варианты решения нахуй. Возьму и выполню все варианты перестановок и сделаю прочек получилась линия или нет. Тем более перестановок выйдет около нихуя. Чтобы небыло баги перезаписи значений, опять пришлось добавлять клонирование через сериализацию. </p>
  <figure id="99Fn" class="m_original">
    <img src="https://img3.teletype.in/files/a2/7f/a27f6aa8-2465-41fb-8d92-c1772eedfe07.png" width="725" />
  </figure>
  <h3 id="OL7G"><strong>Эмуляция</strong></h3>
  <p id="BlQd">Тут все обошлось без приколов. Есть классы, где в нейминге указаны позиции. Я передал туда ответы и кликал сразу куда нужно.</p>
  <figure id="T4W9" class="m_original">
    <img src="https://img2.teletype.in/files/19/52/1952459f-9d60-40f6-82d1-937252b67e85.png" width="1680" />
  </figure>
  <p id="AkBD">Само задание просто парсил из кеша</p>
  <figure id="ZcBq" class="m_original">
    <img src="https://img4.teletype.in/files/7f/86/7f86ea91-8104-4f89-978d-b0bee9054921.png" width="354" />
  </figure>
  <p id="wLhu">Все максимально просто и логично</p>
  <figure id="LxWI" class="m_original">
    <img src="https://img4.teletype.in/files/7f/e2/7fe2d073-1bcb-40fc-b5d3-1d447195aa9c.png" width="729" />
  </figure>
  <p id="5HFk">В итоге решало 100 из 100 на эмуляции.</p>
  <figure id="j512" class="m_original">
    <img src="https://img3.teletype.in/files/ee/e5/eee57dee-7a19-4a17-8cea-90f29de40fdc.png" width="1680" />
  </figure>
  <p id="u6SL"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="VeKF">Gobang (эмуляция)</h2>
  </section>
  <figure id="0xhd" class="m_original">
    <img src="https://img3.teletype.in/files/27/f2/27f2f703-12ef-468a-a283-625f473f8f78.png" width="344" />
  </figure>
  <p id="UYw4">Наверняка, мой код говно и можно сделать проще (любители литкода, ваш выход), но я сделал как сделал и оно работает. </p>
  <figure id="k5fV" class="m_original">
    <img src="https://img3.teletype.in/files/ac/f7/acf77f07-8755-4c4e-afc7-cf0379310fd0.png" width="510" />
  </figure>
  <p id="Qz3c">Как и в случае с прошлой капчей, тут нам прилетает массив</p>
  <figure id="Ulap" class="m_original">
    <img src="https://img4.teletype.in/files/b2/fe/b2febf01-a445-4326-8a7a-426e3e60a1a0.png" width="867" />
  </figure>
  <h3 id="09YM"><strong>Решение</strong></h3>
  <p id="sKd7">Для начала чекаем какие у нас вообще есть цвета. После, проходимся по горизонтали, вертикали и диагоналям, собирая статку по цветам в каждом типе линий (BOARD) через функцию подсчета checker. Далее чекаем какой именно тип линий - решение и на какой позиции, сейвим в task_type и value.</p>
  <figure id="PWIo" class="m_original">
    <img src="https://img2.teletype.in/files/10/d4/10d404c2-e57f-4e14-b52e-29d30929bbb5.png" width="1453" />
  </figure>
  <p id="6WEe">А после, шукаем конкретную позицию дырки и камня желаемого цвета, исключая при поиске нашу линию - решение. Все довольно топорно. Куча циклов, но проблем по скорости вроде нету, поэтому меня всё устраивает. </p>
  <figure id="Eegu" class="m_original">
    <img src="https://img4.teletype.in/files/74/d8/74d84c32-18f6-4336-acf9-abcbad42281e.png" width="951" />
  </figure>
  <h3 id="rXNn"><strong>Эмуляция</strong></h3>
  <p id="FSrC">В процессе тестов я нашел багу. Если варианта ответа 2, хуйня как на скрине ниже. Изначально я это не предусмотрел и оно лажало, решая 90%. Но ведь это можно просто взять и фиксануть.</p>
  <p id="JsZH"></p>
  <figure id="iS6U" class="m_original">
    <img src="https://img2.teletype.in/files/1d/80/1d80a1e2-840e-4a89-be39-5ba35d9e3669.png" width="1099" />
  </figure>
  <p id="Yf17">В итоге я её просто взял и захардкодил. У нас в чекере идет подсчет цветов, а дырку мы выкидываем. Получается, у нас всегда остается объект, где всего 1 цвет.</p>
  <figure id="lxX1" class="m_original">
    <img src="https://img3.teletype.in/files/a5/fc/a5fc281f-a3da-436f-b4a2-367728d422a6.png" width="445" />
  </figure>
  <p id="NwDM">Задачку, как и в прошлой капче, дергаем через кеш.</p>
  <figure id="o16F" class="m_original">
    <img src="https://img2.teletype.in/files/5a/8a/5a8a5259-6756-4add-9664-18a514b4cf05.png" width="337" />
  </figure>
  <p id="QzZs">Клик по элементам решил сделать через выбор класса полоски и её элемента.</p>
  <figure id="4RyB" class="m_original">
    <img src="https://img2.teletype.in/files/54/25/54258a68-8655-4c79-9504-655a7ebbac45.png" width="1220" />
  </figure>
  <p id="CPst">В итоге все работает, теперь решает 100 из 100.</p>
  <figure id="aIid" class="m_original">
    <img src="https://img2.teletype.in/files/53/c3/53c36111-ebbe-48e9-b502-505c4e0effc5.png" width="1680" />
  </figure>
  <p id="4Qyw"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="EUtB">Icon (эмуляция)</h2>
  </section>
  <figure id="HlVI" class="m_original">
    <img src="https://img2.teletype.in/files/9e/dd/9eddb57b-a6d4-4403-90c1-928cc6a572ce.png" width="344" />
  </figure>
  <p id="haFH">А вот с этой штукой я уже чуток намучался. Задачка прилетает, как и со слайдером.</p>
  <figure id="jYME" class="m_original">
    <img src="https://img4.teletype.in/files/ff/a5/ffa599eb-ec7d-4695-84ee-9dc66479e8a2.png" width="827" />
  </figure>
  <h3 id="tOir"><strong>Решение</strong></h3>
  <p id="F0MQ">Ну окей, ищем и удаляем фон, всё как у слайдера. Фоны я ранее чисто под эту капчу парсил и мерджил, ровно как и со слайдером.</p>
  <figure id="ccND" class="m_original">
    <img src="https://img4.teletype.in/files/70/0a/700a9063-894e-4ac5-9b29-d237e198d5b2.png" width="812" />
  </figure>
  <p id="Vhcy">Картинка получается не очень чистая, но в целом сойдет. Все таки нам важно сохранить иконки и похерить шум.</p>
  <figure id="CoNo" class="m_original">
    <img src="https://img1.teletype.in/files/4b/b5/4bb5145c-4846-41b4-b693-4e67e3200692.png" width="325" />
  </figure>
  <p id="60BM">А теперь самое интересное, че же делать дальше?</p>
  <figure id="0HVC" class="m_original">
    <img src="https://img3.teletype.in/files/21/18/2118f01c-1bf9-4f2b-9bca-79cbd869c12a.png" width="426" />
  </figure>
  <p id="ZRfi">А дальше надо по любому дергать эти иконки. Только вот хуйня вся в том, что мини иконки и их версии на картинке чуть отличаются.</p>
  <figure id="op4M" class="m_original">
    <img src="https://img2.teletype.in/files/da/2b/da2ba3d6-ea57-4cc9-a663-600933ca0d32.png" width="309" />
  </figure>
  <p id="xaMz">Поэтому я решил дергать внешний контур иконки. Я получаю фон, а потом дергаю все что не фон)</p>
  <figure id="c95j" class="m_original">
    <img src="https://img4.teletype.in/files/f2/83/f283df1e-22f3-4b63-97cd-7e10725e4281.png" width="1006" />
  </figure>
  <p id="dZ6s">Да, выглядит он немного ебано, но задачу свою полностью выполняет. Всетаки прям в пиздатом качестве иконки в данной капче не вытянешь, даже при наличии фона.</p>
  <figure id="V6au" class="m_original">
    <img src="https://img4.teletype.in/files/f4/4c/f44cf373-ad42-4ed3-9f0b-633cd8cf15f5.png" width="378" />
  </figure>
  <p id="trOF">Дополнительно добавляю сортировку. В чем смысол решения станет понятно чуть позже.</p>
  <figure id="H4kG" class="m_original">
    <img src="https://img2.teletype.in/files/1c/10/1c1068b1-1227-4142-8ec7-46d97166e3a6.png" width="510" />
  </figure>
  <p id="TYtb">Ну и мини иконки тож дергаю. Тк они сразу чб, то всё чуток проще.</p>
  <figure id="dTWD" class="m_original">
    <img src="https://img3.teletype.in/files/23/2e/232ea200-bf9f-49d4-84f5-a3435bf28d5e.png" width="940" />
  </figure>
  <p id="NWKT">На выходе получаем подобную хуеверть.</p>
  <figure id="dv5m" class="m_original">
    <img src="https://img4.teletype.in/files/79/f4/79f4b5a2-c6c2-4d48-89ad-f40e99156fbf.png" width="377" />
  </figure>
  <p id="qPed">И тоже сортирую.</p>
  <figure id="uSri" class="m_original">
    <img src="https://img3.teletype.in/files/64/c0/64c06503-74e7-40ab-b46b-2ff665387169.png" width="540" />
  </figure>
  <p id="OQyj"><strong>Ну а теперь перейдем к сути решения.</strong></p>
  <p id="vrQH">Берём 2 массива, массив иконок с картинки и мини иконок. <br />Далее нам нужно как-то их сопоставить. Для этого оба массива сортируем по ключу, какому-то хитрому значению параметров, которое специфично для каждой картинки, но при этом не зависит от размера. На выходе получим пары.</p>
  <figure id="x0EH" class="m_original">
    <img src="https://img4.teletype.in/files/35/ee/35ee5d8c-7163-41c9-938f-5f67c584bb09.png" width="384" />
  </figure>
  <p id="U3BH">Так как у массива мини иконок был порядковый идентификатор, раз пары у нас есть, соберем новый массив с индексом от второго и координатами от первого, а потом отсортируем по порядковому индексу. </p>
  <figure id="SM2s" class="m_original">
    <img src="https://img2.teletype.in/files/18/01/18017ceb-3cde-40cd-ab15-d82bb95b7f73.png" width="344" />
  </figure>
  <p id="gtCL">Однако, для сравнения нужен какой-то хитрый параметр. Да, в сортировках выше уже и так видно как я порешал, но представим что ни кто этого не заметил.</p>
  <p id="NoVb">Чтобы его подобрать, я просто взял и провел тесты со всеми алгоритмами и значениями. Для тестов заготовил 10 картинок и чекал какой метод решения лучше. Вообще, у <a href="https://image-js.github.io/image-js/#roi" target="_blank">роя много всяких параметров и методов</a>, но я почекал чисто базу.</p>
  <figure id="PCWU" class="m_original">
    <img src="https://img2.teletype.in/files/17/e5/17e59734-42bc-4994-8fb0-34f84ea1475a.png" width="361" />
  </figure>
  <p id="MrTu">И решением по итогу стал старый советский...</p>
  <figure id="QfHP" class="m_original">
    <img src="https://img2.teletype.in/files/df/6b/df6b16f1-6081-4424-9169-d13f0e56a86d.png" width="238" />
  </figure>
  <p id="2C99">Кароче, я поделил <a href="https://github.com/image-js/image-js/blob/legacy/roiDocumentation/README.md" target="_blank">площадь на периметр</a> и определил это значение в качестве кэфа: <code>e.coeff=e.d.mbrSurface/e.d.perimeter</code></p>
  <figure id="KCmW" class="m_original">
    <img src="https://img2.teletype.in/files/d4/dd/d4ddab3f-36ec-49e3-b356-78c18fccbcf0.png" width="400" />
  </figure>
  <p id="4sLM">И по итогу получим правильное решение.</p>
  <figure id="jGtm" class="m_original">
    <img src="https://img4.teletype.in/files/ba/9a/ba9a52f2-293a-4303-9f8d-599cc2880fdc.png" width="300" />
  </figure>
  <p id="YTC0">Чтобы это все добавить на картинку, я просто выполнил цикл.</p>
  <figure id="7KQG" class="m_original">
    <img src="https://img4.teletype.in/files/7c/f3/7cf3e43e-4332-49fa-a7d3-debe6afb5261.png" width="397" />
  </figure>
  <p id="XJiP">Ну и добавил текст. Все довольно просто.</p>
  <figure id="yUAu" class="m_original">
    <img src="https://img4.teletype.in/files/ba/ed/baed97a1-2cff-4b71-97d3-8d3a642106f5.png" width="1528" />
  </figure>
  <p id="6xca"><strong>Шо имеем по итогу?</strong></p>
  <p id="ox5L">Берём фон и картинку. Делаем маску. По маске получаем картинку из роя, причем с параметрами. Считаем каждой картинке отношение периметра к площади, а также сейвим координаты XY. Потом сортировка.<br />Получаем инфу по площади и периметру для мини иконок. Их тоже сортируем? но при этом сейвим их индексы. </p>
  <p id="UOY8">Далее еще она сортировка, но итогового массива.</p>
  <figure id="UbAy" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/37/0a/370a1605-fa2a-48a2-9da2-122e6feb267b.png" width="827" />
    <figcaption>Изи</figcaption>
  </figure>
  <p id="wqJJ">Так как мини иконки без фона, отдельно делал функцию добавления оного</p>
  <figure id="vfDo" class="m_original">
    <img src="https://img4.teletype.in/files/36/51/3651f2c1-ea0c-48db-8da9-b4e6ab6bf0a1.png" width="446" />
  </figure>
  <h3 id="3TfV"><strong>Эмуляция</strong></h3>
  <p id="QYl8">Ну тут все совсем просто. Парсим положение картинки, а потом эти координаты докидываем к ответу.</p>
  <figure id="2Lbe" class="m_original">
    <img src="https://img1.teletype.in/files/83/ae/83ae9b5b-d9ef-4dda-bb69-fe8d070ef0f5.png" width="1481" />
  </figure>
  <p id="s40u">В целом, на тестах статка выходила в 60% успеха, что неплохо для такой капчи, при том без использования нейронок.</p>
  <figure id="FgzL" class="m_original">
    <img src="https://img4.teletype.in/files/32/fe/32fe9554-0edd-443e-b693-1d32ff9531c4.png" width="1680" />
  </figure>
  <p id="nVwO"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="aKY2">Space</h2>
  </section>
  <p id="fypH">Помимо описанных ранее капч, у гитеста ещё есть вот такая поебеть, которую можно чекнуть на другой демо страничке <a href="https://www.geetest.com/en/demo" target="_blank">https://www.geetest.com/en/demo</a></p>
  <figure id="eUjn" class="m_original">
    <img src="https://img1.teletype.in/files/cd/01/cd0169da-fb1e-416e-8868-a9a74c25f414.png" width="349" />
  </figure>
  <p id="16UZ">Но как её решать я не смог придумать, не затащил. </p>
  <p id="ybym">Типо кликни на маленький зеленый рядом с большим еще чем-то. Я хуй знает как это решать без нейронок и распознавания объектов. Поэтому её скрипаем.</p>
  <figure id="YfFk" class="m_original">
    <img src="https://img1.teletype.in/files/04/40/04408aba-6a2e-43f7-b89d-b42ce8df8701.png" width="700" />
  </figure>
  <p id="9sNX"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="VSRE">Реверс и запросеки</h2>
  </section>
  <p id="rfCg">Напоминаю, наша <a href="https://www.geetest.com/en/adaptive-captcha-demo" target="_blank">демо страничка</a>.</p>
  <p id="F0au">Проведем поверхностный ресерч. Все параметры и так есть в задачке капчи или еще где-то, а вот W. Её нам и надо будет разгадать.</p>
  <figure id="iSr0" class="m_original">
    <img src="https://img2.teletype.in/files/14/91/1491b6d0-2849-42f4-aa99-fd358477fd53.png" width="1073" />
  </figure>
  <p id="5CS6">Опять чекаем стек вызовов, опять чекаем каждый вызов..</p>
  <figure id="lNK7" class="m_original">
    <img src="https://img1.teletype.in/files/47/04/4704a0aa-973c-440b-903a-7bbff02801b8.png" width="454" />
  </figure>
  <p id="9XAS">Находим воть и потом разматываем дальше</p>
  <figure id="P9gN" class="m_original">
    <img src="https://img4.teletype.in/files/b7/2a/b72ab0a9-cf3c-430c-9453-b867f015ee11.png" width="775" />
  </figure>
  <p id="dKT2">И приходим вот сюды. И шо мы тут видим? А видим мы, что было тело с решением, а потом мы его как-то пошифровали, получив на выход 2 какие-то строки. </p>
  <figure id="AGk0" class="m_original">
    <img src="https://img3.teletype.in/files/62/46/62460bac-1af0-40de-91ea-ebf4c16a7662.png" width="1114" />
  </figure>
  <p id="1E8p">Шагаем еще чуть назад и видим, что создаются 2 функции, AES(cbc) и RSA. Тогда все становится на свои места. Мы генерим рандом ключ, им шифруем тело через AES, а потом шифруем ключ через RSA, тем самым юзаем плюсы обоих крипто методов.</p>
  <figure id="M5dn" class="m_original">
    <img src="https://img3.teletype.in/files/21/1a/211aa62a-981f-4f0e-bebc-eadec6e4d2c0.png" width="1144" />
  </figure>
  <p id="5CoQ">Теперь нужно понять че мы шифруем. Для слайдера это позиция + какой-то пов + пара дефолт данных. В целом, вроде ничего сложного. </p>
  <figure id="3n4g" class="m_original">
    <img src="https://img2.teletype.in/files/de/59/de5978a4-18cd-4e0b-9ae6-f0fd36b5e293.png" width="1343" />
  </figure>
  <p id="nREW">Такс, ну ключик RSA у нас статичный, поэтому пиздим его из памяти.</p>
  <figure id="GPca" class="m_original">
    <img src="https://img4.teletype.in/files/fa/e3/fae36b0f-7d20-44c6-bb43-5a434b84686f.png" width="1025" />
  </figure>
  <p id="sQSs">Все оказалось довольно просто, поэтому я решил почекать другие варианты гитеста (старый вид). Чекнул на <a href="https://test.cap.guru/demo/geetest#geetest1" target="_blank">демо страничке от кап гуру</a>. Код такой же практически, алгоритмы те же..</p>
  <figure id="M756" class="m_original">
    <img src="https://img2.teletype.in/files/5c/30/5c30d381-f148-41fa-a8c0-1a8fbba59b8b.png" width="1278" />
  </figure>
  <p id="iJrT">И нашел я там.. такой же ключ RSA. Типо, ровно тот же.</p>
  <p id="joDg">00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81</p>
  <figure id="hcl4" class="m_original">
    <img src="https://img3.teletype.in/files/aa/1e/aa1e5760-354c-4e8a-8092-0a987e8045b8.png" width="1280" />
  </figure>
  <p id="lOhk">А потом я подумал: выглядит гига изично, но мне так лень писать код.</p>
  <figure id="X8ir" class="m_original">
    <img src="https://img2.teletype.in/files/dd/2d/dd2dda5c-83ef-4db0-a0b6-70964ebc28f6.png" width="700" />
  </figure>
  <p id="LM5t">Поэтому по ключу я посерчил на гите и нашел сразу готовые решения. </p>
  <p id="cPIk">Какбэ да, можно было б и самому пореверсить, но нахуя, а главное зочем, если это ровно тот же код, что я получил бы и сам, но часа через 3.</p>
  <figure id="cRYg" class="m_original">
    <img src="https://img4.teletype.in/files/b7/d3/b7d34da4-2f04-4c16-998a-ebfa6ae47b88.png" width="1408" />
  </figure>
  <figure id="b1EB" class="m_original">
    <img src="https://img2.teletype.in/files/1a/81/1a819510-8a5b-4c42-8d13-642173fbaa75.png" width="500" />
  </figure>
  <p id="9CbP">Из всех реп <a href="https://github.com/sijiyo/projects/blob/b35b81ae7e9ed4b25ab3780080366ad7fa145447/geetest4_slide/jiyan.js#L24" target="_blank">для меня примечательна стала именно эта</a>, тк код на ноде.</p>
  <figure id="B23E" class="m_original">
    <img src="https://img4.teletype.in/files/fa/ee/faee01c0-2348-405c-92ba-14ba7214ec65.png" width="986" />
  </figure>
  <p id="Pu5w">Забегая вперед скажу, что китаец молодец и написал отличный рабочий код. Желаю ему получить мискарис и кошкажена от партия.</p>
  <figure id="8pcV" class="m_original">
    <img src="https://img1.teletype.in/files/85/e3/85e3b701-e1c2-42cf-a2b9-c956f60712e5.png" width="659" />
  </figure>
  <p id="S7mL">Также, чуток погуглил и нашел много заметок прям с разбором реверса от других китайцев, поэтому не вижу смысла расписывать это тут.</p>
  <figure id="1ddq" class="m_original">
    <img src="https://img2.teletype.in/files/93/9c/939c2fd9-f1fd-46b3-b305-6b10a4d27697.png" width="943" />
  </figure>
  <p id="YnRd">Хорошие заметки, <a href="https://cloud.tencent.com/developer/article/2208883" target="_blank">все подробно и четко расписано</a>, со стрелочками даже.</p>
  <figure id="Sbti" class="m_original">
    <img src="https://img4.teletype.in/files/3f/a1/3fa1ac0c-e150-426b-afdb-534af7964287.png" width="1058" />
  </figure>
  <p id="T413">А тут даже есть <a href="https://www.zhihu.com/zvideo/1646167968571793408?playTime=73.2" target="_blank">подробный видео гайд</a>, <a href="https://www.zhihu.com/question/37337751/answer/3027371601" target="_blank">помимо статьи</a>.</p>
  <figure id="hqau" class="m_original">
    <img src="https://img4.teletype.in/files/b9/55/b955b7b7-450b-40d0-8dd2-6d075a8be7e9.png" width="687" />
  </figure>
  <p id="jecJ">Вот тоже интересная заметка по реверсу гитеста. Тут даже целый форум, <a href="https://www.52pojie.cn/forum-5-1.html" target="_blank">точнее ветка на форуме</a>. </p>
  <p id="a4d6">Вот например <a href="https://www.52pojie.cn/thread-1735973-1-1.html" target="_blank">реверс протобуфа</a>. Чел показал, как собрал данные и шаблон, а потом через питончик отправить запрос.</p>
  <figure id="NcPN" class="m_original">
    <img src="https://img3.teletype.in/files/ef/80/ef80dfc7-699d-4054-959f-e194b7caa3bb.png" width="1003" />
  </figure>
  <p id="9jUC"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="0cpc">IconCrush (запросы)</h2>
  </section>
  <p id="VuWW">Такс, раз шифрование у нас есть, соберем решалку на самой простой задачке и почекаем. Общая схема скрипта такая.</p>
  <figure id="udh9" class="m_original">
    <img src="https://img1.teletype.in/files/8d/f4/8df47936-e0bb-4868-93b7-9a0158665a37.png" width="288" />
  </figure>
  <p id="nUBE">В процессе подготовки к тестам, я обратил внимание, что в прод коде капчи, в отличие от китайского есть 2 новых значения:</p>
  <figure id="uO3T" class="m_original">
    <img src="https://img2.teletype.in/files/1b/36/1b36d041-9c39-43cf-8d8c-05760851f4bb.png" width="329" />
  </figure>
  <p id="KzKw">Чуть потыкал стек вызовов и нашел biht.</p>
  <figure id="SvRC" class="m_original">
    <img src="https://img1.teletype.in/files/cd/c9/cdc946b7-9ae4-483a-964e-8a80c284ceab.png" width="1091" />
  </figure>
  <p id="YECG">Тут оно дергало из гига массива файла по индексу нейм biht.</p>
  <figure id="ymaV" class="m_original">
    <img src="https://img4.teletype.in/files/3c/40/3c400f44-d35a-4bb6-a593-aa94723feda2.png" width="321" />
  </figure>
  <p id="eF4L">Значение мы всегда получаем одно и то же - 1426265548. А значение это - контрольная сумма функции от самой себя. Возможно это какой-то контроль версий файла капчи.</p>
  <figure id="Ww2m" class="m_original">
    <img src="https://img4.teletype.in/files/3f/9e/3f9eb331-d53e-4a4d-b1f6-f51f11e00a13.png" width="1091" />
  </figure>
  <p id="aDbW">А вот чтобы найти второй параметр, пришлось чуть похитрить. И нет, это не рандом. Оказалось он тянется из файла капчи и ставится как window._lib</p>
  <figure id="SyJN" class="m_original">
    <img src="https://img3.teletype.in/files/64/2a/642a6391-37aa-4657-b173-d46be30d6ecf.png" width="1089" />
  </figure>
  <p id="tJEU">Я поставил на декод логический брек, который стопал когда видел слово _lib. И нашел от куда оно берется.</p>
  <figure id="H5Dw" class="m_original">
    <img src="https://img3.teletype.in/files/20/3d/203d4644-c95b-44d9-bd10-00771d4a7c74.png" width="759" />
  </figure>
  <p id="bjgn">Оказалось, в коде есть гига массив с данными, по индексу от туда и берется значение. Первая часть имени есть в файле, вторая в массиве. И получается это какбэ привязка к файлу, типо ключи.. можно и наверное нужно сделать парсер, но для тестов я просто их дернул как есть и фсе. Хотя парсинг написать изи, пример скрин ниже.</p>
  <figure id="gIXK" class="m_original">
    <img src="https://img3.teletype.in/files/69/39/69397feb-ab23-42d3-8b77-9e5cb80470a4.png" width="639" />
  </figure>
  <p id="EO8j">По итоге код шифрования стал выглядеть так</p>
  <figure id="YGBF" class="m_original">
    <img src="https://img1.teletype.in/files/cf/16/cf16b0a7-8b20-454d-99db-715d21348cea.png" width="1551" />
  </figure>
  <p id="CbmT"><strong>Теперь перейдем к самой решалке.</strong></p>
  <p id="LV7c">Чисто визуально массив повернут, но на самом деле нет и ничего делать не нужно.</p>
  <figure id="dxZI" class="m_original">
    <img src="https://img3.teletype.in/files/24/a0/24a0bf7f-8539-4af8-9b7c-1c451df6ede9.png" width="677" />
  </figure>
  <p id="sl8n">Почекаем че мы шифруем для этой капчи. Вроде вся та же хуйня, что я собрал ранее. Можно тестить.</p>
  <figure id="kgUb" class="m_original">
    <img src="https://img2.teletype.in/files/5a/93/5a931eeb-b894-4d36-9aa5-f787efa84de3.png" width="1675" />
  </figure>
  <p id="ujqc">Запрашиваем капчу, дергаем ответ и пару данных для запроса ответа. Получаем ответ, шифруем и шлем на решение.</p>
  <figure id="KMlp" class="m_original">
    <img src="https://img1.teletype.in/files/c9/41/c9410cc5-0665-4386-801c-793052efd3e6.png" width="1197" />
  </figure>
  <p id="EREq">Интересная тут только подготовка тела капчи. Я докинул параметров, которые нужны в запросе и добавил енкод для тела, чтобы сразу из JSON получить uri данные.</p>
  <figure id="fwjG" class="m_original">
    <img src="https://img1.teletype.in/files/4f/e9/4fe9b13d-fb10-4952-9cdf-d2654d8e698c.png" width="928" />
  </figure>
  <p id="wbKh">И оно <strong>в итоге</strong> работает, решает 100 из 100 на запросах)</p>
  <figure id="FWY2" class="m_original">
    <img src="https://img3.teletype.in/files/66/e9/66e962ec-15bf-4ccb-baba-e622e2b3401e.png" width="855" />
  </figure>
  <p id="K71e">А значит нужно переходить к остальным капчам.</p>
  <p id="OeFR"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="0PCS">Gobang (запросы)</h2>
  </section>
  <p id="DW2x">И в отличие от прошлой капчи, тут поменялся только тип таска и блок решалки перекочевал из скрипта с эмуляцией.</p>
  <figure id="WnOT" class="m_original">
    <img src="https://img2.teletype.in/files/5a/b6/5ab62230-67ed-4c59-b407-acfe4a32a023.png" width="343" />
  </figure>
  <p id="gVHO"><strong>Итог</strong>: 100 из 100</p>
  <figure id="bPVT" class="m_original">
    <img src="https://img4.teletype.in/files/f9/67/f96761c7-ae10-4f6f-8c86-49717512ff8b.png" width="855" />
  </figure>
  <p id="n7bt"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="nFZG">Icon (запросы)</h2>
  </section>
  <p id="yhvF">У клик капчи данные были странноватые.</p>
  <figure id="0H8G" class="m_original">
    <img src="https://img3.teletype.in/files/ee/e6/eee65c7c-0136-44b3-9be3-177d9e2ec50a.png" width="1372" />
  </figure>
  <p id="JgcL">Но оказалось, что они просто в процентах.</p>
  <figure id="9O3A" class="m_original">
    <img src="https://img3.teletype.in/files/ed/09/ed094660-1d35-4a49-8cb9-e171a794da41.png" width="1311" />
  </figure>
  <p id="btwb">Тоесть, в отличие от предыдущей капчи, помимо переноса решалки, в эту потребовалось докинуть еще функцию перевода координат в проценты.</p>
  <figure id="YLbr" class="m_original">
    <img src="https://img3.teletype.in/files/24/7c/247cfbb8-8307-4dd9-8c18-2fd6955fa867.png" width="676" />
  </figure>
  <p id="Ouxn"><strong>В итоге</strong>, около 60% валид решения, как и в случае с эмуляцией.</p>
  <figure id="Qd63" class="m_original">
    <img src="https://img4.teletype.in/files/f5/af/f5afdd39-d5bd-4a1b-9f91-b0c46a2a450e.png" width="1189" />
  </figure>
  <p id="09b5"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="uM9X">Slide (запросы)</h2>
  </section>
  <p id="SiG7">А вот у слайдера есть пара своих отличий.</p>
  <figure id="M8yV" class="m_original">
    <img src="https://img1.teletype.in/files/c8/e3/c8e3873e-be42-4dbb-9844-a4bc2d4d35a2.png" width="1679" />
  </figure>
  <p id="kaUe">Как и в ориг репе китайца, в теле решения этой капчи нужны были параметры setLeft и userresponse.</p>
  <p id="SGKq">{<br />    &quot;setLeft&quot;: 216,<br />    &quot;passtime&quot;: 1003,<br />    &quot;userresponse&quot;: 216.72311322005146<br />}</p>
  <p id="5AeO">Там я и спиздил кусок userresponse: <code>distance / (.8876 * 340 / 300)</code></p>
  <p id="Tl8r">Для запросов решалку я поставил уже нормальную, на контурах, как и у бинанса.</p>
  <figure id="z29d" class="m_original">
    <img src="https://img1.teletype.in/files/ca/77/ca77b26c-8a2b-4442-972a-3bd613291a1c.png" width="336" />
  </figure>
  <p id="6R0B">Ну и все решалось также отлично.</p>
  <figure id="C0VK" class="m_original">
    <img src="https://img1.teletype.in/files/c7/0c/c70c89b8-d740-4d1e-abc5-6aa413ac6249.png" width="667" />
  </figure>
  <p id="yf7U"><strong>Итог</strong>: 100 из 100, но парочку захавал антифрод.</p>
  <figure id="aO46" class="m_original">
    <img src="https://img2.teletype.in/files/1f/10/1f107a85-2a96-44d1-881b-28d2766c89b6.png" width="854" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/4CmcPZ3e9iy</guid><link>https://teletype.in/@it_hueta/4CmcPZ3e9iy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/4CmcPZ3e9iy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>TikTok - cхема на 100 000 000$. Часть 2. Три ебучих капчи.. на запросах.</title><pubDate>Sun, 14 Apr 2024 16:43:59 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/46/1b/461bf5cc-826c-4f27-a81d-8aa27e7d8caf.png"></media:content><category>вах</category><description><![CDATA[<img src="https://img4.teletype.in/files/34/b8/34b8efc8-7c21-422e-bb13-11c418c07eb3.png"></img>В первой части я рассказал о своей истории знакомства с тт, тем как проебал темку с потенциалом в дохуя, а также, тем на что я въебал пол года.]]></description><content:encoded><![CDATA[
  <figure id="4G2D" class="m_original">
    <img src="https://img4.teletype.in/files/34/b8/34b8efc8-7c21-422e-bb13-11c418c07eb3.png" width="1920" />
  </figure>
  <h2 id="0RzQ">Введение</h2>
  <p id="cUQg">В первой части я рассказал о своей истории знакомства с тт, тем как проебал темку с потенциалом в дохуя, а также, тем на что я въебал пол года. </p>
  <figure id="6ZM2" class="m_original">
    <img src="https://img2.teletype.in/files/d4/51/d451d785-93a7-410c-b411-7a2457910a91.png" width="1099" />
  </figure>
  <p id="FtZu">С одной стороны, было весело и полезно, все-таки скил я сильно подкачал. С другой, обидно что по деньгам вышло нихуя. </p>
  <figure id="YDst" class="m_original">
    <img src="https://img4.teletype.in/files/b2/97/b2970340-381f-4cd1-82d5-dddc35d8aca6.png" width="2834" />
  </figure>
  <p id="nxFi">Чуть позже, как подкачал скил, капчи всё же раъебал. Потому, хотелось бы ими поделиться. </p>
  <figure id="2EBY" class="m_original">
    <img src="https://img3.teletype.in/files/2e/b3/2eb3dde0-4266-449a-9b57-5a300c24d816.png" width="1280" />
  </figure>
  <p id="ziN8">Да, я <a href="https://community.bablosoft.com/topic/21721/%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D0%BF%D1%87%D0%B8-tiktok/118" target="_blank">натыкался на форуме</a>, что подобное решение продают, но я потратил на тикток слишком много времени и сил, чтобы что-то продавать или допиливать, а потому делюсь тем что есть) Как обычно, я решил сделать чуточку больше чем остальные, больше чем есть в паблике. Похуярили..</p>
  <figure id="3uJC" class="m_original">
    <img src="https://img1.teletype.in/files/49/d9/49d940b3-01f0-4b8b-9be6-3e107ae581e7.png" width="860" />
  </figure>
  <p id="uf0j"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="3WUc">Slide Капча</h2>
  </section>
  <p id="yLcg">Демо страница: <a href="https://sf16-scmcdn-va.ibytedtos.com/goofy/secsdk-captcha/va/2.15.21/index.html" target="_blank">https://sf16-scmcdn-va.ibytedtos.com/goofy/secsdk-captcha/va/2.15.21/index.html</a></p>
  <figure id="f2Ov" class="m_original">
    <img src="https://img4.teletype.in/files/f8/c9/f8c9d3fd-2315-4b3a-9558-2c73d164faad.png" width="372" />
  </figure>
  <p id="01rx">Нашел я эту демо страничку когда-то совсем давно, копаясь в коде запроса капчи тт. Если правильно помню, тогда она (капча) прилетала фреймом с линкой на эту страничку.</p>
  <h3 id="mwkX"><strong>Подходы к решению</strong></h3>
  <p id="FpaC">На zenno форуме когда-то давно уже поднимался <a href="https://zenno.club/discussion/threads/besplatnyj-geetest-na-100.70111/" target="_blank">вопрос решения капчи слайдера</a>. </p>
  <figure id="UT3U" class="m_original">
    <img src="https://img2.teletype.in/files/d8/d0/d8d0d688-567d-4e9c-97db-3b12dfd4fb1d.png" width="371" />
  </figure>
  <p id="minb">Применяемое там решение базировалось на логике: напарсить всё и составить целые картинки, а потом уже искать отличия. </p>
  <figure id="bunU" class="m_original">
    <img src="https://img2.teletype.in/files/d3/0c/d30c0bdb-52b1-417b-85ef-dac98b8dead1.png" width="1002" />
  </figure>
  <p id="kslk">Кстати, несколько позднее я <a href="https://habr.com/ru/articles/508690/" target="_blank">увидел подобную идею на хабре</a>, что было <a href="https://medium.com/@filipvitas/how-to-solve-geetest-slider-captcha-with-js-ac764c4e9905" target="_blank">переводом вот этой статьи</a> (спиздинг с зенки?).</p>
  <figure id="M5Uy" class="m_original">
    <img src="https://img3.teletype.in/files/2d/4b/2d4bd0e1-6f37-43d8-955e-68ec101994b5.png" width="523" />
  </figure>
  <p id="4RUI">Ещё есть варианты переводить в серое, как делал Sadzurami.</p>
  <figure id="ZljW" class="m_original">
    <img src="https://img4.teletype.in/files/77/f1/77f1285c-58fb-4762-a188-91d6fbe24a2b.png" width="511" />
  </figure>
  <p id="VyPH">Однако, мне такой подход кажется не очень практичным, особенно когда есть сопоставимые (на деле на порядок лучше) по качеству альтернативы. Потому, я использовал подход на контурах, как и в случае с бинансом. Более подробно то как я пришел к этому решению расписано в материале про бинанс.</p>
  <figure id="WuEN" class="m_original">
    <img src="https://img2.teletype.in/files/92/22/9222f478-33ec-49bc-b749-5a47b42d7e56.png" width="498" />
  </figure>
  <h3 id="EWOA"><strong>Мой подход</strong></h3>
  <p id="AKQy">Как уже сказал, я просто перенес решение с бинанса на тикток, но без трудностей тут конечно не обошлось. </p>
  <p id="xykR">Я взял свой модуль и въебал большие пороговые значения, чтоб получать по сути только белые линии обтекающие пазл на фул картинке.</p>
  <figure id="cIgK" class="m_original">
    <img src="https://img4.teletype.in/files/f5/22/f5229ef6-1d78-48a4-9476-b0e6eb5d528f.png" width="717" />
  </figure>
  <p id="JK2m"><strong>Первой задачкой</strong> стало то, что положение пазла по Y (высоте), которое присылает тт, слишком маленькое. </p>
  <figure id="66D5" class="m_original">
    <img src="https://img3.teletype.in/files/ed/a4/eda4e79d-7830-4a6d-82f8-27614ceac2cb.png" width="745" />
  </figure>
  <p id="mQai">В итоге оно резало криво.</p>
  <figure id="JQX8" class="m_original">
    <img src="https://img2.teletype.in/files/df/e3/dfe3dc5e-ae87-4c0b-b329-05993c166833.png" width="444" />
  </figure>
  <p id="tpuL">Решением стало - прописать 2х размер. Почему это сработало, станет очевидно чуть позже.</p>
  <figure id="pFXb" class="m_original">
    <img src="https://img4.teletype.in/files/7c/91/7c91c839-4620-4f32-84b4-3cc6c41ab934.png" width="566" />
  </figure>
  <p id="stUn"><strong>Второй преградой</strong> на пути стало то, что контуры получались слишком тонкие, что в итоге приводило к ошибке. При наличии мусора в контурах или белых объектов часто не мог найти правильное положение. Хотя казалось бы, куда ещё лучше.</p>
  <figure id="G2Il" class="m_original">
    <img src="https://img3.teletype.in/files/ef/2f/ef2f4707-5870-4857-b7db-adf9e804388b.png" width="441" />
  </figure>
  <p id="uJid">В отличие от мелкой картинки банана, тут она имеет размер 552х344 и потому был резон сделать расширение белых областей, <a href="https://docs.opencv.org/2.4/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html" target="_blank">подробнее и на умном туть</a>. </p>
  <figure id="6vxU" class="m_original">
    <img src="https://img3.teletype.in/files/2b/b4/2bb4ebb2-5aff-4664-bd71-55d52f3849de.png" width="595" />
  </figure>
  <p id="6Q51">Значение подбирать, разумеется, нужно не от пизды.</p>
  <figure id="yVWn" class="m_original">
    <img src="https://img2.teletype.in/files/1e/19/1e1935c0-32c2-4ca4-80a3-a4cb05403693.png" width="500" />
  </figure>
  <p id="z8Aj">Я опять использовал<a href="https://www.npmjs.com/package/image-js" target="_blank"> image-js</a>. <a href="https://image-js.github.io/image-js/#imagedilate" target="_blank">Дока</a>.</p>
  <figure id="2GR3" class="m_original">
    <img src="https://img4.teletype.in/files/76/9e/769e8db3-4189-4e62-b73f-d82517f6bd0e.png" width="663" />
  </figure>
  <p id="M0Bw">В итоге, оно начало стабильно работать, на 10 из 10.</p>
  <figure id="2tza" class="m_original">
    <img src="https://img3.teletype.in/files/62/3f/623f3ff4-e072-4a95-b0af-1e7ad6f01953.png" width="446" />
  </figure>
  <p id="G9rn">Но веселье на этом не заканчивается. Покопавшись в сурсах капчи, я понял, что они используют не ориг картинку, а уменьшенную (вот так сюрприз). Тоесть если я вот так решу, то эта позиция пазла нахуй не пригодится.</p>
  <figure id="W4gu" class="m_original">
    <img src="https://img2.teletype.in/files/55/94/55948dc1-482a-4fe4-a043-ccc9c59f464e.png" width="800" />
  </figure>
  <p id="wq3S">Причем, для пк размеры одни, а для мобилок другие.</p>
  <figure id="5Pbc" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/30/97/30974f7a-324b-4380-ae08-0098e21b13fc.png" width="726" />
    <figcaption>Пк</figcaption>
  </figure>
  <figure id="Wgu8" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f7/1a/f71acd44-13d6-4433-95d8-285d2745f2d3.png" width="367" />
    <figcaption>Моб</figcaption>
  </figure>
  <p id="dGow">Поставив брек на модификации атрибута кнопки, который отвечает за перерисовку положения кнопки слайдера..</p>
  <figure id="Qz5I" class="m_original">
    <img src="https://img2.teletype.in/files/94/2b/942b562e-b3a6-4810-a15c-31e4a079f0d4.png" width="736" />
  </figure>
  <p id="i61u">Я попал сюда, где увидел, что исходная позиция tip_y, которую вертает тикток, увеличена на некоторую константу. </p>
  <figure id="RYgg" class="m_original">
    <img src="https://img3.teletype.in/files/aa/47/aa475348-86c9-40d2-bb64-0b293a217322.png" width="1280" />
  </figure>
  <p id="CYc0">Прокрутив чуть выше, стало очевидно как работает вся эта хуеверть. Оно просто чекает какое у нас устройство (бек это кстати по юа чекает) и в зависимости от этого ставит константу в 1 или в 1.23...</p>
  <figure id="HuJS" class="m_original">
    <img src="https://img2.teletype.in/files/1d/ad/1dad4297-909d-477f-ad82-5b939cf6aa65.png" width="1278" />
  </figure>
  <p id="uAih">А после сжимает её через css до 276, либо до 340, в зависимости от устройства.</p>
  <figure id="XfSS" class="m_original">
    <img src="https://img1.teletype.in/files/86/87/8687525f-1816-4cce-b932-8279d566f2d7.png" width="1299" />
  </figure>
  <p id="KfjC">Всё это я применил и в софте.</p>
  <figure id="S6pp" class="m_original">
    <img src="https://img2.teletype.in/files/13/f7/13f77df7-42aa-4dac-a315-d91836cd2043.png" width="1280" />
  </figure>
  <p id="3hGL">Ресайз сделал также через image-js. Теперь результат решалки уже можно будет применять на практике.</p>
  <figure id="mVuN" class="m_original">
    <img src="https://img1.teletype.in/files/88/7d/887d4b98-4f95-43b0-85f8-2ad1d786a001.png" width="393" />
  </figure>
  <p id="017o"><strong>Третий препон</strong> - координаты. Раз я решил делать на запросах, значит нужно и координаты как-то кастовать. Но прежде, стоит разобраться, а чё вообще генерировать.</p>
  <p id="2Qvi">В случае с пк, данных до ху я.</p>
  <figure id="wzQm" class="m_original">
    <img src="https://img4.teletype.in/files/3d/ef/3def4867-a2ba-47bd-a602-f582a5e46154.png" width="1195" />
  </figure>
  <p id="MXGV">А с мобилкой, не сказал бы что меньше. Но я решил выбрать мобилку (на деле разницы нет шо выбирать, одинаковая хуйня).</p>
  <figure id="JjqB" class="m_original">
    <img src="https://img3.teletype.in/files/e2/e5/e2e50bde-49bc-4813-b2c1-5b319ac77d5d.png" width="1186" />
  </figure>
  <p id="BMca">Ну.. пока ты двигал пазл, вот там всё и происходило</p>
  <figure id="lD1f" class="m_original">
    <img src="https://img1.teletype.in/files/81/b8/81b8b536-1946-4c64-b403-fa7c67572670.png" width="317" />
  </figure>
  <p id="rNe7">Сначала я долго всматривался в координаты, а потом они начали всматриваться в меня. И тогда тикток сказал:</p>
  <figure id="CR1J" class="m_original">
    <img src="https://img3.teletype.in/files/a6/b4/a6b4a86f-ff90-4684-9631-2ec8057af9aa.png" width="949" />
  </figure>
  <p id="ORNq">А если серьезно, я поставил бреки, посерчил код и пришел сюда</p>
  <figure id="sW3v" class="m_original">
    <img src="https://img2.teletype.in/files/17/f1/17f17794-1d22-414c-89ff-4bf24308314e.png" width="1279" />
  </figure>
  <p id="28Ly">А потом сюда (на позицию данных перед отправкой). </p>
  <figure id="qTDN" class="m_original">
    <img src="https://img2.teletype.in/files/d4/6b/d46ba214-fb4d-48ef-b798-2e8b0ca001e2.png" width="1279" />
  </figure>
  <p id="sw7t">Вернувшись назад по стеку, я увидел как пополнялись эти массивы.</p>
  <figure id="BnVH" class="m_original">
    <img src="https://img2.teletype.in/files/1c/1b/1c1b71ba-c862-43b7-aeee-bc42db291697.png" width="1065" />
  </figure>
  <p id="jCrZ">Ну окэй, мы знаем 2 массива, пазл (drag_track, он же reply) и кнопка слайдера (slide_btn_track, он же m) и можем примерно понять от куда они берутся. Но остается странный массив T. Количество значений в drag_track и reply одинаковое, тк оно по сути описывает одно и то же движение, только с дух разных точек по Y, а вот T.. </p>
  <figure id="x2MM" class="m_original">
    <img src="https://img4.teletype.in/files/b7/80/b780e99d-ab25-431f-a6d2-762292d896b3.png" width="449" />
  </figure>
  <p id="MgC7">Причем, заметим что T кратно 5 от количества reply значений всегда.</p>
  <figure id="38f2" class="m_original">
    <img src="https://img4.teletype.in/files/3a/1c/3a1c4dc2-7587-4e71-a559-7f371f7791ac.png" width="1003" />
  </figure>
  <p id="ViM3">Прочекав код мы придем вот сюда. Оно тречит позицию не пазла, а &quot;мышки&quot;, когда она зажата и сейвит каждую пятую точку.</p>
  <figure id="a1hb" class="m_original">
    <img src="https://img4.teletype.in/files/7c/de/7cde1afe-18cb-47c4-8474-a9f94433ba61.png" width="1278" />
  </figure>
  <p id="LHbK">Штош, имея примерное представление о том, что тут происходит, я решил не ебать себе мозги, а тупо: сделал скрин экрана, обрезал его, взял ответ с координатами и накидал скрипт который нарисовал всю хуйню движения мышки.</p>
  <figure id="itXy" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5c/94/5c9407b8-370a-4add-b0b0-34d84a3f0d30.png" width="1312" />
    <figcaption>Рисовалка</figcaption>
  </figure>
  <figure id="agAQ" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ee/80/ee807404-6765-4b9e-876f-b6c3531fa5a0.png" width="1070" />
    <figcaption>Данные решения</figcaption>
  </figure>
  <figure id="HUnH" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c8/e7/c8e78261-c667-461c-a9a3-e9e2fb7c33f6.png" width="436" />
    <figcaption>Скрин</figcaption>
  </figure>
  <p id="m3We">Результаты были не очень читаемые, поэтому мне пришлось применить немного магии рандомного подбора циферков, добавив сдвиги. Точнее, я почекал всякие расстояния, но не прям чтобы сильно уверен, что правильно все понял (но работает же все в итоге). Примечательно, что координаты движения кнопки были прям точные и правильные относительно скрина. Значит, в написании решения от нее и будем отталкиваться.</p>
  <figure id="PiiQ" class="m_original">
    <img src="https://img4.teletype.in/files/bd/c5/bdc5e0ef-977f-456c-9aff-acdee5823d0c.png" width="1049" />
  </figure>
  <p id="Jn5m">Чтобы воспроизвести эту хуйню, мне нужно было понять от каких цифр отталкиваться, поэтому я собрал чуть инфы - размеры кнопок и картинок, а также их положение через <a href="https://learn.javascript.ru/coordinates" target="_blank">getBoundingClientRect()</a></p>
  <figure id="h3R8" class="m_original">
    <img src="https://img3.teletype.in/files/ec/3c/ec3cad56-2a94-4b35-a127-c54cf11c4f3f.png" width="605" />
  </figure>
  <p id="w7yb">Применительно к тт это выглядело вот так.</p>
  <figure id="uSYH" class="m_original">
    <img src="https://img2.teletype.in/files/93/63/9363783b-c729-4607-b177-36e0ecf75cb2.png" width="1280" />
  </figure>
  <figure id="HzLG" class="m_original">
    <img src="https://img3.teletype.in/files/69/8f/698fe702-44a9-4637-8547-9a0586423d48.png" width="1279" />
  </figure>
  <figure id="lBPL" class="m_original">
    <img src="https://img3.teletype.in/files/e5/44/e5447ad1-bfc0-4faa-9baf-9e1be319f0b3.png" width="1278" />
  </figure>
  <p id="YugD"><strong>Ну и осталась генерация..</strong></p>
  <p id="9lfK">В ситуации с бинансом я писал свой говнокод, этот случай конечно не исключение, но часть работы я решил переложить на попсовое решение <a href="https://www.npmjs.com/package/windmouse" target="_blank">windmouse</a>. Классека. </p>
  <p id="oveG">На первый взгляд может показаться, что тут нихуя непонятно.. и на второй тоже.. </p>
  <figure id="tHne" class="m_original">
    <img src="https://img4.teletype.in/files/3e/c4/3ec41ad3-97f2-41b7-a954-23473e417e66.png" width="732" />
  </figure>
  <p id="ONK3">Благо, у либы есть <a href="https://windmouse-visualizer.netlify.app/" target="_blank">онлайн визуализатор</a>, благодаря чему можно быстрее понять всю эту хуеверть. По факту, я просто хочу, чтобы из одной точки по координатам XY до другой провели линию. При этом гравитация (плавность) максимальная, отклонения от траектории 1, шаг по времени между точками от 1 до 5 (мс), а в пикселях макс шаг например 4. Таргет зона, это степень отклонения от конечной точки. </p>
  <figure id="WjXj" class="m_original">
    <img src="https://img4.teletype.in/files/fc/fc/fcfc5590-1672-4161-8651-b6d3793f9b91.png" width="297" />
  </figure>
  <p id="9hzR">Я чуток поигрался с настройками и разобрался как кастовать правильную линию.</p>
  <figure id="DjVr" class="m_original">
    <img src="https://img2.teletype.in/files/1e/17/1e17b790-5452-4f59-854e-e4dc19aca675.png" width="247" />
  </figure>
  <p id="ylWc">И так, я набросал базовую инфу, понял как генерить линии и накидал некий сценарий работы в голове:</p>
  <ul id="oDtS">
    <li id="NwCw">Берем позицию кнопки от её середины по высоте. </li>
    <li id="iGnv">От нее ставим позицию до конца по Y + допустимые отклонения и передаем windmouse задачу генерации линии.</li>
    <li id="IQO7">Имея данные движения, кастуем 3 массива, учитывая специфику доп отклонений каждого. У кнопки это -8 пикселей вверх, у пазла фикса по Y, а X как у кнопки, у курсора добавил некоторое старт отклонения в рамка иконки стрелки у кнопки.</li>
  </ul>
  <p id="oLgR">По итогу получился следующий код.</p>
  <figure id="Kl2D" class="m_original">
    <img src="https://img2.teletype.in/files/94/29/94293cad-1973-4dfb-88e7-bb838dd0f43c.png" width="1268" />
  </figure>
  <p id="RoEr">Ииии... он нихуя не работал. Я въебал 6 часов, собирая какую-то хуйню на координатах, до конца вообще не контролируя че происходит и <strong>оно блять не заработало</strong>.</p>
  <figure id="oDTB" class="m_original">
    <img src="https://img2.teletype.in/files/99/7a/997a6df0-40dd-4fab-aede-1c8ceacba667.png" width="480" />
  </figure>
  <p id="mtnC">Вот так сюрприз, с нихуя ничего не работает.</p>
  <figure id="4igB" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e8/d3/e8d3aa4c-571b-4e1d-a77e-5ed0e6503e10.png" width="992" />
  </figure>
  <p id="XYNW">В рисовалке все выглядело как надо, как в решенных. Тоесть я свой генератор тестил на демо картинке и рисовало похоже.</p>
  <figure id="M7LW" class="m_original">
    <img src="https://img1.teletype.in/files/c6/2c/c62cd7a3-85c2-4367-9867-6f06709d3c28.png" width="855" />
  </figure>
  <p id="enwj">И я уж было собирался идти спать, но подумал порандомить отступы для значения reply. В сравнении с данными от решенных капч, позиции у нее были со сдвигом на размер от окна до кнопки (37.5), тоесть будто движения от края экрана. Но я убрал этот шаг и оно начало нормально работать. </p>
  <figure id="NeXD" class="m_original">
    <img src="https://img2.teletype.in/files/5e/e4/5ee44081-f52e-4c5e-907e-dd425c17737f.png" width="604" />
  </figure>
  <figure id="jJUj" class="m_original">
    <img src="https://img3.teletype.in/files/a9/01/a901af19-7a44-4d59-b7a8-b943fdad0a04.png" width="604" />
  </figure>
  <p id="5KCu">Ну типо 100 из 100 ответ от сервера тт на решение. Решалось по сути мгновенно.</p>
  <figure id="rNxY" class="m_original">
    <img src="https://img1.teletype.in/files/4e/79/4e7964cb-a223-4c7c-ba30-27483265bfe2.png" width="1240" />
  </figure>
  <p id="rnoA">На браузере, ясен хуй, оно тоже пиздато работает. Причем и для моб и для пк режима.</p>
  <figure id="qPvo" class="m_original">
    <img src="https://img2.teletype.in/files/df/36/df364610-a14d-4293-a789-7199f0cd6675.png" width="1680" />
  </figure>
  <p id="lgMQ">Картинки и тело задачи я дернул через кеш. Сначала вытянул инфу по капче, потом ссылки на картинки, а по ним сами картинки (тоже из кеша).</p>
  <figure id="CNsE" class="m_original">
    <img src="https://img2.teletype.in/files/9a/0f/9a0f14d3-7b08-49c7-aacf-3f075323e739.png" width="896" />
  </figure>
  <p id="PUqw"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="gkr6">Не баг, а фича</h2>
  </section>
  <p id="YCIh">Не найдя для себя удобным доступы к капче через всякие формы авторизации, я решил потыкать текущую демку.</p>
  <figure id="0XKk" class="m_original">
    <img src="https://img2.teletype.in/files/5a/28/5a28b587-2785-4087-82fe-21d0644acdef.png" width="550" />
  </figure>
  <p id="hUUO">Я заметил, что если передать в ссылке другой тип капчи, то оно вернет картинки под другую капчу. По сути, ссылку можно свести даже к виду <a href="https://verify-sg.byteoversea.com/captcha/get?os_type=2&fp=verify_0&subtype=whirl" target="_blank">https://verify-sg.byteoversea.com/captcha/get?os_type=2&amp;fp=verify_0&amp;subtype=whirl</a></p>
  <figure id="FRdv" class="m_original">
    <img src="https://img1.teletype.in/files/09/c5/09c56ed2-5301-4a67-84cf-079120077789.png" width="1632" />
  </figure>
  <p id="8U7i">А потому, можно попробовать и запрос подменить) Что я собственно и сделал, получив в распоряжение демку на все 3 типа капчи.</p>
  <figure id="JuCi" class="m_original">
    <img src="https://img2.teletype.in/files/94/42/94422213-5664-423f-b766-90fe2e7e0f33.png" width="1151" />
  </figure>
  <p id="p5mP">Манкипатч запросекаф опять помог мне.</p>
  <figure id="HYgZ" class="m_original">
    <img src="https://img2.teletype.in/files/9e/e6/9ee6bdda-9408-4753-b5a7-d265ac27f294.png" width="1280" />
  </figure>
  <p id="CLgR">Кстати, при работе с качей на запросах мне нужен был параметр verify_, а это оказалось подобие UUID.</p>
  <figure id="u2gg" class="m_original">
    <img src="https://img1.teletype.in/files/46/ca/46ca000b-6781-4454-bd30-eab26a8bf2d9.png" width="1680" />
  </figure>
  <p id="19HD">Ещё, было весело играть в отслеживание координат мышки</p>
  <figure id="QUnJ" class="m_original">
    <img src="https://img2.teletype.in/files/50/da/50da7ec1-2256-4048-a5a2-f5749f3745bb.png" width="1028" />
  </figure>
  <p id="PaXe"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="q8HS">Whirl Капча</h2>
  </section>
  <p id="K5RI">Демо страница: <a href="https://www.tiktok.com/login/phone-or-email/email" target="_blank">https://www.tiktok.com/login/phone-or-email/email</a></p>
  <figure id="TtkX" class="m_original">
    <img src="https://img4.teletype.in/files/b3/be/b3be9e74-9ba8-4f92-a707-14c681f17396.png" width="364" />
  </figure>
  <p id="uhKu">Не то чтобы данная страница капчи была полезная для меня в тестах, имея описанную ранее фичу, но раз это линка того, где тт использует данную капчу в проде, пусть будет.</p>
  <figure id="x3xU" class="m_original">
    <img src="https://img2.teletype.in/files/19/4e/194ed954-625c-4686-ba91-80ad1c7ef7e6.png" width="398" />
  </figure>
  <p id="1hbF">Следующей капчей, которую я порешал, была эта.  Рассмотрим какие у нее есть решения в паблике.</p>
  <h3 id="ydmB"><strong>Подходы к решению</strong></h3>
  <p id="VBD2">Данная капча похожа на (старую) rotation captcha у funcaptcha.</p>
  <figure id="gtlR" class="m_original">
    <img src="https://img3.teletype.in/files/24/5d/245dc1cc-cb61-45eb-aae5-bd9aab9e2e86.gif" width="470" />
  </figure>
  <p id="EzsK">Есть опенсурс <a href="https://www.cssscript.com/demo/image-rotation-captcha-rverify/" target="_blank">демка</a> и <a href="https://www.cssscript.com/image-rotation-captcha-rverify/" target="_blank">сурсы</a>.</p>
  <figure id="Bvaj" class="m_original">
    <img src="https://img2.teletype.in/files/91/07/9107f129-ec4c-4ace-bfdf-79f933670800.png" width="504" />
  </figure>
  <p id="E4iC">У поворотных капч на гите <a href="https://github.com/Starry-OvO/rotate-captcha-crack" target="_blank">было решение</a> на основе RotNet.</p>
  <figure id="2len" class="m_original">
    <img src="https://img2.teletype.in/files/d1/38/d138cf6b-99da-421e-853e-ec757733c815.png" width="1438" />
  </figure>
  <p id="aI2w">Только вот данная капча проще чем кажется (это не тот rotation), у неё есть и более интересный подход к решению)</p>
  <figure id="8UYG" class="m_original">
    <img src="https://img1.teletype.in/files/4b/f1/4bf18937-e1d6-49b9-b71c-15dc6200ee1f.gif" width="200" />
  </figure>
  <p id="IeJz">Некоторое время назад на zenno <a href="https://zennolab.com/discussion/threads/krugleshok-tik-tok-reshenie-dlja-kapchi.103862/#post-698928" target="_blank">форуме бесплатно выложили решалку этой капчи</a>. Хоть оно и работало, но оказалось с подвохом. В скрипте был стилак)</p>
  <figure id="NvI6" class="m_original">
    <img src="https://img1.teletype.in/files/89/be/89be583a-c5ad-419b-818a-750bf031ee9a.png" width="1164" />
  </figure>
  <p id="1Jft">Все сначала так радовались, пока не поняли подвоха..</p>
  <figure id="VVVC" class="m_original">
    <img src="https://img4.teletype.in/files/bc/75/bc75c8ca-51ce-42da-958e-a9b6530e671a.png" width="320" />
  </figure>
  <figure id="XIG0" class="m_original">
    <img src="https://img3.teletype.in/files/27/18/2718eaa9-f39e-44e3-a471-c90d32b10d6a.png" width="480" />
  </figure>
  <figure id="PczW" class="m_original">
    <img src="https://img3.teletype.in/files/ad/47/ad4783da-f5ea-4f60-85c9-5d30fd5ec54f.png" width="400" />
  </figure>
  <figure id="DzPQ" class="m_original">
    <img src="https://img4.teletype.in/files/b1/92/b192e4ba-f636-4a94-897f-ff2dce08ed7d.png" width="546" />
  </figure>
  <figure id="5Xwq" class="m_original">
    <img src="https://img2.teletype.in/files/df/a7/dfa76c2b-33b6-4f00-ab8b-3af7de571908.png" width="700" />
  </figure>
  <figure id="Lbt0" class="m_original">
    <img src="https://img1.teletype.in/files/42/db/42dbfc77-1658-4501-beb1-57305827bfb5.png" width="678" />
  </figure>
  <figure id="uRp8" class="m_original">
    <img src="https://img3.teletype.in/files/60/c5/60c5d224-0b69-4a77-921e-e635973542c9.png" width="548" />
  </figure>
  <p id="V973">Однако, не суть, всё равно оно ведь работало)</p>
  <figure id="hG0B" class="m_original">
    <img src="https://img1.teletype.in/files/0a/ed/0aed0a28-d79a-4826-86d5-80419e9f0bc0.gif" width="320" />
  </figure>
  <p id="Cd14">И так, оно дергало координаты по некому списку, а потом сравнивало.</p>
  <figure id="UmJU" class="m_original">
    <img src="https://img1.teletype.in/files/06/cb/06cb66c7-bfd5-412a-8eb1-0a104969378f.png" width="1163" />
  </figure>
  <h3 id="Eh8B"><strong>Мой подход</strong></h3>
  <p id="qkR1">До публикации софта со стилаком (каким-то кеком) на форме зенки, я пришел примерно к тем же мыслям и сделал подобное решение. Так как кругляшка у тт 2, а не один, это сильный проеб, благодаря которому сложность всей капчи сводится на нет. </p>
  <figure id="R8KO" class="m_original">
    <img src="https://img1.teletype.in/files/c9/20/c92074ee-b72b-4c59-af28-ebadb8c3831b.png" width="700" />
  </figure>
  <p id="K3jW">Если разрезать картинку на 2 части, в месте разреза на каждой из картинок будет одинаковый рисунок, с круглым вырезом та же хуйня. Берем внешний контур у мелкой, внутренний у большой, вертим и сравниваем эти 2 круга пока не совпадут.</p>
  <figure id="ThJJ" class="m_original">
    <img src="https://img4.teletype.in/files/7a/51/7a517e60-643c-472e-b8dd-47cc2e43fee2.png" width="1256" />
  </figure>
  <p id="ylI3">Подглядел я эту мысль когда-то <a href="https://intsystem.org/captcha/vzlom-keycaptcha/" target="_blank">в статье по взлому KeyCaptcha</a>.</p>
  <figure id="DyT3" class="m_original">
    <img src="https://img1.teletype.in/files/01/cd/01cd435d-0656-4533-84d1-c227785eee81.png" width="360" />
  </figure>
  <p id="Y4qp">Но есть нюанс.. сначала, развить эту идею я нормально не смог. Я дергал контуры 2 пиксельные полоски, а потом крутил их.. Да, оно работало, но крайне нестабильно.</p>
  <p id="IKhE"><strong>Что я пробовал?</strong></p>
  <p id="BQTf">Начал я вообще с того, что стал вникать как вертеть картинки и потом обрабатывать каким-нибудь фильтром, чтобы в итоге при сравнении картинок бас давал хороший результат. </p>
  <p id="Ni8e">И так, вертим картинки</p>
  <figure id="Aixk" class="m_original">
    <img src="https://img4.teletype.in/files/33/2b/332bf026-e897-4ab2-b966-217fad34e162.png" width="500" />
  </figure>
  <p id="ADYv">Сначала вертел я её сервисами.. как долбаёб. </p>
  <figure id="K6Yw" class="m_original">
    <img src="https://img3.teletype.in/files/25/2d/252d5f7f-f689-400c-a782-3d99a2ebb59e.png" width="1508" />
  </figure>
  <p id="XkMd">А потом до меня дошло, что таким макаром я далеко не уеду. И опять пришел к либе <a href="https://image-js.github.io/image-js/#imagerotate" target="_blank">image-js, а именно функции rotate</a>.</p>
  <figure id="vS4x" class="m_original">
    <img src="https://img2.teletype.in/files/18/10/18102d26-77d2-4fc6-9584-f279b3f3bdee.png" width="1082" />
  </figure>
  <figure id="cwAr" class="m_original">
    <img src="https://img3.teletype.in/files/24/5d/245dbf59-0fc9-4926-a236-2651547ced90.png" width="660" />
  </figure>
  <p id="LgQ1">Я подбирал всякие серые фильтры, экспериментировал с тем как лучше делать: взять мини картинки и растянуть до размера контура кольца или наоборот контур кольца сжать или вообще их оба растянуть или сжать до какой-то иной цифры.</p>
  <figure id="1Wj6" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/20/dc/20dc2ef6-6c84-4864-af78-fffd4e8aec10.png" width="872" />
    <figcaption>Сжатия и растяжения колец</figcaption>
  </figure>
  <figure id="ufWc" class="m_original">
    <img src="https://img3.teletype.in/files/2b/a3/2ba303dd-17fc-44b9-8ed4-d0ec82ef8623.png" width="509" />
  </figure>
  <figure id="DPWv" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ea/2c/ea2c0b06-26ea-4eb3-bddc-d80e58bb91d9.png" width="919" />
    <figcaption>Чекал влияние контуров на качество решения</figcaption>
  </figure>
  <p id="kGJa">Тестировал чб фильтры и их комбинации.</p>
  <figure id="COmI" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/10/2d/102d0461-4458-4fe8-b4da-50bc70bad53f.png" width="324" />
    <figcaption>Турнирная таблица</figcaption>
  </figure>
  <figure id="Fb7E" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e0/ef/e0ef75f8-67fa-454e-9889-6845db20bf93.png" width="1335" />
    <figcaption>Список фильтров</figcaption>
  </figure>
  <figure id="LdhA" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f4/c9/f4c941bb-e569-42f9-b4b1-bc5fc61c0916.png" width="1223" />
    <figcaption>Серые фильтры</figcaption>
  </figure>
  <figure id="tV8S" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/18/7a/187a5112-da45-46ea-9798-a0a081202f62.png" width="435" />
    <figcaption>Результаты тестов</figcaption>
  </figure>
  <p id="uCvU">Убил недели 2 на всякую хуйню. Зато, код выглядит не сильно по уебански.</p>
  <figure id="Deg1" class="m_original">
    <img src="https://img4.teletype.in/files/b9/02/b9024860-301b-4f1b-ae65-12370738dd13.png" width="1453" />
  </figure>
  <p id="PVO6">Кстати, в один из тестов я даже нашел еще один сбой в матрице (прям как в бинансе с нередач картинкой). Берем контур.</p>
  <figure id="ddpa" class="m_original">
    <img src="https://img3.teletype.in/files/26/19/261910ae-3fce-4839-b4a2-fcab8b3a9f55.png" width="273" />
  </figure>
  <p id="lSMU">Перегоняем в оттенки серого. И получаем.. изначальную картинку.</p>
  <figure id="vhqW" class="m_original">
    <img src="https://img3.teletype.in/files/a3/e1/a3e1dbbd-6fbd-4e8c-b98d-1a3bb8d58c25.png" width="273" />
  </figure>
  <p id="LWf9">Причем если контур из png перевести в jpg, то бага уже не воспроизведется.</p>
  <figure id="Il4z" class="m_original">
    <img src="https://img2.teletype.in/files/96/f0/96f01261-c44e-4f73-abe5-16fb4eab303d.png" width="273" />
  </figure>
  <p id="6mHn">Хз почему так выходит.</p>
  <figure id="A10D" class="m_original">
    <img src="https://img1.teletype.in/files/80/f6/80f648f1-5c11-42f7-9150-e14c8b2988c1.png" width="600" />
  </figure>
  <p id="7hng">Остановился я в итоге на фильтре &quot;magenta&quot;.</p>
  <figure id="Cppc" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/bf/ea/bfea0b54-932c-455b-9927-21de61caeb04.png" width="899" />
    <figcaption>Работа не волк, работа -  work, walk - это ходить</figcaption>
  </figure>
  <p id="GatO">Ну и вынес это в отдельный скрипт решалку.</p>
  <figure id="YzHD" class="m_original">
    <img src="https://img3.teletype.in/files/e8/be/e8be76c1-0154-4f8c-8c98-d5b78fa9a66e.png" width="1340" />
  </figure>
  <p id="32wY">Ну и какбэ, оно решало, да, но не достаточно хорошо. Пробив 20% меня не устраивал.</p>
  <figure id="1xvx" class="m_original">
    <img src="https://img2.teletype.in/files/57/e0/57e026cb-e882-46ee-a053-2e6829aa61bb.png" width="1384" />
  </figure>
  <p id="sPyC">На деле все решение сводилось вот к чему: вертим картинки и дергаем контур круга, а потом сравниваем через бас совпало или нет.. говно говна, а не решение.</p>
  <figure id="zpxn" class="m_original">
    <img src="https://img4.teletype.in/files/3f/bc/3fbcc18e-0ac5-4083-8bcb-22be0fa41a2a.png" width="931" />
  </figure>
  <p id="Avt5">А потом до меня дошло, что линяя не обязательно должна быть круглой. Мы можем перевести контуры в 2 прямые линии и искать позицию уже в них. Тк если делать через поворот круга, происходит пересчет цвета и уебищно все выходит.</p>
  <figure id="NoO2" class="m_original">
    <img src="https://img1.teletype.in/files/08/2f/082f7707-6fa5-4473-a198-66359a279f21.png" width="987" />
  </figure>
  <p id="Mj1v">Уроборос, который кусает (наверное) свой хвост, отличная визуализация этой мысли. Тоесть ее можно развернуть.</p>
  <figure id="z0xG" class="m_original">
    <img src="https://img2.teletype.in/files/51/e3/51e3835d-9b1e-4739-ab24-ca65d17e42db.png" width="512" />
  </figure>
  <p id="m1Vh">@ZennoTema привел эти мысли в рабочий красивый пример, со своим хитрым алгоритмом поиска краёв. </p>
  <figure id="QSuQ" class="m_original">
    <img src="https://img4.teletype.in/files/78/44/78448cc2-548c-4f0f-a98c-8a17a08aaa1f.png" width="1154" />
  </figure>
  <p id="upaq">И оно просто ахуительно работало</p>
  <figure id="7GTZ" class="m_original">
    <img src="https://img3.teletype.in/files/22/21/2221154d-b25f-405c-ae0c-414424f53d35.gif" width="320" />
  </figure>
  <p id="5J4u">Хоть у ZennoTema всё работало заебись, я решил сделать по своему, более топорным методом.</p>
  <figure id="Yfa1" class="m_original">
    <img src="https://img4.teletype.in/files/75/c4/75c4fa18-14a1-4b92-98ec-1ca256db5a0e.png" width="1083" />
  </figure>
  <p id="sIhq"><strong>К чему я пришел в итоге?!</strong></p>
  <figure id="dUhR" class="m_original">
    <img src="https://img1.teletype.in/files/49/8d/498d4353-6297-4514-96fb-a28f9927a9bd.png" width="720" />
  </figure>
  <p id="SJLw">Рисуем кружок, как и в случае с tutanota. Только тут задача получить все крайние пиксели кружка.</p>
  <figure id="py26" class="m_original">
    <img src="https://img2.teletype.in/files/96/ff/96ffd320-f47d-4a4a-ae49-4f7ef92febbe.png" width="1609" />
  </figure>
  <p id="i02P">Чекаем прозрачность и пропускаем пиксели, где пусто.</p>
  <figure id="x570" class="m_original">
    <img src="https://img3.teletype.in/files/68/67/68674768-f963-4dc0-b6c4-549370f74ac5.png" width="1609" />
  </figure>
  <p id="WVot">Но мне не нравилось, что линии получались разной длинны, я был убежден что так быть не должно. Пробуя делать разные алго, в итоге всеравно получалось разное количество пикселей. Сравнивать было неудобно и результат был хуевый. Я чуть даже не дошел до того, чтобы сесть руками позиции пикселей посчитать. Ну типо бля, в одной 169, в другой 276, хуй поймешь как потом от туда вытянуть правильный результат.</p>
  <figure id="X2zP" class="m_original">
    <img src="https://img3.teletype.in/files/6c/78/6c780e88-3036-41e0-84b9-f1b58758c471.png" width="902" />
  </figure>
  <p id="yAxI">Поэтому я решил рисовать чуть с отступом от края, получая в итоге 360 пикселей. Последним параметром я указал тип кружка, о нем чуть позже.</p>
  <figure id="brPW" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/47/25/472593b7-d663-445f-b785-93a32bc64b88.png" width="472" />
    <figcaption>Центр круг</figcaption>
  </figure>
  <figure id="HD1K" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/57/29/572905d0-b93a-494b-a909-0957211990c3.png" width="716" />
    <figcaption>Кольцо</figcaption>
  </figure>
  <p id="Gr6i">Однако, при текущем алго возникает проеб.</p>
  <p id="oK2y">Получается 361. 0 и 360 градусов совпадают по X и Y. И мы это быстро фиксим.</p>
  <figure id="KtGI" class="m_original">
    <img src="https://img2.teletype.in/files/96/9d/969d708c-973e-4870-87cf-864d8e1ee061.png" width="1385" />
  </figure>
  <p id="STUi">Сначала я сделал так, поставив шаг от 1 градуса, а потом понял, что лучше наоборот, начинать от 0 до 359.</p>
  <figure id="mcg0" class="m_original">
    <img src="https://img2.teletype.in/files/5f/a2/5fa2583e-6f09-4615-93a6-559955084dda.png" width="694" />
  </figure>
  <p id="1dOQ">360 пикселей, 360 градусов.</p>
  <figure id="QlKp" class="m_original">
    <img src="https://img2.teletype.in/files/58/c9/58c9d698-f360-44a6-994e-efa5a4afb9c2.png" width="480" />
  </figure>
  <p id="X9CT">Дальше ключевое - делать полоски из найденных пикселей, чтобы потом их сравнить и найти правильное положение. Я много экспериментировал и выходила хуйня.</p>
  <figure id="2Ssh" class="m_original">
    <img src="https://img1.teletype.in/files/4f/39/4f39279d-9549-4522-87e1-422eecdc1157.png" width="532" />
  </figure>
  <p id="si0o">И тут ZennoTema предложил гениальную в своей простоте идею, до которой я сам дойти не смог: просто удваиваем вторую линию, тогда при поиске мы сразу можем найти правильное положение первой во второй. </p>
  <figure id="JPgx" class="m_original">
    <img src="https://img2.teletype.in/files/1c/f0/1cf075c8-2009-4991-94d8-b93263def0f4.gif" width="640" />
  </figure>
  <p id="jKZW">По итогу получился вот такой простой код. Для кольца мы делаем удвоение линии.</p>
  <figure id="iMJm" class="m_original">
    <img src="https://img2.teletype.in/files/57/c4/57c4e50c-1cfe-42b9-8a44-2a45389461dd.png" width="1025" />
  </figure>
  <p id="WUOx">Я въебал кучу времени, чтобы рисовать 360 линий (каждую со сдвигом на 1 пиксель), но в итоге оно у меня работало через хуй, а тут буквально 1 мелочь в пару строк кода и сразу все встало на свои места, стало решать на 100%. </p>
  <figure id="hn5I" class="m_original">
    <img src="https://img1.teletype.in/files/c1/4b/c14bda20-3f17-4934-a679-989200d755c9.png" width="1200" />
  </figure>
  <p id="5VGn">Еще раз, вот это и есть все решение. Да, вот так все просто.</p>
  <figure id="RB2c" class="m_original">
    <img src="https://img2.teletype.in/files/96/a8/96a8e5ce-92ba-40e1-b6ea-345f65f86ef2.png" width="1666" />
  </figure>
  <p id="PRKW"></p>
  <p id="pJCu">Так как у нас 2 круга, которые крутятся на встречу друг к другу, итоговый угол надо делить на 2 (макс угол для каждой картинки в таком случае 180 градусов).</p>
  <figure id="x5vB" class="m_original">
    <img src="https://img4.teletype.in/files/f5/6b/f56bbd5b-e90a-4997-aecc-8040ef972853.png" width="1005" />
  </figure>
  <p id="Wlg7"><strong>Ну а теперь перейдем к запросекам.</strong> </p>
  <p id="MNK3">С точки зрения кода, что слайдер, что это, по сути одна хуйня. </p>
  <figure id="wBr9" class="m_original">
    <img src="https://img4.teletype.in/files/76/c3/76c3ecda-8cab-446b-a5d2-fae8f1682661.png" width="910" />
  </figure>
  <p id="qKXu">Единственное, меняется тип капчи whirl и положение у reply по Y это 0. Тем не менее, нам надо как-то еще понять, как перевести полученный угол в координаты для слайдера.</p>
  <figure id="qvS0" class="m_original">
    <img src="https://img4.teletype.in/files/73/59/735960a6-dc65-43bf-86ed-ab51a6f91986.png" width="1679" />
  </figure>
  <p id="UoQE">Ну окей, ставим брек на rotateZ, а потом чекаем че у нас выше места остановки. А выше формула перевода координат в угол, она нам и нужна: <code>var deg = a.x / (222 * _.n * kt / 100) * 180;</code>  Это вроде мусор <code> * kt / 100</code> там 100 на 100 всегда делится, нахуя оно это делает я так и не понял. А вот <code>_.n</code> коэффициент масштабирования капчи.</p>
  <figure id="3TIr" class="m_original">
    <img src="https://img1.teletype.in/files/c5/38/c5380d9e-d991-4918-991e-5265a5f37bf9.png" width="1676" />
  </figure>
  <p id="4DJO">Я поставил логпоинт, чтобы почекать данные в процессе решения.</p>
  <figure id="L1Jh" class="m_original">
    <img src="https://img3.teletype.in/files/e0/f4/e0f4e6e8-6f51-4362-95f8-82f2671e6f11.png" width="1679" />
  </figure>
  <p id="KPpw">Ну какбэ понятно, берем координаты, делим 222 и умножаем на 180, получаем угол в градусах. А нам нужно наоборот. Кстати, 180 тут тк 1 картинка должна максимально пройти 180 градусов, а картинок у нас 2 движущиеся в противоположных направлениях. Тоесть даже если они уже в правильном положении, если каждая пройдет 180 градусов, они опять встретятся.</p>
  <figure id="PmmV" class="m_original">
    <img src="https://img2.teletype.in/files/9c/73/9c73958d-6b94-4012-a62a-184459eed28b.png" width="230" />
  </figure>
  <p id="vEvH">Ну и фсе, я просто взял и вывернул формулу, допом обновил startY, тк тут (в куче ответов) она была другая.</p>
  <figure id="6ted" class="m_original">
    <img src="https://img4.teletype.in/files/72/65/72656fcd-9af8-4042-8b7a-ec1d08c106df.png" width="599" />
  </figure>
  <p id="0d8o">В теле поменялись пару мелочей</p>
  <figure id="ADJ9" class="m_original">
    <img src="https://img4.teletype.in/files/f8/43/f843226c-1f2f-49cd-812a-a869d3a21cff.png" width="372" />
  </figure>
  <p id="WkAE">Ну и оно работает по красоте в итоге. По сути 100 из 100, но часть решений скушал антифрод. Либо проеб на пол пикселя есть.</p>
  <figure id="IbdH" class="m_original">
    <img src="https://img4.teletype.in/files/34/00/34002cf2-353a-4a73-8c02-d473d8f5c7f4.png" width="1280" />
  </figure>
  <p id="CPaL">Пример ситуации с ошибкой. Остальные 2 ошибки такие же. Решено все вроде правильно, но фроду тт чет не понравилось.</p>
  <figure id="QGir" class="m_original">
    <img src="https://img1.teletype.in/files/07/f0/07f0334f-de2f-4b7e-8a0c-e2e0198d1380.png" width="857" />
  </figure>
  <p id="2key">Про браузер и смысла нет говорить. Добавилась только формула dist для конвертации угла в координаты кнопки. И тоже работает пиздато. В режиме моб и в режиме пк.</p>
  <figure id="mA9C" class="m_original">
    <img src="https://img2.teletype.in/files/57/6c/576cc538-42b3-4bcf-979d-33480186e28f.png" width="1293" />
  </figure>
  <p id="8wVw">Помимо этого, помнится мне, был вопрос по этой капче применительно к мобилкам. </p>
  <figure id="7Mcm" class="m_original">
    <img src="https://img1.teletype.in/files/c5/00/c5009d2c-9a45-4534-84d5-21aae45049e9.png" width="591" />
  </figure>
  <p id="mjmd">Мне стало интересно, а можно ли чисто из скрина делать решение. На ранних экспериментах я говнял свой детект краев и думал кропать. </p>
  <figure id="OfPP" class="m_original">
    <img src="https://img4.teletype.in/files/f0/e0/f0e0c967-e310-4791-b12e-c2928aed693e.png" width="2027" />
  </figure>
  <p id="I4za">По факту, если юзать метод прохода по кругу, зная размеры кружков, можно все спокойно собрать, причем даже со скрина. Но лучше так не делать.. Лучше дергать ориг картинки.</p>
  <figure id="iIXh" class="m_original">
    <img src="https://img1.teletype.in/files/c5/7c/c57c075b-2258-485c-8fdc-04ec109b4602.png" width="381" />
  </figure>
  <p id="igcC">Ещё, похожую по своей сути капчу кидали в чат, но валид демку я найти не смог, так что и тестов применительно к ней не будет.</p>
  <figure id="lKCd" class="m_original">
    <img src="https://img1.teletype.in/files/c0/c5/c0c5fc12-dc7d-4671-8121-d0ec4cb5f007.png" width="467" />
  </figure>
  <p id="GLIj"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="qn6u">3D Капча</h2>
  </section>
  <p id="H0h4">Демо страница: <a href="https://ads.tiktok.com/i18n/login/" target="_blank">https://ads.tiktok.com/i18n/login/</a></p>
  <figure id="ZVJG" class="m_original">
    <img src="https://img2.teletype.in/files/12/20/122015ed-0a72-4257-b015-b08dee120857.png" width="345" />
  </figure>
  <p id="Ugel">Ну а теперь перейдем к самому интересному. Именно с этой капчи у меня начались сложности с тиктоком. Все-таки, я ведь именно с ads tiktok работал.</p>
  <figure id="EGLM" class="m_original">
    <img src="https://img2.teletype.in/files/98/2b/982bcc19-bff5-4f66-86e5-9bf0adc7ddf1.png" width="1680" />
  </figure>
  <p id="FegS">Чисто технически, найти решение данной капчи, да еще и без всяких нейронок (онли на бас), было самой интересной задачкой) </p>
  <figure id="8n4g" class="m_original">
    <img src="https://img1.teletype.in/files/0c/7c/0c7c8a64-a7f6-4703-b4af-577574578694.png" width="1200" />
  </figure>
  <p id="YWfP">Данное решение (ну не прям точно такое, но суть осталась прежней) я придумал еще тогда, года 4 назад, но не затащил по скилам. На эксперименты с этой хуйней суммарно я потратил где-то недели 2, а может и месяц..</p>
  <figure id="nCwh" class="m_original">
    <img src="https://img4.teletype.in/files/be/15/be15a845-f523-465e-90af-2e011883d2b7.png" width="600" />
  </figure>
  <p id="71B4">Разберем какие есть подходы к решению в паблике.</p>
  <h3 id="CQQX"><strong>Подходы к решению</strong></h3>
  <p id="pvCU">На форуме зенки была <a href="https://zenno.club/discussion/threads/zagruzka-video-v-tiktok.80337/" target="_blank">решалка данной капчи</a>. Строилась она на <a href="https://habr.com/ru/articles/120562/" target="_blank">сравнении картинок по phash</a> из <a href="https://zenno.club/discussion/threads/bolshoj-pak-dlja-raboty-s-izobrazhenijami-unikalizacija-narezka-i-analiz-sxozhesti-izobrazhenij.64826/" target="_blank">другого материала</a>. <a href="https://avito.tech/tpost/bliry40tnp-poisk-pohozhih-izobrazhenii-v-moderatsii" target="_blank">Челы из авито</a>, кстати, для сравнения картинок в антифроде сетку отдельную обучали.</p>
  <figure id="XU8e" class="m_original">
    <img src="https://img1.teletype.in/files/8d/84/8d84ccb0-2627-4ba7-9b3e-ee5141d5636e.png" width="1038" />
  </figure>
  <p id="tYbx">Вернемся к зенке. Они дергают картинку, режут на мини картинки (фигуры), сравнивают их. Важным шагом тут является вот это:</p>
  <figure id="BPo9" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c0/cf/c0cf2b7c-cf41-4d5c-b707-9fc8774af428.png" width="239" />
    <figcaption>Nо как они режут на мини картинки</figcaption>
  </figure>
  <p id="F2TO">Если я правильно понял, они берут картинку, как-то фильтруют и получают чб маску, вычитают ее и дергают фигуры.</p>
  <figure id="rBAz" class="m_original">
    <img src="https://img3.teletype.in/files/64/ff/64ff4b26-a84a-4126-9c65-127ac8b653b4.png" width="477" />
  </figure>
  <p id="AGSI">Непосредственно код.</p>
  <figure id="DbFy" class="m_original">
    <img src="https://img1.teletype.in/files/8d/97/8d975f2e-d557-41e4-b603-00966235390d.png" width="933" />
  </figure>
  <p id="KFxJ">Вся обработка <a href="https://www.aforgenet.com/framework/features/blobs_processing/" target="_blank">вот этой либой, по аналогии с примером</a>.</p>
  <figure id="riWT" class="m_original">
    <img src="https://img4.teletype.in/files/f2/2f/f22fae84-1c16-42bc-963f-e1f7baab016d.png" width="962" />
  </figure>
  <p id="rxw7">Кажется, что фильтруют только фон?!</p>
  <figure id="kKos" class="m_original">
    <img src="https://img4.teletype.in/files/3a/c7/3ac794b9-7952-4276-823a-a1ef9e6cc286.jpeg" width="340" />
  </figure>
  <p id="qT98">И сравнивают в итоге через phash. Только вот сравнение по phash тут не является оптимальным подходом, лучше подойдут шаблоны (Template Matching или простыми словами &quot;поиск картинки в картинке&quot;). В чем я убедился на собственных тестах.</p>
  <figure id="ePvC" class="m_original">
    <img src="https://img1.teletype.in/files/4e/71/4e7124ba-d1ae-4bec-b3b4-27838b1b389b.png" width="500" />
  </figure>
  <p id="IkQw">Потому не удивительно, что даже на простых примерах оно лажает.</p>
  <figure id="BVWi" class="m_original">
    <img src="https://img3.teletype.in/files/a3/f9/a3f94ade-ceb0-45fe-a7f1-5fb98b89bf3c.gif" width="276" />
  </figure>
  <p id="OgbR">Когда я решал ее в своем софте на запросах, я выбрал рукапчу. Но токен (кука) очень быстро умирал.</p>
  <figure id="xDt5" class="m_original">
    <img src="https://img3.teletype.in/files/62/3c/623c89bf-da98-4a99-986d-344a8f170b39.png" width="1176" />
  </figure>
  <p id="Q9eJ">С запросеками при решении капчи я чуток намучался, тикток штука крайне специфическая..</p>
  <figure id="rXJX" class="m_original">
    <img src="https://img4.teletype.in/files/b7/9f/b79feb25-a674-4f10-b62c-46fad5b8b21f.png" width="1197" />
  </figure>
  <p id="lEfu">Ну и оно работало, я даже по нему <a href="https://community.bablosoft.com/topic/21468/tiktok-%D0%BD%D0%B0-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%D1%85/2" target="_blank">софт публиковал на форуме</a>.</p>
  <figure id="3NXo" class="m_original">
    <img src="https://img4.teletype.in/files/f7/43/f743ebe5-d03e-474c-813d-7aa29c12c900.png" width="1132" />
  </figure>
  <p id="CcN9">Весь смысл капчи тт, на самом деле, сводится к тому, что при входе на сайт дается сгенерированная на фронтенде кука verify_ (как генерится писал чуть ранее), а потом по ней происходит запрос авторизации и капчи. Если капчу на этой куке решили, тт пустит. Поэтому мне на рукапче нужно было передать свои куки и попросить verify_  куку? в которой пройдена капча.</p>
  <figure id="vp8l" class="m_original">
    <img src="https://img1.teletype.in/files/0e/a2/0ea2a306-6bd5-4fea-aed9-5ce64da5a42e.png" width="606" />
  </figure>
  <p id="m7MH">Также я тогда упоминал шифрование логина и пароля. Вдруг, пригодится кому-то.</p>
  <p id="cf38"><code>function encrypt(e) {<br />    var t, n = [];<br />    if (void 0 === e)<br />        return &quot;&quot;;<br />    t = function(e) {<br />        for (var t, n = e.toString(), o = [], i = 0; i &lt; n.length; i++)<br />            0 &lt;= (t = n.charCodeAt(i)) &amp;&amp; t &lt;= 127 ? o.push(t) : 128 &lt;= t &amp;&amp; t &lt;= 2047 ? (o.push(192 | 31 &amp; t &gt;&gt; 6),<br />                o.push(128 | 63 &amp; t)) : (2048 &lt;= t &amp;&amp; t &lt;= 55295 || 57344 &lt;= t &amp;&amp; t &lt;= 65535) &amp;&amp; (o.push(224 | 15 &amp; t &gt;&gt; 12),<br />                o.push(128 | 63 &amp; t &gt;&gt; 6),<br />                o.push(128 | 63 &amp; t));<br />        for (var r = 0; r &lt; o.length; r++)<br />            o[r] &amp;= 255;<br />        return o<br />    }(e);<br />    for (var o = 0, i = t.length; o &lt; i; ++o)<br />        n.push((5 ^ t[o]).toString(16));<br />    return n.join(&quot;&quot;)<br />}</code><br />[[MAIL_HASH]] = encrypt([[MAIL]])<br />[[PASSWORD_HASH]] = encrypt([[PASSWORD]])<br />[[TIME]] = Date.now()</p>
  <figure id="faXu" class="m_original">
    <img src="https://img2.teletype.in/files/d5/2f/d52fd464-183d-482a-b82e-b3b734b1e86d.png" width="1282" />
  </figure>
  <p id="GgQJ">Наверняка, можно было сделать готовых нейронках или заюзать что-то типо yolo, разметить ручками датасет, <a href="https://www.youtube.com/watch?v=-XeKG_T6tdc" target="_blank">как делал индус в гайде</a>, и затюнить под себя.</p>
  <figure id="siJt" class="m_original">
    <img src="https://img2.teletype.in/files/1e/b4/1eb4623b-3a36-44e8-a1b3-b551a408d042.png" width="716" />
  </figure>
  <p id="kkr4">Но это не мой путь...</p>
  <figure id="hb0P" class="m_original">
    <img src="https://img3.teletype.in/files/a6/87/a687c8a2-352c-46d3-8929-4c1b1c686b87.png" width="700" />
  </figure>
  <h3 id="wQCh"><strong>Мой подход</strong></h3>
  <p id="jUV8">Я выбрал для себя выбрал некий вектор, который и хотел добить и почекать что выйдет.</p>
  <figure id="IEYZ" class="m_original">
    <img src="https://img1.teletype.in/files/ce/6b/ce6bdd3e-bb58-47cd-9ad3-04b7aa8c11eb.png" width="479" />
  </figure>
  <p id="oLJC">Для начала просто взял картинку, нарезал ее ручками и решил проверить, что имея готовые фигурки я достаточно точно смогу найти правильный ответ. На тот момент я еще не учел важность приведения их к 1 размеру, но и без этого тест оказался удачным. Я заготовил 3 теста: нарезка, с фильтром цвета, с перегоном в серое.</p>
  <figure id="bQnj" class="m_original">
    <img src="https://img2.teletype.in/files/97/c5/97c5a97d-26b1-4117-bbe5-eaadaf5fafe3.png" width="788" />
  </figure>
  <figure id="Gsfy" class="m_original">
    <img src="https://img4.teletype.in/files/b7/6e/b76e4684-d849-4412-a196-f711419d31a2.png" width="755" />
  </figure>
  <figure id="8X8p" class="m_original">
    <img src="https://img2.teletype.in/files/5d/f5/5df5abd6-0f97-4d14-a634-1da7eb13fb6e.png" width="752" />
  </figure>
  <p id="uTzA">Вырезал я картинки ручками, через фотошоп. В бас создавал картинку - фон 100 на 100 пикселей и добавлял на каждый фигуры в центр. А потом производил сравнение картинок в двойном цикле, как в первой версии скрипта для IconCaptcha.</p>
  <p id="jKsI">По результатом сравнения победила нужная пара. Ожидаемо.</p>
  <figure id="gPWv" class="m_original">
    <img src="https://img1.teletype.in/files/82/50/82505786-cddc-423b-b185-3bae4c8e21c6.png" width="546" />
  </figure>
  <p id="dTse">Самое забавное, что при цветном тесте победило розовое колесо и розовая буква Y, получается, важно убрать цветовой шум. Поэтому, в ласт тесте показаны серые фигуры. Черипикинг такой черипикинг..</p>
  <figure id="69e6" class="m_original">
    <img src="https://img2.teletype.in/files/d6/74/d674fac5-5bb3-4824-b851-db996308aa94.png" width="1106" />
  </figure>
  <p id="D94v">Осталось всего-то понять как вырезать автоматом.. вез всяких питонов, через бас..</p>
  <figure id="P16S" class="m_original">
    <img src="https://img4.teletype.in/files/fc/7f/fc7fe0fc-6d8b-4b86-abba-0ea3eb3fa2dd.png" width="697" />
  </figure>
  <p id="OdUQ">По факту ведь нам нужно: перегнать в серый, получить маску, по маске дернуть фигурки. По цветам также есть резон фильтры сделать. Так, ну а тени определенно идут нахуй. </p>
  <figure id="XfhE" class="m_original">
    <img src="https://img1.teletype.in/files/04/9a/049ac4e8-f383-423d-bbe1-87aa2b929e63.png" width="1104" />
  </figure>
  <p id="smiO">И все бы ничего, если б я не столкнулся вот с этим примером. Оказалось, что в тт не мало (на самом деле мало, нахуя я вообще на это обратил внимание) картинок с перекрытием одноцветных фигур, на решение этого и ушло больше всего времени.</p>
  <figure id="8WlB" class="m_original">
    <img src="https://img2.teletype.in/files/1a/61/1a61294b-3caf-425c-9113-bf6f30d1bd05.png" width="534" />
  </figure>
  <p id="klvA">Как оказалось позже, смысла в этом особого и небыло, докинуло всего пару процентов.</p>
  <figure id="b0Nd" class="m_original">
    <img src="https://img2.teletype.in/files/5d/97/5d970edc-c640-4a82-9c0e-fb19c3229f7f.png" width="360" />
  </figure>
  <p id="9Znn"><strong>Что я пробовал?</strong></p>
  <figure id="m8BT" class="m_original">
    <img src="https://img4.teletype.in/files/fe/ab/feabf736-cc81-4d9f-b2f7-84e435c696c6.png" width="788" />
  </figure>
  <p id="NRza">Начал я с <a href="https://habr.com/ru/companies/joom/articles/445354/" target="_blank">ресерча подходов</a> к сравнению картинок и поиску похожих. В целом, базированная база.</p>
  <figure id="JOJ9" class="m_original">
    <img src="https://img3.teletype.in/files/e7/25/e7256238-c246-420f-b9be-443a3c619d5b.png" width="745" />
  </figure>
  <p id="yrXk">Так как я хотел решать без <a href="https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md" target="_blank">нейронок</a>, этот (yolo) подход я проигнорил. Они всетаки для более сложных задач подходят, а эта выглядит посильной и без них. </p>
  <p id="Dmly">В целом, <a href="https://vc.ru/dev/286152-poisk-obektov-cherez-opredelenie-ih-konturov-sredstvami-opencv" target="_blank">накидать контуры</a>, пару фильтров, а потом дергаем то что нашли. Выйдет примерно то шо и у зенки.</p>
  <figure id="TkJS" class="m_original">
    <img src="https://img3.teletype.in/files/aa/ed/aaed049c-82c4-4ebe-8c05-258f437e6c4a.png" width="675" />
  </figure>
  <p id="mg3I">Ну какбэ да, опять собель, <a href="https://habr.com/ru/articles/114452/" target="_blank">опять контуры</a>.</p>
  <figure id="Fjkw" class="m_original">
    <img src="https://img3.teletype.in/files/ae/6a/ae6ae3c2-955a-456a-bfde-3ca2c6ee1966.png" width="1075" />
  </figure>
  <p id="PQQb">Кстати, тени идут нахуй. Как и фон. <a href="https://pinetools.com/image-edge-detection" target="_blank">Чекал туть</a>.</p>
  <figure id="hOtl" class="m_original">
    <img src="https://img1.teletype.in/files/46/ce/46cee48e-82eb-4a2b-a776-325cc1b3518e.png" width="1068" />
  </figure>
  <p id="zjpC">Я пробовал чекать контуры. Но сами по себе контуры решением являться не могут. Наложения картинок, фигуры всетаки 3д и состоят из частей.</p>
  <figure id="ot3H" class="m_original">
    <img src="https://img1.teletype.in/files/c2/38/c238548e-cff1-41a5-bcac-f04a31208298.png" width="399" />
  </figure>
  <p id="A9Id">Я думал делать <a href="https://ru.stackoverflow.com/questions/535046/%D0%9A%D0%B0%D0%BA-%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C-%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8E-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%86%D0%B2%D0%B5%D1%82%D1%83" target="_blank">цветовую сегментацию</a>. Или <a href="https://medium.com/nuances-of-programming/%D0%BE%D0%B1%D0%BD%D0%B0%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%BE%D0%B9-%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-python-9128814bc55c" target="_blank">как туть</a>.</p>
  <figure id="dDki" class="m_original">
    <img src="https://img2.teletype.in/files/1a/b2/1ab20bb8-4549-4746-aab3-eb809811517f.png" width="739" />
  </figure>
  <p id="Bc4d">Только вот у меня не opencv с питоном, а нода и бас.</p>
  <figure id="VG0D" class="m_original">
    <img src="https://img4.teletype.in/files/b3/9c/b39c1146-ee96-4e11-8eb6-fdeadf47dd45.png" width="736" />
  </figure>
  <p id="HRnz">Тогда я опять вспомнил про <a href="https://www.npmjs.com/package/image-js" target="_blank">image-js</a>, в которой были нужные функции, примерчики, и которая работала в бас 23.2.2 (12 ноде). </p>
  <p id="rWBL">Подставив свою картинку я сразу понял, что с этим уже можно будет работать.</p>
  <figure id="RN0N" class="m_original">
    <img src="https://img1.teletype.in/files/8e/9e/8e9e44d5-29b7-43a9-b541-a473475e3431.png" width="1279" />
  </figure>
  <p id="CyNb">За пару часов я накидал простой код выдергивания фигур. И оно прекрасно и абсолютно точно не работало нахуй. Чего-то нехватало. </p>
  <p id="yx04">P.s.: На самом деле, нужно было добавить также сжатие картинок в 1 размер, на скрине просто неудачный пример.</p>
  <figure id="jSvU" class="m_original">
    <img src="https://img3.teletype.in/files/6e/c7/6ec7645f-a90c-417d-b183-e41964d1b59a.png" width="1280" />
  </figure>
  <p id="ZHa9">А нехватало разделения объектов. Но я, вместо того чтобы накинуть фильтры по цветам, начал копать совершенно в другую сторону, надеясь заодно порешать вторую проблему - наложение одноцветных.</p>
  <figure id="gnK1" class="m_original">
    <img src="https://img3.teletype.in/files/ab/8a/ab8a13b0-2df7-4d1c-9850-8e2ffc7f2bff.png" width="1280" />
  </figure>
  <p id="uceH">Я стал копать как можно вообще разделять наложенные объекты. Самое умное к чему я пришел - <a href="https://datahacker.rs/007-opencv-projects-image-segmentation-with-watershed-algorithm/" target="_blank">алгоритм водораздела</a>. На самом деле, я перепробовал дохуища всяких вариантов, но в итоге получалось какое-то говнище и водораздел стал последней надеждой.</p>
  <figure id="8wnO" class="m_original">
    <img src="https://img3.teletype.in/files/e9/75/e9753ade-2bc5-49cb-a547-4d685c698974.png" width="1024" />
  </figure>
  <p id="Jl6K">Бля, ну ведь <a href="https://pyimagesearch.com/2015/11/02/watershed-opencv/" target="_blank">с монетками оно работает</a> же.</p>
  <figure id="WZ0u" class="m_original">
    <img src="https://img3.teletype.in/files/ea/5e/ea5e17da-46ed-4817-af39-679c33981ecd.png" width="800" />
  </figure>
  <p id="IlFG">Вообще, я потом чуть потыкал и дергать без фильтра по цвету, результат хоть не очень, но даже так, оно всеравно работало.</p>
  <p id="WNjd">Решило 52 из 100. это без всего. Без цветовой сегментации и без водораздела (разбиения слипшихся одноцветных), чисто минус фон только.</p>
  <figure id="4hSf" class="m_original">
    <img src="https://img1.teletype.in/files/0c/c8/0cc8e823-0348-41dd-93bd-f31de734f4b8.png" width="608" />
  </figure>
  <figure id="yt0a" class="m_original">
    <img src="https://img1.teletype.in/files/0b/b4/0bb4a719-8c56-456e-b358-7e60c6c17767.png" width="609" />
  </figure>
  <p id="RhKl">Вернемся к разделению картинок.</p>
  <p id="Cds0">Пока все дрочили на чатгпт, я отсматривал хуеву тучу видео от индусов про то, как юзать алгоритм <a href="https://www.aegissofttech.com/articles/watershed-algorithm-and-limitations.html" target="_blank">водораздела в опенцв</a>, при том что у меня даже пайтон не установлен.</p>
  <figure id="KJKc" class="m_original">
    <img src="https://img3.teletype.in/files/a0/ea/a0ead116-0c6f-40d3-8399-388ec65ade25.png" width="1368" />
  </figure>
  <p id="56nw">В image-js был алгоритм <a href="https://github.com/image-js/image-js/blob/9ab86a86f6c13a9a7d14c62566c1396c3c6f54f4/src/image/roi/creator/fromWaterShed.js#L28-L110" target="_blank">fromWaterShed</a>, но он нихуя не работал у меня в бас.</p>
  <figure id="IZg7" class="m_original">
    <img src="https://img4.teletype.in/files/7d/f5/7df55d9c-d977-4fb8-9591-b8c2816b9c47.png" width="1079" />
  </figure>
  <p id="IUq8">Поэтому мне пришлось ручками его переносить из сурсов.</p>
  <figure id="DL6W" class="m_original">
    <img src="https://img4.teletype.in/files/3b/9f/3b9fd69e-592f-427e-bd54-3042eb6dc8c6.png" width="1168" />
  </figure>
  <figure id="tKu2" class="m_original">
    <img src="https://img1.teletype.in/files/87/c7/87c7a0eb-b85c-4086-8a95-962e5f98a687.png" width="1277" />
  </figure>
  <p id="JlNV">Только вот по итогу тестов я понял, что фигуры то у меня тонкие, буквы там всякие и тд, это не блядские круги, потому этот алгоритм не подойдет.</p>
  <figure id="t7K8" class="m_original">
    <img src="https://img3.teletype.in/files/2b/b7/2bb7e8a7-5944-40f2-9798-f9c54760e1d8.png" width="1196" />
  </figure>
  <p id="gVQC"></p>
  <p id="2W1a"></p>
  <p id="aw4y">Я решил начать сначала, с подбора алгоритма серого, потом возможно бахну эрозию и собеля или канни, чтоб получить контуры и выкину нахуй ту часть где контуры/</p>
  <p id="hybe">Сложно только, что картинки одного цвета с нечетким контуром</p>
  <p id="i6dn">Потом я нашел ещё <a href="https://answers.opencv.org/question/71691/single-blob-multiple-objects-ideas-on-how-to-separate-objects/" target="_blank">одно интересное решение</a>. В image-js есть всякие такие проколы: <a href="https://github.com/image-js/image-js/blob/675bafe1ec5f78d2d5d36df67e14e254d27a1f2d/src/image/compute/__tests__/monotoneChainConvexHull.js" target="_blank">monotoneChainConvexHull</a>, <a href="https://github.com/image-js/image-js/blob/d3700aa4713c5f4811882db327480b411c79bea5/src/image/compute/__tests__/localMaxima.js" target="_blank">localMaxima</a></p>
  <figure id="bha0" class="m_original">
    <img src="https://img1.teletype.in/files/cd/a8/cda83296-6613-4750-b019-b11a159f15ec.png" width="801" />
  </figure>
  <figure id="jOoA" class="m_original">
    <img src="https://img4.teletype.in/files/3d/46/3d46207d-9dce-436b-8c6a-deb70db28685.png" width="405" />
  </figure>
  <p id="SAge">Но в моем случае это наверное не очень подошло бы. Кароче, этот вариант я тоже развивать не стал.</p>
  <figure id="bmra" class="m_original">
    <img src="https://img2.teletype.in/files/93/ac/93ac15fe-0d11-411e-85b4-6674dffb355d.png" width="492" />
  </figure>
  <p id="4iuz">Для решения проблемы наложения картинок у меня было несколько тупых идей:<br />1) градиентный фильтр<br />2) херовые точки выпуклых фигур<br />3) поиск картинки из базы на картинке<br />4) вычесть контуры<br />Но остановился я по итогу на контурах.</p>
  <figure id="4Aem" class="m_original">
    <img src="https://img3.teletype.in/files/6d/3b/6d3be3fe-3f0a-4503-9af4-3ae78b170fed.png" width="680" />
  </figure>
  <p id="THlw"></p>
  <p id="kNz0"><strong>К чему я пришел в итоге?!</strong></p>
  <figure id="ukop" class="m_original">
    <img src="https://img4.teletype.in/files/3e/07/3e07f76b-ba4b-45b4-9d27-02eb2178f41b.png" width="929" />
  </figure>
  <p id="FSWY">Ранее я писал что получилось делать 52%. Я брал картинку, убирал фон фильтром уровней, переводил в серое и делал маску. Потом, применял маску и дергал по ней те фигуры, которые больше 500. А после, под каждую делал квадратную подложку размером по максимальной стороне и уменьшал до размера 20 на 20. Увеличил их только сейчас для скрина.</p>
  <figure id="EulO" class="m_original">
    <img src="https://img1.teletype.in/files/84/cf/84cfe668-b338-47a2-9dcc-a97320d40acc.png" width="1393" />
  </figure>
  <figure id="T3lO" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fa/2a/fa2a43e8-15ef-4978-8f28-3174936e6603.png" width="1280" />
    <figcaption>Пьем чай и ни каких подвохов)</figcaption>
  </figure>
  <p id="Zi70">Далее я пытался разбираться с масками. Заметил, что фильтр шара неплохо режет что-то целое.</p>
  <figure id="L9Qu" class="m_original">
    <img src="https://img4.teletype.in/files/7a/4a/7a4a439a-67f3-4f2e-9044-a639340c018e.png" width="1101" />
  </figure>
  <p id="Dn30"></p>
  <figure id="w13l" class="m_original">
    <img src="https://img1.teletype.in/files/0a/3f/0a3f5409-1c7c-44e5-ab1b-a17578c67736.png" width="697" />
  </figure>
  <p id="78yp">Потом, я пытался юзать 2 фильтра, светлый и темный и мерждить маски от них, в надежде получить удачный способ разделения картинок.</p>
  <figure id="mlOS" class="m_original">
    <img src="https://img2.teletype.in/files/10/cb/10cbc886-08dd-42fe-aa88-f843d626000f.png" width="1828" />
  </figure>
  <figure id="aNSY" class="m_original">
    <img src="https://img3.teletype.in/files/e0/63/e063a812-2ae0-4a1c-8937-cc753021e458.png" width="881" />
  </figure>
  <p id="jZuw">Ну и, разумеется, оно работало. Но хуево.</p>
  <figure id="zd6Y" class="m_original">
    <img src="https://img1.teletype.in/files/43/8f/438f883b-eec2-4c5e-97d9-b26e3a664cef.png" width="550" />
  </figure>
  <p id="jeLB">Следующим шагом стала фильтрация по цветам.</p>
  <p id="EWZy">Я пытался по аналогии с opencv делать фильтрацию по цветам. Пытался понять что-то на вот этих всяких графках.</p>
  <figure id="bM2m" class="m_original">
    <img src="https://img1.teletype.in/files/0a/9c/0a9c937a-5363-4014-ad06-5b6507bffc4f.png" width="1269" />
  </figure>
  <p id="vkTh"></p>
  <p id="j64T">Я правда пытался понять как вот эти всякие цвета подбирать <a href="https://stackoverflow.com/questions/57469394/opencv-choosing-hsv-thresholds-for-color-filtering" target="_blank">https://stackoverflow.com/questions/57469394/opencv-choosing-hsv-thresholds-for-color-filtering</a></p>
  <p id="cRPM">Но в итоге, я просто сам методом научного тыка наугадывал диапазоны под каждый цвет и добил до 78%.</p>
  <figure id="6ZJr" class="m_original">
    <img src="https://img3.teletype.in/files/6c/a2/6ca25792-3958-47e0-a0d2-39e355ea1b91.png" width="527" />
  </figure>
  <figure id="P76f" class="m_original">
    <img src="https://img3.teletype.in/files/21/20/2120d6d5-7e8a-4de0-8a31-3e39b8eb9fff.png" width="1541" />
  </figure>
  <p id="Kq8E">На простых примерах понятно, изи.</p>
  <figure id="ySqo" class="m_original">
    <img src="https://img2.teletype.in/files/59/d1/59d12958-025f-4d31-b05f-b66dfc81ccdd.png" width="687" />
  </figure>
  <p id="Tdrg">Однако, есть и проебы, а они бывают 2х видов:<br />1) Слипшиеся одноцветные (14)</p>
  <figure id="tDEZ" class="m_original">
    <img src="https://img4.teletype.in/files/f2/e8/f2e8c60f-8b0d-4358-a6a7-f018abd1c65e.png" width="1969" />
  </figure>
  <p id="qaKJ">2) Просто похожесть букв блять разных (8)</p>
  <figure id="qtan" class="m_original">
    <img src="https://img1.teletype.in/files/0b/69/0b69dda8-9905-4306-8e61-1a884db90fda.png" width="2629" />
  </figure>
  <p id="vCkx">Хороший ли это результат, не знаю. Но вряд ли кто то еще проебал бы месяц на такую хуйню.</p>
  <figure id="OkqA" class="m_original">
    <img src="https://img2.teletype.in/files/d7/57/d757f1da-0065-469e-be3e-1f6815d202bd.png" width="948" />
  </figure>
  <p id="CPAO">Поэтому я сел делать дальше, добавив разделение слипшихся одноцветных. </p>
  <p id="EoWv">И в итоге добил до 80%</p>
  <figure id="g1KF" class="m_original">
    <img src="https://img4.teletype.in/files/70/a1/70a17922-80c3-4e96-8b39-87082ed7891b.png" width="590" />
  </figure>
  <figure id="zTy1" class="m_original">
    <img src="https://img3.teletype.in/files/67/05/6705d30a-5818-42df-940b-8f4d967f3f9d.png" width="1236" />
  </figure>
  <p id="z43A"><strong>Ну а теперь перейдем к запросекам.</strong> </p>
  <p id="szlu">В отличие от остальных, тут все максимально просто. Тупо 2 координаты + параметр T.</p>
  <figure id="sbmV" class="m_original">
    <img src="https://img2.teletype.in/files/90/15/901530ce-ae0f-457e-897a-66354a47cbf4.png" width="1453" />
  </figure>
  <p id="lGkV">Координаты в соответствии с картинкой.</p>
  <figure id="Rrdh" class="m_original">
    <img src="https://img4.teletype.in/files/3a/6a/3a6a3c78-b8dc-46cb-8740-ee4e806e1022.png" width="1680" />
  </figure>
  <p id="VZvr">Но есть нюанс, картинку опять ресайзит</p>
  <figure id="y6wW" class="m_original">
    <img src="https://img4.teletype.in/files/3a/bf/3abf2ee1-741f-4ad7-b889-161f8ca353c1.png" width="442" />
  </figure>
  <p id="GRy8">Я решил не менять размер картинки сразу, чтобы не сбивать статичные настройки фильтров, но для лога и координат я сделал ресайз.</p>
  <figure id="MUQg" class="m_original">
    <img src="https://img3.teletype.in/files/a3/3a/a33aac9e-eed3-442b-8755-c0172dbed0ca.png" width="1012" />
  </figure>
  <p id="bTss">Значение T у меня было на тестах почему-то одинаковое. Поэтому, его я захардкодил. Помимо формирования JSON все остальное я выкинул.</p>
  <figure id="0nhI" class="m_original">
    <img src="https://img3.teletype.in/files/ee/b5/eeb5f65f-9af2-492d-9d7c-c032eaeb349b.png" width="599" />
  </figure>
  <p id="yLyr">Ну и в итоге все по красоте ебошило)</p>
  <figure id="5lfF" class="m_original">
    <img src="https://img4.teletype.in/files/7d/ff/7dff376d-3ddc-459e-b5ee-247b2f5e1f26.png" width="885" />
  </figure>
  <p id="OuMa">В том числе и на эмуляции, в пк и моб режимах</p>
  <figure id="NRvt" class="m_original">
    <img src="https://img2.teletype.in/files/d9/ed/d9ed5ee4-7816-440f-b708-427de3adf770.png" width="1680" />
  </figure>
  <p id="KN8a">Теперь мы можем ебать все 3 капчи тт) </p>
  <figure id="MFai" class="m_original">
    <img src="https://img2.teletype.in/files/18/d4/18d4418d-f019-46a0-b03c-e7438a956403.png" width="1920" />
  </figure>
  <p id="Tqs6">Но при работе с тт я столкнулся с ещё одной неприятной штукой</p>
  <p id="Zu3h"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="LBYT">Age gate</h2>
  </section>
  <p id="CW7T">Блять, это должно было быть легким, но я долго не мог разобраться, пока не подсказал товарищ про одну мелочь.</p>
  <figure id="IunR" class="m_original">
    <img src="https://img2.teletype.in/files/56/f9/56f9ff7d-7d70-4e95-ace2-53a0792b782f.png" width="517" />
  </figure>
  <p id="VpY1">Казалось бы, окей, берем линию, дергаем текст у selected.</p>
  <figure id="WjM5" class="m_original">
    <img src="https://img1.teletype.in/files/88/ee/88eedaef-3105-447a-b3c5-865cbf79e101.png" width="917" />
  </figure>
  <p id="VxNr">Потом дергаем все тексты и чекаем на какой позиции выбранный и сколько нам шагать до желаемого значения.</p>
  <figure id="7gzY" class="m_original">
    <img src="https://img1.teletype.in/files/06/1b/061b5e05-88c9-4cb3-9d2d-494e1c0f25ab.png" width="499" />
  </figure>
  <p id="FW0n">Написал отдельный генератор разбиения на свапы с шагом в n.</p>
  <figure id="DqBl" class="m_original">
    <img src="https://img3.teletype.in/files/e4/e6/e4e60af5-49f2-437b-9d67-ae331dc459c8.png" width="487" />
  </figure>
  <p id="6pcI">1) Только вот не все так просто. Вся ебля была вот здесь. Без блока двигать мышь оно начинало играть в angrybirds при шаге выше 1, вместо нормального свапа.</p>
  <figure id="nfqr" class="m_original">
    <img src="https://img1.teletype.in/files/4a/be/4abe1ca6-c38b-4c4b-8ea2-7b6b310ad41b.png" width="463" />
  </figure>
  <p id="5F7n">В целом, оно и сейчас иногда багает, но это пофикшено перечеком даты</p>
  <figure id="AtJS" class="m_original">
    <img src="https://img4.teletype.in/files/3b/ae/3bae629c-f27e-4a4a-8306-fecd23dd274c.png" width="1680" />
  </figure>
  <p id="BJIT">2) Как не сложно догадаться, блоки идут на самом деле не по порядку. Нулевой индекс у блока с годом, потом у блока с месяцем и уже после идет с днём</p>
  <p id="yL4z">Поэтому я сразу сделал генерацию даты в нужном формате и порядке.</p>
  <figure id="txNX" class="m_original">
    <img src="https://img2.teletype.in/files/d4/e9/d4e964a2-8016-43db-999f-bc0581d5088a.png" width="1444" />
  </figure>
  <p id="WUOj">3) Блок с днем, центральный блок, тоже оказался с подвохом.</p>
  <figure id="bJ9K" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/60/7f/607fd68b-379a-4954-9c08-9842481af673.png" width="236" />
    <figcaption>Да, да, опять подвохи</figcaption>
  </figure>
  <p id="oJ0P">Написано свойство селектед у одного, а по факту там у 24 было. Фиксанул докинув флаг. Перечек тож по итогу спасает.</p>
  <figure id="rb86" class="m_original">
    <img src="https://img2.teletype.in/files/d3/19/d31976ae-57e7-4283-aaba-4e5e2eaaa5a0.png" width="810" />
  </figure>
  <p id="5ek3">4) Хорошее решение не всегда хорошо. Когда софт двигал положение пиксель в пиксель на правильную позицию, тт просто не выставлял это число. Тоесть еще один способ палева. У обычных людей так не бывает и должно срабатывать автоматическое докручивание до верной позиции.</p>
  <figure id="Mr85" class="m_original">
    <img src="https://img3.teletype.in/files/2e/16/2e16f77c-84e1-4c00-bd09-fca560ab9a7d.png" width="1280" />
  </figure>
  <p id="o8cP">Поэтому пришлось добавить небольшое смещение.</p>
  <figure id="E7bR" class="m_original">
    <img src="https://img2.teletype.in/files/5f/42/5f42a3c9-9d19-4184-b37f-6a977993517c.png" width="842" />
  </figure>
  <p id="kmxC">Ну а на этом всё, я пиздую пить чай</p>
  <figure id="fJfc" class="m_original">
    <img src="https://img4.teletype.in/files/34/52/34520bab-6660-4fa9-a3c2-89e93e4e6728.png" width="1100" />
  </figure>
  <figure id="NcvF" class="m_original">
    <img src="https://img1.teletype.in/files/8d/61/8d611b28-df44-4a62-a40a-d1da55da83e8.png" width="892" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/g14vehC0d2O</guid><link>https://teletype.in/@it_hueta/g14vehC0d2O?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/g14vehC0d2O?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Собачка делает waf (bypass Qrator)</title><pubDate>Sun, 14 Apr 2024 12:37:25 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/25/1a/251a1d08-9425-409d-bec1-3df5f7846ac6.png"></media:content><category>выебано</category><description><![CDATA[<img src="https://img1.teletype.in/files/45/17/4517b5a5-fe2b-426e-959b-ec496b383e90.png"></img>В чат прилетел вопрос про &quot;сложную&quot; вафку. Штош, ну мы это еще посмотрим...]]></description><content:encoded><![CDATA[
  <figure id="Bc1w" class="m_original">
    <img src="https://img1.teletype.in/files/45/17/4517b5a5-fe2b-426e-959b-ec496b383e90.png" width="828" />
  </figure>
  <p id="S9MW">В чат прилетел вопрос про &quot;сложную&quot; вафку. Штош, ну мы это еще посмотрим...</p>
  <figure id="N46j" class="m_original">
    <img src="https://img1.teletype.in/files/c5/48/c548f246-c475-40a2-b36c-7eba8f5d4125.png" width="698" />
  </figure>
  <p id="sZfd">Улетает шифро дата, прилетает кука.</p>
  <figure id="nGCe" class="m_original">
    <img src="https://img3.teletype.in/files/27/69/276916c7-7bb7-4108-8ce7-aa12deb10224.png" width="1280" />
  </figure>
  <p id="oPU4">Чутка повангуем.</p>
  <figure id="Zsit" class="m_original">
    <img src="https://img4.teletype.in/files/b3/88/b388cb04-1032-42ea-953d-f469df2624ab.png" width="400" />
  </figure>
  <p id="7fdL">Ставим брек на btoa, тк очевидно что шифро дату удобнее слать так.</p>
  <figure id="midi" class="m_original">
    <img src="https://img2.teletype.in/files/51/24/51240f48-fd83-46da-bb51-d47c832a7ac4.png" width="1167" />
  </figure>
  <figure id="fIL8" class="m_original">
    <img src="https://img2.teletype.in/files/50/6c/506c6100-7aa4-401a-b72c-70ef0fd2f0f3.png" width="1280" />
  </figure>
  <p id="GSzN">Хотя можно было бы и вот так забрекать отправку запроса, но тут мы попадаем в момент перед отправкой, эт пригодится трохи позже.</p>
  <figure id="8hyK" class="m_original">
    <img src="https://img3.teletype.in/files/6d/dc/6ddc55bf-caea-498c-bb87-10634699e4ae.png" width="1211" />
  </figure>
  <p id="pbrc">И так, после брека btoa имеем скрипт. Теперь над собрать по частям чего оно тут хуевертит.</p>
  <figure id="Gnqb" class="m_original">
    <img src="https://img2.teletype.in/files/10/a6/10a655a8-bcc8-4662-94ee-cf506b4865f7.png" width="1213" />
  </figure>
  <p id="dymX">Чуток потыкав, становится все очевидно.</p>
  <figure id="929A" class="m_original">
    <img src="https://img3.teletype.in/files/ae/a8/aea8a205-5df0-44b2-bc59-55fc50e8da9e.png" width="1215" />
  </figure>
  <p id="DqDF">Чекнем че такое <strong>ne </strong>тк эт и есть шифрование данных, после которого идет btoa</p>
  <figure id="1DUv" class="m_original">
    <img src="https://img2.teletype.in/files/1a/41/1a413a8d-1af5-41bf-ae8c-f8b79ff84f6a.png" width="885" />
  </figure>
  <p id="9cFK">Довольно быстро, но и не без подсказки со стороны чела из чата, код шифрования был готов:</p>
  <figure id="Lf52" class="m_original">
    <img src="https://img3.teletype.in/files/26/27/262757dc-b185-4ad0-a52f-7e1903554719.png" width="1018" />
  </figure>
  <p id="lfEY">Подсказкой оказалось, что генерация pow (он же x, он же <strong>getD</strong>), находился на пару строк выше..</p>
  <figure id="welK" class="m_original">
    <img src="https://img4.teletype.in/files/7e/09/7e09488e-5be5-45d9-a9d7-376204e6a87e.png" width="634" />
  </figure>
  <p id="Ez5r">А сама вот эта хуеверть по итогу превращается в простенький цикл</p>
  <figure id="9vnX" class="m_original">
    <img src="https://img3.teletype.in/files/af/00/af00ff44-508c-44f1-89f6-b97b6640eb9b.png" width="663" />
  </figure>
  <p id="7xA8">И какбэ жить здорово, да, только вот оно шифрует фингер в процессе работы. А мне он нужен в сыром виде, для допила. Поэтому..</p>
  <figure id="D1oU" class="m_original">
    <img src="https://img1.teletype.in/files/ca/63/ca63cd0f-bccc-4822-b4ef-4bdefb21dd47.png" width="1275" />
  </figure>
  <p id="JM8n">Типо вот у нас функции, каждая из них перебирается и вызывается в цикле, получая и сразу шифруя ответ. И чё?</p>
  <figure id="exL4" class="m_original">
    <img src="https://img4.teletype.in/files/b1/96/b1961f68-5991-46c0-9eee-c013ef8f2363.png" width="321" />
  </figure>
  <p id="i2A6">При этом сохраняя время создания</p>
  <figure id="Y86B" class="m_original">
    <img src="https://img3.teletype.in/files/65/52/6552e4d3-433a-4b97-a256-ed8e5bc48cd5.png" width="1043" />
  </figure>
  <p id="2Vsa">И вот я сел пилить снятие фингера. Только вот форматирование документа приводило сразу к крашу</p>
  <figure id="RlBL" class="m_original">
    <img src="https://img1.teletype.in/files/8e/cf/8ecf2399-f019-441a-97f3-4f1e25c45562.png" width="800" />
  </figure>
  <p id="aPGA">Тоесть вкладка с этой поеботой сразу умирала, тк впадала в бесконечный цикл. Защита блять ебучая.</p>
  <figure id="btEc" class="m_original">
    <img src="https://img3.teletype.in/files/ae/11/ae11b500-5a37-4bb1-b5e7-aee4289b8bbe.png" width="317" />
  </figure>
  <p id="xJjm">Тогда я накинул манкипатч, закастомил, но вышла страшная хуета, от которой я решил отказаться.</p>
  <figure id="ayaX" class="m_original">
    <img src="https://img3.teletype.in/files/e9/45/e9457916-7830-47f9-80e6-77af759ed777.png" width="896" />
  </figure>
  <p id="Idco">По итогу, тот же чел из чата поделился интересным наблюдением. Скрипт умирал вот от этого кода. Получается, вся их защита строилась просто на проверке переносов</p>
  <figure id="3qii" class="m_original">
    <img src="https://img2.teletype.in/files/de/f4/def4bc4f-7940-4c16-b287-95b53d3381d9.png" width="1141" />
  </figure>
  <p id="gFY9">Как они настраивали эту защиту остается лишь гадать</p>
  <figure id="enEq" class="m_original">
    <img src="https://img3.teletype.in/files/2c/33/2c332b3d-6b1f-4d5a-8cc4-d0971f75ea9d.png" width="1024" />
  </figure>
  <p id="eagE">Для обхода такой сложной защиты, я подошел к скрипту, взять за руку и сказать</p>
  <figure id="mIyz" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8f/60/8f600413-8749-4cd1-a3d0-cb82f7bdf3ae.png" width="600" />
    <figcaption>Да, и этого хватило чтобы избавиться от бесконечного цикла</figcaption>
  </figure>
  <p id="loXw">Накидав еще совсем чуток кода, получилось то что я и хотел.</p>
  <figure id="Z9tn" class="m_original">
    <img src="https://img2.teletype.in/files/53/61/5361c1e9-2fdf-4d5f-85fb-1ca4c8dc6288.png" width="1131" />
  </figure>
  <p id="4stQ">Убрал шифрование и попросил вертать только ориг, тк я не стал вникать в скольких пред функциях идет вызов текущей, всё равно шифрование только туть.</p>
  <figure id="P2nw" class="m_original">
    <img src="https://img2.teletype.in/files/1d/af/1daf14a7-49cb-4362-8341-c97c0e36edb5.png" width="934" />
  </figure>
  <p id="YQZf">Отправка запроса. Было:</p>
  <figure id="QTpq" class="m_original">
    <img src="https://img3.teletype.in/files/6d/dc/6ddc55bf-caea-498c-bb87-10634699e4ae.png" width="1211" />
    <figcaption>Было</figcaption>
  </figure>
  <p id="wNk3">Стало</p>
  <figure id="9BvQ" class="m_original">
    <img src="https://img3.teletype.in/files/6f/92/6f92a5fb-fd26-48e9-bedb-66cb73ef7968.png" width="552" />
    <figcaption>Стало</figcaption>
  </figure>
  <p id="96Bb">Чекаем. Все работает.</p>
  <figure id="T0le" class="m_original">
    <img src="https://img4.teletype.in/files/32/3a/323a3567-7bcf-40eb-b59f-213c64909dcf.png" width="1366" />
  </figure>
  <p id="ap87">Чекаем в браузере, добавив наш патченый файл через локальное переопределение. Тож воркает.</p>
  <figure id="XDjh" class="m_original">
    <img src="https://img4.teletype.in/files/7f/1b/7f1b2545-cae3-4a1f-b49b-1f5086ebdaab.png" width="1280" />
  </figure>
  <p id="J3Rd">Тестим через бас</p>
  <figure id="IvIP" class="m_original">
    <img src="https://img4.teletype.in/files/f1/5d/f15d7107-8d70-489a-bee3-3c713b15a980.png" width="317" />
  </figure>
  <p id="5tn3">Тож ноу проблем</p>
  <figure id="u7lM" class="m_original">
    <img src="https://img1.teletype.in/files/0e/83/0e835b15-4018-4a67-a461-029053ca9263.png" width="1296" />
  </figure>
  <p id="h3Z5">Можно было бы и дальше копать, зачекать какие именно данные оно собирет с отпечатка, но мне резко стало похуй.</p>
  <figure id="AqOR" class="m_original">
    <img src="https://img2.teletype.in/files/db/65/db65f89b-d100-49df-9fe9-a2a56040283f.png" width="500" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/l-SMqreejj5</guid><link>https://teletype.in/@it_hueta/l-SMqreejj5?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/l-SMqreejj5?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Binance (и coinmarketcap) соло с бананом. Шучу, не соло. Geetest на запросах.</title><pubDate>Mon, 25 Mar 2024 00:44:18 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/8d/87/8d8738cf-20a5-42a0-bd92-15d49d1947c7.png"></media:content><category>вах</category><description><![CDATA[<img src="https://img4.teletype.in/files/7d/35/7d354ca5-bd50-4534-8d21-3ee16a6ab3a6.png"></img>Пожалуйста, не проматывайте до середины]]></description><content:encoded><![CDATA[
  <figure id="Cmcj" class="m_original">
    <img src="https://img4.teletype.in/files/7d/35/7d354ca5-bd50-4534-8d21-3ee16a6ab3a6.png" width="1024" />
  </figure>
  <p id="T3MI"><em>Пожалуйста, не проматывайте до середины</em></p>
  <p id="4ECY">В этом материале я разобрал один из своих заказов, то как решал авторизацию (binance и coinmarketcap) и регистрацию (coinmarketcap) аков на запросах, их алгоритмы шифрования, а также реверс geetest slider и его решение на запросах без сервисов (онли нода, онли бас + шифрования).</p>
  <p id="jk3r">Однако не все сразу, начнем чуть издалека.</p>
  <p id="cChQ"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="omIz">Binance</h2>
  </section>
  <h3 id="U6Gb"><strong>Шифрования и подписи на авторизации</strong></h3>
  <p id="Ekxo">Понадобился мне как-то бинанс, но копировать куки из браузера было не очень хорошим решением, тк они автоматически умирали через сутки. Да, можно было повесить браузер, делать авториз и работать с ним, но мне захотелось сделать авториз на запросах, потому-что могу. А еще, через браузер, почти всегда, получается какое-то не стабильное говнище.</p>
  <p id="x7OV"><strong>Начнем с конца.</strong></p>
  <p id="vA4D">Для проверки авториза и работы на аке достаточно вот этого. Я ручками взял и удалял все куки, заголовки и тд. Все остальное по сути мусор.</p>
  <figure id="UfEV" class="m_original">
    <img src="https://img1.teletype.in/files/8d/90/8d902c4a-c8bf-4dcc-809f-294509d2a071.png" width="488" />
  </figure>
  <p id="ux4u">Тоесть достаточно всего одного кукиса p20t, который серв при авторизе дает и csrftoken (который всего-то нужно как-то получить). Хорошо, получается нам нужно узнать от куда берутся всего 2 параметра)</p>
  <figure id="2nkQ" class="m_original">
    <img src="https://img4.teletype.in/files/b0/99/b0990d9c-06be-481e-b648-f7a3c0b0fbd3.png" width="447" />
  </figure>
  <p id="Ejgs">И я сел серчить. Когда я тыкал, пост параметры выглядели следующим образом</p>
  <figure id="pFOI" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e6/37/e63752b2-e0db-4464-b93b-9167f31acfed.png" width="493" />
    <figcaption>Его линка https://accounts.binance.com/bapi/accounts/v2/public/authcenter/login</figcaption>
  </figure>
  <p id="Rqo6">Тыкал я, тыкал.. и случайно мне выпала другая капча. Ну раз она на обычном гитесте, который есть на рукапче, сделать авториз выйдет еще проще.</p>
  <figure id="ksCE" class="m_original">
    <img src="https://img2.teletype.in/files/dc/0d/dc0dc85d-5861-4542-8338-12545800753c.png" width="294" />
  </figure>
  <p id="deT7">Тоесть вот так выглядят пост данные, девайс инфо - фингер, мыло, пароль, сейф пароль и капча.</p>
  <figure id="GnY3" class="m_original">
    <img src="https://img3.teletype.in/files/2a/bf/2abfb26d-99c8-4232-9921-7dd5ebdc707e.png" width="565" />
  </figure>
  <p id="Uu5B">Ну оки, запросим тогда капчу. Ключ для капчи получаем так<br />&quot;<a href="https://accounts.binance.com/bapi/composite/v1/public/common/security/gt-code?t=" target="_blank">https://accounts.binance.com/bapi/composite/v1/public/common/security/gt-code?t=</a>&quot;+Date.now()<br />Апи дока по решению <a href="https://rucaptcha.com/api-rucaptcha#solving_geetest" target="_blank">https://rucaptcha.com/api-rucaptcha#solving_geetest</a><br /></p>
  <p id="khcb"><strong>deviceInfo </strong>- прост фингер. по итогу оно на беке будет чекать, юа ласт авториза совпадает или нет. Тоесть в случае спиздинга куков будет фрод, тк не тот юа.</p>
  <figure id="dXdw" class="m_original">
    <img src="https://img1.teletype.in/files/cc/c4/ccc489c1-b06a-4aee-be54-922bf3470fef.png" width="1680" />
  </figure>
  <p id="gvfy"><strong>password </strong>- md5(password+email)</p>
  <figure id="7pnl" class="m_original">
    <img src="https://img1.teletype.in/files/80/8c/808c4941-aa24-4a05-9bea-5263903f2d4c.png" width="1680" />
  </figure>
  <p id="elg8">Ну и я такой: О, md5!</p>
  <figure id="C1kQ" class="m_original">
    <img src="https://img1.teletype.in/files/81/3d/813dad4b-ca0f-4141-8dfe-4099ec3aa102.png" width="1680" />
  </figure>
  <figure id="CU6J" class="m_original">
    <img src="https://img4.teletype.in/files/bd/8c/bd8cf430-dd26-4cf5-8d93-ba130af11050.png" width="441" />
  </figure>
  <p id="ZLCZ">А что если бы было сложнее?<br />Ну воть, зашел в функцию и опять очевидно что это md5.</p>
  <figure id="UcUU" class="m_original">
    <img src="https://img2.teletype.in/files/94/75/947517aa-fa10-4d98-8f0e-e19572bd9954.png" width="1370" />
  </figure>
  <p id="xLig"><strong>safePassword </strong>- sha512(password). Да, это тоже сразу очевидно..</p>
  <figure id="Jsdr" class="m_original">
    <img src="https://img3.teletype.in/files/e2/a7/e2a7f77e-9c8b-40c8-a73e-307f6fb95be4.png" width="1011" />
  </figure>
  <figure id="W1tT" class="m_original">
    <img src="https://img4.teletype.in/files/b5/27/b527bf78-1103-4faa-b9fc-c9b5600edba8.png" width="437" />
  </figure>
  <p id="TrnE">Если вдруг, по какой-то причине это не очевидно, тыкаем дальше брек и тут прямо в коде это написано</p>
  <figure id="hmzk" class="m_original">
    <img src="https://img3.teletype.in/files/e8/b7/e8b77b6d-119b-4bc0-a181-d6f5faff911d.png" width="908" />
  </figure>
  <p id="66Wo">Потыкать можно туть: <a href="https://emn178.github.io/online-tools/md5.html" target="_blank">https://emn178.github.io/online-tools/md5.html</a></p>
  <figure id="ZAKg" class="m_original">
    <img src="https://img4.teletype.in/files/7e/81/7e8168d7-0831-48bf-ac51-61b6f0c46e0d.png" width="1497" />
  </figure>
  <p id="HlZC">А потом я еще словил.. validateCodeType: &quot;random&quot;. Не пон, защита це или нет, капчу решать я понимаю как, ее слать и буду.</p>
  <figure id="0Raw" class="m_original">
    <img src="https://img1.teletype.in/files/45/9f/459f02ee-bc7f-442d-ad48-e73f0286f42b.png" width="267" />
  </figure>
  <p id="RLZS">В запросеках есть вот такое. Это обычный uuid. Но эт не обязательно, чисто украшательства для статки бинанса.<br /><strong>x-ui-request-trace</strong>: 74274726-6d01-48fc-b885-7eb578840b84<br /><strong>x-trace-id</strong>: 74274726-6d01-48fc-b885-7eb578840b84</p>
  <p id="I8EL">Генерю так<br />function uuidv4() {<br />  return &#x27;xxxxxxxx-xxxx-4xxx-bxxx-xxxxxxxxxxxx&#x27;.replace(/[xb]/g, function(c) {<br />    var r = Math.random() * 16 | 0, v = c == &#x27;x&#x27; ? r : (r &amp; 0x3 | 0x8);<br />    return v.toString(16);<br />  });<br />}<br />VAR_UUID=uuidv4();</p>
  <p id="3FGR"></p>
  <p id="3LaO">Я: наверное бинанс использует какие-то хитрые методы для индентификации юзера, а также при авторизе супер шифруют и потом как-то разгадывают...<br />Бинанс: no</p>
  <figure id="NPIs" class="m_original">
    <img src="https://img1.teletype.in/files/8c/7e/8c7e6c07-9b93-44ac-abbc-6925f28e9c75.png" width="628" />
  </figure>
  <p id="LAkx">Тоесть они прост собирают трохи инфы о фингере, в основном тут важен юа, а стартовый <strong>csrf </strong>это md5 от нихуя.</p>
  <figure id="plL2" class="m_original">
    <img src="https://img3.teletype.in/files/2e/97/2e97d5c1-2bc6-4f3f-a415-e4e489defe4f.png" width="448" />
  </figure>
  <p id="di65">Также, чуток посерчил вебархив на предмет рест апишек интересных. В целом, их там есть и они даже работают. </p>
  <p id="E0w4"><a href="http://web.archive.org/web/20171230040337/https://www.binance.com/login.html" target="_blank">http://web.archive.org/web/20171230040337/https://www.binance.com/login.html</a></p>
  <figure id="eFwf" class="m_original">
    <img src="https://img1.teletype.in/files/88/1b/881b0ef5-6c07-4702-b0e0-09db198a5f87.png" width="1679" />
  </figure>
  <p id="ntPN"><a href="https://web.archive.org/web/20200417073710/https://www.binance.com/en/login" target="_blank">https://web.archive.org/web/20200417073710/https://www.binance.com/en/login</a></p>
  <figure id="3DyB" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9a/00/9a008038-845e-4783-87b0-f74dd2ca5ac1.png" width="1299" />
    <figcaption>Оно запросило у гитест капчу и тот вернул капчу с картинкой бинанса</figcaption>
  </figure>
  <p id="N4hQ">Довольно интересно копаться в сурсах через веб архив.</p>
  <p id="UsY0">Старая: <a href="https://accounts.binance.com/gateway-api/v1/public/authcenter/login" target="_blank">https://accounts.binance.com/gateway-api/v1/public/authcenter/login</a></p>
  <p id="ELet">Нынешняя (на момент создания софта): <a href="https://accounts.binance.com/bapi/accounts/v2/public/authcenter/login" target="_blank">https://accounts.binance.com/bapi/accounts/v2/public/authcenter/login</a></p>
  <p id="XVIU">Нынешняя (на момент написания этой заметки): <a href="https://accounts.binance.com/bapi/accounts/v3/public/authcenter/login" target="_blank">https://accounts.binance.com/bapi/accounts/v3/public/authcenter/login</a></p>
  <p id="vqzJ"></p>
  <p id="WhWr">Я даже некий прекол нашел. При авторизе можно отправить что угодно в письме на мыло юзеру. Потенциально, зная пароль можно было бы придумать какой-то фиш..</p>
  <figure id="n3Kk" class="m_original">
    <img src="https://img4.teletype.in/files/36/87/3687ec93-9860-425d-8a2e-a5788967701a.png" width="733" />
  </figure>
  <p id="gPp3">Тоесть если проходит логин и пароль, но девайс по юа новый, в device_name можно пропихнуть свой текст. Вроде и прикольно, но просто текст, более ничего запихать не удалось, а это до уязвимости не дотягивает(</p>
  <figure id="TxfC" class="m_original">
    <img src="https://img2.teletype.in/files/5e/33/5e33bfeb-69fa-4dcd-8eff-58bc986e7241.png" width="920" />
  </figure>
  <p id="x7B8"><strong>Итог:</strong></p>
  <p id="BM4z">Авториз работает, банан сосатб. Вот такой скриптик по итогу вышел.</p>
  <p id="Bqaj">Хэшим логпас и пас.</p>
  <figure id="gUgV" class="m_original">
    <img src="https://img1.teletype.in/files/c1/24/c12486cb-7fe2-459a-9e51-12577a03a74d.png" width="459" />
  </figure>
  <p id="PUtr">Добавляем девайс дату, как баз64 от нашего фингера</p>
  <figure id="ND4D" class="m_original">
    <img src="https://img4.teletype.in/files/b8/ab/b8ab401b-da14-4c03-8469-b01ad542e654.png" width="1009" />
  </figure>
  <p id="6QXF">Запрашиваем и решаем капчу</p>
  <figure id="NRLL" class="m_original">
    <img src="https://img3.teletype.in/files/2f/b6/2fb6ea31-b8ad-4c73-a459-822ffaf669fd.png" width="321" />
  </figure>
  <p id="lFJ8">Формируем запросек на рукапчу и дергаем ответ</p>
  <figure id="Mt5d" class="m_original">
    <img src="https://img3.teletype.in/files/a7/0a/a70ab309-2c3f-48e4-ada2-f765f1b1a9fe.png" width="1102" />
  </figure>
  <p id="JeY5">Ну и собственно шлем запрос авториза, а потом дергаем токен и куку, выполнил от куки хэш.</p>
  <figure id="5m8A" class="m_original">
    <img src="https://img1.teletype.in/files/ca/21/ca21e810-7b41-4c1d-8a6d-835d951c3ed9.png" width="1235" />
  </figure>
  <figure id="ZJgb" class="m_original">
    <img src="https://img1.teletype.in/files/82/70/82704cec-6b6d-4545-a297-796e79318d53.png" width="1145" />
  </figure>
  <p id="tZ9O">По итогу чека авториз воркал (на момент написания софта)</p>
  <figure id="OLlY" class="m_original">
    <img src="https://img3.teletype.in/files/e7/eb/e7ebc8bb-bf14-4ae2-8adb-6a4e4ee0ac60.png" width="1237" />
  </figure>
  <p id="E6eU"></p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="AUw6">Капча slider (geetest)</h2>
  </section>
  <figure id="PsOd" class="m_original">
    <img src="https://img3.teletype.in/files/ad/d5/add5e152-be5a-4547-b1ec-b3c9d71975fb.png" width="329" />
  </figure>
  <p id="dBlU">Я был бы не я, если б не сел чекать и дефолтную капчу. Как я потом понял, оказалось, что эт был geetest. Хотя, выглядело не то чтобы сильно страшно.</p>
  <h3 id="vtoF">Шифрование и данные</h3>
  <p id="lyan"><strong>Начнем с шифрования. </strong></p>
  <p id="fvw7">Имеем тело. Данными о решении будет <strong>data</strong>. </p>
  <p id="mRbB">Напоминаю, урл банана: <a href="https://accounts.binance.com/ru/login?return_to=aHR0cHM6Ly93d3cuYmluYW5jZS5jb20vcnU%3D" target="_blank">https://accounts.binance.com/ru/login?return_to=aHR0cHM6Ly93d3cuYmluYW5jZS5jb20vcnU%3D</a></p>
  <figure id="Ztjd" class="m_original">
    <img src="https://img3.teletype.in/files/ed/dc/eddcc6da-3e71-401e-9a72-9af70c93b0af.png" width="1280" />
  </figure>
  <p id="34tD">И так, картинка прилетает 1 куском, получается дальше он ее режет по ширине пазла и высоту не знает, умно)</p>
  <figure id="vc7H" class="m_original">
    <img src="https://img4.teletype.in/files/f1/1b/f11b4791-ab4d-412b-aedc-b5d7e89352b2.png" width="1280" />
  </figure>
  <p id="0H4u">Хорошо, как обычно, открываем стек вызовов, находим хуйню. Осталось теперь понять как работает эта хуйня, а именно как формируется тело запроса.</p>
  <figure id="YIw8" class="m_original">
    <img src="https://img3.teletype.in/files/ee/64/ee64962e-8556-4bb5-b73d-40446abfe1a9.png" width="1280" />
  </figure>
  <p id="nOpV">Вариантов фона за пазлом не много и это наводит на некоторые мысли по решению самого поиска пазла. А именно, собрать фон без дырки и шукать потом отличие. Также заметим, что из исходного изображения ещё 60 пикселей слева нужно вырезать. 60 чтобы отрезать пазл и ещё 60, ТК в браузере туда ставится пазл. Но об этом трохи позже.</p>
  <figure id="qiDK" class="m_original">
    <img src="https://img3.teletype.in/files/2d/46/2d462fa8-3150-463c-bdcc-2d7a0d35951e.png" width="421" />
  </figure>
  <p id="cO8Q">Тэкс. Ну, начало найдено, где бреки ставить более менее ясно.</p>
  <figure id="Ljc8" class="m_original">
    <img src="https://img2.teletype.in/files/df/87/df879d00-5907-4d53-99a0-472f992a1465.png" width="1278" />
  </figure>
  <p id="T6i4">Чуть потыкав находим ключевой поинт, от которого и будет строиться весь остальной ресерч. Это итоговый жысончег, который мы шифруем.</p>
  <figure id="08Vg" class="m_original">
    <img src="https://img1.teletype.in/files/05/4e/054ef9fe-589c-4c50-9319-650369af6074.png" width="1280" />
  </figure>
  <p id="CrKT">Вот мы получаем параметр <strong>ev</strong>.</p>
  <figure id="Kspa" class="m_original">
    <img src="https://img4.teletype.in/files/ba/fa/bafaf74e-d3c1-469e-96b9-5e786498c05d.png" width="1278" />
  </figure>
  <p id="clWo">Выведем нашу инфу в лог до шифрования.</p>
  <figure id="FlSJ" class="m_original">
    <img src="https://img2.teletype.in/files/d9/b5/d9b57e8c-7ebb-4950-a237-84a24b949853.png" width="1279" />
  </figure>
  <p id="tG3y">Тыкаем далее и попадаем сюда. Видим дохуя страшную обфускацию сглаживания потока (свичкейсы и порядок действий). Где-то тут оно шифрует наше решение.</p>
  <figure id="apu1" class="m_original">
    <img src="https://img3.teletype.in/files/65/85/658593b6-f634-4453-9d12-9d46ddce794d.png" width="1279" />
  </figure>
  <p id="MuR2">И по итогу превращает в нечитаемую кашу, а потом перегон в base64.</p>
  <figure id="89bD" class="m_original">
    <img src="https://img3.teletype.in/files/60/63/6063a04c-5eed-46c3-9edd-a783667b4139.png" width="1280" />
  </figure>
  <figure id="SKQF" class="m_original">
    <img src="https://img4.teletype.in/files/f9/a3/f9a37730-50c6-4272-93db-2d7e517f18ce.png" width="807" />
  </figure>
  <p id="nVMT">Ёпта, ну.. пару строк я и ручками деобфусцирую</p>
  <p id="PGFW"><code>for (var d = 0; i[o(&quot;JF1c&quot;, 218)](d, u[s(1242, &quot;%O$2&quot;) + &quot;h&quot;]); d++)<br />                            p += i[s(3410, &quot;7crc&quot;)](on, i[n(&quot;S3iz&quot;, 2013)](u[o(&quot;UlhH&quot;, 105) + n(&quot;k*^^&quot;, 1441)](d), t[r(&quot;TKH^&quot;, 2165) + c(&quot;JF1c&quot;, 2489)](i[n(&quot;u&amp;1s&quot;, 2227)](d, t[n(&quot;Lw!2&quot;, 3103) + &quot;h&quot;]))));</code></p>
  <p id="x5Va">Хуяк!</p>
  <figure id="6p9C" class="m_original">
    <img src="https://img1.teletype.in/files/07/33/0733be92-20c3-47a9-bbdf-98a302cde9fe.png" width="317" />
  </figure>
  <p id="d7UQ"><code>p = [];<br />for (var d = 0; d&lt;u.length; d++){<br />    p += String.fromCharCode(u.charCodeAt(d)^t.charCodeAt(d%t.length))<br />}<br />btoa(p)</code></p>
  <p id="FdSp">Получается, оно просто выполняет xor с неким ключом <strong>t</strong> (&quot;2p5facdc&quot;). </p>
  <p id="N8hD">Бля, ну тогда надо понять от куда берется этот ключ и шифрование будет выебано.</p>
  <figure id="YnOa" class="m_original">
    <img src="https://img4.teletype.in/files/fa/04/fa04829d-3c78-4e79-b5e8-dbb294d6a404.png" width="1280" />
  </figure>
  <p id="8AEW">Сравниваем <strong>data </strong>из запроса с той что я заенкодил. Всё как надо)</p>
  <figure id="sL93" class="m_original">
    <img src="https://img1.teletype.in/files/4b/02/4b02c1c4-cd4f-4f4e-a851-bf0827452890.png" width="1280" />
  </figure>
  <figure id="ZN6u" class="m_original">
    <img src="https://img1.teletype.in/files/41/b7/41b776b9-69b3-4c11-961f-714d2c69441b.png" width="1024" />
  </figure>
  <p id="KGO4">Теперь осталось понять, от куда берется этот ключ <strong>t</strong> и это, либо <strong>ek</strong>, либо <strong>salt</strong>.</p>
  <figure id="T9u7" class="m_original">
    <img src="https://img2.teletype.in/files/9e/27/9e275b4a-15b5-4d2f-b113-6779fa504d8d.png" width="1278" />
  </figure>
  <p id="Yacj">Тыкаем по коду и попадаем сюды, где какая-то математика с ключом <strong>ek</strong>, но в реверс виде.</p>
  <p id="3c4B"><code>var c = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;h&quot;, &quot;i&quot;, &quot;j&quot;, &quot;k&quot;, &quot;x&quot;, &quot;y&quot;].join(&quot;&quot;)<br />              , l = Math.floor(e.length/t);</code></p>
  <figure id="VVns" class="m_original">
    <img src="https://img4.teletype.in/files/b1/f0/b1f093f2-5cef-475c-93ef-a19b070da677.png" width="1278" />
  </figure>
  <p id="xHqz"><code>var i = t.split(&quot;&quot;).reverse().join(&quot;&quot;)</code></p>
  <figure id="EdJW" class="m_original">
    <img src="https://img3.teletype.in/files/ec/c7/ecc7769f-a89a-460d-9c67-e89142fdbfa7.png" width="1280" />
  </figure>
  <p id="NQlO">Ну тож изи ручками деобфусцирую. На выходе получаю простой код. На вход <strong>ek</strong>, на выходе получим ключ. Тоесть тело нашли, шифрование, на удивление, тоже.</p>
  <figure id="alf6" class="m_original">
    <img src="https://img4.teletype.in/files/77/ff/77ff88e9-c7c3-4a7d-86de-c7c56fe24673.png" width="388" />
  </figure>
  <figure id="bbP3" class="m_original">
    <img src="https://img3.teletype.in/files/61/70/617032a4-6094-4964-b0cf-baea166ed29a.png" width="589" />
  </figure>
  <p id="6PN5">В итоговом коде это выглядит вот так</p>
  <figure id="KNIu" class="m_original">
    <img src="https://img4.teletype.in/files/34/94/34948407-85da-4f17-8d9c-706c7c687cd0.png" width="519" />
  </figure>
  <p id="N05g">А потом отправляем запрос с нашим решением. </p>
  <figure id="rpoL" class="m_original">
    <img src="https://img4.teletype.in/files/b4/d0/b4d0c9d9-b905-4a28-835b-de34a74136c8.png" width="1051" />
  </figure>
  <p id="MWl1">Я тестировал каждый этап работы, в том числе этот. Я брекал решенную в браузере капчу, чтобы запрос не улетел, а потом перекидывал все в бас, шифровал и слал на сервер, чтобы убедиться, что все собрал правильно.</p>
  <figure id="88sU" class="m_original">
    <img src="https://img4.teletype.in/files/ff/d3/ffd3b621-1cf4-4629-bf01-46b29005e284.png" width="433" />
  </figure>
  <p id="y8jF"></p>
  <p id="PXus"><strong>Анализ шифруемых данных</strong></p>
  <p id="PWVk">Перейдем к анализу шифруемых данных и начнем собирать <strong>ev</strong>, <strong>be</strong>, <strong>dist</strong></p>
  <p id="Y3bu">Напомню, что отталкиваемся вот от сюда.</p>
  <figure id="sawM" class="m_original">
    <img src="https://img2.teletype.in/files/9f/81/9f81408c-8b34-442f-ab19-04cf14b4d9e8.png" width="1280" />
  </figure>
  <p id="GpHp"><strong>ev </strong>- какая-то мини инфа о браузере, размеры экрана и какая-то странная <strong>pre</strong>.. выглядит довольно не сложно. А вот в <strong>be</strong> у нас есть <strong>el </strong>и <strong>th</strong>, в котором тоже <strong>el</strong>..</p>
  <figure id="mIyz" class="m_original">
    <img src="https://img4.teletype.in/files/3c/e0/3ce03b1d-8ea9-44af-8b95-c0f40484b1a8.png" width="1279" />
  </figure>
  <p id="lZkN">Остаются: <strong>be </strong>- движение мыши, <strong>dist </strong>- ответ. Ну, с <strong>dist </strong>всё понятно.</p>
  <p id="GBgD">Получается, нужно всего лишь понять как формировать <strong>be </strong>и в целом, че это там происходит, и пол дела сделано будет.</p>
  <p id="Hd6P">В <strong>be </strong>у нас есть <strong>ec</strong>, <strong>el</strong>, <strong>th</strong></p>
  <figure id="pv1s" class="m_original">
    <img src="https://img2.teletype.in/files/18/90/1890ab72-fdf1-42ed-9510-e7821db8f58d.png" width="1653" />
  </figure>
  <p id="gECg">Покопавшись в коде, можем найти, что оно собирает инфу по событиям. Если ориентироваться на <strong>el </strong>в <strong>th</strong>, видно как оно сейвит нажатие мыши, её движение и отпускание.</p>
  <p id="YerQ"><code>click: &quot;cl&quot;<br />mousedown: &quot;md&quot;<br />mouseenter: &quot;me&quot;<br />mousemove: &quot;mm&quot;<br />mouseout: &quot;mo&quot;<br />mouseup: &quot;mu&quot;<br />touchcancel: &quot;tc&quot;<br />touchend: &quot;te&quot;<br />touchmove: &quot;tm&quot;<br />touchstart: &quot;ts&quot;</code></p>
  <p id="Gmxk">Получается, но чекает координаты относительно всякой хуйни и пишет в массив.</p>
  <figure id="WYdO" class="m_original">
    <img src="https://img3.teletype.in/files/af/75/af75a9a4-b9d3-43df-9dbe-bf253d139a23.png" width="1279" />
  </figure>
  <p id="iEyA">Кажется, что в <strong>thumbnailEventList </strong>координаты только относительно квадратика.</p>
  <figure id="MxSh" class="m_original">
    <img src="https://img2.teletype.in/files/94/b7/94b78159-fc73-431f-bc51-10f49c34fc3a.png" width="1279" />
  </figure>
  <p id="5EVC">Направил курсор на нижний левый угол, выдало координаты (0, 38), учитывая что кубик 40 на 40, а 0 в у нас от левого верхнего угла.</p>
  <figure id="8l0s" class="m_original">
    <img src="https://img2.teletype.in/files/91/2b/912bf5bf-8812-4362-935c-1c014a289ba4.png" width="1278" />
  </figure>
  <p id="hWoc"><code>&quot;me|39,20&quot; - навел и сработал первый тригер<br />&quot;mm|39,20&quot; - появилась лапка<br />&quot;md|24,20&quot; - клик с зажатием<br />&quot;mm|27,22&quot; - тяну лапку до сюда<br />&quot;me|26,22&quot; - отпускаю лапку</code></p>
  <figure id="My19" class="m_original">
    <img src="https://img2.teletype.in/files/18/88/1888f002-3349-4a3d-a155-f28f6d077c33.png" width="1279" />
  </figure>
  <p id="5zYM">В результате получаем хуйню с данными о перемещении.</p>
  <figure id="aIJF" class="m_original">
    <img src="https://img2.teletype.in/files/9a/7a/9a7a9adc-0d48-466c-a071-24b8be1d7a26.png" width="1280" />
  </figure>
  <p id="CWfZ"><code>&quot;dist&quot;:133 - решение</code></p>
  <p id="IXfN"><code>&quot;si&quot;:{&quot;w&quot;:40,&quot;h&quot;:40} - дефолт (це размер дырки)</code></p>
  <p id="cjbl"><code>&quot;el&quot; - другие параметры движения. вот те которых дохера</code></p>
  <p id="OxVw"><code>&quot;ec&quot;:{&quot;mm&quot;:80,&quot;md&quot;:1,&quot;mu&quot;:1} - количество событий в массиве а также количество тыков на капчу</code></p>
  <p id="OSRu">Если выкинуть кучу данных это превращается в :<br /><code>&#x27;{&quot;ev&quot;:{&quot;wd&quot;:35,&quot;im&quot;:31,&quot;de&quot;:&quot;&quot;,&quot;brla&quot;:35,&quot;prde&quot;:&quot;9,35,77,59&quot;,&quot;pl&quot;:&quot;Win32&quot;,&quot;wiinhe&quot;:657,&quot;wiouhe&quot;:728},&quot;be&quot;:{&quot;ec&quot;:{&quot;mm&quot;:80,&quot;md&quot;:1,&quot;mu&quot;:1},&quot;el&quot;:[],&quot;th&quot;:{&quot;el&quot;:[],&quot;si&quot;:{&quot;w&quot;:40,&quot;h&quot;:40}}},&quot;dist&quot;:133}&#x27;</code></p>
  <p id="DM4V">А если по сути, то вообще<br /><code>{ev: {…}, be: {…}, dist: 133}</code></p>
  <p id="V5HH">Не так уж на деле и страшно</p>
  <figure id="9pmA" class="m_original">
    <img src="https://img1.teletype.in/files/44/ed/44ed778c-9adf-4559-b427-44dbfd775788.png" width="1279" />
  </figure>
  <p id="BZJG">Получается, что <strong>be </strong>это  прост пропарс результатов<br /><code>be: {<br />    ec: {}<br />    el: []<br />    th: {}<br />}</code><br />От сюда<br /><code>r={<br />    eventCount: {},<br />    eventList: [],<br />    lastEventTime: 0,<br />    thumbnailEventList: [],<br />    thumbnailSize: {w: 40, h: 40}<br />}</code></p>
  <p id="HsQV"><code>ec - eventCount</code></p>
  <p id="EQWW"><code>el - eventList</code></p>
  <p id="YNfZ"><code>th - {thumbnailEventList, thumbnailSize}</code></p>
  <p id="dhAH">Генерация <strong>ev </strong>это конечно кек</p>
  <p id="sLbw"><code>ev = {<br />    brla: s(),<br />    de: &quot;&quot;,<br />    im: s(),<br />    pl: pc.platform,<br />    prde: prde(),<br />    wd: s(),<br />    wiinhe: pc.innerHeight,<br />    wiouhe: pc.outerHeight<br />}</code></p>
  <p id="MpsE">Что же это за хитрая функция <strong>s</strong>..<br /><code>function s(){<br />    (Math.floor(50 * Math.random())*2) + 1;<br />}</code></p>
  <p id="crxZ">На деле, <strong>be </strong>не такой уж и сложный</p>
  <p id="u0D3"><code>be: {<br />       ec: {<br />           md: 1<br />           mm: 80<br />           mu: 1<br />       }<br />       el: [ ]<br />       th: {<br />           el: [ ]<br />           si: { }<br />       }<br />   }</code></p>
  <p id="99K4">Где это просто счетчик</p>
  <p id="w3e0"><code>ec: {<br />           md: 1<br />           mm: 80<br />           mu: 1<br />       }</code><br />Большая координат движения мыши <code>el: [ ]</code></p>
  <p id="GfMO">Статика <code>si: { h: 40, w: 40 }</code><br />Малая (относительно квадратика) группа движения мыши <code>el: [ ]</code></p>
  <figure id="59j0" class="m_original">
    <img src="https://img1.teletype.in/files/c3/bc/c3bc5d51-e9f3-4d9d-9244-b43478461d06.png" width="1279" />
  </figure>
  <p id="VzY1"></p>
  <h3 id="cotT">Генерация данных</h3>
  <p id="koZJ">Штош, разобрались с реверсом шифрования и поверхностно с данными, осталось понять, как генерировать эти самые координаты. </p>
  <p id="jJhS">Начнем сначала. У нас оно чекает координаты.</p>
  <figure id="b4u7" class="m_original">
    <img src="https://img1.teletype.in/files/48/47/4847f8fa-d335-4300-85b2-27cffc72d32e.png" width="1280" />
  </figure>
  <p id="9ffJ">Чуть деобфусцируем и получим</p>
  <p id="ucdA"><code>var u = e.getBoundingClientRect()<br />                  , l = Math.round(t.clientX - u.left)<br />                  , d = Math.round(t.clientY - u.top)</code></p>
  <p id="nNvv"><code>x: Math .floor(l).toString()<br />y: Math .floor(d).toString()</code></p>
  <p id="3ysU">Получается, шо это код, который дергает относительно этого маленького пазла, как было замечено ранее.</p>
  <figure id="8904" class="m_original">
    <img src="https://img3.teletype.in/files/ee/a7/eea7e448-7eaa-4e54-8ef9-fe57150506b0.png" width="1280" />
  </figure>
  <p id="xstA">По сути просто вот эти значения - старт значения кнопки.</p>
  <figure id="tgbS" class="m_original">
    <img src="https://img1.teletype.in/files/02/12/021231e3-daf1-459e-8b8c-fcb8e533e215.png" width="690" />
  </figure>
  <p id="NuFC">Для генерации времени использует <code>(new Date).getTime()</code></p>
  <figure id="v8mc" class="m_original">
    <img src="https://img3.teletype.in/files/67/d4/67d4d1fc-ad7f-48a9-8505-672a62da9c2f.png" width="1278" />
  </figure>
  <p id="9tpK">Напомню, у нас есть несколько типов событий:<br /><code>click: &quot;cl&quot;<br />mousedown: &quot;md&quot;<br />mouseenter: &quot;me&quot;<br />mousemove: &quot;mm&quot;<br />mouseout: &quot;mo&quot;<br />mouseup: &quot;mu&quot;<br />touchcancel: &quot;tc&quot;<br />touchend: &quot;te&quot;<br />touchmove: &quot;tm&quot;<br />touchstart: &quot;ts&quot;</code></p>
  <p id="pGMg">Фул блок капчи на самом деле содержит много областей. В зависимости от того, куда я навел мышку, кликнул и тд, выводится соответствующее событие.</p>
  <figure id="r4LT" class="m_original">
    <img src="https://img4.teletype.in/files/bb/f1/bbf1b32a-2c7d-4376-bd21-39b336bfba6c.png" width="1278" />
  </figure>
  <p id="n79c">Пример набора событий.</p>
  <p id="2HrZ"><code>0: &quot;im|mm|355,284|1648175834425|1&quot;<br />27: &quot;im|mm|120,385|5|1&quot;<br />39: &quot;shim|mm|85,397|10|1&quot;<br />40: &quot;wi|mm|84,398|7|1&quot;<br />50: &quot;slth|mm|76,416|10489542|1&quot;<br />51: &quot;wi|mm|282,505|882163|1&quot;<br />52: &quot;wi|mm|378,413|1994077|1&quot;</code></p>
  <p id="odRI"></p>
  <p id="wsqs"><code>Действие над im, тип действия mm - навел на картинку</code></p>
  <figure id="JbMs" class="m_original">
    <img src="https://img1.teletype.in/files/c8/52/c8520d65-2c42-48be-9bbb-571ad714bb42.png" width="1280" />
  </figure>
  <p id="xiLO"><code>Действие над shim (пазл), mm - навел на картинку</code></p>
  <figure id="LM0u" class="m_original">
    <img src="https://img3.teletype.in/files/a7/bc/a7bcd37a-76ba-4834-a3c7-ba7e85368dcc.png" width="1279" />
  </figure>
  <p id="l8mZ"></p>
  <p id="mkFf">Хорошо, раз у нас дохуя всяких областей, разберемся какие вообще мы имеем области:</p>
  <p id="FQfH"><code>wi - область окна капчи</code></p>
  <figure id="PAgZ" class="m_original">
    <img src="https://img1.teletype.in/files/06/2d/062d85b8-c6f6-4915-9a34-e5489d491472.png" width="1280" />
  </figure>
  <p id="sSvd"><code>im - область картинки пазла</code></p>
  <figure id="JtYb" class="m_original">
    <img src="https://img3.teletype.in/files/aa/0d/aa0df5fe-7007-4337-b052-a2e8f3dc40f4.png" width="1280" />
  </figure>
  <p id="YTIe"><code>shim - область полоски для пазла</code></p>
  <figure id="uvKC" class="m_original">
    <img src="https://img2.teletype.in/files/92/98/9298688d-5b7d-42bb-8d89-de6e7fd41630.png" width="1280" />
  </figure>
  <p id="Ue47"><code>sl - область слайдера. скорее всего, за исключением область квадратика и надписи</code></p>
  <figure id="AwGN" class="m_original">
    <img src="https://img4.teletype.in/files/31/d2/31d2511f-bbf5-493f-95b3-8883b03354ca.png" width="1280" />
  </figure>
  <p id="ygiL"><code>trtx - область надписи на слайдере</code></p>
  <figure id="jU0P" class="m_original">
    <img src="https://img4.teletype.in/files/fb/22/fb22d9c1-bdd0-42ea-a54c-2178504daba3.png" width="1280" />
  </figure>
  <p id="Rs4C"><code>slth - область квадратика слайдера, исключая иконку</code></p>
  <figure id="0Tq3" class="m_original">
    <img src="https://img4.teletype.in/files/b5/74/b574ca92-4f2e-4f51-bcc2-47721a041e02.png" width="1280" />
  </figure>
  <p id="emG2"><code>ar - область иконки на квадратике слайдера. В идеале, в ней и нужно двигаться при решении.</code></p>
  <figure id="5lCM" class="m_original">
    <img src="https://img2.teletype.in/files/d2/06/d2065a8e-5fdb-442c-90e5-d34ccb99712b.png" width="1280" />
  </figure>
  <p id="mB1d"></p>
  <p id="3iBh">Имеем области:<br /><code>wi - область окна капчи<br />im - область картинки пазла<br />shim - область полоски для пазла<br />sl - область слайдера<br />trtx - область надписи на слайдере<br />slth - область квадратика слайдера, исключая иконку<br />ar - область иконки на квадратике слайдера</code><br /></p>
  <p id="U7QE">Имеем события:<br /><code>click: &quot;cl&quot;<br />mousedown: &quot;md&quot;<br />mouseenter: &quot;me&quot;<br />mousemove: &quot;mm&quot;<br />mouseout: &quot;mo&quot;<br />mouseup: &quot;mu&quot;<br />touchcancel: &quot;tc&quot;<br />touchend: &quot;te&quot;<br />touchmove: &quot;tm&quot;<br />touchstart: &quot;ts&quot;</code></p>
  <p id="swux">Может возникнуть резонный вопрос нахуя нужно вот это? А вот в чем фокус:</p>
  <p id="Yn7U"><code>0: &quot;im|mm|355,284|1648175834425|1&quot;<br />27: &quot;im|mm|120,385|5|1&quot;<br />39: &quot;shim|mm|85,397|10|1&quot;<br />40: &quot;wi|mm|84,398|7|1&quot;<br />50: &quot;slth|mm|76,416|10489542|1&quot;<br />51: &quot;wi|mm|282,505|882163|1&quot;<br />52: &quot;wi|mm|378,413|1994077|1&quot;</code></p>
  <p id="zYRx"><code>0: &quot;|22,2&quot;<br />1: &quot;mm|22,2&quot;</code></p>
  <p id="iEaF">Ещё раз <code>50: &quot;slth|mm|76,416|10489542|1&quot;</code></p>
  <p id="OM1v">И <code>1: &quot;mm|22,2&quot;</code></p>
  <p id="L8od">Второй массив отражает движение мыши только относительно квадратика,<br />а основной - первый, в нем и время в миллисекундах и координаты. Получается мы можем получить второй из первого по сути.</p>
  <p id="88KG">И тут я прикинул, что закодить это все будет не очень просто. Ну точнее, мне не очень уже хочется так сильно ебаться. И кто-то наверное спросит &quot;а почему бы просто не заюзать <a href="https://www.npmjs.com/package/windmouse" target="_blank">windmouse</a>?&quot;, а я, который о ней узнал только после того как сделал софт, отвечу:</p>
  <figure id="SxDP" class="m_original">
    <img src="https://img1.teletype.in/files/03/ff/03ff25c0-27e6-40ce-81c9-1bfe6f28d697.png" width="640" />
  </figure>
  <p id="aTRA">А потом я покумекал и решил чекнуть &quot;что если решать имитируя телефон?&quot;. Должно же быть ну явно по проще. И таки да.</p>
  <figure id="uC3C" class="m_original">
    <img src="https://img1.teletype.in/files/0b/f6/0bf67435-78c1-41a8-b668-e35762798488.png" width="1280" />
  </figure>
  <p id="ZTu8">Всего лишь один простенький массив нужно генерить и всё. Еще раз, нам нужен только <strong>el </strong>для <strong>be </strong>(большой), а для <code>&quot;th&quot;:{&quot;el&quot;:[]..</code> уже не нужен. Не то чтобы это прям на сильно проще, но точно не сложнее)</p>
  <figure id="vMR3" class="m_original">
    <img src="https://img1.teletype.in/files/46/6d/466dd6a9-9934-4249-b9d7-237d32be1429.png" width="929" />
  </figure>
  <p id="NpiG">Дергает оно инфу  о положении с тачскрина:</p>
  <p id="kLFt"><code>clientX: 42.66666793823242<br />clientY: 509.3333435058594<br />force: 1<br />identifier: 0<br />pageX: 42.66666793823242<br />pageY: 509.3333435058594<br />radiusX: 15.333333015441895<br />radiusY: 15.333333015441895<br />rotationAngle: 0<br />screenX: 366<br />screenY: 520</code></p>
  <figure id="rhFv" class="m_original">
    <img src="https://img1.teletype.in/files/0b/0f/0b0fc49a-4485-4179-934a-4b552dc6b9cd.png" width="1280" />
  </figure>
  <p id="eauL">Да, нам все еще нужно чекать положение пазла относительно всей высоты страницы, но лучше генерить 1 хуйню, чем 2.</p>
  <p id="WIxf">Учитывая логи выше, получается, нужно зажимать только иконку стрелки, чтобы мозги себе не ебать. <code>44х44</code> - кнопка, <code>24х24</code> - иконка. <br />Тоесть: <code>x = 40+((44-24)/2)+random(0,24)</code></p>
  <p id="Nvvv"><strong>slth </strong>словил на координатах, которые означают левый край, тоесть все оки.<br />x = 40; y = 510<br /><strong>at </strong>словил тыкая тож в край иконки<br />x = 54; y = 524</p>
  <p id="Zve8"><strong>at </strong>словил тыкая тож в край иконки<br />x = 52; y = 520</p>
  <p id="DZdR">Получается следующее:<br />Минималка: x = 50; y = 520<br />Максималка должна быть: x = 50+24=74; y = 520+24=544<br />Но это в рамках начального положения.</p>
  <p id="gPBT">Для теста сложил время начиная с первого значения массива:<br /><code>&quot;ar|ts|61,526|1648212768794|1&quot;</code><br />от <code>1648212768794</code>, получилось <code>6419</code></p>
  <p id="wo1h">Вычел от <code>lastEventTime: 1648212775213</code>, получил то же значение<br />значит я все правильно посчитал. А значит, время действительно правильно посчиталось. Единственное, дало пол секунды хз откуда.</p>
  <figure id="YmSf" class="m_original">
    <img src="https://img1.teletype.in/files/84/1f/841fc949-9bd8-455e-8679-7131c0a199e5.png" width="604" />
  </figure>
  <p id="sOHs">Хорошо, перейдем к итоговому решению. Задаем константы. </p>
  <figure id="57LR" class="m_original">
    <img src="https://img3.teletype.in/files/67/22/6722a397-58e2-426a-abc5-2bbe20a95772.png" width="1202" />
  </figure>
  <p id="Jxdd">Шизо генерация.. Вместо того, чтобы юзать <a href="https://www.npmjs.com/package/windmouse" target="_blank">windmouse</a>, которая вероятно и в бас стоит, я наговнял свой алго ветренной мышки.</p>
  <figure id="oan8" class="m_original">
    <img src="https://img1.teletype.in/files/41/7c/417c3785-52c8-4b96-9973-005eead54fe0.png" width="1234" />
  </figure>
  <p id="tE2J">По итогу генерится вот такая красота.</p>
  <figure id="0hl6" class="m_original">
    <img src="https://img2.teletype.in/files/9c/3f/9c3f3bef-a772-49f9-833c-dc989e4b5ed9.png" width="726" />
  </figure>
  <figure id="fRZV" class="m_original">
    <img src="https://img3.teletype.in/files/26/85/2685cef0-563e-4ca7-85ae-2eaf7b988cd2.png" width="594" />
  </figure>
  <p id="KLap">С другой стороны, блять, оно ведь, действительно, по итогу работало..</p>
  <figure id="zT4k" class="m_original">
    <img src="https://img2.teletype.in/files/58/b1/58b1f96e-586d-4978-9ca7-8c092d1b00f8.png" width="721" />
  </figure>
  <p id="nYK7"></p>
  <h3 id="V9Jb">Решение пазла</h3>
  <figure id="jnhL" class="m_original">
    <img src="https://img2.teletype.in/files/9c/d8/9cd82215-7ccc-48af-8d5c-99f13028181a.png" width="369" />
  </figure>
  <p id="Ccjm">Вернемся немного назад, ведь нужно же еще и само положение ответа как-то найти.</p>
  <p id="a9uW"><a href="https://habr.com/ru/articles/508690/" target="_blank">Классически слайдер решают</a> собирая фоновую картинку без дырки и сопоставляют с той что в задаче. </p>
  <figure id="dI42" class="m_original">
    <img src="https://img2.teletype.in/files/97/c8/97c87d80-e0fc-4c67-8892-49f04656c9e9.png" width="523" />
  </figure>
  <p id="0kIX">На это я намекал чуть ранее.</p>
  <figure id="Msii" class="m_original">
    <img src="https://img2.teletype.in/files/12/7b/127bdfe8-216e-4187-98ad-2fbfcaf7d208.png" width="421" />
  </figure>
  <p id="32AS">Но работает это, когда картинок фона не много, а хотелось бы чет более универсальное. </p>
  <p id="NU2T">Также, на форуме бас были 2 <a href="https://community.bablosoft.com/topic/5835/%D1%80%D0%B5%D1%88%D0%B0%D0%B5%D0%BC-captchapuzzle" target="_blank">старых решения</a>.</p>
  <figure id="b165" class="m_original">
    <img src="https://img3.teletype.in/files/a4/e9/a4e9450c-114f-4448-b0d9-1a77ca2c4e51.png" width="754" />
  </figure>
  <p id="2kSW">В обоих суть сводилась к <a href="https://community.bablosoft.com/topic/20877/captcha-binance" target="_blank">поиску кусочка пазла на картинке</a>.</p>
  <figure id="OhRr" class="m_original">
    <img src="https://img3.teletype.in/files/22/86/22862730-b84f-4dfa-a8ab-a1781167285b.png" width="572" />
  </figure>
  <p id="jAi8">Но в этом подходе качество было крайне скверное. Поэтому, как всегда, я решил пойти своим путём.</p>
  <p id="55Ed">Общая тактика решения должна свестись к тому, что первым шагом мы подрежем мини пазл и чекнем его положение, далее кропнем картинку по высоте этого пазла, а потом как-то надо будет найти куда его двигать.</p>
  <figure id="F935" class="m_original">
    <img src="https://img3.teletype.in/files/a9/e7/a9e7f127-3fde-43be-b687-d4af10cf30d1.png" width="458" />
  </figure>
  <p id="KAoV">Я стал разгонять, а как можно улучшить картинку, убрать всякий мусор, чтоб искало положение лучше, чем бас это делает дефолтно. Погонял разные фильтры:</p>
  <p id="hy2s">Перегон в серый</p>
  <figure id="GEzF" class="m_original">
    <img src="https://img1.teletype.in/files/03/0c/030cb936-3330-4e50-aa4e-c3f68a3c0d47.png" width="337" />
  </figure>
  <p id="Uihe">Уменьшение цветов</p>
  <figure id="QIFz" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/77/a5/77a5510d-0503-41d0-81a0-bb26f2181a72.png" width="309" />
    <figcaption>8 бит</figcaption>
  </figure>
  <figure id="mV47" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c3/84/c3841933-a875-4288-b3e8-6d5c20e32ae9.png" width="309" />
    <figcaption>яркость и контраст (30 - 100)</figcaption>
  </figure>
  <p id="FkvI">Я пробовал делать перегон в чб по порогу (нативными средствами бас)</p>
  <figure id="WM8a" class="m_original">
    <img src="https://img3.teletype.in/files/ef/6d/ef6de89c-a3db-4de5-be93-0ed75b38e6c5.png" width="876" />
  </figure>
  <p id="DKcv">Ну и оно вроде как работает, причем довольно неплохо.</p>
  <figure id="H8lv" class="m_original">
    <img src="https://img3.teletype.in/files/ed/36/ed3649c4-eb4e-41d7-9fa0-9ca7af20ce29.png" width="343" />
  </figure>
  <p id="IDvm"></p>
  <p id="hL5X">Но результат был не достаточно хорош для меня.</p>
  <figure id="DKT7" class="m_original">
    <img src="https://img2.teletype.in/files/19/04/1904ae95-8d32-4d62-946f-96ce30a140df.png" width="473" />
  </figure>
  <p id="PrLq">В процессе работы также возникла очень странная бага: на картинке нельзя было рисовать через бас.</p>
  <p id="zfZO">Скриним, рисуем на картинке и.. ни ху я</p>
  <figure id="zfv7" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c1/60/c1607e74-dee7-44de-883a-50f549512643.png" width="337" />
  </figure>
  <p id="QLKP">Берем картинку в base64, получаем айди, применяем по айди формат в жпег,, получаем base64, получаем опять айди и рисуем прямоугольник.</p>
  <p id="LOPX">Я хуй знает почему, но даже на скрине не позволял рисовать. До сих пор не разобрался.</p>
  <figure id="HH3j" class="m_original">
    <img src="https://img1.teletype.in/files/ca/de/cade48a3-740b-43cc-8fba-d6c35cbd161d.png" width="318" />
  </figure>
  <p id="Pcrr"><strong>Оператор Собеля</strong></p>
  <p id="hYeY">Кароче, шукал я, шукал, и потом я наткнулся на это <a href="https://habr.com/ru/articles/114452/" target="_blank">(Алгоритмы выделения контуров изображений)</a>: </p>
  <figure id="9drP" class="m_original">
    <img src="https://img1.teletype.in/files/4a/8e/4a8eed90-00bd-4a10-9ea1-4a4736fd2310.png" width="950" />
  </figure>
  <p id="4XKs">Оказалось, что <a href="https://newtechaudit.ru/obzor-osnovnyh-algoritmov-vydeleniya-konturov-izobrazheniya/" target="_blank">это база в обработке изображений</a>. (Более подробная инфа про фильтр собеля с хорошим кодом <a href="https://observablehq.com/@mbostock/sobel-operator" target="_blank">есть туть)</a>. Тоесть, во всяких <a href="https://robocraft.ru/computervision/484" target="_blank">спец либах типо OpenCV</a> именно так и решают мою задачу </p>
  <figure id="PKRr" class="m_original">
    <img src="https://img2.teletype.in/files/5e/bb/5ebbe162-42e5-4f2c-9c73-eaf6a29afa73.png" width="300" />
  </figure>
  <p id="gQG5">Прогнал свою картинку на одном из сайтиков и понял, что это именно то что я искал. Онли пазл, ни каких цветов, ни какого мусора.  </p>
  <figure id="ldOw" class="m_original">
    <img src="https://img1.teletype.in/files/0b/0f/0b0f0df1-c46c-410f-9f86-8d0d248a38d7.png" width="369" />
  </figure>
  <p id="W9DG"><strong>Детектор границ Кенни (Canny)</strong></p>
  <p id="oHdu">Чуть поискав дальше, я нашел, что у этой задачи (выделения краев) есть допил на фильтра собеля, чтоб лучше фильтровать мусор. Это был <a href="https://en.wikipedia.org/wiki/Canny_edge_detector" target="_blank">алгоритм кеннни/кэннни/канни</a>. </p>
  <p id="KfnS">Я искал то, что работает без канваса, в 23.2.2 и <a href="https://www.npmjs.com/package/canny-edge-detector" target="_blank">тут (в canny-edge-detector) всё работает.</a> Это доп либа для библиотеки <a href="https://image-js.github.io/image-js/" target="_blank">image-js</a>, либы с кучей фич для обработки изображений.</p>
  <figure id="Zv58" class="m_original">
    <img src="https://img2.teletype.in/files/dd/93/dd93ea39-8f4e-4a5f-86ef-f748ff40153d.png" width="1022" />
  </figure>
  <p id="ZcHV">Даже <a href="https://github.com/image-js/canny-edge-detector/blob/master/src/index.js" target="_blank">код понятный.</a></p>
  <figure id="AAHs" class="m_original">
    <img src="https://img3.teletype.in/files/a7/5d/a75da2c9-ebf3-41ae-8d58-4aab0e01e505.png" width="1280" />
  </figure>
  <p id="RdHY">Очень простой и логичный подход, но на удивление эффективный. Просто переводим картинки в серое, уменьшая тем самым шум от цветов, упрощая картинку, затем применяем фильтр Гауса, чтобы добавить мыла и уменьшить количество деталей, а после восстанавливаем детали фильтром собеля (алгоритмом поиска края). Тем самым мы оставим только важные детали на картинке и получим чб. По итогу мы получим только очертания, без всякого мусора. При этом, размечать ничего тоже не надо. Иные подходы к слайдерам я разберу в одной из следующих статей.</p>
  <figure id="6LiB" class="m_original">
    <img src="https://img2.teletype.in/files/94/30/94308da3-1348-4e54-a463-aed5caf76d40.png" width="800" />
  </figure>
  <p id="NTW5">Я накидал простой код..</p>
  <figure id="Cck9" class="m_original">
    <img src="https://img4.teletype.in/files/f2/bf/f2bf4b6f-0188-4bfa-8659-284a4397705f.png" width="430" />
  </figure>
  <p id="0JMf">И в итоге оно сработало!</p>
  <figure id="W4Rg" class="m_original">
    <img src="https://img3.teletype.in/files/2d/40/2d4084f5-266f-4764-bccc-44843e072f79.png" width="498" />
  </figure>
  <p id="XxpU">Поэтому я сразу же решил упаковать все в модуль.</p>
  <figure id="ThGn" class="m_original">
    <img src="https://img2.teletype.in/files/17/26/17263be8-069b-4fbb-9258-2caeaded76ac.png" width="1489" />
  </figure>
  <p id="15wj">Юзать ноду конечно прикольно, но иметь 1 готовый блок на много прикольнее. Для этого я и сделаль сасный прекрасный модуль</p>
  <figure id="F3un" class="m_original">
    <img src="https://img4.teletype.in/files/b1/bd/b1bd6e3c-26bc-4164-beb3-ca938cff3b62.png" width="509" />
  </figure>
  <p id="vT0g">Чуть потыкав код модуля, обнаружил, что в меню можно нарисовать практически что угодно. Гифку, видео.. Ну я и нарисовал.</p>
  <figure id="gr78" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/18/78/18784326-96ae-4df2-86db-601b130303fe.gif" width="899" />
    <figcaption>Хотел поставить эту гифку, но оно сильно увеличивало время загрузки баса..</figcaption>
  </figure>
  <figure id="pvaD" class="m_original">
    <img src="https://img2.teletype.in/files/13/e9/13e9e399-419c-4ea1-afe7-11c8bd7cc13c.png" width="1634" />
  </figure>
  <figure id="kmrP" class="m_original">
    <img src="https://img1.teletype.in/files/40/57/405772fb-fb3b-4348-b486-bfd5e5b69caa.png" width="1447" />
  </figure>
  <p id="e6ab">Чет похерилось качество при конвертации в гифку.</p>
  <figure id="bbo1" class="m_original">
    <img src="https://img1.teletype.in/files/46/2b/462b108f-1b25-43c4-af08-2c2ab5c5a5f1.png" width="909" />
  </figure>
  <p id="TBE8"></p>
  <p id="7LnF">Анимаш очка</p>
  <figure id="jkAI" class="m_original">
    <img src="https://img4.teletype.in/files/3d/d5/3dd5f54d-7470-428e-87e9-603a42daa2bf.png" width="900" />
  </figure>
  <p id="4ZaT">И еще..</p>
  <figure id="Kouu" class="m_original">
    <img src="https://img4.teletype.in/files/b0/ae/b0aed841-6777-4e2c-93bc-407ce5c86cae.png" width="470" />
  </figure>
  <p id="ABT6">В итоге остановился на более минималистичной анимации, прост чтобы что-то мелькало.</p>
  <figure id="03iP" class="m_original">
    <img src="https://img4.teletype.in/files/fe/32/fe32aa7b-a4e3-4e6c-97ee-c68221d65cff.png" width="843" />
  </figure>
  <p id="qJKi"><strong>Че вышло по итогу?!</strong></p>
  <p id="rN2L">Дергаем мини пазл, отрезая X по фиксе и Y по прозрачности (сверху вниз).</p>
  <figure id="JRe7" class="m_original">
    <img src="https://img4.teletype.in/files/3d/f4/3df4e422-9046-4008-9719-3ddfa112a220.png" width="1300" />
  </figure>
  <p id="exxl">Докинем контуров, кроп фона и поиск картинки в картинке.</p>
  <figure id="XgFz" class="m_original">
    <img src="https://img3.teletype.in/files/27/4d/274d9cfc-714d-408b-8c79-3189b500281b.png" width="1085" />
  </figure>
  <p id="bmMr"></p>
  <p id="w8DH">Объединив генерацию мышки и шифрование тела из прошлых разделов с решалкой можем начать тестить.</p>
  <figure id="t0Oy" class="m_original">
    <img src="https://img2.teletype.in/files/d6/89/d68958f8-a997-4c1d-a6fc-499f288a8039.png" width="311" />
  </figure>
  <p id="erpA">Ну и все ебашит по красоте. Единственное, в половине случаев ему не нравились движения мышки. Фрод типо. С другой стороны, у меня и руками оно решалось через раз.</p>
  <figure id="PvBU" class="m_original">
    <img src="https://img1.teletype.in/files/86/30/8630d92b-ee39-44d5-84cd-0aa3c5c3c864.png" width="615" />
  </figure>
  <p id="peQ0">99% решения, сука. Не решилась всего одна ебучая картинка.</p>
  <figure id="tXiA" class="m_original">
    <img src="https://img2.teletype.in/files/9e/d5/9ed5dd79-767e-44b4-a60d-0438ae91d117.png" width="503" />
  </figure>
  <p id="qE0E"><strong>Преколы</strong></p>
  <p id="uvcO">Помимо этого нашел еще всяких приколов. Тогда я открыл для себя <a href="https://huggingface" target="_blank">huggingface</a>, где увидел кучу нейронок. Оказалось, что детектор края делают и на нейронках (нахуя, не очень понятно, но наверное в этом есть смысл). </p>
  <figure id="w7UW" class="m_original">
    <img src="https://img4.teletype.in/files/fb/79/fb797793-da09-4e36-8a56-612ab622f9ea.png" width="498" />
  </figure>
  <p id="mxSt">Ну и типо это все бесплатно. Тоесть оно решает и гугл и hcaptcha и эт готовые модельки. Как гитхаб, только для нейронок и с демками.</p>
  <figure id="2AKc" class="m_original">
    <img src="https://img4.teletype.in/files/bc/fc/bcfc0316-64c4-4900-8c37-9d1546532871.png" width="1263" />
  </figure>
  <figure id="hFbO" class="m_original">
    <img src="https://img4.teletype.in/files/3e/dc/3edc39d7-83d0-451f-b3fd-18effb9dd6c6.png" width="1278" />
  </figure>
  <p id="jnm5">Оказалось, есть алгоритмы генерации всякой хуйни на фракталах.</p>
  <figure id="GiG7" class="m_original">
    <img src="https://img2.teletype.in/files/99/6a/996a3882-492b-46bb-b2b6-cc88db66ab02.png" width="1147" />
  </figure>
  <p id="Ia1P">Вот такую всякую хуйню я почекал. Времени въебал конечно много, но было довольно весело. </p>
  <p id="Ig0H"><strong>Ну и казалось бы фсе, но нет..</strong></p>
  <figure id="4MCB" class="m_original">
    <img src="https://img4.teletype.in/files/72/db/72dba518-96a4-4062-b707-7941c22dc431.png" width="604" />
  </figure>
  <p id="D6kz"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="z2lc">Сoinmarketcap</h2>
  </section>
  <figure id="nPBj" class="m_original">
    <img src="https://img2.teletype.in/files/5e/be/5ebe81ff-8b58-4e33-bef5-c0fcfc0802c1.png" width="594" />
  </figure>
  <p id="MDWg">Спустя пару недель, как я разъебал банан, спросили &quot;могу ли я на заказ сделать coinmarketcap (авторизация и регистрация)?&quot;. Ну я и решил чекнуть че же там, со стороны выглядит, что банан, что coinmarketcap, примерно как одна хуйня.</p>
  <figure id="2OmL" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/46/4f/464fe787-9ed2-4014-92ad-9c0923aeefef.png" width="300" />
    <figcaption>Ебать, ну конечно я могу)</figcaption>
  </figure>
  <p id="vCXg">А потом я такой: лол они просто капчу банана поставили.. и домен в капче банана.. и подписи банана.. и кучу еще чего как у него. хм.. слишком уж все похоже.</p>
  <figure id="gFnH" class="m_original">
    <img src="https://img3.teletype.in/files/6d/69/6d691244-01c8-4d5b-991f-84c981e8bcd0.png" width="600" />
  </figure>
  <p id="YSFd">Интересно, конечно, что линка на капчу до сих пор валид: <a href="https://public.bnbstatic.com/image/antibot/image/SLIDE/20220804/01/f4b6ab69cf7f42939d9a0c77eacfea29.png" target="_blank">https://public.bnbstatic.com/image/antibot/image/SLIDE/20220804/01/f4b6ab69cf7f42939d9a0c77eacfea29.png</a></p>
  <figure id="pKAz" class="m_original">
    <img src="https://img2.teletype.in/files/12/aa/12aa5ff9-c111-4e5a-8e0d-a1a545964d62.png" width="370" />
  </figure>
  <h3 id="Ugzt">Регистрация</h3>
  <p id="JVHq">Хоть капча и та же (как и всё остальное), на всякий случай проведем поверхностный ресерч.</p>
  <figure id="51XF" class="m_original">
    <img src="https://img4.teletype.in/files/f9/6f/f96f1a89-8d06-436c-aa5f-c669da4a6f42.png" width="1279" />
  </figure>
  <p id="5F0c">И <strong>csrf </strong>токен в урле, как и в банане, md5 от нихуя</p>
  <figure id="E0ie" class="m_original">
    <img src="https://img4.teletype.in/files/fb/24/fb2489e6-7223-4cc2-bba1-1a835d859b31.png" width="1279" />
  </figure>
  <figure id="y76n" class="m_original">
    <img src="https://img3.teletype.in/files/23/d2/23d21d10-ce4e-4efc-b855-61aff753793a.png" width="1280" />
  </figure>
  <p id="a0AL"></p>
  <figure id="t5F5" class="m_original">
    <img src="https://img4.teletype.in/files/bb/c8/bbc8b9d4-b6ba-4d32-b25d-93f31342ff64.png" width="1277" />
  </figure>
  <p id="NXU8">В случае с бананом я прост 1 раз снимал свой фингер и юзал его, но раз это заказ, много аков.. желательно и этот момент по красоте порешать. </p>
  <figure id="lcsy" class="m_original">
    <img src="https://img3.teletype.in/files/2c/df/2cdfd75b-1b69-4f36-b85c-d9b1c79e59f2.png" width="1677" />
  </figure>
  <p id="yZra">Поэтому, нашел все данные для генерации фингера - <strong>deviceInfo</strong> и его подпись <strong>fingerprint</strong>. Для полноты картины нехватает только 3х подписей <strong>x-se </strong>на реге (x-se-bh, x-se-pd, x-se-rd) и <strong>Fvideo-Id</strong>. Фингер, кстати, подписывается через MurmurHash3 (x64hash128).</p>
  <figure id="S2ny" class="m_original">
    <img src="https://img3.teletype.in/files/6b/f5/6bf54203-b737-4d23-88a4-2c1221518698.png" width="1280" />
  </figure>
  <p id="uHu0">Про MurmurHash3 из либы fingerprintjs я писал уже на примере yahoo. Открытые сурсы либы нашел на каком-то гитлаб через гугел.</p>
  <figure id="xNjF" class="m_original">
    <img src="https://img2.teletype.in/files/13/a2/13a2fd17-1610-454a-9603-1c8c76ed335a.png" width="1280" />
  </figure>
  <p id="yFXn">Штош, раз ясно что собирать, накидаем скриптик.</p>
  <p id="1RNY">o = {<br />                screen_resolution: i.screenResolution,<br />                available_screen_resolution: i.avaScreenResolution,<br />                system_version: Rt(),<br />                brand_model: _t(),<br />                system_lang: r.language,<br />                timezone: Mt(),<br />                timezoneOffset: r.timezoneOffset,<br />                user_agent: r.userAgent,<br />                list_plugin: Pt(r),<br />                canvas_code: Bt(r.canvas),<br />                webgl_vendor: n.vendor,<br />                webgl_renderer: n.renderer,<br />                audio: r.audio,<br />                platform: r.platform,<br />                web_timezone: r.timezone,<br />                device_name: Et()<br />            }</p>
  <p id="EDgW">Данные тянуть можно из бас фингера, разве что аудио и обычный канвас не получится.. можно сделать нормально их, а можно чисто шума туда въебать, всеравно это хэш, а на фрод оно тут не повлияет)</p>
  <figure id="34Uj" class="m_original">
    <img src="https://img1.teletype.in/files/8e/0c/8e0cc91f-f139-4642-be02-c3dcc97ca5f4.png" width="399" />
  </figure>
  <p id="okPE">Ну я и накидал за пару минут.</p>
  <figure id="80Q8" class="m_original">
    <img src="https://img1.teletype.in/files/c5/ba/c5badada-251b-4cc6-b445-b6177bd8c349.png" width="1198" />
  </figure>
  <p id="8t0B">В отличие от банана, тут было еще некоторое количество дополнительных приколов, например подписи в заголовке, те самые <strong>x-se</strong>. А <strong>x-request-id</strong>, как и у банана, это тупо uuid4, а именно - <code>uuid4().replace(/-/g, &quot;&quot;)</code></p>
  <figure id="uJB4" class="m_original">
    <img src="https://img2.teletype.in/files/52/4a/524a436e-0ef6-4ef4-b506-32e2311bd681.png" width="1279" />
  </figure>
  <p id="hgYi">Ну и.. вот они, осталось деобфусцировать.</p>
  <figure id="QAcZ" class="m_original">
    <img src="https://img3.teletype.in/files/ac/5f/ac5fb400-a67d-4be7-95d3-432f2966790a.png" width="1280" />
  </figure>
  <p id="R7TR">Опять тело с хуйней как у капчи, опять xor по ключу. Хотя стоп, че это блять за координаты ебучие. Заметим ключик &quot;abcddcbabadc7hbw&quot;, он нам еще пригодится)</p>
  <figure id="42bU" class="m_original">
    <img src="https://img2.teletype.in/files/9d/24/9d2478bf-60b8-40fc-893c-9ef3d3b165c6.png" width="1279" />
  </figure>
  <p id="cSMG">Оказалось, оно тречит как чел тыкает вводит форму, это и есть подпись <strong>x-se-bh</strong>.</p>
  <figure id="oJ0a" class="m_original">
    <img src="https://img3.teletype.in/files/24/b5/24b54e8e-f4c5-4e1e-a198-4a76a457840f.png" width="1277" />
  </figure>
  <p id="w2Nb">Я взял и деобфусцировал ручками эту хуетень, получив код. Ксорим мы как раз с  &quot;abcddcbabadc7hbw&quot;. Причем, как оказалось, он статичный.</p>
  <figure id="VdiN" class="m_original">
    <img src="https://img1.teletype.in/files/c2/01/c201212b-5f28-467a-be9f-bc91091ad4fb.png" width="1225" />
  </figure>
  <p id="Ieon">Хорошо, перейдем к следующим подписям</p>
  <figure id="6OlX" class="m_original">
    <img src="https://img2.teletype.in/files/96/e0/96e034e1-e517-4314-a6e1-d7ec888b449d.png" width="1280" />
  </figure>
  <p id="HiVQ">Возьмем подпись <strong>x-se-rd</strong>. Мы енкодим какую-то рандом строку?!</p>
  <figure id="Ywes" class="m_original">
    <img src="https://img3.teletype.in/files/23/6a/236a3631-f087-46d2-af30-582445c4fa9e.png" width="1278" />
  </figure>
  <p id="Ptk8">Отреверсим алгоритм и получим.. такой же код как и для прошлой подписи. И ведь с <strong>x-se-pd</strong> ровно то же самое.</p>
  <figure id="MFWT" class="m_original">
    <img src="https://img1.teletype.in/files/0c/e0/0ce01e5b-120c-42a9-82af-cd69d26015c6.png" width="1030" />
  </figure>
  <p id="zqxT">Заметим, что дополнительно каждая подпись енкодится еще одним алгоритмом</p>
  <figure id="gYqv" class="m_original">
    <img src="https://img1.teletype.in/files/4c/1e/4c1ec418-6f13-4048-986c-11c55ed482cc.png" width="1020" />
  </figure>
  <p id="Blwc">Задекодим его и получим ровно то что ожидали. Однако, статичное число 1100.. </p>
  <figure id="m6Fa" class="m_original">
    <img src="https://img4.teletype.in/files/bf/dc/bfdce3b2-77d2-4701-8fa8-773a7c5288c3.png" width="1228" />
  </figure>
  <p id="Uw8w">Я почекал и оказалось что оно считается из длинны. И тут я подумал, ну а что если я возьму сделаю по шагам енкод, а потом наоборот декод, у нас ведь ксор. И это, действительно, сработало.</p>
  <figure id="zQ3R" class="m_original">
    <img src="https://img1.teletype.in/files/49/40/49407ad2-9b99-4aaa-9578-2d64aba0975b.png" width="1227" />
  </figure>
  <figure id="17ZI" class="m_original">
    <img src="https://img3.teletype.in/files/ea/c5/eac56183-117d-4d6d-91c1-e82816b99f9a.png" width="1227" />
  </figure>
  <figure id="IM6g" class="m_original">
    <img src="https://img1.teletype.in/files/0e/ea/0eea7b0e-d426-4b58-859d-3101250be4ee.png" width="1227" />
  </figure>
  <figure id="gAAp" class="m_original">
    <img src="https://img2.teletype.in/files/96/44/964453f9-1737-4e04-8902-3972d240ae36.png" width="1228" />
  </figure>
  <figure id="QRPF" class="m_original">
    <img src="https://img1.teletype.in/files/09/59/0959d6af-24de-40bf-8493-48c7851c44c4.png" width="1228" />
  </figure>
  <figure id="NkVd" class="m_original">
    <img src="https://img4.teletype.in/files/75/d5/75d52c09-6ff9-4c63-8917-0ba2fb40b00e.png" width="1228" />
  </figure>
  <figure id="Puzi" class="m_original">
    <img src="https://img2.teletype.in/files/de/13/de136b11-87fa-42e6-a89e-957aeef50db4.png" width="1227" />
  </figure>
  <figure id="s5WY" class="m_original">
    <img src="https://img4.teletype.in/files/fa/c2/fac261ba-38ac-4da8-8686-6f0ee09f4e1a.gif" width="275" />
  </figure>
  <p id="PkQc">Так на много удобнее работать с этими подписями. Увидел, закинул в свой алго, декодировал и чекнул че там.</p>
  <p id="uCGL">А актуален ли этот код? Да, перед выпуском данного материала я чекнул coinmarketcap и оно реально до сих пор работает.</p>
  <figure id="cG8o" class="m_original">
    <img src="https://img1.teletype.in/files/c3/3e/c33e163c-725a-4b4a-b46f-89b594838ff1.png" width="1238" />
  </figure>
  <figure id="k1xI" class="m_original">
    <img src="https://img4.teletype.in/files/fb/e2/fbe2e72c-f705-464c-b905-26e5480a0e70.png" width="1160" />
  </figure>
  <p id="yY5o"><strong>x-se-pd</strong> и <strong>x-se-rd</strong> похожи на рандом. Потыкав чуть код (пол часика тыкал код деобфусцируя через консольку), я убедился, что это и есть рандом. Тоесть рандом + контрольная сумма от него. Назвал я этот алгоритм hueta.</p>
  <figure id="SW0U" class="m_original">
    <img src="https://img4.teletype.in/files/bd/55/bd55adce-e822-4d61-b60c-ea04b6cf7e94.png" width="804" />
  </figure>
  <p id="Qk75"><strong>Итоговый код</strong>. Скорее всего, они они чекают тайм штамп в этой псевдо рандом подписи.</p>
  <figure id="EZPf" class="m_original">
    <img src="https://img4.teletype.in/files/38/96/389624ff-0d97-4d57-aa2d-cec7f5462f1f.png" width="436" />
  </figure>
  <p id="TzD4">Вернемся к подписи <strong>x-se-bh</strong>, тк её же надо тоже генерировать..</p>
  <figure id="WbsN" class="m_original">
    <img src="https://img1.teletype.in/files/83/be/83be6f3f-d175-4913-b850-2ed7ba603dad.png" width="966" />
  </figure>
  <p id="rsyf">А шо нам тут собственно надо?<br /><code>ec - счетчик каждого вида в el<br />el - набор всех движений<br />mt - статик параметры полей<br />sg - хуета хеш от el<br />si - сумма всех элементов el<br />t - текущее время</code></p>
  <figure id="dktB" class="m_original">
    <img src="https://img2.teletype.in/files/92/b7/92b7b6ec-b918-4d58-99f8-66913df01005.png" width="852" />
  </figure>
  <p id="DHdz">Ну, с <strong>sg </strong>всё понятно</p>
  <figure id="SVGg" class="m_original">
    <img src="https://img4.teletype.in/files/ba/76/ba7622f3-a3d0-4c5e-a829-5255a5b46d89.png" width="1227" />
  </figure>
  <p id="XKZq">А вот <strong>el</strong>.. бля, генерить дату под ввод каждого символа будет ооочень дрочно. Это получается, над учитывать длину вводимых данных, скорость ввода имитировать.</p>
  <figure id="hqxx" class="m_original">
    <img src="https://img3.teletype.in/files/aa/da/aada5548-20f0-471d-8306-1c32ffc381ea.png" width="426" />
  </figure>
  <p id="6hkx">И тут я подумал, можно же просто взять и сделать ctrl+c ctrl+v, как я люблю. В смысле, имитировать копировать вставить и эт сильно упростит мне задачу. </p>
  <p id="YHGK"><code>0 -  номер блока<br />ts - тип события<br />1659865878895 -  время старта<br />128,184 - координаты относительно всего экрана<br />112,28 - координаты относительно центра объекта</code></p>
  <p id="h4Br">Для события keydown не нужны ни какие координаты, как и для touchend, но тут добавляется всё равно черт очка -</p>
  <figure id="Lqxc" class="m_original">
    <img src="https://img4.teletype.in/files/b7/66/b766beef-0dfc-4cab-bea5-b51464d8a3c6.png" width="893" />
  </figure>
  <p id="ty0m">Я проделал все действия и заготовил образцовый шаблон.</p>
  <figure id="n9CS" class="m_original">
    <img src="https://img1.teletype.in/files/4a/11/4a116d12-670b-402c-ba32-de3bf0365b00.png" width="1279" />
  </figure>
  <p id="4qGk">Образцовый шаблон:<br /><code>0: &quot;0ts1659871850308-178,184-163,28&quot;<br />1: &quot;0te114-,&quot;<br />2: &quot;0k31&quot;<br />3: &quot;0m9-179,184&quot;<br />4: &quot;0d1-179,184-163,28&quot;<br />5: &quot;0u3-179,184&quot;<br />6: &quot;0k156&quot;<br />7: &quot;1ts6204-170,286-155,26&quot;<br />8: &quot;1te98-,&quot;<br />9: &quot;1m9-171,287&quot;<br />10: &quot;1d2-171,287-155,27&quot;<br />11: &quot;1u9-171,287&quot;<br />12: &quot;1k78&quot;<br />13: &quot;1k257&quot;<br />14: &quot;2ts1977-186,532-171,32&quot;<br />15: &quot;2te219-,&quot;<br />16: &quot;2m53-187,532&quot;<br />17: &quot;2d4-187,532-171,32&quot;<br />18: &quot;2u5-187,532&quot;</code></p>
  <p id="PZyO">Тыкаем на поле, потом жмем кноп очки копировать вставить, потом отпускаем и еще 1 раз но на второе поле, а потом тыкаем на кнопку отправки и тоже отпускаем.</p>
  <p id="JQvk"><code>touchstart<br />touchend<br />keydown<br />mousemove<br />mousedown<br />mouseup<br />keydown<br />————————-<br />touchstart<br />touchend<br />mousemove<br />mousedown<br />mouseup<br />keydown<br />keydown<br />————————-<br />touchstart<br />touchend<br />mousemove<br />mousedown<br />mouseup</code></p>
  <p id="AZ5i">Я всё это перевел в код</p>
  <figure id="GRmL" class="m_original">
    <img src="https://img4.teletype.in/files/7d/c9/7dc9452b-461f-462e-a7fd-d26965d3e4df.png" width="1029" />
  </figure>
  <p id="msl5">А потом собрал всё в более полный вид. Изи)</p>
  <figure id="JuZj" class="m_original">
    <img src="https://img2.teletype.in/files/5a/9f/5a9fc2fb-704c-40b4-8395-07b3f56ff3a2.png" width="1058" />
  </figure>
  <figure id="PVP6" class="m_original">
    <img src="https://img3.teletype.in/files/ee/d5/eed56f59-7c37-4d3f-b65f-3ea269ebf097.png" width="911" />
  </figure>
  <p id="6RAB">Так, с этим разобрались. В итоге, чё по хэдерам?</p>
  <figure id="U3nr" class="m_original">
    <img src="https://img4.teletype.in/files/b7/eb/b7ebdcad-39fd-461e-908c-e421b82eba29.png" width="966" />
  </figure>
  <figure id="iAId" class="m_original">
    <img src="https://img1.teletype.in/files/02/34/0234fb6d-1db7-45bd-bb77-3167b81d9b75.png" width="969" />
  </figure>
  <figure id="g3WQ" class="m_original">
    <img src="https://img4.teletype.in/files/f3/a4/f3a49773-150f-4d99-9342-a9b68da32b78.png" width="967" />
  </figure>
  <p id="NXp8"><strong>Пройдемся по порядку в хэдерах запроса реги</strong><br />URL запроса: https://api.coinmarketcap.com/auth/v4/user/signUp<br />1) <strong>x-csrf-token</strong>= о, он приходит в ответ на первый запрос<br />2) Дефолт хедеры:</p>
  <ul id="v0S2">
    <li id="DLPy">accept: application/json, text/plain, */*</li>
    <li id="ccRA">accept-encoding: gzip, deflate, br</li>
    <li id="Racn">accept-language: ru-RU,ru;q=0.9</li>
    <li id="FkJT">cache-control: no-cache</li>
    <li id="oN6u">content-length: 164</li>
    <li id="fvWw">content-type: application/json</li>
  </ul>
  <p id="pTtU">3) cookie имеют тут <strong>Fvideo-Id </strong>33899f3fa49a9da38d94435ff364252d052666b5, но больше там ничего нового или страшного нет, кроме <strong>sensorsdata2015jssdkcross</strong>..<br />4) <strong>device-info</strong> ну эт фингер<br />5) <strong>fvideo-id</strong> та самая золупа которую я и буду дальше ковырять<br />6) <strong>x-request-id</strong>: 6648b1f9fc3541ddb46540b670cd2b50 - uuid4 <br />7) Дальше подписи, как генерить их уже ясно, осталось данные научиться правильно готовить</p>
  <p id="SxVu">Кстати, это тоже uuid4: &quot;X-UI-REQUEST-TRACE&quot;, &quot;X-TRACE-ID&quot;, &quot;BNC-UUID&quot;</p>
  <p id="ngek">Чекал я <strong>Fvideo-Id</strong>, но ни где его не было и я уж было начал думать, что это какая-то генерация, но нет, он есть в ответе.</p>
  <figure id="dqA2" class="m_original">
    <img src="https://img4.teletype.in/files/32/26/32260a10-f243-4842-879c-715508c215db.png" width="1219" />
  </figure>
  <p id="i7Oi">Запросек <a href="https://api.commonservice.io/fvideo/tenant/sign/web?en=CXU&t=cmc" target="_blank">https://api.commonservice.io/fvideo/tenant/sign/web?en=CXU&amp;t=cmc</a></p>
  <figure id="5c95" class="m_original">
    <img src="https://img4.teletype.in/files/b9/2f/b92f8ba5-19b8-4a6a-a655-3f2d3a79b7de.png" width="699" />
  </figure>
  <p id="qyUi">А получаем мы его отправив фингер</p>
  <figure id="dcFl" class="m_original">
    <img src="https://img2.teletype.in/files/12/b5/12b57371-5b74-4d91-a15a-c0b5ff115fe1.png" width="1324" />
  </figure>
  <p id="AqDf">От фингера <strong>deviceInfo</strong> оно отличается неймингом и парой доп параметров, в остальном смысол одинаковый. Главное, канвас и аудио хэш совпадают, это  наверняка и чекают</p>
  <figure id="CD7A" class="m_original">
    <img src="https://img3.teletype.in/files/ad/91/ad91a7f3-ef16-4c4f-a35a-17349ac11b15.png" width="1318" />
  </figure>
  <p id="zPuW">До него улетает запрос на странный урл со словом antibot: <a href="https://api.commonservice.io/gateway-api/v1/friendly/antibot/coll" target="_blank">https://api.commonservice.io/gateway-api/v1/friendly/antibot/coll</a></p>
  <figure id="Y0nw" class="m_original">
    <img src="https://img2.teletype.in/files/1d/d3/1dd3db97-87d2-4d0c-9f5f-56eb02068a3b.png" width="1322" />
  </figure>
  <p id="cXdK">Параметр <strong>c</strong> не base64, потому я попробовал декодировать как подписи до этого. И оно сработало.</p>
  <p id="75ri">Обратим внимание на 52ce8bda-04ee-4fec-bea1-2c2781d992f7. </p>
  <figure id="txUA" class="m_original">
    <img src="https://img3.teletype.in/files/a5/43/a5431460-12ea-4d81-b260-797afe61c6ed.png" width="1511" />
  </figure>
  <p id="040K">Тоесть мы сначала шлем <a href="https://api.commonservice.io/gateway-api/v1/friendly/antibot/coll" target="_blank">https://api.commonservice.io/gateway-api/v1/friendly/antibot/coll</a> и после этого запрашиваем <strong>Fvideo-Id</strong>, при том передав один и тот же идентификатор. Так как это все на одном домене, закономерно предположить, что это отдельный антифрод.</p>
  <figure id="pl18" class="m_original">
    <img src="https://img4.teletype.in/files/76/7b/767b1458-d074-40dc-a10f-0e4cebed66df.png" width="883" />
  </figure>
  <p id="9LeS">Тогда антибот тож нужно пилить..</p>
  <p id="gluK"><strong>se_</strong> данные эт рандом с таймингом и контрольной суммой, как и в хэдерах ранее.</p>
  <figure id="PPwF" class="m_original">
    <img src="https://img3.teletype.in/files/a4/72/a4726c70-6f35-4dc0-af90-9cd3c0ff40d6.png" width="1486" />
  </figure>
  <p id="8ctP">А вот <strong>ev </strong>это еще один фингер. Даже парочку страшных слов есть, корс, языки.. ужос.</p>
  <figure id="oZYn" class="m_original">
    <img src="https://img4.teletype.in/files/78/bc/78bcde89-a9fe-45da-bd72-ddbe7760fdcf.png" width="1378" />
  </figure>
  <p id="eAFM"> На самом деле, тут ничего страшного нет, чуть ручками деобфусцировать и готово.</p>
  <figure id="N83E" class="m_original">
    <img src="https://img2.teletype.in/files/93/c0/93c0dab0-60d7-406d-9728-ee8c692e7431.png" width="1675" />
  </figure>
  <p id="5nsL">hl - <code>window.history</code></p>
  <figure id="oFqk" class="m_original">
    <img src="https://img3.teletype.in/files/20/9a/209aab6e-ce77-47a8-9239-9ff928d16b21.png" width="665" />
  </figure>
  <p id="3u2f">ivw - <code>(&#x27;$cdc_asdjflasutopfhvcZLmcfl_&#x27; in document) || !!i[&#x27;webdriver&#x27;] || ![];</code></p>
  <figure id="1cYA" class="m_original">
    <img src="https://img2.teletype.in/files/d4/8b/d48b013f-7834-4002-9e92-946933b63718.png" width="1329" />
  </figure>
  <p id="Fpwf">ismo - <code>/Android|webOS|iPhone|iPad|iPod|BlackBerry|Mobile/i.test(navigator.userAgent) || &#x27;ontouchstart&#x27; in window || (&#x27;orientation&#x27; in window);</code></p>
  <figure id="xWvP" class="m_original">
    <img src="https://img3.teletype.in/files/66/2b/662bfc5e-4c2a-4e80-b509-46496ad25f03.png" width="1307" />
  </figure>
  <p id="5QaU">cors - <code>window.XMLHttpRequest</code></p>
  <figure id="Z3PB" class="m_original">
    <img src="https://img2.teletype.in/files/14/b1/14b1a3bb-3a3c-4e9c-876f-7d0aa2cd00e3.png" width="724" />
  </figure>
  <p id="WjDV"><strong>Чё по кукам?</strong><br />1) sajssdk_2015_cross_new_user=1;<br />2) sensorsdata2015jssdkcross={&quot;distinct_id&quot;:&quot;1827ee10e6213e-07d1158fc471378-5437971-250125-1827ee10e6a12d&quot;,&quot;first_id&quot;:&quot;&quot;,&quot;props&quot;:{&quot;$latest_traffic_source_type&quot;:&quot;直接流量&quot;,&quot;$latest_search_keyword&quot;:&quot;未取到值_直接打开&quot;,&quot;$latest_referrer&quot;:&quot;&quot;},&quot;identities&quot;:&quot;eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTgyN2VlMTBlNjIxM2UtMDdkMTE1OGZjNDcxMzc4LTU0Mzc5NzEtMjUwMTI1LTE4MjdlZTEwZTZhMTJkIn0=&quot;,&quot;history_login_id&quot;:{&quot;name&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;$device_id&quot;:&quot;1827ee10e6213e-07d1158fc471378-5437971-250125-1827ee10e6a12d&quot;}; <br />3) _ga=GA1.....; _gid=GA1.2.1...;<br />4) se_sd=gUKVhWRwDRVGQ4HxaCBlgZZF1AgkNESW1tWBcVEN1hdWwVlNXVIO1; se_gd=hNTVhUhgRHAUVBVlSCgggZZXQElUGBVUFoSBcVEN1hdWwDlNXVcM1; se_gsd=XjEgOzBhLCM0CQUxNAw2Ci0xEgFXAQBXV1lBW1NWVlhbAlNS1;</p>
  <p id="riRK"><strong>sensorsdata2015jssdkcross</strong></p>
  <figure id="yh1a" class="m_original">
    <img src="https://img1.teletype.in/files/0a/ca/0aca05fd-3a9a-4ef0-a123-2c77b6777403.png" width="1288" />
  </figure>
  <figure id="5TNG" class="m_original">
    <img src="https://img3.teletype.in/files/e6/39/e6396883-e8e3-4643-b15e-f24814f900ea.png" width="1019" />
  </figure>
  <figure id="VM0k" class="m_original">
    <img src="https://img3.teletype.in/files/ac/ca/acca9306-1049-4f78-9d1a-ee8f96188d5b.png" width="1317" />
  </figure>
  <p id="faGk">Вообще, это вроде какие-то <a href="https://www.tencentcloud.com/document/product/301/17346" target="_blank">чисто китайские кукисы</a>.</p>
  <figure id="35rd" class="m_original">
    <img src="https://img2.teletype.in/files/1f/37/1f3732b9-af6a-4d1b-81a4-1264b0571e65.png" width="1240" />
  </figure>
  <p id="LsV3"></p>
  <p id="pzO1">А вот <strong>se_</strong>.. непонятно только от куда берется <strong>se_gsd </strong></p>
  <figure id="cL57" class="m_original">
    <img src="https://img2.teletype.in/files/15/f6/15f6b308-c83b-45b6-ba8c-c02026ad68d3.png" width="557" />
  </figure>
  <p id="52sX"> <strong>se_gsd </strong>берется из ответа на этот запрос + немного доп обработки.</p>
  <p id="kAn3"><code>&quot;T1LVF1UUlBUAlNwAgwYBQMIUVpkIDM2IQMxDjE3VgMhFSdyLDA0w9223q9dj04&quot;.split(&#x27;&#x27;).reverse().join(&#x27;&#x27;)</code></p>
  <p id="UEe8"><code>parseInt(&quot;40jd9q3229w0ADLydSFhMgV3EjDxMQI2MDIkpVUIMQBYwgAwNlAUBlUU1FVL1T&quot;.length/0x5)</code></p>
  <figure id="whRK" class="m_original">
    <img src="https://img2.teletype.in/files/db/87/db87c2fb-bc5b-4bfa-81d5-b040a0480655.png" width="1513" />
  </figure>
  <p id="SVFu">А такая функция у меня уже есть</p>
  <figure id="KQZb" class="m_original">
    <img src="https://img1.teletype.in/files/84/4c/844c964a-74a3-4a9b-bcdc-e93ff4346f4b.png" width="1437" />
  </figure>
  <figure id="CeIG" class="m_original">
    <img src="https://img4.teletype.in/files/3a/82/3a820cdd-7c78-4714-ad4c-101245584b43.png" width="649" />
  </figure>
  <p id="tI6J">Еще встретил в процессе реверса какие-то преколы. </p>
  <figure id="xF17" class="m_original">
    <img src="https://img3.teletype.in/files/27/fd/27fdf85c-9d1c-46f4-84f8-68ec019f3180.png" width="1096" />
  </figure>
  <p id="Mi7D"><strong>Как я сделал по итогу</strong></p>
  <p id="cqXq">Мне было лен парсить и форматировать фингеры баса, поэтому я сделал html страничку и прогнал на эмуле скрипты с установкой фингера.</p>
  <figure id="7gL8" class="m_original">
    <img src="https://img2.teletype.in/files/58/fa/58fa8f00-5f41-4ce6-a74e-0e74f723aeb9.png" width="1428" />
  </figure>
  <p id="00Zn">Ну а далее все как было ранее, формируем фингер и докидываем хэш, формируем из него фингер для fvideo, дергаем кукисы, касуем генерацию sensorsdata2015jssdkcross, формируем sd_ подписи и проходим antibot, получив fvideo.</p>
  <figure id="J9y3" class="m_original">
    <img src="https://img2.teletype.in/files/5b/3e/5b3e5156-c1ae-4ae9-9058-244c1bd802f3.png" width="1497" />
  </figure>
  <p id="IYky">А далее автори. Кастуем подписи, получаем куки, решаем капчу, пытаемся войти по токену качпчи.</p>
  <figure id="mWLf" class="m_original">
    <img src="https://img2.teletype.in/files/15/9d/159d7c62-c6c3-441a-abff-c103a91e4583.png" width="1588" />
  </figure>
  <p id="3Fda">С капчей все как было разобрано ранее. Получаем, режем, решаем, получаем токен решения.</p>
  <figure id="7eaB" class="m_original">
    <img src="https://img3.teletype.in/files/a5/24/a52425c3-4d2d-48ea-b0e6-10efd7e2cc3f.png" width="1342" />
  </figure>
  <p id="nyGQ">В итоге, все работает. Не удивительно.</p>
  <figure id="r4sM" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/24/c0/24c0643e-8e04-4b96-a7f6-2bba1b3fd8ee.png" width="1280" />
    <figcaption>И для невалид пароля.</figcaption>
  </figure>
  <figure id="psMv" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/af/f4/aff4b466-8a01-47f6-92bd-78e411efb24f.png" width="1280" />
    <figcaption>И для валид.</figcaption>
  </figure>
  <p id="Zbe8">Единственное, модуль на 23.2.2 бас в 12 ноде перестал работать, тк тянул новую версию image-js с какой-то багой. Хотя на новом бас в 18 ноде оно работает нормально. Для 23.2.2 я нашел ласт валидную версию - 0.21.9 и фиксанул модуль.    </p>
  <h3 id="bxqM">Авторизация</h3>
  <p id="jJkG">И тут меня ждал сюрприз. Я делал под слайдер, а тут не слайдер. Тут хуйня как у бинанса. Нахуя я тогда вообще ебался со слайдером?</p>
  <figure id="Frqx" class="m_original">
    <img src="https://img3.teletype.in/files/a2/54/a25447da-a4e5-4109-b818-2daa6d95cce7.png" width="1874" />
  </figure>
  <p id="CFg4">Я начал тыкать капчу, презагружал много раз, переключал на регу. И случилось чудо. Я обнаружил &quot;фичу&quot; с подменой капчи)</p>
  <figure id="89BH" class="m_original">
    <img src="https://img1.teletype.in/files/c2/a1/c2a1c6d6-a4c0-433c-8646-85fe06b7a313.png" width="469" />
  </figure>
  <p id="cnfj">Цимес тут вот в чем. Нельзя просто так взять и получить капчу. Капча привязана к &quot;приложению&quot;, а именно токену который оно возвращает. Тоесть при запросе авториза оно вертает securityId (securityCheckResponseValidateId)</p>
  <figure id="isbo" class="m_original">
    <img src="https://img1.teletype.in/files/c9/3a/c93a04ed-e149-4afa-b5a5-23975b2b68c9.png" width="362" />
  </figure>
  <p id="yCS4">По этому айди вертает только капчу приложения, тоесть что бы я не написал biz mode (CMC_register например), оно вернет такую капчу, какая положена для этого ендпоинта.</p>
  <figure id="s0Gt" class="m_original">
    <img src="https://img4.teletype.in/files/7d/e7/7de7f23f-10ff-482d-b911-4961ac7e41c5.png" width="1075" />
  </figure>
  <p id="bWl7">Только вот есть нюанс. Я могу получить капчу слайдер для регистрации, а токен решения потом применить на авторизации) </p>
  <figure id="0c6e" class="m_original">
    <img src="https://img1.teletype.in/files/81/4a/814af3fd-0ca9-4269-9b42-3ef5cc098238.png" width="1258" />
  </figure>
  <p id="4uFj">Собственно, это я и сделал, запилив по итогу фул рабочий софт всего с 1 капчей. </p>
  <figure id="JU4a" class="m_original">
    <img src="https://img3.teletype.in/files/a5/d0/a5d06c99-54a8-4852-abed-66be8b9f2520.png" width="671" />
  </figure>
  <p id="Sngu">Все ебашит по красоте)</p>
  <figure id="Fxzz" class="m_original">
    <img src="https://img2.teletype.in/files/9e/67/9e67aa2d-21b9-40ba-99b4-faaa64c8c2c1.png" width="424" />
  </figure>
  <h3 id="Lj45">А почему не соло? </h3>
  <p id="An6M">Потому-что у меня есть дохуя потоков чтобы выебать бинанс)</p>
  <figure id="lKgG" class="m_original">
    <img src="https://img1.teletype.in/files/88/b4/88b4b153-ae64-405a-98d1-08e9d85013b0.png" width="998" />
  </figure>
  <h2 id="j43m">Дополнение</h2>
  <p id="Umda">Чёт я решил ещё раз почекать бинанс перед публикацией и случайно наткнулся на <a href="https://www.binance.com/ru/captcha/test" target="_blank">демо страницу</a>, страницу с капчей и без шифрования. На её примере на много проще понять всю эту хуйню.</p>
  <p id="T2Vg">И так, у нас есть тело</p>
  <figure id="89AJ" class="m_original">
    <img src="https://img1.teletype.in/files/c5/a4/c5a4ba68-6e6e-4e90-b1f9-1109a7c03e6f.png" width="1677" />
  </figure>
  <p id="EtNB">Чекаем вызовы</p>
  <figure id="ZEK9" class="m_original">
    <img src="https://img3.teletype.in/files/64/55/64558176-300a-42df-aca2-d4b8ceefebd3.png" width="644" />
  </figure>
  <p id="erPW">Чуть выше видим формирование тела решения капчи</p>
  <figure id="43R1" class="m_original">
    <img src="https://img1.teletype.in/files/44/25/44256c9f-806c-4da2-96e0-d4f5d411a18c.png" width="1319" />
  </figure>
  <p id="9KsW">Перейдем тогда сразу <strong>к шифрованию</strong>. Видим ультра гига мега шифровку на ксор в пару строк)</p>
  <figure id="Bbey" class="m_original">
    <img src="https://img1.teletype.in/files/c5/52/c552db44-8078-4361-a347-72f559f40aa6.png" width="1486" />
  </figure>
  <p id="puJh">У меня по итогу ручной деобфускации вышел тот же код по сути.</p>
  <figure id="eIWy" class="m_original">
    <img src="https://img4.teletype.in/files/77/3d/773ddc22-c53b-43f2-a275-972735a25479.png" width="526" />
  </figure>
  <p id="cjyr">В мое случае также sig была в качестве контрольной суммы, но туть она прилетает сразу.</p>
  <figure id="fkh3" class="m_original">
    <img src="https://img1.teletype.in/files/8d/34/8d342f45-771a-4ed5-9d12-affa9cd47ed8.png" width="379" />
  </figure>
  <p id="BCXn">Чекнем <strong>ev</strong>. Штош, без обфускации выглядит совсем не страшно</p>
  <figure id="KWPh" class="m_original">
    <img src="https://img4.teletype.in/files/74/b7/74b7c1ec-b96e-4903-a804-0ed10c310d6f.png" width="1242" />
  </figure>
  <p id="Vht9">Ну, а c <strong>be</strong> тут все тоже на много яснее.</p>
  <figure id="zKvg" class="m_original">
    <img src="https://img1.teletype.in/files/8b/04/8b041416-9088-4ec8-8f59-b8146a6560c4.png" width="1242" />
  </figure>
  <figure id="UhQv" class="m_original">
    <img src="https://img1.teletype.in/files/8b/04/8b041416-9088-4ec8-8f59-b8146a6560c4.png" width="1242" />
  </figure>
  <figure id="adAc" class="m_original">
    <img src="https://img2.teletype.in/files/db/fd/dbfd4662-a326-4995-8b85-8a39439e1f5f.png" width="1241" />
  </figure>
  <p id="GgQt">Я искал файл который дебажил (с обфускацией), но он не сохранился, благо на скрине осталось название, а потому я <a href="https://bin.bnbstatic.com/static/chunks/commons.0063d6c1.js" target="_blank">смог дернуть искомый файл</a>)</p>
  <figure id="Qf89" class="m_original">
    <img src="https://img1.teletype.in/files/4c/f3/4cf3033d-5440-4c6b-9b1d-a09634af7c2b.png" width="1263" />
  </figure>
  <p id="njoS">Я думал, что в проде данная капча уже не юзается, раз сурсы открытые. Но оказалось шо нет, до сих пор висит на каких-то эндпоинтах. </p>
  <figure id="hiK9" class="m_original">
    <img src="https://img1.teletype.in/files/c9/42/c9421d1b-2498-4ce7-a29a-8f1a375f85e4.png" width="426" />
  </figure>
  <p id="vSFC">А это значит, что можно подсунуть её токен в любой эндпоинт)</p>
  <figure id="1xF4" class="m_original">
    <img src="https://img4.teletype.in/files/bc/fb/bcfb0776-1537-4570-90ec-6456c751b094.png" width="798" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/qoQWFGT3vDw</guid><link>https://teletype.in/@it_hueta/qoQWFGT3vDw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/qoQWFGT3vDw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Tutanota и капча с часами</title><pubDate>Fri, 22 Mar 2024 01:36:44 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/0f/a1/0fa1134a-2817-4428-a30f-3bf96417b314.png"></media:content><category>вах</category><description><![CDATA[<img src="https://img2.teletype.in/files/5b/33/5b33c702-c92a-454c-938e-fe4a6e2d5129.png"></img>Цель жизни - въебать тутаноту (или хотябы тикток).]]></description><content:encoded><![CDATA[
  <figure id="tMtZ" class="m_original">
    <img src="https://img2.teletype.in/files/5b/33/5b33c702-c92a-454c-938e-fe4a6e2d5129.png" width="1920" />
  </figure>
  <p id="XOdh">Цель жизни - въебать тутаноту (или хотябы тикток).</p>
  <p id="NK0V">В очередной раз, все началось с вопросика в чате</p>
  <figure id="AjcP" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4e/3e/4e3e126d-8630-46f0-b5b8-ba416d640ebc.png" width="388" />
    <figcaption>Вопрос в чате</figcaption>
  </figure>
  <p id="lvIz">Я в ответ в чатике написал небольшой обзор подходов, как ее можно было бы решать. И сразу написал в лс автору вопроса и.. игнор, час, два. Кто вообще спит в 5 утра? Хотя на след день мне уже ответили.</p>
  <p id="TWkE">А я вообще-то потыкать ее хотел. Нахуя тогда было спрашивать..(</p>
  <ul id="8D4F">
    <li id="BcTH">Как узнать время по часам <a href="https://ru.wikihow.com/%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D0%BF%D0%BE-%D1%87%D0%B0%D1%81%D0%B0%D0%BC" target="_blank">https://ru.wikihow.com/%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D0%BF%D0%BE-%D1%87%D0%B0%D1%81%D0%B0%D0%BC</a></li>
    <li id="eqEn"><a href="https://gohtml.ru/js/82-canvas-s-nulya-analogovyie-chasyi-na-js" target="_blank">Аналоговые часы на JS https://gohtml.ru/js/82-canvas-s-nulya-analogovyie-chasyi-na-js</a></li>
    <li id="NX9t"><a href="https://ru.stackoverflow.com/questions/859941/%D0%A7%D0%B0%D1%81%D1%8B-%D0%BE%D1%82%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-canvas" target="_blank">Часы отрисованные canvas https://ru.stackoverflow.com/questions/859941/%D0%A7%D0%B0%D1%81%D1%8B-%D0%BE%D1%82%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-canvas</a></li>
  </ul>
  <figure id="0k9x" class="m_original">
    <img src="https://img3.teletype.in/files/ea/40/ea4005f3-e66e-4994-be12-350e6badc3d4.png" width="698" />
  </figure>
  <figure id="EQ6c" class="m_original">
    <img src="https://img1.teletype.in/files/42/d9/42d9c476-75ec-4651-a2e3-6f9a88026027.png" width="868" />
  </figure>
  <figure id="nChK" class="m_original">
    <img src="https://img4.teletype.in/files/fc/0e/fc0ed2a8-3578-4bed-b0c3-5732f4ef3b21.png" width="965" />
  </figure>
  <p id="VGFa">Тогда я подумал: В пизду, сам блять найду эту капчу и выебу ее нахуй</p>
  <p id="PPhQ">И где же я ее нашел? в Яндексе, а в Гугле блять нихуя! Хотя, странно что оно гит коммит проиндексировало.</p>
  <p id="cAXQ"><a href="https://github.com/tutao/tutanota/commit/23017c06e4291acf9cd9265749ec055cc4ac78bb.patch" target="_blank">https://github.com/tutao/tutanota/commit/23017c06e4291acf9cd9265749ec055cc4ac78bb.patch</a></p>
  <figure id="qVCg" class="m_original">
    <img src="https://img3.teletype.in/files/65/47/6547f60d-b63a-427d-9daa-626498a8a59f.png" width="1175" />
  </figure>
  <p id="kteR"><a href="https://github.com/tutao/tutanota/commit/23017c06e4291acf9cd9265749ec055cc4ac78bb" target="_blank">https://github.com/tutao/tutanota/commit/23017c06e4291acf9cd9265749ec055cc4ac78bb</a></p>
  <figure id="xCGK" class="m_original">
    <img src="https://img3.teletype.in/files/e1/3d/e13ddc30-ad78-4f5b-89a3-dfdb1a1ead26.png" width="1147" />
  </figure>
  <p id="oNLT"><a href="https://github.com/tutao/tutanota/blob/f52ac6e09af03925863d76410fd0862b147c58f4/src/subscription/Captcha.ts" target="_blank">https://github.com/tutao/tutanota/blob/f52ac6e09af03925863d76410fd0862b147c58f4/src/subscription/Captcha.ts</a></p>
  <figure id="I7O4" class="m_original">
    <img src="https://img4.teletype.in/files/34/9d/349dcdae-ce51-45c1-a07f-857704ff25c6.png" width="1050" />
  </figure>
  <p id="ofUF"><a href="https://github.com/tutao/tutanota/blob/c3637bf6487431c7383b49da033e894adc19bd06/test/tests/subscription/SignupFormTest.ts" target="_blank">https://github.com/tutao/tutanota/blob/c3637bf6487431c7383b49da033e894adc19bd06/test/tests/subscription/SignupFormTest.ts</a></p>
  <figure id="9zS2" class="m_original">
    <img src="https://img4.teletype.in/files/bc/ab/bcab51fa-d9c1-402b-8dbd-a93a57cea3d0.png" width="867" />
  </figure>
  <p id="xL5x">Еще было <a href="https://zennolab.com/discussion/threads/ne-mogu-najti-reshenie-kapchi.106997/" target="_blank">обсуждение на форуме зенки</a>. Я мельком почекал, но чужие решения мне не сильно инетересны</p>
  <figure id="XYhz" class="m_original">
    <img src="https://img2.teletype.in/files/da/0c/da0cbcaa-df21-4898-9576-ce45bf9e9d23.png" width="878" />
  </figure>
  <p id="t8dQ">Нашел про капчу часы в блоге протона, но примера не нашел там <a href="https://proton.me/blog/captchas" target="_blank">https://proton.me/blog/captchas</a></p>
  <figure id="MmAI" class="m_original">
    <img src="https://img4.teletype.in/files/32/25/3225d5f5-9a02-432b-b0b1-d5dd6fcbfad7.png" width="325" />
  </figure>
  <figure id="mAAj" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8a/17/8a177c02-884f-4603-adb7-507596087cc4.png" width="481" />
    <figcaption>Пример капчи</figcaption>
  </figure>
  <h2 id="YyWg">Похуярили</h2>
  <p id="nWoR">Даже зная что искать, капчу получить мне удалось не сразу, пришлось по перебирать прокси. </p>
  <figure id="xJ7F" class="m_original">
    <img src="https://img3.teletype.in/files/a7/54/a754cf73-1dc3-45d2-bc24-dc2c69e0ae19.png" width="333" />
  </figure>
  <p id="8u1J">Сразу бросается в глаза то, что часы разных размеров и расположены в разных частях картинки. Тогда над для начала кропнуть их.</p>
  <figure id="GsGn" class="m_original">
    <img src="https://img1.teletype.in/files/86/e0/86e0420b-bc09-4892-a317-97a5cdc09f5b.png" width="272" />
  </figure>
  <p id="Y0A1">Проходимся по всей картинке, ищем границы чекая черные пиксели. </p>
  <figure id="pEce" class="m_original">
    <img src="https://img3.teletype.in/files/aa/69/aa6979a8-3124-47b5-b0fc-5b2809fb3be4.png" width="1153" />
  </figure>
  <p id="GBBc">Кропаем картинку по полученным координатам. Пока всё довольно просто.</p>
  <figure id="wxt1" class="m_original">
    <img src="https://img4.teletype.in/files/b1/4f/b14f737c-4da0-4468-b3c6-562eacfc7a1b.png" width="817" />
  </figure>
  <p id="E6zP"></p>
  <p id="9Ai5">Акей, теперь мысля следующая, нам надо как-то рисовать круги зная радиус. Я решил поискать другой варик, не тот что скинул в ориг ответе, чуток погуглил и нашел ответ на хабре <a href="https://qna.habr.com/q/623933" target="_blank">https://qna.habr.com/q/623933</a></p>
  <figure id="C7jf" class="m_original">
    <img src="https://img2.teletype.in/files/9f/bc/9fbce5fc-4a89-42d7-bf7f-a53e8804e240.png" width="640" />
  </figure>
  <p id="0Usm">И в итоге накидал следующий код, чтобы рисовать кружок.</p>
  <figure id="eWEn" class="m_original">
    <img src="https://img4.teletype.in/files/73/a7/73a78b78-6fd6-459b-9157-82812a9feaa1.png" width="948" />
  </figure>
  <p id="1w1H">Я перегнал градусы в другую систему координат, чтоб можно было считать позицию X и Y. </p>
  <figure id="nLNg" class="m_original">
    <img src="https://img3.teletype.in/files/6d/b1/6db132ed-8d61-45f2-8d18-6ef13fae091d.png" width="157" />
  </figure>
  <p id="7LUj">Прошелся по всему кругу, увеличивая позицию на шаг. Тк шаг мелкий, а пиксель большой, сейвил позицию ласт пикселя, чтобы 2 раза его не считать потом. Дополнительно +радиус к позиции, тк в радианах оно считает типо от центра, а у нас 0 это лево верх.</p>
  <figure id="sfkY" class="m_original">
    <img src="https://img4.teletype.in/files/b6/10/b610f606-b6b9-45e4-9084-94a77534f00f.png" width="600" />
  </figure>
  <p id="DnDG">Докинем лог и получим чет типо этого, если чекать и менять цвет пикселя. Тогда остается сделать так, чтобы проходило по кругу в некотором диапозоне и как-то понимать где какая стрелка.</p>
  <figure id="QRDh" class="m_original">
    <img src="https://img2.teletype.in/files/5c/c0/5cc0365c-2ba8-4bea-bcf9-084ace11ea2f.png" width="1280" />
  </figure>
  <p id="jtvh">Если мы будем двигаться из центра наружу, то нам получается нужно найти сначала центр, выкинуть центральный круг и двигаться от его позиции, потом найти первый пиксель и засейвить его положение в градусах, чтобы следить отдельно тк мы не знаем какая именно это стрелка. Потом ждать на каком из диапазонов, первом или большом, кончается черные пиксели, что в итоге и станет ответом на вопрос какая первая была стрелка. Если обе были на 1 позиции, то во втором диапазоне изначально не будет черных пикселей.</p>
  <figure id="e0NA" class="m_original">
    <img src="https://img2.teletype.in/files/db/c7/dbc7c070-7095-40db-8701-1dd4269b7fe9.png" width="255" />
  </figure>
  <figure id="9Mwp" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/82/32/823279b5-e190-4fea-95c5-ed6240345f7b.png" width="1280" />
    <figcaption>Кто понял, тот понял</figcaption>
  </figure>
  <p id="E04g">Я не очень умный, поэтому подумал сделать все наоборот, искать первую - большую, а потом мелкую, двигаясь из наружи к центру.</p>
  <figure id="o8Uc" class="m_original">
    <img src="https://img4.teletype.in/files/3d/42/3d421e0a-0a13-4d55-9864-04eb894388bc.png" width="1000" />
  </figure>
  <p id="3xED">А еще, вдруг картинка повернута, как например тут или хуже, значит над в любом случае будет искать где начало. </p>
  <figure id="zN1Z" class="m_original">
    <img src="https://img1.teletype.in/files/8d/ad/8dadea56-d1b7-40b9-a11d-5481eab7e041.png" width="500" />
  </figure>
  <p id="NkwC">На самом деле, в любом случае нужно искать границы для стрелок, чтобы учесть ситуацию, где обе стрелки в 1 положении, иначе оно будет ебошить либо в 0, либо на край капчи и проще сразу это учесть)</p>
  <p id="Dw8S">И так уж совпало, что начало - цифра 1, всегда прорисована твердо и четко, поэтому я захардкодил ее поиск. Делим на 8 частей и в 4 ищем длинную прямую палку. </p>
  <figure id="SKMK" class="m_original">
    <img src="https://img2.teletype.in/files/d9/97/d9973bfa-08ce-4c66-a962-ed9e44a0a475.png" width="392" />
  </figure>
  <p id="HB97">Двигаемся сверху вниз (y), справа налево (x), чтоб быстрее добраться и прийти от зеленой точки к синей. Ищем черный пиксель. К синей (левому краю), тк в ситуации с зеленой стрелкой (12-60 минут), у нас самой нижней точкой может оказаться стрелка, а нужно получить нижнюю точку единички, потому ищем макс нижнюю левую.</p>
  <figure id="XylB" class="m_original">
    <img src="https://img1.teletype.in/files/07/b8/07b8f899-87aa-470e-b208-ebd9def3bf85.png" width="944" />
  </figure>
  <p id="qnxX">Она будет нашим отступом от края по всей длине окружности.</p>
  <figure id="tE5Q" class="m_original">
    <img src="https://img3.teletype.in/files/28/c2/28c29d2b-574c-4b67-bf45-ef96c42db9fb.png" width="605" />
  </figure>
  <p id="o6Ux">В итоге получим вот такую границу.</p>
  <figure id="R4Fc" class="m_original">
    <img src="https://img1.teletype.in/files/8e/77/8e77ce5e-fcfa-4695-94f6-57d27028d8a1.png" width="389" />
  </figure>
  <p id="EbkT">Теперь надо найти границы центрального кружка, чтобы установить нижнюю границу для диапазона поиска. Я просто двигался в 4 стороны по 1 пикселю, пока не встретил не черный на как минимум 2х позициях. </p>
  <figure id="Hkdy" class="m_original">
    <img src="https://img3.teletype.in/files/ec/0b/ec0bdb81-78c7-4815-aa32-50510420d5d3.png" width="859" />
  </figure>
  <p id="BFQp">В итоге я все накидал, но столкнулся вот с такой хуйней. Я не оч умный, хоть и видел всякое дерьмо, но даже я ахуел. Хотя казалось бы, база.. (зеленым выделил диапазон, который скипается при проверке). </p>
  <p id="fh8L">Речь про лог. Если чекнуть внимательно, видно как на переменную в итоге влиял реверс. Массив перемешивается в процессе работы, блен, это ж типо другая функция.. хуле оно так делает. Зелененький диапазон распидорасило, неприятненько.</p>
  <figure id="tr5W" class="m_original">
    <img src="https://img4.teletype.in/files/f9/34/f9347601-0a05-468f-8645-59419a9a08a1.png" width="1612" />
  </figure>
  <p id="IVSg">Вот более простой пример, чтобы было понятно о чем речь.</p>
  <figure id="DnWz" class="m_original">
    <img src="https://img1.teletype.in/files/41/fb/41fb8b08-d015-4035-b4e1-31336c7170e6.png" width="247" />
  </figure>
  <figure id="Kfsf" class="m_original">
    <img src="https://img3.teletype.in/files/a0/24/a024a9db-d1f3-4253-96a1-7886b6a9e461.png" width="480" />
  </figure>
  <p id="acwb">Все дело в старом советском ..  <a href="https://learn.javascript.ru/object-copy" target="_blank">Копировани объектов и ссылки</a> и нет, const тут не поможет. <a href="https://ru.stackoverflow.com/questions/1178298/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BF%D1%80%D0%B8-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9-%D0%BF%D1%80%D0%B8%D1%81%D0%B2%D0%BE%D0%B5%D0%BD-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0-%D0%BC%D0%B5%D0%BD%D1%8F%D0%B5%D1%82%D1%81%D1%8F-%D0%B8-%D1%81%D0%B0%D0%BC" target="_blank">Вот еще пример.</a></p>
  <figure id="zf9h" class="m_original">
    <img src="https://img4.teletype.in/files/3c/4a/3c4acf34-3dfe-443a-ad0b-724b1dd0f607.png" width="1129" />
  </figure>
  <p id="aOGN">Ебучий, сука, JS, блять, ебучее программирование.</p>
  <figure id="RpHf" class="m_original">
    <img src="https://img1.teletype.in/files/0b/1a/0b1ab3aa-fa3c-49f4-b800-b51c3c329eae.png" width="480" />
  </figure>
  <p id="nUhy">Да, это говнокод.. Но суть не поменялась, через searchPos мы перебираем круги и чекаем ответ и сервим черные пиксели, при том передавая диапазон если нашли первую стрелку. А через getPos просто рисуем кружок и собираем черные пиксели, исключая диапазон, если он передан.</p>
  <p id="G7NR">Также важно не забыть, что у нас на часах 0 там где 12, а у тригонометрического круга там где 3 и при том, на нем отсчет против часовой, поэтому надо докинуть 90 градусов и потом пересчитать их. Всё довольно логично.</p>
  <figure id="yRnM" class="m_original">
    <img src="https://img2.teletype.in/files/53/df/53dfb66d-77f2-4dc4-a46d-38e4d901cc1a.png" width="1639" />
  </figure>
  <p id="XWWX">Функцию определения координат предложила чат гпт.</p>
  <figure id="7fDP" class="m_original">
    <img src="https://img4.teletype.in/files/78/60/7860c8b6-20f0-4a5f-b4a7-c797f0637da7.png" width="718" />
  </figure>
  <p id="UWbA">Ошибку я случайно заметил на тестах, тупо вхуячив ее код.. ненадо так делать.</p>
  <figure id="k89i" class="m_original">
    <img src="https://img4.teletype.in/files/fb/7b/fb7b4716-f744-4c34-8bb8-e2fafeca4758.png" width="254" />
  </figure>
  <p id="7iQE">8:60, очевидно, не пройдет валидацию</p>
  <figure id="nNXW" class="m_original">
    <img src="https://img4.teletype.in/files/33/10/33101bf4-2aa8-43c4-bdbc-fbc381646b6e.png" width="902" />
  </figure>
  <figure id="nD6u" class="m_original">
    <img src="https://img4.teletype.in/files/31/4b/314be76f-1cc2-4667-8757-26993ea19afb.png" width="320" />
  </figure>
  <p id="37M4">Я ее трохи поправил, чтоб округляло времени до 5 минут - нашего шага в капче.</p>
  <figure id="mH5X" class="m_original">
    <img src="https://img4.teletype.in/files/7d/fb/7dfb7c34-2dd0-402e-bdef-afe5087b8002.png" width="718" />
  </figure>
  <p id="dPbQ">Ебац, роботаит</p>
  <figure id="ifLe" class="m_original">
    <img src="https://img4.teletype.in/files/7a/4c/7a4c4896-f335-4e1e-a37e-bb6227496e3e.png" width="1035" />
  </figure>
  <p id="T2RU">И для часов пофиксил округление, чтоб не было как на центральном примере (9:00).</p>
  <figure id="xEYD" class="m_original">
    <img src="https://img2.teletype.in/files/96/6a/966a5527-2f31-4228-b127-10bcabccbbe2.png" width="333" />
  </figure>
  <p id="zcKu">Однако, я не мог остановиться просто на одной капче и решил сделать регер.</p>
  <figure id="WGS0" class="m_original">
    <img src="https://img2.teletype.in/files/1c/07/1c07a00b-d98c-4099-9189-d6a69497dd2a.png" width="480" />
  </figure>
  <h2 id="qIgY">Реверс!?</h2>
  <figure id="ONxA" class="m_original">
    <img src="https://img1.teletype.in/files/c5/c6/c5c6eb73-0ea0-4a4d-ad04-9726c4d044c2.png" width="1536" />
  </figure>
  <p id="Awx3">Ну я и сел тыкать че же там после капчи. </p>
  <figure id="z9RV" class="m_original">
    <img src="https://img4.teletype.in/files/76/68/7668c137-60e9-45cd-b4c4-85b347891df5.gif" width="320" />
  </figure>
  <p id="QCSA">А после капчи какой-то пиздец. Более того, еще и минуту ожидания зачем-то (pow).</p>
  <figure id="uiZ5" class="m_original">
    <img src="https://img4.teletype.in/files/77/69/776952a5-ab7c-44cb-937d-464519c9c23e.png" width="1054" />
  </figure>
  <figure id="suFJ" class="m_original">
    <img src="https://img2.teletype.in/files/1e/03/1e03d58c-07a7-4a60-84b9-5c077079129a.png" width="929" />
  </figure>
  <figure id="728G" class="m_original">
    <img src="https://img1.teletype.in/files/89/d7/89d718cf-a8f1-44be-983a-036851d06ea3.png" width="930" />
  </figure>
  <p id="iNPT"></p>
  <figure id="fJlO" class="m_original">
    <img src="https://img2.teletype.in/files/1e/04/1e043c57-3978-4535-a887-5bf99dd9640e.png" width="1920" />
  </figure>
  <figure id="9Vb8" class="m_original">
    <img src="https://img1.teletype.in/files/cc/2e/cc2e15e2-21ec-40f8-89a4-405ffc108d8e.png" width="1280" />
  </figure>
  <figure id="b0ry" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3f/e3/3fe32073-edf2-4f03-abdb-fd7259b629f1.png" width="661" />
    <figcaption>И ведь это все нужно.. блять</figcaption>
  </figure>
  <p id="3FMV">Ладно, поехали разбираться с проблемами по мере поступления. </p>
  <p id="5Eob">Начнем с signup. </p>
  <figure id="g6Cj" class="m_original">
    <img src="https://img1.teletype.in/files/c1/4f/c14f6e04-d2f1-471d-bd33-a98df823af3e.png" width="1277" />
  </figure>
  <figure id="GsHB" class="m_original">
    <img src="https://img2.teletype.in/files/94/ee/94ee1b7b-328c-4448-91bf-7eeafa2d925a.png" width="1279" />
  </figure>
  <figure id="x4MQ" class="m_original">
    <img src="https://img2.teletype.in/files/91/b3/91b3e35c-1337-4d6d-a3e2-f338502fc364.png" width="300" />
  </figure>
  <p id="SBIv">Другое дело) Тогда можно будет тупо фул код подрезать..</p>
  <figure id="azzw" class="m_original">
    <img src="https://img4.teletype.in/files/b7/d2/b7d29f1a-80b7-4586-8649-70e5e08da03e.png" width="1279" />
  </figure>
  <p id="rcRQ">Трохи поресерчим, что тут происходит</p>
  <figure id="XcTF" class="m_original">
    <img src="https://img2.teletype.in/files/de/70/de70e9bf-e299-4aa9-be73-55710680ba7d.png" width="1279" />
  </figure>
  <figure id="dy3q" class="m_original">
    <img src="https://img4.teletype.in/files/bf/86/bf863967-0ccf-4a32-9a35-2ab5ea9bcbfa.png" width="1279" />
  </figure>
  <figure id="iuTD" class="m_original">
    <img src="https://img2.teletype.in/files/57/ad/57ad66bf-ce54-459b-9750-4cbef188df33.png" width="1277" />
  </figure>
  <p id="24iW">Ясна понятна, криптография ебучая значит</p>
  <figure id="Ir2H" class="m_original">
    <img src="https://img4.teletype.in/files/3e/1c/3e1c2d33-5573-4ab2-88c0-e5fcd1edbcbc.png" width="1278" />
  </figure>
  <figure id="gfX6" class="m_original">
    <img src="https://img4.teletype.in/files/f3/22/f322ef3b-e819-4300-8e89-188b3f6566e6.png" width="1280" />
  </figure>
  <p id="mcyp">Хмммм.. <a href="https://www.npmjs.com/package/@tutao/tutanota-crypto?activeTab=explore" target="_blank">https://www.npmjs.com/package/@tutao/tutanota-crypto?activeTab=explore</a></p>
  <figure id="zu1a" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/30/19/3019fa7d-2904-4aad-aff9-96bea3879345.png" width="637" />
    <figcaption>Ну.. нет так нет</figcaption>
  </figure>
  <p id="z2tP">Штош, раз просто так взять и поставить либы нельзя, летс гоу хэнд джоб</p>
  <figure id="5PXn" class="m_original">
    <img src="https://img4.teletype.in/files/35/83/35836247-8b71-4392-9473-b44ca7e9dff3.gif" width="498" />
  </figure>
  <p id="wJKu">Ну а потом я тупо взял и перенес каждый файл, добавил все нужные импорты и фсе. Всего-то 2 дня ушло.. (если правильно помню)</p>
  <figure id="bIcN" class="m_original">
    <img src="https://img3.teletype.in/files/e6/56/e6565e95-9801-4dbe-a38b-3691b4f43c54.png" width="1521" />
  </figure>
  <figure id="D0GT" class="m_original">
    <img src="https://img4.teletype.in/files/f6/72/f6724b2b-90f2-4a00-a285-f68d80e2807e.gif" width="429" />
  </figure>
  <figure id="bsuc" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/71/42/71427355-1acf-4d90-bd6f-289f541a0e51.gif" width="517" />
    <figcaption>Немножко кодаф</figcaption>
  </figure>
  <p id="rem5">Как он работает? Ну.. он работает.. да.</p>
  <figure id="NbpE" class="m_original">
    <img src="https://img4.teletype.in/files/3e/07/3e07f76b-ba4b-45b4-9d27-02eb2178f41b.png" width="929" />
  </figure>
  <p id="10V9">По сути я тупо подтянул весь код который был нужен из всех файлов и чуть поправил. Наверное можно было проще, спиздить из воркера, но я не догадался.. или не получилось, не помню уже. </p>
  <p id="qb5v">Ещё, вот эт хуйню вынес в отдельный блок, она по сути и майнила минуту у меня ключи с браузера. <a href="https://www.npmjs.com/package/jsbn-rsa" target="_blank">https://www.npmjs.com/package/jsbn-rsa</a></p>
  <figure id="sX2d" class="m_original">
    <img src="https://img2.teletype.in/files/9c/af/9caf9b45-e33f-4395-b115-877848069439.png" width="637" />
  </figure>
  <p id="zxZ9"><strong>Утечка памяти в бас</strong></p>
  <p id="Z4jY">По порту файлов в ноде баса я спросил у Ghost, и он <a href="https://community.bablosoft.com/topic/23154/%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C-%D1%82%D0%B5%D1%87%D0%B5%D1%82-%D0%BD%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B5%D0%B9-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8/7" target="_blank">поделился багой</a> - утечкой памяти и ее решением.  </p>
  <figure id="dv19" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0f/90/0f907fa8-be77-4568-bfbb-c877cbf8dcc6.png" width="841" />
    <figcaption>Утечка памяти</figcaption>
  </figure>
  <p id="lfuN">Тоесть нужно сейвить в глобалку, чтобы постоянно не дергать файлы.</p>
  <figure id="UZOf" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0b/3f/0b3ff235-faf2-478d-b64b-53c529078ede.png" width="1042" />
    <figcaption>Без утечки памяти</figcaption>
  </figure>
  <p id="k6QT">А я прост в объект все сейвил и фсе. Кароч, наверное так не надо делать.</p>
  <figure id="DoXc" class="m_original">
    <img src="https://img4.teletype.in/files/b5/f8/b5f896bc-dcba-412b-9c03-4c30060f05b3.png" width="1521" />
  </figure>
  <h2 id="wNIp">Тесты</h2>
  <p id="HGxF">Тутанота сосатб. Капча решается.</p>
  <figure id="fZzO" class="m_original">
    <img src="https://img1.teletype.in/files/cc/8a/cc8a1251-360f-4493-b39f-6c2b1357dd2b.png" width="1280" />
  </figure>
  <p id="4p5a">Рега проходит</p>
  <figure id="ewMg" class="m_original">
    <img src="https://img1.teletype.in/files/85/fa/85fa34a4-de04-43ab-bdad-fc94f04eaa5a.png" width="1280" />
  </figure>
  <p id="BY28">Код работает. Я вообще в ахуе, что оно без всяких тестов завелось. Столько кода и сразу все работает. Вот что значит копипейст)</p>
  <figure id="GuSi" class="m_original">
    <img src="https://img2.teletype.in/files/1a/6f/1a6fc6d6-e996-4eef-8dfc-f2f0e68e1e90.png" width="1280" />
  </figure>
  <p id="vrOF">Но письма слать с ходу нельзя, хоть я и не собирался.</p>
  <figure id="VMwO" class="m_original">
    <img src="https://img4.teletype.in/files/ff/27/ff279cb5-539f-4947-9654-04097233aeea.png" width="1272" />
  </figure>
  <figure id="jN82" class="m_original">
    <img src="https://img1.teletype.in/files/0d/0d/0d0d5741-64a0-4ad2-800f-35c321017084.png" width="308" />
  </figure>
  <p id="gpa1">Когда я увидел, что это все рил работает, я такой:</p>
  <figure id="nyQT" class="m_original">
    <img src="https://img1.teletype.in/files/05/67/056726c3-fef2-496b-9bf3-efd6537e068c.png" width="604" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/fS4TY3eiAqv</guid><link>https://teletype.in/@it_hueta/fS4TY3eiAqv?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/fS4TY3eiAqv?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>IconCaptcha free 99,9%</title><pubDate>Fri, 22 Mar 2024 01:35:56 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e8/fa/e8fa8a38-0099-4932-83cd-ab79449b8891.png"></media:content><category>вах</category><description><![CDATA[<img src="https://img3.teletype.in/files/68/45/68457379-dda9-41f3-9d30-fb74c2ca3aa0.png"></img>Вы думаете что с человеком, который вот до такой степени точно исследует тему можно спорить? Вы думаете что я вас не переиграю? Что я вас не уничтожу? Я вас уничтожу!]]></description><content:encoded><![CDATA[
  <figure id="LJCf" class="m_original">
    <img src="https://img3.teletype.in/files/68/45/68457379-dda9-41f3-9d30-fb74c2ca3aa0.png" width="1200" />
  </figure>
  <p id="XRY0">Вы думаете что с человеком, который вот до такой степени точно исследует тему можно спорить? Вы думаете что я вас не переиграю? Что я вас не уничтожу? Я вас уничтожу!</p>
  <figure id="QIMV" class="m_original">
    <img src="https://img2.teletype.in/files/59/27/5927cba8-664d-4c84-84f9-e1cd5dc4e051.png" width="799" />
  </figure>
  <p id="HWZv">А началось все как обычно. Некоторое время назад мне прилетел вопрос</p>
  <figure id="eO1x" class="m_original">
    <img src="https://img2.teletype.in/files/df/df/dfdf763e-85e4-482f-9d2f-0bb41dfd850e.png" width="285" />
  </figure>
  <p id="Jm3p">И кто-то щя подумал: Ооо, очередной букс помойка.</p>
  <figure id="FD2D" class="m_original">
    <img src="https://img4.teletype.in/files/3f/00/3f00a73f-5c28-4b6e-83f3-7aa523cd2d57.png" width="1280" />
  </figure>
  <p id="L8Lh">Однако. Вы тыкаете буксы, чтобы заработать копейки, я потому что их весело ебать.</p>
  <figure id="anMN" class="m_original">
    <img src="https://img1.teletype.in/files/4e/36/4e3637cf-66cf-418d-aad8-43df775d9fe8.png" width="560" />
  </figure>
  <p id="RljO">Я уже сталкивался с похожей капчей, тогда это была икон капача. Нужно было просто найти 1 картинку отличную от других.</p>
  <figure id="LDBV" class="m_original">
    <img src="https://img3.teletype.in/files/e1/91/e191ca1e-8c70-4402-be12-41101b73feab.png" width="410" />
  </figure>
  <p id="F7Y4">Дуглас в чате тогда (дохуя давно) <a href="https://youtu.be/ZjRcgDHiN74" target="_blank">предложил (не ебу сам он додумался или нет)</a>, что раз отличная картинка одна, сравним просто самую первую с остальными, если у первой со всеми одинаковая схожесть эт и есть ответ, либо если есть какая-то, что сильнее отличается от первой чем остальные, то ответ уже она. Довольно простая идея.</p>
  <figure id="Fue4" class="m_original">
    <img src="https://img1.teletype.in/files/8b/c6/8bc6c961-7d60-4da6-8ef3-0a687aced969.png" width="451" />
  </figure>
  <p id="P5vz">Мне она не понравилась. Я использовал подсчет траста каждой картинки (сравнение каждой с каждой). В перспективе это сработало бы и при наличии шума на картинках. </p>
  <figure id="K8iC" class="m_original">
    <img src="https://img2.teletype.in/files/9a/27/9a2742e6-43ca-4d6b-bf25-824f1cf98302.png" width="1551" />
  </figure>
  <p id="8Urw">Ну и как будто бы, с моим подходом при наличии шума и поворота ничего сильно не поменялось бы. Нужно всего лишь докинуть еще 1 (2) цикл чтобы сравнивать все виды 1 картинки с вариантами других.</p>
  <figure id="jn3O" class="m_original">
    <img src="https://img3.teletype.in/files/a9/ba/a9bac87d-a74e-4acf-80b0-849e345ee1e1.png" width="362" />
  </figure>
  <p id="ltNk">И так, генерим тест массив для визуализации манипуляций с чиселками, чтоб не наебаться потом с картинками. Создаем каждой &quot;картинке&quot; 8 вариантов положения: 4 поворот и еще 4 для каждой - отзеркаливание.</p>
  <figure id="TPWs" class="m_original">
    <img src="https://img4.teletype.in/files/30/4f/304fcf17-f993-48de-aa92-705fa8daefe7.png" width="1015" />
  </figure>
  <p id="h3CF">Чтоб не сравнивать с собой, есть резон добавить<code> if (i === j) {continue;}</code></p>
  <figure id="0pHg" class="m_original">
    <img src="https://img4.teletype.in/files/fa/d6/fad6fd57-a220-44db-8f40-07f279fa8b59.png" width="1077" />
  </figure>
  <p id="WEpe">Атлишна. Осталось добавить счетчик макс значения, чтоб не была такая огромная ебала на 64 варианта каждая, а всего 4 варианта с ответами.</p>
  <figure id="06yz" class="m_original">
    <img src="https://img2.teletype.in/files/57/1b/571be13f-2ae3-4ede-bf92-6d98513c6fb8.png" width="1233" />
  </figure>
  <p id="lgOy">Чел утром:</p>
  <figure id="1Fyv" class="m_original">
    <img src="https://img2.teletype.in/files/11/1b/111b121d-43a0-4de8-88ff-4c1d12cbfb66.png" width="466" />
  </figure>
  <p id="Eedf">Чет до меня только к утру дошло, что изначальный вопрос был не про иконкапчу, а про похожую, а я уже иконкапчу почти разъебал.</p>
  <figure id="wQKW" class="m_original">
    <img src="https://img2.teletype.in/files/5d/3a/5d3a3fa3-910d-4aa6-b948-676784b6a20e.png" width="509" />
  </figure>
  <p id="ZW3K">Штош, ну тогда добьем её.</p>
  <p id="S5zT">Кстати, сурсы самой капчи с иконками <a href="https://github.com/Agence-MIBE/IconCaptcha-Plugin-jQuery-PHP/blob/master/assets/icons/light/icon-1.png" target="_blank">https://github.com/Agence-MIBE/IconCaptcha-Plugin-jQuery-PHP/blob/master/assets/icons/light/icon-1.png</a></p>
  <figure id="f73y" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c8/9f/c89ff859-9b84-45d6-ada1-a0648073cbaf.png" width="674" />
    <figcaption>У капчи 2 версии, я начал с черной</figcaption>
  </figure>
  <h2 id="WyoS">Похуярили</h2>
  <figure id="XsVw" class="m_original">
    <img src="https://img3.teletype.in/files/66/a2/66a2cd56-e868-49d7-b82d-7ea2c6bc8292.png" width="700" />
  </figure>
  <p id="Pmyj"> Начнем с простого, с реверса. Так, ну токен изи, он в первом запросе.</p>
  <figure id="An49" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/53/55/53552ca8-5714-4452-aafe-64d572e8cf81.png" width="1384" />
  </figure>
  <p id="Xd39">Тело запроса. Тоже изи.</p>
  <figure id="UoNt" class="m_original">
    <img src="https://img3.teletype.in/files/68/ba/68ba5203-82db-481a-ba16-1a70d5d6abc9.png" width="1385" />
  </figure>
  <p id="dhQF">widgetId обычный uuid</p>
  <figure id="GeyU" class="m_original">
    <img src="https://img1.teletype.in/files/ce/b2/ceb2452e-488d-4a21-ad29-16a0f4e76985.png" width="878" />
  </figure>
  <p id="tB63">Тайм штампы тоже изи, 0 обфускации - 0 проблем</p>
  <figure id="p9ys" class="m_original">
    <img src="https://img2.teletype.in/files/50/61/50618943-ae73-4034-8991-d86f3721a735.png" width="1384" />
  </figure>
  <p id="9wYs">При отправке решения используется challengeId, эт uuid с сервера в теле ответа на запрос капчи, а challenge там эт сама картинка.</p>
  <figure id="7VRM" class="m_original">
    <img src="https://img4.teletype.in/files/3a/cb/3acb6124-8efb-4b7f-ae0a-630dd612d6c8.png" width="1526" />
  </figure>
  <p id="BgX7">Прогнав пару капч, можно заметить, что размер фул капчи всегда фикс, а количество иконок (задач) внутри 5-8. А еще, мы можем пройтись вверху с шагом в пиксель посчитать количество черных писелей фильтруя по альфа каналу, это будет количество частей (+1).</p>
  <figure id="AAIk" class="m_original">
    <img src="https://img2.teletype.in/files/d2/86/d286e3d0-27da-493f-bf0c-8c735636e9bf.png" width="1088" />
  </figure>
  <p id="5pyz">Докинем парочку функций и веселая нарезка готова. Код максимально простой.</p>
  <figure id="1LXy" class="m_original">
    <img src="https://img3.teletype.in/files/28/76/28760ae6-b9c4-4312-a85d-858784394ec9.png" width="1928" />
  </figure>
  <figure id="L2CZ" class="m_original">
    <img src="https://img2.teletype.in/files/93/08/9308e3bf-ec4d-4c78-ba9f-c973e558b6da.png" width="599" />
  </figure>
  <p id="KQqu">Ну и всё бы ничего, если б картинки определялись нормально, только по итогу нихуя не получалось их нормально сравнить.</p>
  <figure id="Y5cg" class="m_original">
    <img src="https://img2.teletype.in/files/53/85/5385e565-c0f4-441f-9a1a-2998395f33d3.png" width="462" />
  </figure>
  <figure id="Y3Vm" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e0/6e/e06e2f6b-f3b8-44f7-a008-bdf718da3148.png" width="1000" />
    <figcaption>Сука, как же я заебался искать как сравнить 2 ебучих картинки</figcaption>
  </figure>
  <p id="fQ1V">Я потыкал разные алгоритмы иии.. нихуя.  Казалось бы, дохуя алгоритмов, но блять, простой сдвиг в пару пикселей и оно уже нихуя не видит. Однако..</p>
  <figure id="oRnN" class="m_original">
    <img src="https://img2.teletype.in/files/96/b6/96b65ee8-1a69-42ef-855e-10fa6ef33580.png" width="993" />
  </figure>
  <p id="oxxr">Используя <a href="https://www.npmjs.com/package/image-js" target="_blank">image-js</a> я написал перегон 1 картинки в 8 и дополнительно каждой мыло и сжатие до 20% + еще пару фильтров. И в итоге это сработало.</p>
  <figure id="RelR" class="m_original">
    <img src="https://img3.teletype.in/files/e3/b6/e3b6b2be-562f-4e7b-9005-3c52dfce3fca.png" width="544" />
  </figure>
  <p id="VB3Z">Видишь слева такую полоску хуйни? Это всё картинки, уменьшенные и замыленные. И попарно все они сравнены (4090 сравнений).</p>
  <figure id="aSQ6" class="m_original">
    <img src="https://img1.teletype.in/files/06/e4/06e4e8fc-c501-41ff-ae7f-76b08dd84e9c.png" width="966" />
  </figure>
  <figure id="MLKe" class="m_original">
    <img src="https://img3.teletype.in/files/a9/cb/a9cb5fc7-2ad9-4019-bb6c-06f08a33ea6d.png" width="973" />
  </figure>
  <p id="rgPF">А 4090 сравнивания - не дохуя? Оказалось, что нет, решает мгновенно.</p>
  <figure id="si5v" class="m_original">
    <img src="https://img3.teletype.in/files/ea/97/ea972532-52a8-46d0-b372-d1191defccde.png" width="641" />
  </figure>
  <p id="Os0A">Примечательно, что без уменьшения и доп фильтров работало крайне ебано, возможно еще прозрачность самой иконки тож рандом.</p>
  <figure id="8kEH" class="m_original">
    <img src="https://img2.teletype.in/files/5b/bc/5bbc10dd-f885-460e-9236-cc7a20781b54.png" width="424" />
  </figure>
  <p id="dbZ4">В простой версии капчи я делал накопление траста для каждой картинки и его юзал как метод для определения картинки, которая больше всего отличается от остальных.</p>
  <figure id="pJKf" class="m_original">
    <img src="https://img1.teletype.in/files/84/ed/84ed08c0-99a7-47ac-bddb-a7405805cf06.png" width="489" />
  </figure>
  <p id="OBCh">Сейчас получилось по сути то же самое. </p>
  <p id="xAm9">Я беру список коллекций (вариантов картинки: повороты и отзеркаливание) для каждой картинки. Первые 2 цикла перебирают коллекции 1-8 сравнивая их друг с другом. Чтобы сравнивать элементы коллекций есть еще 2 цикла (тк сравниваем 2 коллекции). Если какая-то картинка из коллекции нашла пару в другой, пишем collection_trust +1. Еще добавил пару прерываний цикла, чтоб если похожую картинку нашло, не искало дальше.</p>
  <p id="rIZ2">Через <a href="https://www.npmjs.com/package/image-js" target="_blank">getSimilarity из image-js</a> я сравниваю картинки и говорю совпадает или нет.</p>
  <p id="pOVl">По итогу в trusts мы будем иметь инфу о количестве пар у каждой картинки.</p>
  <figure id="QwSH" class="m_original">
    <img src="https://img4.teletype.in/files/78/b4/78b4f81e-ca46-4d6d-99a5-570051d0af12.png" width="1272" />
  </figure>
  <p id="MHAE">Ну а дальше просто дергаем индекс макс элемента</p>
  <figure id="z9Pq" class="m_original">
    <img src="https://img2.teletype.in/files/d4/5b/d45b9fd5-94a7-435d-b246-aeed19bfe886.png" width="508" />
  </figure>
  <p id="VjZp">А теперь можно и тесты провести. По итогу всего 1 ошибка, возможно, надо с порогом чуть поиграть, щя стоит 90%. За 300 тестов всего 1, довольно неплохо. Предположим, что качество решения 99,9%)</p>
  <figure id="uF0d" class="m_original">
    <img src="https://img2.teletype.in/files/dd/cb/ddcb0b90-96fb-4d93-800c-649fea381c89.png" width="657" />
  </figure>
  <figure id="J0NW" class="m_original">
    <img src="https://img4.teletype.in/files/39/7a/397ab511-8fd7-4981-a7ff-2ebd28fbfdf3.png" width="811" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/TKeo2XTRv-8</guid><link>https://teletype.in/@it_hueta/TKeo2XTRv-8?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/TKeo2XTRv-8?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Twitter ui_metrics ебаный реверс</title><pubDate>Fri, 22 Mar 2024 01:35:19 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5c/82/5c82c42e-f275-4c8a-9104-952140925754.png"></media:content><category>выебано</category><description><![CDATA[<img src="https://img4.teletype.in/files/75/29/75294985-7faf-4fd1-9bf1-852d980b7a32.png"></img>Реверс инжиниринг для самых маленьких. Просили отреверсить чет очень простое, воть. Я писал эту заметку тварищу, потому она немного.. ебаная.]]></description><content:encoded><![CDATA[
  <p id="W0qi">Реверс инжиниринг для самых маленьких. Просили отреверсить чет очень простое, воть. Я писал эту заметку тварищу, потому она немного.. ебаная.</p>
  <figure id="MVjI" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/55/25/55257a2d-ad2c-4a6f-801f-44cef0add9fc.png" width="1280" />
    <figcaption>Вся заметка в одном меме</figcaption>
  </figure>
  <p id="O2iC">На картинке выше представлено 3 подхода к решению: <br />1) Просто вызывать код через консольку и не вникать че там (easy)</p>
  <p id="MYss">2) Юзать имитацию дум например <a href="https://www.npmjs.com/package/window" target="_blank">window</a> на основе <a href="https://www.npmjs.com/package/jsdom" target="_blank">jsdom</a> (medium)</p>
  <p id="mRH9">3) Реверсить и разобраться как же все-таки работает код (hard)</p>
  <h2 id="7f2T">Похуярили</h2>
  <p id="yxP2">1) И так, я открыл запросеки, увидел следующую хуйню и решил чекнуть че куда.</p>
  <figure id="rb75" class="m_original">
    <img src="https://img3.teletype.in/files/ee/b6/eeb62db3-751c-42ab-b973-56f7068872ee.png" width="1280" />
  </figure>
  <p id="ZQv0">2) Подошел, взял за руку и сказал твердо и чётко: ctrl+shift+f. Изи.</p>
  <figure id="54un" class="m_original">
    <img src="https://img2.teletype.in/files/1b/26/1b2691e5-c0f3-4e13-bb05-f844a92c33cd.png" width="952" />
  </figure>
  <p id="0npZ">3) Ставлю бреки на старте функции на прочек, тк у нас жысончег на выходе.</p>
  <figure id="BmPm" class="m_original">
    <img src="https://img2.teletype.in/files/5e/31/5e315910-2f13-4d12-8c3d-475580c94a2b.png" width="1044" />
  </figure>
  <p id="MrgU">4) Зачек через консоль очка. Вызываем код и смотрим че происходит. Он вертает результаты вычислений. При том, результат всегда одинаковый. Оки, вход найден, осталось понять как оно это делает.</p>
  <figure id="XXbV" class="m_original">
    <img src="https://img2.teletype.in/files/18/3d/183d1189-c405-4b48-b04f-52701886d562.png" width="893" />
  </figure>
  <p id="o0MZ">5) Казалось бы, вертает объект с циферками, а в начале они собстна и есть, но хуй там плавал, оно еще и считает чето, тоесть код получается динамический и весь код (ну почти) и есть по сути шифрование. Оки, тогда как жить то блять? Надо чекать дальше.</p>
  <figure id="AaVR" class="m_original">
    <img src="https://img3.teletype.in/files/ad/da/addac64d-6972-4014-bc30-d988b8637b8b.png" width="700" />
  </figure>
  <figure id="GkMa" class="m_original">
    <img src="https://img1.teletype.in/files/09/ac/09ac9115-d7d6-4b8b-bed3-2945a6c624c5.png" width="603" />
  </figure>
  <p id="Ihbg">6) Я просто скопировал весь код нахуй и отправил на <a href="http://jsnice.org/" target="_blank">http://jsnice.org/</a>, чтобы привести к более читаемому виду. Переменные стали чутка понятнее, да и в целом приятнее смотреть. Посмотрим, сломался ли код или все норм.</p>
  <figure id="hFkz" class="m_original">
    <img src="https://img1.teletype.in/files/40/d1/40d1e669-225d-424d-a367-471fc1996daf.png" width="1280" />
  </figure>
  <p id="N4S4">7) Создал файлики и подрубил код к html шаблончику, чтоб дебагать код изолированно. Установил див куда вывести текст для сравнения. Вывод в обоих файлах направил на див. Почекаем норм ли работает файл с читаемыми переменными. </p>
  <figure id="o0b9" class="m_original">
    <img src="https://img1.teletype.in/files/84/1b/841b94f4-3370-48fb-b73e-eafa3b74f719.png" width="122" />
  </figure>
  <figure id="LhbM" class="m_original">
    <img src="https://img4.teletype.in/files/b6/07/b60738f7-5c61-44c1-8942-72593fccc5b6.png" width="547" />
  </figure>
  <figure id="o6yo" class="m_original">
    <img src="https://img3.teletype.in/files/e9/f9/e9f9ccb8-32ba-411e-a065-606e7f4c51cc.png" width="584" />
  </figure>
  <figure id="Fb69" class="m_original">
    <img src="https://img1.teletype.in/files/0e/02/0e02041d-23df-415e-8422-b4ad7268aecf.png" width="850" />
  </figure>
  <figure id="JhQY" class="m_original">
    <img src="https://img3.teletype.in/files/af/cd/afcd3302-58fb-4910-8d91-7713c8585a3f.png" width="620" />
  </figure>
  <figure id="JwdY" class="m_original">
    <img src="https://img3.teletype.in/files/ad/1e/ad1e5d38-7b5c-4947-904d-7d2caf455b9d.png" width="618" />
  </figure>
  <p id="6eci">Тоесть я в самом начале нашел где оно там ответ дергает и вхучил туда свой кусок кода, чтобы выводить результаты на страничку. Затестил  иии.. </p>
  <p id="Hta6">Вывод одинаковый, код заебок, значит можно реверсить.</p>
  <p id="Yjzd">8) Начинаем реверсить локал очка фаел</p>
  <figure id="Brq5" class="m_original">
    <img src="https://img4.teletype.in/files/7b/41/7b410ac1-41c0-45fb-a5d0-77338ef7ec7e.png" width="831" />
  </figure>
  <p id="NjUl">Оно взяло хуйню и вызвало первую функцию.</p>
  <figure id="sSXC" class="m_original">
    <img src="https://img3.teletype.in/files/a1/c5/a1c54b43-00b0-404f-9aa0-35a0deda438f.png" width="1209" />
  </figure>
  <p id="DEFt">Судя по коду:<br /><code>//создает див<br />var content = document.createElement(&quot;div&quot;);<br />//скрывает его от юзера, чтоб мозгу не ебать эпилептикам<br />content.setAttribute(&quot;style&quot;, &quot;display:none;&quot;);<br />//вставляет в конец боди<br />document.getElementsByTagName(&quot;body&quot;)[0].appendChild(content);<br />//тут делает какую-то ебаную магию с входными числами, которую и нужно понять<br />var object = parse($($($(content, d), a), b), content, 0);<br />//удаляет нахуй созданный див<br />content.parentNode.removeChild(content);<br />//вертает ебаную хуйню<br />return object;</code></p>
  <p id="WU9t">Окей, давайте тогда разбираться с этой магией</p>
  <figure id="u9ho" class="m_original">
    <img src="https://img3.teletype.in/files/2c/be/2cbeb589-8442-4d29-b445-44515b1f5be4.png" width="263" />
  </figure>
  <p id="IItK">Оно закидывает<br />content - блок див и цифру входную в функцию $<br />$(content, d)<br />потом опять content и другую цифры<br />$(.., a)<br />с третьей та же хуйня<br />$(.., b)<br />а потом передает обновленный content, старый и 0 в parse<br />parse($($($(content, d), a), b), content, 0);<br />как не трудно догадаться, content превращается в огромное дерево вложенных дивов, а parse дергает нужное.</p>
  <figure id="c0mX" class="m_original">
    <img src="https://img2.teletype.in/files/1a/36/1a366577-060a-46d9-9979-f8c92915ac3b.png" width="620" />
  </figure>
  <p id="RfFO">Тоесть $ делает какие-то вычисления, создает дум дерево и пишет их в него. А parse вытягивает назад всю хуйню.</p>
  <figure id="EU33" class="m_original">
    <img src="https://img4.teletype.in/files/3c/c6/3cc6d627-2c9e-4393-aa40-6d7ca3d2eaf0.png" width="1035" />
  </figure>
  <p id="UQG4">Окей, тогда надо понять как переписать это на нормальный язык, выкинув работу с дум.</p>
  <blockquote id="Wx1Q">function $(elem, value) {<br />          var i = 0;<br />          for (; i &lt; 8; i++) {<br />            var parent = document.createElement («div»);<br />            elem.appendChild (parent);<br />            parent.innerText = value;<br />            if ((value &amp; 1) == 0) {<br />              elem = parent;<br />            }<br />            value = value ≫ 1;<br />          }<br />          return elem;<br />        }</blockquote>
  <p id="iAO3"><br />Тут на вход брало числа и делало какую-то хуйню. вопрос, какую?<br />ну ясен хуй, оно делало 8 итераций, создавало див и вот еще какая-то вот поебень</p>
  <blockquote id="dFPu">if ((value &amp; 1) == 0) {<br />              elem = parent;<br />            }<br />            value = value &gt;&gt; 1;</blockquote>
  <p id="HWx7">Хорошо, <a href="https://learn.javascript.ru/bitwise-operators" target="_blank">чекаем доку</a> чтобы понять что это за поебень.<br />Да, эт побитовые операторы. И хуле они тут делают? Число обрабатывается в двоичном виде:<br />value = value &gt;&gt; 1;</p>
  <p id="RxPE">Ну какбэ на самом деле похуй что они делаю, математика обычная.</p>
  <figure id="2tK5" class="m_original">
    <img src="https://img1.teletype.in/files/0f/bb/0fbbc18c-c66b-4e98-b63d-cc19715b5890.png" width="240" />
  </figure>
  <p id="h63R">Чекаем также след хуйню.</p>
  <figure id="xXW8" class="m_original">
    <img src="https://img1.teletype.in/files/44/03/44032980-2944-40b1-968d-f5dbc3c41207.png" width="820" />
  </figure>
  <figure id="mV6w" class="m_original">
    <img src="https://img4.teletype.in/files/37/8b/378b677d-4b5b-4e74-b7ce-8659377242f2.png" width="512" />
  </figure>
  <p id="az0b">На строках 17 и 30 стояли логпоинты, которые писали значения. Не трудно догадаться, что значения тут как в дум дереве и це и есть нужные цифры</p>
  <figure id="hQ6k" class="m_original">
    <img src="https://img1.teletype.in/files/c0/d6/c0d62ff5-c108-461c-8823-3fae9cd2f227.png" width="1075" />
  </figure>
  <p id="X9a9">Фиксанем функцию $, чтоб вертала только нужное, как было в логе.</p>
  <figure id="u1Kz" class="m_original">
    <img src="https://img1.teletype.in/files/01/7b/017b88ca-d3b7-4b94-9ad8-23ced8d794e3.png" width="1018" />
  </figure>
  <p id="YsGf">Тоесть оно засунуло через $ и отредачило, а потом дернуло через parse всю хуйню и далее сложило их рекурсивно и вернуло остаток от деления на 256</p>
  <figure id="Zfp7" class="m_original">
    <img src="https://img4.teletype.in/files/b8/ab/b8ab0b87-88ca-4ad0-bb56-78b8b7259dd5.png" width="600" />
  </figure>
  <p id="0XBa">Тоесть вместо parse, если у нас норм массив, можем написать </p>
  <p id="zVdh"><code>...reduce(function (a, b) { return a + b }, 0) % 256</code></p>
  <p id="zfV1">На выходе получаем простой код</p>
  <figure id="xyXk" class="m_original">
    <img src="https://img3.teletype.in/files/e5/07/e5074048-965f-49ed-931a-85e5ce805f50.png" width="652" />
  </figure>
  <p id="EeJY">А теперь сюрпрайз. Если пролистать ниже, везде дублируется точно такой же код, название функции только меняется. Тоесть вот це и была браузерная за щит очка.</p>
  <figure id="pQsR" class="m_original">
    <img src="https://img4.teletype.in/files/7a/99/7a99dec7-d092-4873-acc2-dd15b8d7cc84.png" width="420" />
  </figure>
  <p id="fyWV">Можно было бы ну просто взять и запарсить регулярками входные значения, названия переменных и генерить без трабл, я бы так и сделал.</p>
  <p id="WAjb">Только вот код оказался динамическим и я прихуел, подумав что фсе, смэрть. Эт ведь каждый раз новые имена переменных, позиции в коде, код постоянно разный.</p>
  <p id="B6KP">Но бля, больше то привязок к браузеру нет нахуй. Поэтому я просто подошел, взял за руку и сказал:</p>
  <figure id="zcSL" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1d/7e/1d7e0290-e089-4ea5-9d55-ee99d3efb87c.png" width="1280" />
    <figcaption>Бам, блять.</figcaption>
  </figure>
  <p id="IuEB">Возьми из фул кода все функции, дерни мне их в массив, выкинь их нахуй и поменяй на вызов моей.</p>
  <figure id="mYTY" class="m_original">
    <img src="https://img3.teletype.in/files/e5/07/e5074048-965f-49ed-931a-85e5ce805f50.png" width="652" />
  </figure>
  <p id="tpD5">Тк в коде встречались и простые функции, добавил условие проверки, чтоб такую хуйню не трогал, только та которая с привязкой к браузеру</p>
  <figure id="1O5b" class="m_original">
    <img src="https://img3.teletype.in/files/28/9a/289ada5e-5c2e-40f2-8492-ea72bee023bb.png" width="404" />
  </figure>
  <p id="mkPw">Есть еще немножко мусора</p>
  <figure id="lBl6" class="m_original">
    <img src="https://img4.teletype.in/files/b3/65/b3650463-4dcf-4efe-9e41-d27cd738a670.png" width="789" />
  </figure>
  <p id="eSDE">Поэтому нам нужно дернуть основную функцию по имени</p>
  <figure id="6E2E" class="m_original">
    <img src="https://img4.teletype.in/files/35/f9/35f9a2e0-5f19-4048-aed1-2e85f02ab945.png" width="789" />
  </figure>
  <p id="1OzU">Для этого я запилил регулярку, чтоб дернуть нейм нашей основной функции</p>
  <figure id="EScZ" class="m_original">
    <img src="https://img2.teletype.in/files/df/dc/dfdc30bc-7231-4eb2-b762-9a2cf6a6ce12.png" width="1280" />
  </figure>
  <p id="AuyX">Тк конец нашей функции дефолт хуйня - возврат результата, режем от нейма функции до сюды.</p>
  <figure id="THu9" class="m_original">
    <img src="https://img2.teletype.in/files/9c/60/9c607617-d846-425a-a9c3-17f561e33fc5.png" width="603" />
  </figure>
  <p id="pIgS">Также собираем наш шаблон кода. После отправляем в эвал и сохраняем результат в переменную.<br />Режем через split код по имени нашей функции и вытягиваем ее.</p>
  <p id="x3Oi">Как видно по скрину, я свою функцию сумм добавил к шаблону кода, в области видимости основной её видно</p>
  <figure id="pfZT" class="m_original">
    <img src="https://img4.teletype.in/files/37/cb/37cb3783-3962-43f4-8deb-41a0f4fc322a.png" width="724" />
  </figure>
  <figure id="kB4l" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/ba/dd/badd6d2b-90c0-4ecc-ae9e-cbe66380d5a6.png" width="1200" />
    <figcaption>Говнокодим и собираем код на регулярках</figcaption>
  </figure>
  <p id="vjVv">Моя функция сумм заменяет вот такую повторяющуюся хуйню. Тк оно просто дергает нужные значения, пихает их в дум, а потом вытаскивает, а я сразу чекаю какие нужны и делаю расчет.</p>
  <figure id="cWwB" class="m_original">
    <img src="https://img2.teletype.in/files/92/1d/921dfbf6-f886-4d1a-b31e-c71866f16a82.png" width="553" />
  </figure>
  <p id="Sub8">Кстати, это логпоинт, если кто не знал. Работает как лог</p>
  <figure id="Y6fo" class="m_original">
    <img src="https://img4.teletype.in/files/fd/8e/fd8e72f5-7b8b-4cad-a7a3-23bd35091362.png" width="315" />
  </figure>
  <figure id="M7kO" class="m_original">
    <img src="https://img4.teletype.in/files/ff/48/ff489e09-7a97-4862-8a2c-a9a8d8436bc7.png" width="627" />
  </figure>
  <h3 id="txaR"><strong>Собираем код и тестим</strong></h3>
  <blockquote id="OZKY">Лол, не трогал код больше года, а он все еще рабочий..</blockquote>
  <figure id="zOZX" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/76/f9/76f91967-9bd2-4a7e-a6fd-34d8da59fca5.png" width="1072" />
    <figcaption>Ворк</figcaption>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@it_hueta/YbGV70iuvOs</guid><link>https://teletype.in/@it_hueta/YbGV70iuvOs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta</link><comments>https://teletype.in/@it_hueta/YbGV70iuvOs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=it_hueta#comments</comments><dc:creator>it_hueta</dc:creator><title>Seosprint, profitcentr и другие.. (решение без сервисов)</title><pubDate>Fri, 22 Mar 2024 01:33:10 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/41/02/41022d44-f8f0-4943-b2a3-0c5e87b88b76.png"></media:content><category>выебано</category><description><![CDATA[<img src="https://img1.teletype.in/files/41/52/4152bf46-b43b-4d7f-8606-ccd2c9b0228a.png"></img>На протяжении многих веков величайшие умы человечества бились над поисками ответа на вопрос &quot;как решить такую капчу?&quot;..]]></description><content:encoded><![CDATA[
  <figure id="JEXQ" class="m_original">
    <img src="https://img1.teletype.in/files/41/52/4152bf46-b43b-4d7f-8606-ccd2c9b0228a.png" width="1200" />
  </figure>
  <p id="VtwO">На протяжении многих веков величайшие умы человечества бились над поисками ответа на вопрос &quot;как решить такую капчу?&quot;. Вопрошающие хотели знать, как решать капчи на буксах, чтоб залутать многа деняк. </p>
  <figure id="d2gU" class="m_original">
    <img src="https://img2.teletype.in/files/d9/a2/d9a26d1b-1979-4946-9e21-424d0a61ae87.png" width="854" />
  </figure>
  <p id="4uF3"><a href="https://zenno.club/discussion/threads/razgadyvanie-kapchi-na-seosprint.95888/" target="_blank">Раньше решали просто</a> - сбор всех картинок как md5 и сопоставление с вопросом.</p>
  <figure id="JH3k" class="m_original">
    <img src="https://img1.teletype.in/files/8f/16/8f16a5c0-2bf8-40e7-9183-6c182e762c28.png" width="412" />
  </figure>
  <p id="uTEK">Даже под текст капчи был на бас пост <a href="https://community.bablosoft.com/topic/3232/%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE%D0%B5-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D0%BF%D1%87%D0%B8-%D0%BD%D0%B0-bas" target="_blank">Бесплатное автоматическое распознавание капчи на BAS.</a> И под <a href="https://community.bablosoft.com/topic/21066/%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5-%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8" target="_blank">profitcentr</a> тоже.</p>
  <p id="xHkJ">На самом деле, эт прикольный подход не только как решение, но и как оптимизация. По сути, мало кому нужно иметь риалтайм генерацию, это большая нагрузка, тем более, вдруг сгенерится чет нерешаемое, поэтому практически все (если не все) просто генерят 1к капч (сильно больше будто бы и смысла особо нет) и сейвят на сервере. А потому, есть резон собрать их все и прорешать 1 раз, пусть даже через сервисы, зато будет база ответов. А если база и обновляется или пополняется, можно просто ее каждый день дополнять. Оптимизация, хуле.</p>
  <figure id="6tFI" class="m_original">
    <img src="https://img4.teletype.in/files/f6/c8/f6c808a1-9f39-4469-a199-4b54bfa39032.png" width="862" />
  </figure>
  <p id="gGdH">Не могу сказать точно, что это блеклист слов капчи, но оно лежало в сурсах (слитый гитлаб яндекса) капчи в одной папке с генератором (вроде как).</p>
  <figure id="ul4V" class="m_original">
    <img src="https://img4.teletype.in/files/ba/52/ba52551b-9e2e-4d65-95e4-94b3684a8ca0.png" width="271" />
  </figure>
  <figure id="Yvcg" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5b/fc/5bfc695b-adb6-4cd1-b592-b6eb70dfd519.png" width="310" />
    <figcaption>Негры в блек листе..</figcaption>
  </figure>
  <p id="Rigq">Я решил внести свою лепту в поиски данного ответа. <br />Хачу решать капчу не решая капчу. Мне было немножко лень писать код, поэтому я попробовал напрячь &quot;искусственный интеллект&quot;, но он упорно выдавал хуйню с багами, без посказок, поэтому пришлось трохи и самому писать.</p>
  <figure id="EPGI" class="m_original">
    <img src="https://img4.teletype.in/files/be/3b/be3b86c1-83f4-4826-8a65-b1902efb6953.png" width="560" />
  </figure>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="7Xmv">Seosprint</h2>
  </section>
  <p id="Qxbc">Некоторое время назад у меня была идея сделать так, чтобы капча решила сама себя. Раз картинок не много, их пускают по кругу в разные вопросы, та что чаще всего в вопросе, та и есть верный ответ. </p>
  <p id="6SWt">Я напарсил запросеками задач с сеоспринт вида: вопрос и ответы, а потом вывернул и сделал перегруппировку, чтобы у каждого ответа был вопрос и частота встречи.</p>
  <figure id="pATp" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ad/57/ad570205-d990-4d87-b6b1-21892bcc27b4.png" width="1461" />
    <figcaption>Обновленный код с использованием pHash</figcaption>
  </figure>
  <p id="QNrQ">Таким образом, я хотел чтобы были получены все правильные вопросы на ответы и оно даже кое как работало, но недавно на <a href="https://community.bablosoft.com/topic/27540/%D0%BA%D0%B0%D0%BA-%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D1%83-%D0%B7%D0%BD%D0%B0%D1%8F-url" target="_blank">форуме я увидел вопрос</a> и оказалось, что капча поменялась. </p>
  <p id="RAdu">Теперь там картинки, видимо, создаются &quot;динамически&quot;. Рано или поздно я планировал опубликовать решалку, но тут оказалось, что она сдохла, поэтому мне захотелось придумать как наебать систему. </p>
  <p id="1Iwy">И для этого, я проделал все то же самое, но в качестве имени указывал не md5, а <a href="https://community.bablosoft.com/topic/21435/phash-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%85%D1%8D%D1%88%D0%B0" target="_blank">перцептуальный хэш</a>, под который я делал когда-то модуль.  Дополнительно мерждил ответы по 75% pHash в 1 картинку.</p>
  <figure id="fqlk" class="m_original">
    <img src="https://img2.teletype.in/files/d6/66/d66684b2-c44c-4b7a-a156-bea44b24b3bf.png" width="1156" />
  </figure>
  <p id="EJOl">Прогнал скачивание 1к капч, вывернул, подсчитал, опять вывернул, получил на выходе набор ответов под каждый вопрос. </p>
  <figure id="fJVM" class="m_original">
    <img src="https://img3.teletype.in/files/e2/98/e298edb0-06a9-4558-b413-c37c0f6daac1.png" width="781" />
  </figure>
  <figure id="avZB" class="m_original">
    <img src="https://img1.teletype.in/files/c2/c1/c2c15a2c-b9b6-4590-bde1-e863d126b8d3.png" width="1254" />
  </figure>
  <p id="xOmF">Запустил сортиров очку по папкам на основе по имени хеша и категории вопроса. По итогу было 30% мусора в каждой категории (наверное из за мерджа.. либо мало запросов), который я ручками почистил. Как не трудно заметить, похожие картинки даже расположены рядом. Только по итогу в решении через pHash, в качестве основного алго, это не помогло, схожесть картинок с разных групп была почему-то слишком высокая, но может это я конечно чет недопонял или проебался в коде.</p>
  <figure id="dgST" class="m_original">
    <img src="https://img3.teletype.in/files/64/28/6428ec88-5ca5-49f3-adaa-0f80a8420cd8.png" width="1620" />
  </figure>
  <h3 id="HRiL">Тесты</h3>
  <p id="LBiI">Я решил провести немножко тестов на различные алго поиска схожести изображений и ручками разметил 10 тасков.</p>
  <p id="u1jV">Удобно, что и тут в бас html работает</p>
  <p id="OPxh"><code>&#x27;&lt;div&gt;&lt;h3&gt;&#x27;+[[QUEST]]+&#x27;&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;data:image/jpeg;base64, &#x27;+[[IMG]]+&#x27; /&gt;&lt;/p&gt;&lt;/div&gt;&#x27;</code></p>
  <figure id="Etiq" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4b/f9/4bf9c1ee-58d7-4aa7-9aea-7e8ca3c334dd.png" width="912" />
    <figcaption>Хэнд джоб.</figcaption>
  </figure>
  <p id="YJsz">В результате получились вот такие размеченные картинки.</p>
  <figure id="cU2E" class="m_original">
    <img src="https://img3.teletype.in/files/64/58/64582259-9f41-4bf1-b876-7c71e880d21d.png" width="1200" />
  </figure>
  <p id="A560">Я подготовил 5 тестов: BAS (нативное сравнение), <a href="https://www.npmjs.com/package/imgphash" target="_blank">pHash</a>, <a href="https://www.npmjs.com/package/image-js" target="_blank">image-js (getSimilarity)</a>, <a href="https://www.npmjs.com/package/jimp" target="_blank">Jimp (distance - pHash)</a>, <a href="https://www.npmjs.com/package/jimp" target="_blank">Jimp (diff - PixelMatch)</a></p>
  <p id="olzG">Также несколько доп тестов для каждого: ориг, gray, gaussianFilter, resize</p>
  <p id="sliS"></p>
  <figure id="ZIb5" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f9/2c/f92c89c3-11df-498a-9f9f-7d66f7740e65.png" width="1124" />
    <figcaption>Доп тесты</figcaption>
  </figure>
  <figure id="7BdF" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/48/d1/48d1992d-2a73-44b4-b681-bba70beea1f3.png" width="2034" />
    <figcaption>Тесты сравнения</figcaption>
  </figure>
  <figure id="EhQD" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/39/69/39691a95-7f0c-42a1-85d6-12259b78edf0.png" width="479" />
    <figcaption>image-js (getSimilarity)</figcaption>
  </figure>
  <figure id="Tens" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/53/d5/53d5c244-f6b6-48fc-8697-b97c4a9a33ea.png" width="450" />
    <figcaption>Jimp.distance</figcaption>
  </figure>
  <figure id="gHeJ" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/13/29/1329b3d6-0267-43a8-8bd7-49a58b6a9fa7.png" width="463" />
    <figcaption>Jimp.diff</figcaption>
  </figure>
  <p id="GnsK"><em>Ну а теперь к самим тестам..</em></p>
  <p id="P08A"><strong>Test1</strong></p>
  <figure id="bj9U" class="m_original">
    <img src="https://img1.teletype.in/files/81/09/81099723-83ea-49ba-aa31-e574f2364ed8.png" width="1219" />
  </figure>
  <figure id="TutA" class="m_original">
    <img src="https://img1.teletype.in/files/0d/f8/0df8e965-7044-499e-a9ae-f79e70f8bea5.png" width="1220" />
  </figure>
  <figure id="8G6j" class="m_original">
    <img src="https://img1.teletype.in/files/0f/bc/0fbcd69a-73e9-4412-b02d-0f7fc7675576.png" width="1214" />
  </figure>
  <figure id="xveM" class="m_original">
    <img src="https://img1.teletype.in/files/80/34/8034c5da-5c0e-4282-a603-f694738d4ed1.png" width="1213" />
  </figure>
  <figure id="pewG" class="m_original">
    <img src="https://img1.teletype.in/files/06/99/069950b1-41f5-4c6c-9122-0012005498ae.png" width="1210" />
  </figure>
  <p id="jXls"><strong>Test2</strong></p>
  <figure id="HTsy" class="m_original">
    <img src="https://img1.teletype.in/files/c7/b7/c7b7df2d-5c98-45d3-a597-67ea58848b63.png" width="1211" />
  </figure>
  <figure id="Cz71" class="m_original">
    <img src="https://img3.teletype.in/files/e4/85/e48534ad-dd40-48cd-9738-d51ba9a7964d.png" width="1213" />
  </figure>
  <figure id="oc4f" class="m_original">
    <img src="https://img1.teletype.in/files/44/c1/44c1096f-f7d8-497b-aaeb-bbb43bc448f0.png" width="1210" />
  </figure>
  <figure id="ivW5" class="m_original">
    <img src="https://img1.teletype.in/files/4e/92/4e92d41b-6311-4f2d-b442-6e92b0a50389.png" width="1211" />
  </figure>
  <figure id="2xKG" class="m_original">
    <img src="https://img3.teletype.in/files/6b/a3/6ba34c10-eaff-4532-b89e-d8f802498e11.png" width="1208" />
  </figure>
  <p id="Co0Z"><strong>Test3</strong></p>
  <figure id="CHOq" class="m_original">
    <img src="https://img4.teletype.in/files/3d/31/3d31cfe4-ff9b-4259-a7c9-3b519f232ced.png" width="1211" />
  </figure>
  <figure id="0F9Q" class="m_original">
    <img src="https://img2.teletype.in/files/15/8c/158c44b5-2e28-4a8b-8dfd-41311658690d.png" width="1210" />
  </figure>
  <figure id="syge" class="m_original">
    <img src="https://img1.teletype.in/files/80/88/808872fe-a0c4-4b86-af3a-33af21cfc1c9.png" width="1207" />
  </figure>
  <figure id="JkPd" class="m_original">
    <img src="https://img4.teletype.in/files/7e/9d/7e9d82d3-e515-43e2-b03f-e6dc95eee5c1.png" width="1211" />
  </figure>
  <figure id="7eZ1" class="m_original">
    <img src="https://img1.teletype.in/files/c1/0e/c10e1a2d-6740-4fa7-93d3-2b034afb6bf8.png" width="1209" />
  </figure>
  <p id="z1cy"><strong>Test4</strong></p>
  <figure id="4jYr" class="m_original">
    <img src="https://img2.teletype.in/files/d3/76/d3767878-01dd-4014-844d-65fd872e83fd.png" width="1208" />
  </figure>
  <figure id="VZqP" class="m_original">
    <img src="https://img2.teletype.in/files/51/b3/51b32cbf-404a-4229-a693-df3d50f14b83.png" width="1215" />
  </figure>
  <figure id="BHlI" class="m_original">
    <img src="https://img4.teletype.in/files/35/2b/352b0c22-4445-4516-abc5-f18c4bc17b96.png" width="1217" />
  </figure>
  <figure id="j0LQ" class="m_original">
    <img src="https://img1.teletype.in/files/02/2c/022c9d12-8303-4748-9863-5dce913a70f4.png" width="1209" />
  </figure>
  <figure id="XSit" class="m_original">
    <img src="https://img1.teletype.in/files/85/92/85929eec-74b8-456b-a8ef-cdaee2158bbc.png" width="1213" />
  </figure>
  <p id="XOZD"><strong>Test5</strong></p>
  <figure id="fPsr" class="m_original">
    <img src="https://img3.teletype.in/files/2c/f0/2cf06fd1-eb6a-46de-92f4-d305a078bbf8.png" width="1211" />
  </figure>
  <figure id="KK0X" class="m_original">
    <img src="https://img3.teletype.in/files/eb/82/eb822f49-acce-4ead-98b8-294d32e00cf0.png" width="1206" />
  </figure>
  <figure id="2Xvm" class="m_original">
    <img src="https://img1.teletype.in/files/48/4d/484d7bdb-6be1-4a99-9fca-dbe1d4e095fc.png" width="1210" />
  </figure>
  <figure id="KQz1" class="m_original">
    <img src="https://img2.teletype.in/files/5d/a9/5da9184e-4e92-494e-a21c-b462bac0fe7d.png" width="1211" />
  </figure>
  <figure id="wUCh" class="m_original">
    <img src="https://img3.teletype.in/files/27/b7/27b799ba-b823-4889-ab35-05ba9afe8250.png" width="1212" />
  </figure>
  <p id="XTKU"><strong>Test6</strong></p>
  <figure id="6X16" class="m_original">
    <img src="https://img4.teletype.in/files/3e/45/3e450a12-4698-43a1-b4a8-733f3322810b.png" width="1207" />
  </figure>
  <figure id="SElK" class="m_original">
    <img src="https://img1.teletype.in/files/8c/c4/8cc400b3-54aa-4ea4-b7c5-a54bd9930fcb.png" width="1210" />
  </figure>
  <figure id="CiNE" class="m_original">
    <img src="https://img1.teletype.in/files/0b/ab/0bab4901-0fea-463a-8f87-ecf230eb7d72.png" width="1209" />
  </figure>
  <figure id="CJwU" class="m_original">
    <img src="https://img2.teletype.in/files/da/88/da88244e-4835-41c3-859a-0428fcfada25.png" width="1214" />
  </figure>
  <figure id="F94v" class="m_original">
    <img src="https://img2.teletype.in/files/5a/c8/5ac82de5-3931-44c1-8262-396370c8bfff.png" width="1212" />
  </figure>
  <figure id="u8fW" class="m_original">
    <img src="https://img1.teletype.in/files/cb/ab/cbab1524-bf3f-4e18-b2b6-157e8ee43782.png" width="1210" />
  </figure>
  <p id="TW1d"><strong>Test7</strong></p>
  <figure id="32Ro" class="m_original">
    <img src="https://img3.teletype.in/files/e8/1e/e81e4c19-f902-4b9b-9f12-e6839a9c37ac.png" width="1209" />
  </figure>
  <figure id="RZXC" class="m_original">
    <img src="https://img2.teletype.in/files/97/6c/976c42e6-dc72-4722-b6a0-daf8a7178cf5.png" width="1212" />
  </figure>
  <figure id="MLbV" class="m_original">
    <img src="https://img3.teletype.in/files/ae/87/ae87384c-4b0e-4dc2-8ea4-89be907922ab.png" width="1214" />
  </figure>
  <figure id="yeEh" class="m_original">
    <img src="https://img2.teletype.in/files/9d/d2/9dd2798e-3d75-401e-87c8-addf49a6e750.png" width="1214" />
  </figure>
  <figure id="VfjV" class="m_original">
    <img src="https://img2.teletype.in/files/95/b1/95b1b90d-5671-4efa-b06c-4597f921dafa.png" width="1211" />
  </figure>
  <p id="uusV"><strong>Test8</strong></p>
  <figure id="nhpt" class="m_original">
    <img src="https://img2.teletype.in/files/d9/d2/d9d22219-2cec-49b5-b04b-73358745722d.png" width="1211" />
  </figure>
  <figure id="4xEC" class="m_original">
    <img src="https://img4.teletype.in/files/3e/3b/3e3bbb69-b3a0-4e2e-88b1-153e9c0773f1.png" width="1210" />
  </figure>
  <figure id="beFU" class="m_original">
    <img src="https://img4.teletype.in/files/3a/14/3a144f1b-9a5e-425f-aa1f-3b4d9152e2df.png" width="1209" />
  </figure>
  <figure id="NBMv" class="m_original">
    <img src="https://img4.teletype.in/files/f7/f1/f7f1486c-4f8b-4db3-afe3-d36681e51efd.png" width="1214" />
  </figure>
  <figure id="4iL5" class="m_original">
    <img src="https://img1.teletype.in/files/0e/8f/0e8fe74b-2732-4bcd-8890-678883f9b37a.png" width="1208" />
  </figure>
  <p id="521m"><strong>Test9</strong></p>
  <figure id="ARhj" class="m_original">
    <img src="https://img2.teletype.in/files/9b/3b/9b3b13a9-b061-4f76-884d-309062199780.png" width="1205" />
  </figure>
  <figure id="nAZv" class="m_original">
    <img src="https://img1.teletype.in/files/44/15/4415c158-70da-476d-9f28-8286dfaef1a3.png" width="1213" />
  </figure>
  <figure id="WWcu" class="m_original">
    <img src="https://img1.teletype.in/files/49/fb/49fb3e84-4ca2-47b5-aca2-63547f1fe890.png" width="1212" />
  </figure>
  <figure id="0fRQ" class="m_original">
    <img src="https://img2.teletype.in/files/53/d6/53d6946e-426e-483a-8cce-b1473a1347ed.png" width="1210" />
  </figure>
  <figure id="47AE" class="m_original">
    <img src="https://img1.teletype.in/files/46/eb/46eb13cf-3539-4a37-b985-c10fbcb4d1a6.png" width="1212" />
  </figure>
  <p id="6Wa5"><strong>Test10</strong></p>
  <figure id="1O36" class="m_original">
    <img src="https://img2.teletype.in/files/9f/8d/9f8d5089-0335-48cb-9d26-14e948632c97.png" width="1209" />
  </figure>
  <figure id="VkGT" class="m_original">
    <img src="https://img4.teletype.in/files/ba/cf/bacf1bbc-e8ef-49ed-8db9-848d4fdd3521.png" width="1212" />
  </figure>
  <figure id="Ugag" class="m_original">
    <img src="https://img4.teletype.in/files/b0/cc/b0cc1152-c217-4deb-b92e-e6cc17d9ae5d.png" width="1211" />
  </figure>
  <figure id="rVn6" class="m_original">
    <img src="https://img1.teletype.in/files/02/45/0245d9cb-0aa2-4980-a5a6-312b3b191196.png" width="1214" />
  </figure>
  <figure id="a5tu" class="m_original">
    <img src="https://img2.teletype.in/files/1c/c1/1cc13367-ea82-45fd-ab9f-e5ad72c63c08.png" width="1212" />
  </figure>
  <h3 id="jXnF">И еще тесты..</h3>
  <p id="jzxS">По итогу я выбрал 3 варианта и провел еще пару тестов: сравнение картинок бас, комбо по 3 метрикам (phash, bas, image-js). Но комбо чет прироста не дало особо, хотя я пытался ставить разные пороги у разных алго в надежде, что это чет поменяет. Jimp алгоритмы почему-то работали в 10 раз медленнее, еще и хуёво в рамках данной задачи. А еще, вполне закономерно, что сходство по pHash у сжатых картинок хуже чем у фул размера. </p>
  <figure id="t2Ct" class="m_original">
    <img src="https://img2.teletype.in/files/9b/d2/9bd2c07e-1466-46fc-8809-f3dc0888346c.png" width="1210" />
  </figure>
  <p id="EnsW">Затем, я заметил, что можно по урлу запрашивать 1 картинку и каждый раз она будет чуть видоизменяться (чб, кроп, поворот). Попробовал насобирать по 10 вариантов каждой картинки при решении 1 таска, но прироста в качестве это не дало, зато стало в 10 раз дольше решать.</p>
  <figure id="YSss" class="m_original">
    <img src="https://img1.teletype.in/files/8c/b6/8cb6631d-ad25-4267-bebf-602d22852ee7.png" width="1210" />
  </figure>
  <figure id="7yLI" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d8/b3/d8b38f43-6439-4113-badb-ffc29a0f675f.png" width="1125" />
    <figcaption>Вариации картинки при повторных запросах. По сути, там привязка номера капчи к куке.</figcaption>
  </figure>
  <h3 id="fM3B">Итоговое решение</h3>
  <p id="f6PX">По итогу я выбрал вариант сравнение image-js с порогом выше 92, по качеству, кажется, трохи лучше чем нейтив бас, а по скорости примерно также.</p>
  <figure id="9P4C" class="m_original">
    <img src="https://img1.teletype.in/files/c0/1c/c01cb53e-044a-4a37-be3a-31cf69e3df8e.png" width="1205" />
  </figure>
  <p id="rkxi">Прогнал 100 тестов. Результат 52/100, что для фри решения без всяких нейросеток вполне неплохо.</p>
  <figure id="I4fA" class="m_original">
    <img src="https://img4.teletype.in/files/ff/bf/ffbfc44a-b91c-477b-9332-c85405eba18f.png" width="1639" />
  </figure>
  <p id="t4LJ">Когда решил капчу сам, без сервисов и она работает, хоть и хуёво, но зато бесплатно.</p>
  <figure id="jjAF" class="m_original">
    <img src="https://img4.teletype.in/files/b4/97/b497d4c9-6636-4000-9532-df801a7ade58.png" width="1134" />
  </figure>
  <p id="9pZx">С другой стороны, картинки разные, добиться иного результата будет не просто.</p>
  <figure id="KCRO" class="m_original">
    <img src="https://img4.teletype.in/files/bd/75/bd750b2a-eafd-44f6-a5a6-c1d0aa152076.png" width="1200" />
  </figure>
  <h2 id="sFgY">Шучу, хуярим дальше</h2>
  <p id="dmIx">Помните, я чуть ранее сказал, что при повторном запросе картинки сайт вертает разные её виды? нутк го этим воспользуемся и напИздим все что есть)</p>
  <p id="uhxG">Так как есть все правильные картинки, можно напарсить каждой по 30 вариаций.</p>
  <figure id="GiRG" class="m_original">
    <img src="https://img4.teletype.in/files/7e/a3/7ea37e91-b420-4cb1-9b85-2123a00ee182.png" width="1034" />
  </figure>
  <figure id="CFyt" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/24/6d/246d739c-e99d-44c1-a668-38a4164b84ca.png" width="1034" />
    <figcaption>изи</figcaption>
  </figure>
  <p id="GCzo">Ну я и напарсил. Ну вот, другое дело. 10/10, алгоритм <strong>BAS</strong>, сжатие + чб + мыло, порог 95%</p>
  <figure id="8Wur" class="m_original">
    <img src="https://img3.teletype.in/files/e4/31/e4314d61-84e8-4bb6-af02-3e3a4b13f2f9.png" width="1217" />
  </figure>
  <figure id="hFAN" class="m_original">
    <img src="https://img3.teletype.in/files/e4/c5/e4c5a5c8-5f4a-42a4-8667-8bef91fe9ba6.png" width="1219" />
  </figure>
  <figure id="5JGh" class="m_original">
    <img src="https://img3.teletype.in/files/2b/fd/2bfddfd4-f26c-43ea-8814-58c6ad729f14.png" width="1215" />
  </figure>
  <p id="1A01">И на алго <strong>image-js</strong>, 92% тоже 10/10.</p>
  <figure id="KNch" class="m_original">
    <img src="https://img2.teletype.in/files/97/14/9714d02a-7a9a-496c-8a59-3833ce656b53.png" width="1216" />
  </figure>
  <figure id="Y4bc" class="m_original">
    <img src="https://img3.teletype.in/files/ac/52/ac52a6d3-1703-4860-b638-5c79eb5b2e84.png" width="1215" />
  </figure>
  <figure id="7uFq" class="m_original">
    <img src="https://img2.teletype.in/files/d4/16/d416012f-02eb-4442-952a-2af3de4434e8.png" width="1218" />
  </figure>
  <p id="9th4">Прогнал 100 тестов. Алго: BAS 91/100, image-js 92/100. Сила черипикинга) Но по сути сильно разницы нет, можно будто бы и то и то юзать.</p>
  <p id="brvX">Ошибка не выделил нужное (над по больше примерчиков): BAS 6/9 , image-js 6/8 </p>
  <p id="Jmjx">Ошибки в парах для сравнения алго: </p>
  <figure id="CkQC" class="m_original">
    <img src="https://img2.teletype.in/files/d0/65/d0651351-06e9-4643-bab3-d84de32b3752.png" width="1212" />
  </figure>
  <figure id="ofxW" class="m_original">
    <img src="https://img3.teletype.in/files/61/c3/61c34107-83dc-4012-8a44-1584d8d835b1.png" width="1212" />
  </figure>
  <figure id="lM4h" class="m_original">
    <img src="https://img3.teletype.in/files/26/ac/26ac088b-63cb-42f5-a922-406bd8f2abd1.png" width="1211" />
  </figure>
  <figure id="HCju" class="m_original">
    <img src="https://img2.teletype.in/files/51/b3/51b3cecc-34a9-4390-91b1-cae1ac7eb161.png" width="1207" />
  </figure>
  <figure id="SRvK" class="m_original">
    <img src="https://img3.teletype.in/files/6e/a0/6ea0845e-c97f-4dac-b8e5-0b6f724c9719.png" width="1206" />
  </figure>
  <figure id="Y0Gd" class="m_original">
    <img src="https://img4.teletype.in/files/39/a4/39a4f242-8198-4f48-987a-cfb3b63bd177.png" width="1213" />
  </figure>
  <figure id="lOT9" class="m_original">
    <img src="https://img3.teletype.in/files/2c/cc/2ccc7ce4-b003-4eb4-aeec-30989ca979df.png" width="1208" />
  </figure>
  <figure id="lRHM" class="m_original">
    <img src="https://img4.teletype.in/files/7d/54/7d54c87d-4413-42e2-92c9-505cec7656eb.png" width="1210" />
  </figure>
  <figure id="q3hL" class="m_original">
    <img src="https://img2.teletype.in/files/de/c0/dec01e2e-d3a2-4681-84b1-38970d8b18b1.png" width="1211" />
  </figure>
  <figure id="oacw" class="m_original">
    <img src="https://img3.teletype.in/files/22/62/226233ce-6ef8-43dd-a691-ce632647dfa1.png" width="1211" />
  </figure>
  <figure id="HZ3x" class="m_original">
    <img src="https://img4.teletype.in/files/35/4b/354b4dad-4d78-4648-a3c8-ed55a95d0df4.png" width="1207" />
  </figure>
  <figure id="ZdcG" class="m_original">
    <img src="https://img4.teletype.in/files/f2/1a/f21a6977-e386-4b9d-9d84-791343ae8328.png" width="1208" />
  </figure>
  <p id="841w">Ну и кароч, я заметил, в итоге что проебал 1 картинку с коровой, потому и были с ней ошибки в тестах. В итоге алго: BAS 94/100, image-js 95/100.</p>
  <figure id="6xEE" class="m_original">
    <img src="https://img4.teletype.in/files/38/a5/38a551d1-6c22-4512-a5fe-09b7e83642d1.jpeg" width="150" />
  </figure>
  <p id="IshW">Судя по качеству решения, кажется что я спарсил почти все что у них было.. мож так и есть. Если еще чуток допарсить каждой картинки, скорее всего качество улучшится..</p>
  <figure id="3l0W" class="m_original">
    <img src="https://img1.teletype.in/files/cb/29/cb29ca94-63b0-4231-a528-e32cc9b938dc.png" width="880" />
  </figure>
  <h3 id="hNLX">Иии... конец!?</h3>
  <p id="4Wyu">Шучу, какой конце нахуй, с хуя ли блять конец?</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="Ayg7">Хуярим дальше. Profitcentr.</h2>
  </section>
  <p id="NqwF">Надо проверим работала ли моя та изначальная уебанская идея.</p>
  <p id="KQv1">Ну и я типо не доволен нихуя. Какого хуя мне опять пришлось заниматься вот этой всей дрочкой? Мне нужно было прогонять тесты фильтруя по вопросу и чекать та или не та картинка, чтоб запускать ее парс. </p>
  <p id="zJ2E">Я хотел прочекать, что моя идея с авто решением через группировку вопроса и ответа сработает, а вместо этого ебался с капчей. Напоминаю, я хочу чекнуть валид алго: </p>
  <p id="SxRB">Формируем хэш таблицу, где в имени хэш картинки и варианты вопросов под нее с подсчетом. <br />После этого выворачиваем её наоборот, берем теперь хэш с его вариантами вопросов и выбираем тот где большее значение, в этот вопрос и ставим хэш.</p>
  <figure id="7oMh" class="m_original">
    <img src="https://img2.teletype.in/files/93/ec/93ecf9fb-924b-424b-947e-cfe6b56bdf11.png" width="867" />
  </figure>
  <p id="89we">На выходе получим жсончег с вопросами и ответами.</p>
  <figure id="3Set" class="m_original">
    <img src="https://img3.teletype.in/files/a8/e6/a8e64197-840e-4b2d-ad39-f2ff88ebe636.png" width="925" />
  </figure>
  <p id="3FQq">Возьмем самое удобное на чем можно почекать.</p>
  <figure id="doBo" class="m_original">
    <img src="https://img4.teletype.in/files/b9/8a/b98a7043-003c-4f7c-a327-5489f6bda024.png" width="1679" />
  </figure>
  <p id="jDxE">1к запросекаф, есть ошибки, не удовлетворительно. Пробуем еще раз.</p>
  <figure id="mo83" class="m_original">
    <img src="https://img4.teletype.in/files/31/5d/315d31bb-c8fe-4716-97ac-ddbff95f08b7.png" width="1435" />
  </figure>
  <p id="IUUl">10к запросекаф. Вот теперь все хорошо разметилось, отлично)</p>
  <figure id="jDp9" class="m_original">
    <img src="https://img4.teletype.in/files/73/6f/736f8b5d-823a-4c49-b149-b5f6128e207d.png" width="1265" />
  </figure>
  <figure id="DCJk" class="m_original">
    <img src="https://img2.teletype.in/files/14/fc/14fc7ec1-d2cc-41c3-9481-b0298c2afd47.png" width="1265" />
  </figure>
  <figure id="l4Xq" class="m_original">
    <img src="https://img1.teletype.in/files/84/28/8428821b-ad68-46e4-a34e-e25671acaafb.png" width="1265" />
  </figure>
  <figure id="BuGr" class="m_original">
    <img src="https://img1.teletype.in/files/83/a1/83a1d434-75c5-45b7-9c0c-6fa3f8b7369f.png" width="1265" />
  </figure>
  <figure id="eDiB" class="m_original">
    <img src="https://img4.teletype.in/files/fc/b4/fcb4ef1c-68b5-4f70-8670-c60381e82a7c.png" width="1265" />
  </figure>
  <p id="6B6F">Да, теперь перевес у ответов статистически значимый.</p>
  <figure id="E8wt" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/22/86/228652c8-4cb6-4778-a172-7ab58ca7dc02.png" width="432" />
    <figcaption>Скрин первого этапа - подсчет вопросов под ответ</figcaption>
  </figure>
  <h3 id="dWDg">Итог:</h3>
  <p id="MRa8">По сути, хэшить картинки действительно есть резон, даже для обычных капч. Все-таки сайт вряд ли их генерит или хранит на серверах огромное количество. А на буксах такой подход стабильно решает капчу на 100%. </p>
  <p id="y4c9">В целом, тыкать буксы было даже немного интересно, особенно попробовать разные сравнения картинок.</p>
  <figure id="DFvP" class="m_original">
    <img src="https://img4.teletype.in/files/bc/cf/bccf51f1-487d-4025-bf4f-b7f36a2e1843.png" width="840" />
  </figure>

]]></content:encoded></item></channel></rss>