Knowledgebase: Password recovery
How to use Elcomsoft Advanced Attacks
Posted by Andrey Malyshev, Last modified by Evgeny Kulazhonok on 27 June 2022 04:02 PM

Password recovery for new file formats can be a very complicated task and may take a long time. In modern world password recovery speed becomes slower and slower, so simple Brute-force or Dictionary attack is not enough for effective password breaking. We can try to use the "human factor" for password recovery. Most of people don't use randomly generated strong passwords because they are very hard to remember. People invent they own password creation rules and think their passwords are strong.

For example, the rule can be as follows:
[My name] [Year of birth] [Some random characters, easy to remember] 

And the possible passwords are:


These passwords are very weak but cannot be recovered using simple Brute-force or Dictionary. We created our advanced attack engine to help to recover such passwords. 

The following attacks are available:

Word attack

This attack tries all possible variations of the given word and applies all possible mutations to each variation.

Dictionary attack

Dictionary options

Press "Add" to add dictionary file(s) to the list, "Remove" to remove the selected one(s), and "Up/Down" to change an order. 

Password mutation options

Here you select the name of the dictionary file, as well as the options that affect the speed and efficiency of the attack. All mutations are divided into a several 'classes' (described below). The program can set the mutation 'level' for every type, that allows to select between speed and efficiency. With the minimum level, the program checks only lowercase passwords, and performs basic mutations only: e.g. Border mutation uses not all special characters, but only digits, and only at the end of the password. For an intermediate level, more special characters are being used (both as prefix and as a suffix); and uppercase characters are also tested. At the maximum level, even more advanced prefixes and suffixes are added, but of course, it runs much slower (as far as more variations are checked).

  • Case mutation: the program checks all variations of uppercase/lowercase characters.
  • Digit mutation: adding several digits to the work (from the dictionary) as prefix and suffix.
  • Border mutation: similar to the above, but adding not only digits, but also most commonly used combinations like 123, $$$, 666, qwerty, 007, ххх etc.; in addition, adding some chars at both end of the word, e.g. #password#, $password$ and more.
  • Freak mutation: replacing some characters (one or more); for example, the word password will also generate p@ssword, p@$$word and p@$$w0rd. Freak mutation is based on l337 language. Check for more info.
  • Abbreviation mutation: some commonly-used abbreviations like ihateyou - ih8you, loveyou - loveu, foryou - 4u etc.
  • Order mutation: reversing the order (password - drowssap), repeating the word (password - passwordpassword), adding the reversed word (password - passworddrowssap).
  • Vowels mutation: playing with vowels, e.g. psswrd, PaSSWoRD, pAsswOrd etc.
  • Strip mutation: removing one char, e.g. assword, pssword, pasword...
  • Swap mutation: replacing some characters, e.g. apssword, psasword, password...
  • Duplicate mutation: duplicating the characters, e.g. ppassword, paassword, passsword, passwword etc.
  • Delimiter mutation: adding delimters between characters: p.a.s.s.w.o.r.d, p+a+s+s+w+o+r+d, p-a-s-s-w-o-r-d.
  • Year mutation: adding the year (four digits) at the end of the word: password1973, password2002.
  • Shift mutation: shifting character in a word: password -> asswordp
  • Substitution mutation: substitute a character: password -> paddword. In this mutation, the changes depend on the qwerty keyboard, taking into account that the user can skip the key when creating a password and press the key next to it. For example, “oassword” instead of “password”. Or “fog” instead of “dog”. Therefore, not all possible characters fall into the search, but only those located nearby on the keyboard
  • Length mutation: password -> passwor ..

Mask attack

With the mask attack, you can check for passwords with the known/complex structure.

The syntax of the mask attack.

The mask consists of immutable characters and changeable (iterable) ranges.

E.g. admin?d?d?d

"admin" characters will not change Instead of each ?d - a digit is substituted (character range from 0 to 9),

