Author

Topic: Need some help with recovering one of my old wallets (Read 290 times)

jr. member
Activity: 87
Merit: 5
There are several tools on github, easiest to use is pywallet, you can get it https://github.com/jackjack-jj/pywallet

Worth to note:

Do NOT use pywallet on your file without backups.
The chance exists that the file won't be accessible / readable anymore after you run pywallet on it. There already were several cases.

Always have one (or multiple) backups of your wallet file before trying to use some tools to gain access to your private keys.

This only happens if you name the output file same as input, don't spread FUD. I have read the source code, pywallet does NOT tamper with
the original file.
legendary
Activity: 1624
Merit: 2481
There are several tools on github, easiest to use is pywallet, you can get it https://github.com/jackjack-jj/pywallet

Worth to note:

Do NOT use pywallet on your file without backups.
The chance exists that the file won't be accessible / readable anymore after you run pywallet on it. There already were several cases.

Always have one (or multiple) backups of your wallet file before trying to use some tools to gain access to your private keys.
member
Activity: 378
Merit: 53
Telegram @keychainX
It's been a while since I've been a part of the bitcoin project. Got extremely bitter after Gox collapsed since I had 90% of my holdings on there. After a recent attic cleaning, I found my old drive, which is supposed to have the other 10% (I believe it was in the thousands of bitcoins, definitely more than one thousand, not exactly sure). I tried every possible password combination I could remember, but it didn't work. The only thing I know for sure is that the password is 10 characters long.

This isn't feasible for me to bruteforce on my home computer, so I was wondering if anybody has experience with smarter algorithms that would be able to decode my wallet passphrase in a shorter amount of time (I'm hoping within a week or so). I've been in a financial crunch recently, and to be honest, had mostly forgotten about cryptocurrencies, so finding my old drive was a very welcome surprise. Feels good to be back in the game. Also, if anyone has contacts with some good wallet recoverers, please let me know, and I will do my best to arrange for an in-person meeting.

Since you seem a bit unaware of the size of your holdings you should first parse the wallet file to see if there is any bitcoin at all.

There are several tools on github, easiest to use is pywallet, you can get it https://github.com/jackjack-jj/pywallet

If you decide to crack it yourself try btcrecover (also on github) or if you have access to gpus get hashcat , you can read more about hashcat at hashcat.net

If you want to know more I will be doing a keynote regarding wallet recovery at malta blockchain summit in a few months (as I did in May with Ledger CEO)

ps. even with a decent rig a 10 character password will take a while, so your best bet is using a dictionary attack with some basic rules, or seup btcrecover to do variations of the passwords you believe you used.
/KX
hero member
Activity: 1241
Merit: 623
OGRaccoon
My advice would be to sit down with a paper and pen and start to write out things that you can re-call about the time you put your drive away.
Write down possible passwords you used around that time, make a list of attempted passwords you can strike off the list.  

Try jog your memory of around this time (sometimes old accounts help to job memory)

How is the drive protected?  Is the drive encrypted? or just password protected?

Do you know what the password protection software is used on the drive?

Another possible way to do this is if you know most of the password used you can generate a list of passwords possibility.

I have included below a small python project that will allow you to generate a list of potential passwords from some input it may help in the process.

The Code..

you can edit the code to add special characters or numbers if you can recall any parts of the password this might also help cut down the attempts required. 

Code:
"""
Command-line utility to generate permutation of possible words used in a password
"""
import argparse
import sys

SPECIAL_CHARACTERS_REPLACEMENTS = {
    "a": "@",
    "o": "0",
    "s": "$",
    "e": "3",
}

SPECIAL_CONNECTOR_CHARACTERS = [
    # "@"
]

SPECIAL_ADDITIONS = [
    "1", "12", "123", "1234"
]

SPECIAL_ADDITIONS_CHARACTERS = [
    "*"
]


