Содержание

SYG - Майнер адресов на bash

SimpleYggGen – майнер адресов Yggdrasil, написанный на bash. Позиционировался, как простой инструмент, с которым справится даже начинающий пользователь Linux. Позволяет добывать адреса с красивыми сочетаниями символов. Работает с регулярными выражениями. Проект поддерживался пользователем acetone. Первый релиз датируется 23 апреля 2020 года.
Причина малой скорости работы скрипта кроется в обращении операционной системы к бинарному файлу Yggdrasil. Скрипт постоянно запрашивает у него конфигурационный файл, после чего проверяет полученный адрес через стандартный функционал того же бинарного файла.
Код распространяется свободно, номинально под лицензией GPL v3 or later.

Notabene: В настоящее время использование скрипта SYG на bash не имеет практического смысла. Он остался в истории, как идеологический прородитель, когда в игру вступили майнеры, написанные на C++ и Go.

Механика процесса

Для работы скрипта, в системе должен быть установлен клиент Yggdrasil. В конечном счете майнинг сводится к получению файлов конфигурации Yggdrasil и их проверке на совпадение адреса с искомым фрагментом. Цель (target) задается при запуске скрипта. Обработка осуществляется по параметру EncryptionPublicKey.

Наглядный пример

# Получаем новый файл конфигурации со случайным адресом. Записываем его в переменную "tempconf".
tempconf=$(yggdrasil -genconf) 
 
# Извлекаем из конфига значение EncryptionPublicKey в одноименную переменную.
EncryptionPublicKey=$(echo $tempconf | grep -w -o -E "EncryptionPublicKey: [0-9a-f]{64}") 
 
# Проверяем адрес, ищем совпадение с искомой строкой ($target).
if ( echo $EncryptionPublicKey | yggdrasil -address -useconf | grep -i -E "$target")
 
# Если есть совпадение, извлекаем из конфига EncryptionPrivateKey.
then EncryptionPrivateKey=$(echo $tempconf | grep -w -o -E "EncryptionPrivateKey: [0-9a-f]{64}")
 
# Затем удачный конфиг записывается на диск.

Скачать

Для практического использования скрипта и более подробного изучения кода, можете сохранить скрипт, кликнув по заголовку блока:

syg2.4.sh
#!/bin/bash
 
#---------------------------------------------------------------#
# RU: Пожелания и правки присылайте на hash.null @acetone       #
# EN: Send wishes and corrections to the hash.null @acetone     #
#                                                               #
# SimpleYggGen v2.4, acetone, 2020. Russia.                     #
#---------------------------------------------------------------#
 
#-----------------КОНФИГУРАЦИЯ / CONFIGURATION------------------#
# Set Yggdrasil binary path:
# for Linux:
YGGBIN=/usr/bin/yggdrasil
# for Windows (running that script with MSYS2 (msys2.org):
#YGGBIN="/c/Program Files/Yggdrasil/yggdrasil.exe"
#
# To enable non-special names uncomment that line:
#nonspecial=true
#
# To enable system testing uncomment that line:
runtest=true
# 
#------------------------КОНЕЦ / END----------------------------#
 
#---------------------------------------------------------------#
#--ЛЮБЫЕ ИЗМЕНЕНИЯ В КОДЕ НИЖЕ ВЫ ДЕЛАЕТЕ НА СВОЙ СТРАХ И РИСК--#
#-----ANY CHANGES IN THE CODE BELOW YOU DO AT YOUR OWN RISK-----#
#---------------------------------------------------------------#
 
test () {
  timestart=$(date '+%s')
 
  for (( c=1; c<101; c++ )); do
    tempconf=$("$YGGBIN" -genconf)
    EncryptionPublicKey=$(echo $tempconf | grep -w -o -E "EncryptionPublicKey: [0-9a-f]{64}")
    if [[ $c = 102 ]]; then
      echo '' > /dev/null
    fi
    echo -n -e "\e[36m  Analyzing $c%\e[0m" \\r
  done
 
  timestop=$(date '+%s')
  final=$(($timestop-$timestart))
 
  if [[ "$final" -le "1" ]]; then
    color="\e[36m"
  elif [[ "$final" -le "2" ]]; then
    color="\e[32m"
  elif [[ "$final" -le "3" ]]; then
    color="\e[33m"
  else
    color="\e[31m"
  fi
 
  echo -n -e "$color  Testing taken $final second(s)\e[0m\n\n"
}
 
log () {
  echo -e "Yggdrasil addresses list\\n$(date '+%Y-%m-%d %H:%M:%S')"\\n > ./syg.log
 
  if ( ls ./sygX* 2> /dev/null | grep 2 &> /dev/null ); then
    ls ./sygX* 2> /dev/null | tr -d syg | tr _ : | tr -d X >> ./syg.log 2> /dev/null
    echo '' >> ./syg.log
    liness=$(wc ./syg.log -l | cut -f1 -d' ' 2> /dev/null);
    tail -n $(($liness-2)) ./syg.log 2> /dev/null
    echo -e "\e[32m  Names saved to syg.log\e[0m\n"
  else
    echo -e "\e[31m  sygX* file not exist\e[0m\n"
    main
    exit 0
  fi
}
 
tars () {
  log
  tar -cf ./syg$(date '+%Y%m%d_%H%M').tar ./sygX* syg.log 2> /dev/null
  echo -e "\e[32m  All addresses archived\e[0m\n"
}
 
intro () {
  clear
  echo -e "\e[38m"' '
  echo -e "  ▒▒▒▒▒▒ ▒    ▒ ▒▒▒▒▒▒"
  sleep 0.05
  echo -e "  ▒      ▒    ▒ ▒"
  sleep 0.05
  echo -e "  ▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒  ▒▒▒"
  sleep 0.05
  echo -e "       ▒      ▒ ▒    ▒"
  sleep 0.05
  echo -e "  ▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒\e[0m"
  echo -e "\e[38m\n  © SimpleYggGen v2.4\n    acetone, 2020\e[0m\n"
}
 
main () {
  circle=0
  randomfortune=0
  sleep 0.03
  echo -e -n '  Target'"$color » \e[0m"
  read userinput
 
  if [[ $userinput = '' ]]; then
    target=::
  elif [[ $userinput == [lL][oO][gG] ]]; then
    log
    sleep 0.3
    main
  elif [[ $userinput == [tT][aA][rR] ]]; then
    tars
    sleep 0.3
    main
  elif [[ $userinput == [tT][aA][rR][dD][eE][lL] ]]; then
    tars
    rm -r ./sygX* 2> /dev/null
    echo -e "\e[33m  Original files deleted\e[0m\n"
    sleep 0.3
    main
  elif [[ $userinput == *[g-zG-Zа-яА-Я\;\+\&\#\~\_\%\=\/]* ]]; then
    sleep 0.03
    echo -e "  \e[31mIncorrect input\e[0m" \\n
    sleep 0.03
    main
  else
    target=$userinput
  fi
 
  if [[ $nonspecial == "true" ]]; then
    dirname=$(echo $target | tr \* S | tr \| I | tr : C | tr ^ U | tr $ D | tr - M | tr [ L | tr ] J | tr . T)
  else
    dirname=$target
  fi
 
  clear
  echo -e \\n"  [$color$target\e[0m] $(date '+%Y.%m.%d %H:%M:%S')\n"
  tput civis
  for ((;;)); do
    tempconf=$("$YGGBIN" -genconf)
    EncryptionPublicKey=$(echo $tempconf | grep -w -o -E "EncryptionPublicKey: [0-9a-f]{64}")
 
    if ( echo $EncryptionPublicKey | "$YGGBIN" -address -useconf | grep -i -E "$target" &> /dev/null ); then
      EncryptionPrivateKey=$(echo $tempconf | grep -w -o -E "EncryptionPrivateKey: [0-9a-f]{64}")
      yggsubnet=$(echo $EncryptionPublicKey | "$YGGBIN" -subnet -useconf)
      yggaddress=$(echo $EncryptionPublicKey | "$YGGBIN" -address -useconf)
 
      mkdir ./sygX$dirname &> /dev/null
      sygnamefile=$(echo $yggaddress | tr : _)
      echo -e "# Address: $yggaddress\n# Subnet:  $yggsubnet\n\n# Change it to yggdrasil.conf\n  $EncryptionPublicKey\n  $EncryptionPrivateKey\n\n# SimpleYggGen v2.4 [$(date '+%Y-%m-%d %H:%M:%S')] \n# Check new version: https://cloud.disroot.org/s/TA63PBsQ6Z7dfGW" > ./sygX$dirname/$sygnamefile
      randomfortune=$(($randomfortune+1))
    fi
 
    circle=$(($circle+1))
    echo -n -e "  \e[35m$circle/\e[0m$randomfortune \e[32m$yggaddress\e[0m " \\r
  done
}
 
# Start script execution
intro
 
# Run test if enabled
if [[ $runtest == "true" ]]; then
  test
else
  color="\e[37m"
fi
 
# Start interactive
main

Для использования, после загрузки необходимо сделать файл исполняемым:

$ chmod +x ./syg2.4.sh

И запустить (права суперпользователя не требуются):

$ ./syg2.4.sh

Регулярные выражения

Регулярные выражения - это набор символов, которые наделены особыми свойствами. Они позволяют сделать процесс майнинга более нацеленным на нужный результат. Это позволяет избежать выдачи похожих, но неподходящих адресов.

Для проверки регулярного выражения перед майнингом его можно проверить следующим образом:

echo примерный_адрес_который_вы_хотите | grep -E "Регулярное_выражение"

Если выдача команды оказалась пустой, по вашему регулярному выражению искомый адрес обнаружен не будет.

Примеры

Практические примеры регулярных выражений:

^…:420: # Привязка к началу строки, первые три символа - любые, двоеточие, 420, двоеточие.
^2.[a-f] # Привязка к началу строки, двойка - первая, затем любой символ, третий символ - любая цифра от «a» до «f».
1dea$ # Привязка к концу строки.
^…:[0-9]{1,4}:[0-9]{1,4}:[0-9]{1,4}:[0-9]{1,4}:[0-9]{1,4}:[0-9]{1,4}:[0-9]{1,4}$ # Адрес, состоящий только из цифр от 0 до 9.
^…:[a-f]{1,4}:[a-f]{1,4}:[a-f]{1,4}:[a-f]{1,4}:[a-f]{1,4}:[a-f]{1,4}:[a-f]{1,4}$ # Адрес, состоящий только из букв от a до f.

Примеры майнинга

:: # Адрес с двойным двоеточием (является целью по умолчанию).
На майнинг указанного адреса ушли сотни миллионов циклов (около месяца в несколько потоков).
200::c84:77b0:f66d:b47e:64c7

^…:ace: # Второй разряд адреса «ace».
Такие адреса находились примерно раз в 20-40 минут, каждый оценивался визуально. В результате майнинга в течение нескольких суток были сохранены адреса с подсетью следующего вида:
300:ace:1ace:dd67::
300:ace:1dea:319f::
300:ace:ac1d:1f10::

Конечно же это баловство, но мелочь, а приятно ;-)

Дополнительные функции

В версии 2.3 (релиз 29.05.2020) появилось три функции, которые делают работу с полученными файлами конфигурации более удобной.

Данный функционал полезен для крупномасштабного майнинга.

Специальные символы в именах

Для замены специальных символов в названии файлов и папок, создаваемых майнером, необходимо раскомментировать строку special=false. В некоторых ситуациях это может оказаться полезным. Таблица замены спецсимволов:

Спецсимвол Замена Мнемоника
* S Star
Вертикальная черта I
: C Colon
Крышка U Up
$ D Dollar
- M Minus
[ L
] J
. T Точка, по-русски

Ссылки

Спасибо: R4SAS