Thus, such passwords will be checked:

admin000, admin001 .. admin999

Other types of changeable ranges:



?d(1980-2020) - number from 1980 to 2020

admin1980, admin1981 .. admin2020



?1(1-3) - custom (charset) from 1 to 3 characters. So, if you use 1 set of lowercase letters, for each?1 a lowercase letter from a to zzz will be used

You can combine ranges and set up to 10 different ranges.


If the brackets are omitted, it will be counted as one character, i.e.

?3 == ?3(1-1)

With the mask attack, you can check for passwords with the known/complex structure. In the Mask field, you can select the mask using the following options:

  • ?? - the '?' symbol itself

  • ?c - small Latin character (from 'a' to 'z')

  • ?C - large Latin character (from 'A' to 'Z')

  • ?$ - one of the special characters (small set): !@#$%^&*()-_+= and space

  • ?@ - one of the special characters (large/complete set): !\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ and space

  • ?# - any printable character with the code from 0x20 to 0x7F

  • ?d - one digit (from 0 to 9)

  • ?d(min-max) - a number from min to max.

  • ?w[dictionary_name.udic] - a word from dictionary_name.udic.

  • ?W[dictionary_name.udic] - a word from a given dictionary with an additional check for the first character to be either uppercase or lowercase. F.e. ?W[english.dic]?d

  • ?0..9(min-max) - min..max characters from custom set. min >= 0

In order to use the last option, you should also create your (custom) own character set (below); each set has its own number. For example, assume that you password is formed as follows:

  • one capital letter 
  • from 3 to 5 small letters 
  • special character (from large set) 
  • from one to three digits 

In that case, the mask is going to be (assuming that the custom charset containing all small letters is created; if it is the only one, it will have the number 1):


Once the mask is properly set, you will see the Password total (the total number of passwords that fits into this mask), and Password range (first and last passwords to be checked):

Combination attack

This attack allows to test passwords that consist of two words, each of them taken from the dictionary (word list). Select the dictionaries in Dictionary 1 and Dictionary 2 fields (you can use the same file or different ones); and the additional options are:

  • Check upper- and lower-case combination 
  • Use word delimiters 
  • Use extra mutations 

With the first option, the program will try to capitalize the first letter of each word, i.e. testing all four combinations. The second option (Use word delimiters) allows to set the different characters (like dash and underline, though you can set any other ones as well) to be used between words. Finally, you can apply extra mutations to all resulting passwords (Dictionary mutations options will be used). The program tries to estimate the total number of passwords instantly, but mutations will not be counted (it is virtually impossible to do that).

Hybrid attack

In Dictionary attack, If several mutations are specified, then passwords are formed sequentially, first with some mutations, then with others, etc. Mutations do NOT overlap each other

For Examle:
The Digits and Strip mutations are set. First, a list of Digits mutations (such as password1, password2 ...) is formed, then Strip mutations (pssword, paword ..) are added to this list. But password1, password2 (as well as pssword, paword) are no longer transformed.

But if you need to find password “pawod9”, first you need to make a Strip, and then put digits mutations on the passwords RECEIVED after the Strip once again. For this case you need Hybrid attack

This attack is similar to Dictionary attack described above, but all mutations are set by the user. Here you can select one or more dictionaries (wordlists), as well as several mutation rules. The rules are set in *.rul files; here are the ones coming with the program:

  • all.rul - all rules (~82000)
  • cases.rul - all possible case combinations (up to 15 character words)
  • common.rul – common mutation rules
  • custom.rul – default rules for custom attacks
  • dups.rul – rules to search for passwords based on various duplicated words or characters
  • dates.rul – date mutations
  • keyboard.rul – rules to search for passwords based on all possible keyboard combinations
  • l33t.rul – l33t 'language'
  • numbers.rul – manipulations with numbers
  • rockyou.rul – top rules based on various leaked passwords

The actual contents of *.rul file starts with [Rules] section (all text before this tag is considered a comment). Maximum length of one rule is 256 bytes. Maximum length of the output word (generated by the rule) should not exceed 256 characters, too. One line can contain several rules (any ones but aN); they are processed from left to right.

Token Description Example


Do nothing, use the original input word


Rotate left

password -> asswordp


Rotate right

password -> dpasswor


Delete the first character

password -> assword


Delete the last character

password -> passwor



password -> Password


Lowercase the first character, uppercase the rest

password -> pASSWORD



password -> passwordpassword


password -> passworddrowssap


Convert to lowercase

PassworD -> password 


Swap the last two characters:

password -> passwodr


Duplicate all symbols

password -> ppaasssswwoorrdd



password -> drowssap


Toggle case of all characters

PassWord -> pASSwORD


Convert to uppercase

pAssword -> PASSWORD 


Vowels elite

password -> PaSSWoRD


Vowels noelite

password -> pAsswOrd


Truncate the word to N character(s) length

password -> pass 


Reject the word if it is less than N characters long. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password -> OK
pass -> not checked 


Reject the word if it is greater than N characters long. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password -> not checked
pass -> OK 


Increment character at position N by 1 ASCII value. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password -> pbssword


Decrement character at position N by 1 ASCII value. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password -> oassword


Replace the character at position N with one at position N+1. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password ->


Replace the character at position N with one at position N-1. 1<=N<=35 (1,2,3,4,5,6,7,8,9,A,B,C..Z)

password ->


Check all possible symbol cases for the word. N is a maximal length of the word to apply this rule for. This rule CANNOT be used in conjunction with other ones!

ab -> ab, aB, AB, Ab
abc -> abc 


Delete the character at position N

password -> pasword 


Copy word N times. N = 3 .. 9

abc -> abcabcabc 


Toggle case of the character at position N. N = 0 .. 9 for the position 0 - 9, N = A .. Z for the position 10 - 35

password -> pasSword 


Duplicate first N characters. 1<=N<=35 (1,2,3,4,5,6,7,8,9,A,B,C..Z)

Y4: password->


Duplicate last N characters. 1<=N<=35 (1,2,3,4,5,6,7,8,9,A,B,C..Z)

Y4: password->


Duplicate the first character of the word N times. N = 1 .. 9

password -> pppassword 


Duplicate the last character of the word N times. N = 1 .. 9

password -> passwordddd 


Add character X to the end of the word

password -> passwords 


Insert character X at the beginning of the word

password -> 1password 


Remove all characters X from the word

password -> paword 


Reject the word if it contains at least one character X 

password -> not checked
Ohio -> OK 


Reject the word if it does not contain character X

password -> OK
Adam -> not checked 


Reject the word if the first character is not X

password -> OK
Texas -> not checked 


Reject the word if the last character is not X

password -> not checked
Anna - OK 


Extract a substring starting at position 0 and ending up before the first occurrence of X character. Do nothing if X is not found.

password ->


Extract a substring starting right after the first found X character and till the end of the string. Do nothing if X is not found.

password ->


Swap the character at position M with the character at position N. 0<=N|M<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

*02: password ->


Reject the word if it does not contain at least M instances of the character X

password -> OK
Nexus -> not checked 


Reject the word if the character at position N is not equal to the X 

password -> OK
John -> not checked 


Insert the character X in position N

password -> paSssword 


Overwrite a character in position N with the character X

password -> paSsword 


Replace all characters X with Y

password -> pa$$word 


Extract a substring of up to M characters length, starting from position N. M = 1 .. 9 for the length equal to 1 - 9, M = A .. Z for the length equal to 10 - 35

password ->


Bitwise left shift of the character at position N. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password ->


Bitwise right shift of the character at position N. 0<=N<=35 (0,1,2,3,4,5,6,7,8,9,A,B,C..Z)

password ->

(57 vote(s))
Not helpful