class Generator:
    def __init__(self, words, output_file, level=5, strict_mode=False):
        self.results = []
        self.words = words
        self.level = level
        self.strict_mode = strict_mode
        self.word_forms = {}
        for word in self.words:
            self.word_forms[word] = self.generate_word_forms(word)
        self.output_file = output_file

    def generate(self):
        self.generate_one_word_dictionary()
        self.generate_two_word_dictionary()
        self.generate_three_word_dictionary()

        for password_dict in self.one_word_dictionary:
            self.results.append(password_dict["pass"])
        for password_dict in self.two_word_dictionary:
            self.results.append(password_dict["pass"])
        for password_dict in self.three_word_dictionary:
            self.results.append(password_dict["pass"])


    def generate_one_word_dictionary(self):
        self.one_word_dictionary = []
        words_only = []
        words_with_special_additions = []
        words_with_special_addition_characters = []
        words_with_special_addition_and_special_characters = []
        for word in self.words:
            for word_form in self.word_forms[word]:
                words_only.append({"pass" : word_form, "forms":[word]})
                for special_addition in SPECIAL_ADDITIONS:
                    words_with_special_additions.append({"pass" : word_form + special_addition, "forms":[word]})
                for special_addition_character in SPECIAL_ADDITIONS_CHARACTERS:
                    words_with_special_addition_characters.append({"pass" : word_form + special_addition_character, "forms":[word]})
                for special_addition in SPECIAL_ADDITIONS:
                    for special_addition_character in SPECIAL_ADDITIONS_CHARACTERS:
                        words_with_special_addition_and_special_characters.append({"pass" : word_form + special_addition + special_addition_character, "forms":[word]})


        self.one_word_dictionary.extend(words_only)
        self.one_word_dictionary.extend(words_with_special_additions)
        self.one_word_dictionary.extend(words_with_special_addition_characters)
        self.one_word_dictionary.extend(words_with_special_addition_and_special_characters)

    def generate_two_word_dictionary(self):
        self.two_word_dictionary = []

        two_words = []
        two_words_with_connectors = []

        for word in self.words:
            for one_word in self.one_word_dictionary:
                if len(one_word["forms"]) < 1:
                    continue
                if word in one_word["forms"]:
                    continue
                if self.strict_mode and self.words.index(word) >= self.words.index(one_word["forms"][0]):
                    continue

                for word_form in self.word_forms[word]:
                    two_words.append({"pass" : word_form + one_word["pass"], "forms":[word, one_word["forms"][0]]})
                    for connector in SPECIAL_CONNECTOR_CHARACTERS:
                        two_words_with_connectors.append({"pass" : word_form + connector + one_word["pass"], "forms":[word, one_word["forms"][0]]})

        self.two_word_dictionary.extend(two_words)
        self.two_word_dictionary.extend(two_words_with_connectors)

    def generate_three_word_dictionary(self):
        self.three_word_dictionary = []

        three_words = []
        three_words_with_connectors = []

        for word in self.words:
            for two_word in self.two_word_dictionary:
                if len(two_word["forms"]) < 2:
                    continue
                if word in two_word["forms"]:
                    continue
                if self.strict_mode and self.words.index(word) >= self.words.index(two_word["forms"][0]):
                    continue

                for word_form in self.word_forms[word]:
                    three_words.append({"pass" : word_form + two_word["pass"], "forms":[word, two_word["forms"][0], two_word["forms"][1]]})
                    for connector in SPECIAL_CONNECTOR_CHARACTERS:
                        three_words_with_connectors.append({"pass" : word_form + connector + two_word["pass"], "forms":[word, two_word["forms"][0], two_word["forms"][1]]})

        self.three_word_dictionary.extend(three_words)
        self.three_word_dictionary.extend(three_words_with_connectors)

    def generate_word_forms(self, composite_word):
        composite_words = composite_word.split(":")
        aggregate_words = []
        for word in composite_words:
            words = [word.upper(), word.lower(), word.title(), word]
            for word_form in [word.upper(), word.lower(), word.title(), word]:
                for i in range(1, self.level + 1):
                    words.append(self.replace_word_with_special_characters(word_form, i))

            aggregate_words.extend(words)

        aggregate_words = self.remove_duplicates(aggregate_words)

        return aggregate_words

    def remove_duplicates(self, words):
        existing = []
        for word in words:
            if word not in existing:
                existing.append(word)

        return existing

    def replace_word_with_special_characters(self, word, level):
        if level == 5:
            level = 100
        output = word
        counter = 0
        for char in SPECIAL_CHARACTERS_REPLACEMENTS:
            output = output.replace(char, SPECIAL_CHARACTERS_REPLACEMENTS[char])
            output = output.replace(char.upper(), SPECIAL_CHARACTERS_REPLACEMENTS[char])
            counter += 1
            if counter >= level:
                break

        return output

    def write_output(self):
        for result in self.results:
            self.output_file.write(result + "\n")
        if self.output_file != sys.stdout:
            self.output_file.close()
        return len(self.results)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='generate a password list from permutation of probable words')

    parser.add_argument('-w', required=True, metavar='word', nargs='+', type=str,
                        help='possible words used in the password')
    parser.add_argument('-s', action='store_true', default=False, help='ordered list of words')
    parser.add_argument('-l', metavar='level', default=5, type=int, help='level of character replacement strength (1 - 5)')
    parser.add_argument('-o', metavar='output.txt', default=sys.stdout, type=argparse.FileType('w'),
                        help='The output file where the password list should be written')

    args = parser.parse_args()

    generator = Generator(args.w, args.o, args.l, args.s)
    generator.generate()
    results = generator.write_output()
    if args.o != sys.stdout:
        print("Generated passwords file with %d possible passwords" % (results))
    else:
        print("Generated %d possible passwords" % (results))





How It Works...

Code:
/Desktop$ python pass.py 
usage: pass.py [-h] -w word [word ...] [-s] [-l level] [-o output.txt]

So to use run  python pass.py -w ThisIsMyPassword -s -l 2 -o output-passwords.txt

THISISMYPASSWORD
thisismypassword
Thisismypassword
ThisIsMyPassword
THISISMYP@SSWORD
THI$I$MYP@$$WORD
thisismyp@ssword
thi$i$myp@$$word
Thisismyp@ssword
Thi$i$myp@$$word
ThisIsMyP@ssword
Thi$I$MyP@$$word
THISISMYPASSWORD1
THISISMYPASSWORD12
THISISMYPASSWORD123
THISISMYPASSWORD1234

this will throw a bunch of possible passwords to the output-passwords.txt file for you to try you can bump the option -l for more complexity in the passwords returned.



As above do not answer to any PM's telling you they will fix it they are scammers.
newbie
Activity: 10
Merit: 1
One option would be to use a trusted wallet recovery service (e.g. https://walletrecoveryservices.com).

You don't explicitly need to give your wallet away.

Especially do not answer newbies which claim to help you.

Further there are some 'professional' wallet recovery services around here which seem to be not that professional at all (i.e. Trying to sound professional, but sharing way too many misinformation).
I would suggest to be careful and not answer anyone via PM. Also don't trust every recovery service which had success in recovering a few wallets.

Thank you, that's some good advice. Will be keeping that in mind. I've already received quite a few PMs offering help and asking to purchase the drive!! Not selling for $50, haha... I will contact Dave.
legendary
Activity: 1624
Merit: 2481
One option would be to use a trusted wallet recovery service (e.g. https://walletrecoveryservices.com).

You don't explicitly need to give your wallet away.

Especially do not answer newbies which claim to help you.

Further there are some 'professional' wallet recovery services around here which seem to be not that professional at all (i.e. Trying to sound professional, but sharing way too many misinformation).
I would suggest to be careful and not answer anyone via PM. Also don't trust every recovery service which had success in recovering a few wallets.
newbie
Activity: 10
Merit: 1
It's been a while since I've been a part of the bitcoin project. Got extremely bitter after Gox collapsed since I had 90% of my holdings on there. After a recent attic cleaning, I found my old drive, which is supposed to have the other 10% (I believe it was in the thousands of bitcoins, definitely more than one thousand, not exactly sure). I tried every possible password combination I could remember, but it didn't work. The only thing I know for sure is that the password is 10 characters long.

This isn't feasible for me to bruteforce on my home computer, so I was wondering if anybody has experience with smarter algorithms that would be able to decode my wallet passphrase in a shorter amount of time (I'm hoping within a week or so). I've been in a financial crunch recently, and to be honest, had mostly forgotten about cryptocurrencies, so finding my old drive was a very welcome surprise. Feels good to be back in the game. Also, if anyone has contacts with some good wallet recoverers, please let me know, and I will do my best to arrange for an in-person meeting.
Jump to: