Перейти к содержимому


Фотография

Восстанавливаем поврежденный wallet.dat


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 29

#1 allbanks

allbanks

    Новичок

  • 5 topics
  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 18 июля 2017 - 04:13

Условия задачи:
1. wallet.dat не зашифрован (не был установлен пароль)
2. Вы не ищете средства на z-адресах zcash и его форках (бабло на t-aдресах данным способом восстанавливается)
3. Юзаем линукс, ибо в нем всё необходимое уже есть из коробки.

wallet.dat может быть поврежден кучей способов (виноват хдд или флешка, баг самого клиента, валлет был случайно удален и восстановлен частично). В этом случае при запуске клиента поврежденный файл будет переименован с расширением .bak и создан пустой новый кошелек.

Итак, в wallet.dat все приватные ключи хранятся в hex-формате, при этом совершенно непонятно, какой ключ какому адресу принадлежит. Наша задача состоит в том, чтобы hex преобразовать в WIF (wallet import format), после чего импортировать его в новый кошелек, таким образом получив доступ к балансу. Если кошелек использовался активно, то ключей там может быть ОЧЕНЬ много, даже в только что созданном wallet.dat может быть больше ста ключей.

Сначала объясню на кошках на примере одного единственного приватного ключа BTC или ZEC.

Итак, у нас есть ключ вида: 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

Добавляем в начало префикс 80: 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
Префикс берется из исходного кода нужной монеты из файла src/chainparams.cpp

BTC: https://github.com/b...params.cpp#L127

Код:
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,128);

Число 128 переводим из десятичной системы в шестнадцатеричную, получаем 80.

ZEC: https://github.com/z...params.cpp#L162

Код:
base58Prefixes[SECRET_KEY] = {0x80};

Здесь это число сразу в шестнадцатеричной системе, берем как есть.

LTC: https://github.com/l...params.cpp#L141

Код:
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,176);

Число 176 переводим из десятичной системы в шестнадцатеричную, получаем B0.

Добавляем в конец суффикс 01: 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D01
Добавив этот суффикс, мы получим приватные ключи в сжатом (compressed) формате, они начинаются на K или L. Если нужны ключи, которые начинаются на 5 (uncompressed), то суффикс не добавляем.

Берем утилиту Bitcoin Explorer https://github.com/l...itcoin-explorer
Скачать готовый запускаемый файл можно здесь https://github.com/l...iki/Download-BX

Вычисляем sha256 из нашего числа:

Код:
echo 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D01 | ./bx-linux-x64-qrcode sha256

Получаем b504a81b66924482a289ce571a614c37b122f40cefb0abba0227e143154c2153

Вычисляем sha256 из полученного числа:

Код:
echo b504a81b66924482a289ce571a614c37b122f40cefb0abba0227e143154c2153 | ./bx-linux-x64-qrcode sha256

a62019d20340a1de1b5f254f07f2f6c96ad5165218459ab4f3c8f5a7c0e12183

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

И наконец получаем приватный ключ, который можно импортировать в кошелек (WIF), с помощью base58-encode:

Код:
echo 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D01a62019d2 | ./bx-linux-x64-qrcode base58-encode

KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617

Запускаем bitcoind и импортируем ключ:

Код:
./bitcoin-cli importprivkey KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617

Проверяем баланс:

Код:
./bitcoin-cli getbalance

Теперь перейдем к работе с файлом кошелька. Пусть это будет zcash. Качаем и скидываем в одну директорию:
поврежденный wallet.dat
bx-linux-x64-qrcode
zcashd
zcash-cli

Сначала нужно файл кошелька преобразовать в текстовый формат:

Код:
xxd -p wallet.dat | tr -d '\n' > plainhex.dump

Далее полученный файл нужно препарировать так, чтобы в нем остались только ключи. В wallet.dat ключи находятся между значениями f70001d63081d30201010420 и a08185308182020101302c06072a8648ce3d0101022100.

Код:
cat plainhex.dump | sed "s/f70001d63081d30201010420/f70001d63081d30201010420\n/g" | sed "s/a08185308182020101302c06072a8648ce3d0101022100/\na08185308182020101302c06072a8648ce3d0101022100/g" | sed '/f70001d63081d30201010420/d' | sed '/a08185308182020101302c06072a8648ce3d0101022100/d' > keys.temp

Эту конструкцию сложно понять без бутылки, поэтому попытаюсь объяснить.
Первый sed вставляет знак перевода строки после каждого значения f70001d63081d30201010420
Второй sed вставляет знак перевода строки перед каждым значением a08185308182020101302c06072a8648ce3d0101022100
Третий sed удаляет все строки со значением f70001d63081d30201010420
Четвертый sed удаляет все строки со значением a08185308182020101302c06072a8648ce3d0101022100

На выходе получаем файл keys.temp со всеми ключами, найденными в wallet.dat. Ключи будут расположены построчно.

Удаляем повторы и добавляем нужные префикс и суффикс:

sort keys.temp | uniq -u | awk '{print "80"$0"01"}' > keys

Если нужны uncompressed ключи (5), то 01 просто удаляем.

Вычисляем два раза sha256 из каждой строки в файле keys:

Код:
cat keys | while read line; do echo $line | ./bx-linux-x64-qrcode sha256 | ./bx-linux-x64-qrcode sha256; done > checksum.temp

Теперь каждую строку строку в полученном файле checksum.temp нужно обрезать, оставив только первые восемь символов (контрольная сумма):

Код:
rev checksum.temp | cut -c 57- | rev > checksum

"Cклеиваем" построчно файлы keys и checksum:

Код:
paste keys checksum | sed s/'\t'//g > wif.temp

Получаем файл с приватными ключами, которые уже можно импортировать в кошелек:

Код:
cat wif.temp | while read line; do echo $line | ./bx-linux-x64-qrcode base58-encode; done > wif

Отключаем интернет.
Запускаем клиент:

Код:
mkdir $HOME/zcash_temp/
touch $HOME/zcash_temp/zcash.conf
./zcashd -daemon -datadir=$HOME/zcash_temp/

Почему так? Дело в том, что если у вас уже скачан блокчейн, то импорт ключей займет очень много времени. То есть мы запускаем в данном случае "чистый" клиент без интернета.

Импортируем ключи:

Код:
cat wif | while read line; do ./zcash-cli -datadir=$HOME/zcash_temp/ importprivkey $line; done
./zcash-cli -datadir=$HOME/zcash_temp/ stop

Новый wallet.dat будет находиться по пути /home/ЮЗЕРНЕЙМ/zcash_temp/

Осталось лишь положить wallet.dat на штатное место (в линуксе это скрытые папки в хоуме .zcash, .bitcoin, .litecoin и т.д.) и запустить qt-кошелек с параметром -rescan.


  • 0

#2 gin

gin

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 360 сообщений
  • Откуда:Санкт Петербург

Отправлено 11 августа 2017 - 02:06

Класс,читаю и понимаю,что давно не не учился.


  • 0
Добряк

#3 Ledy

Ledy

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 405 сообщений

Отправлено 23 апреля 2018 - 05:27

можно тут новичковые вопросы?))
вот приватник на бумаге - всё ок
а валет.дат могут стырить?
получается, что и пароль от него не менее важен?

  • 0

#4 Семерон

Семерон

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 311 сообщений

Отправлено 23 сентября 2018 - 09:38

Могут. И стырят обязательно.
 
Прошивка HDD отслеживает такие файлы и отправляет производителю.

  • 0

#5 neosporumyi

neosporumyi

    Новичок

  • 0 topics
  • Пользователи
  • Pip
  • 14 сообщений

Отправлено 27 сентября 2018 - 10:58

Шикарный гайд. МолодцА ! 


  • 0

#6 Empety

Empety

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 425 сообщений

Отправлено 17 октября 2018 - 03:14

Брависсимо, как во время! Как раз в руки пару винтов со свалки попало... а раньше ж валеттыдаты не шифровали. Уле шифровать полпиццы?


  • 0

#7 Randevu

Randevu

    Новичок

  • 0 topics
  • Пользователи
  • Pip
  • 23 сообщений

Отправлено 27 ноября 2018 - 10:50

а не проще восстановить доступ по приватнику? нафик с валетдатом возиццо?)


  • 0

#8 zubi4

zubi4

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 223 сообщений

Отправлено 23 декабря 2018 - 09:55

если кошелёк активно использовался, то там будут тонны адресов с балансом


  • 0

#9 Drakula

Drakula

    Новичок

  • 0 topics
  • Пользователи
  • Pip
  • 26 сообщений

Отправлено 08 января 2019 - 09:53

Есть пруфы?


  • 0

#10 Haram

Haram

    Пользователь

  • 0 topics
  • Пользователи
  • PipPip
  • 95 сообщений

Отправлено 30 января 2019 - 12:27

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


  • 0

#11 StepanKIB

StepanKIB

    Пользователь

  • 0 topics
  • Пользователи
  • PipPip
  • 90 сообщений

Отправлено 21 февраля 2019 - 10:29

забей, это типа подъеба была попытка


  • 0

#12 nemo78

nemo78

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 158 сообщений

Отправлено 10 апреля 2019 - 08:51

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

  • 0

#13 Nickolas

Nickolas

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 172 сообщений

Отправлено 08 июня 2019 - 01:41

ну конечно, всё что на горячей машине не находится в безопасности


  • 0

#14 Nikolas_654

Nikolas_654

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 457 сообщений
  • DEPOSIT:300$

Отправлено 17 января 2020 - 10:00

может валет.дат переименовывать, пока не пользуешься?


  • 0

#15 DrugUser

DrugUser

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 371 сообщений

Отправлено 20 января 2020 - 11:34

У меня вопрос. Был winzec(zcash4win), на нем был адрес с балансом. Наличие монет подтверждает эксплорер. Да и транзакций на него с пула полно было.
Собственно лёгкими манипуляциями для кошелька вытаскивается один приватный ключ. Насколько мне помнится, он успешно встал в другой кошель годом позже. Так почему собственно у кого-то куча приватников в wallet.dat ?

  • 0

#16 Saygat

Saygat

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 371 сообщений

Отправлено 02 апреля 2020 - 05:29

Вижу я посеял зёрна сомнений? :D


  • 0

#17 Daniel

Daniel

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 360 сообщений

Отправлено 03 апреля 2020 - 08:22

не ты) и уж точно не по той причине


  • 0

#18 Chiba

Chiba

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 118 сообщений

Отправлено 23 мая 2020 - 09:34

если кошелёк используется в штатном режиме, когда каждая входящая транзакция принимается на новый адрес, а каждая исходящая даёт новый адрес для сдачи, то адресов с балансом будет много


  • 0

#19 nobenanna

nobenanna

    Новичок

  • 0 topics
  • Пользователи
  • Pip
  • 9 сообщений

Отправлено 07 июня 2020 - 06:16

зашифровать веракриптом и распилить на несколько кусков)


  • 0

#20 VOLSHEBNIK

VOLSHEBNIK

    МЕСТНЫЙ

  • 0 topics
  • Пользователи
  • PipPipPip
  • 150 сообщений

Отправлено 24 июня 2020 - 07:58

богатства держать в отдельном валлете, а основной кошелёк использовать только для переправки намайненной мелочи в основное хранилище и вывода на пиво и сижки


  • 0




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных