PasswordsPro

v1.3 [Russian]
PasswordsPro - Hashing modules

Each module for hash generation shall be written as separate DLL-file and contain functions GetInfo(), GetHash() and - if necessary - GetSalt() (below these examples are given in Microsoft Visual C++ syntax).

GetInfo()
extern "C" __declspec(dllexport) void GetInfo(MODULEINFO *);

Function GetInfo() shall fill the structure MODULEINFO containing module information:

typedef struct {
        DWORD dwFlags;        // Combination of flags defining different modes of hashing
        char *szAbout;        // Address of text line containing module information
        char *szHashType;     // Address of text line containing hash name
        DWORD dwReserved[13]; // Reserved for future usage
} MODULEINFO;

Field dwFlags supports following flags:

MODULE_HASH_BINARY (0x00000001) - presence of this flag means that the module shall return hash in binary mode (for example, it will be 16 bytes for MD5 hash), while imported hashes shall be HEX line (like "202cb962ac59075b964b07152d234b70") which is to be transformed by the program to binary before starting attack. Without this flag module shall return hash in text mode and compare one to users' hashes without any additional transformations (example of such hash is MD5(Unix)).

MODULE_HASH_SIMPLE (0x00000002) - presence of this flag means that only current password (refers to binary hashes only) is to be used to generate hash what appreciably accelerates simultaneous PasswordsPro work with vast number of such hashes.

MODULE_HASH_BASE64 (0x00000004) - presence of this flag indicates that the module is designated to work with Base64-encoded hashes (refers to binary hashes only) - for example, MD4-hash for password "123" will look like "xYzaSfAHSKO8D8+lEdUWyw==". So PasswordsPro will automatically convert hashes from Base64 to source format before attack, and module accordingly shall return hashes without conversion to Base64 (for example above this will be 16-byte MD4-hash).

MODULE_SALT_BINARY (0x00000100) - presence of this flag indicates that salt (or key) is HEX-string (like "eb07f52d294b7034") which will be converted to bytes before attack and then sent to module.

MODULE_SALT_WITH_HASH (0x00000200) - presence of this flag indicates that salt is stored together with hash (like DES(Unix) or MD5(APR)). When the flag is checked, module shall contain function GetSalt() which will return salt extracted from the source hash string.

MODULE_PASS_HUGE (0x00010000) - presence of this flag indicates that module can generate hash from input data of any size, for instance, from EXE-file of several MB size. Otherwise input data length (i.e. password length) is limited by 127 symbols.

MODULE_NAME_UPPER (0xC0000000) - presence of this flag indicates that username shall be shifted to upper case before hashing.

MODULE_NAME_LOWER (0x80000000) - presence of this flag indicates that username shall be shifted to lower case before hashing.

MODULE_NAME_UNICODE (0x20000000) - presence of this flag indicates that username shall be converted to Unicode before hashing.
GetHash()
extern "C" __declspec(dllexport) int GetHash(HASHINFO *);

GetHash() function shall generate hash using the following parameters of HASHINFO structure:

typedef struct {
        unsigned char *pBuf; // Address of buffer to store generated hash
        char *szPassword;    // Password
        int nPasswordLen;    // Length of password
        char *szSalt;        // Salt, HMAC-key or any other additional key for hashing
        int nSaltLen;        // Length of salt or key
        char *szName;        // User name
        int nNameLen;        // Length of user name
        DWORD dwFlags;       // Combination of flags defining different modes of hashing
        DWORD dwReserved[8]; // Reserved for future usage
} HASHINFO;

Field dwFlags supports following flags:

MODULE_RESULT_SHORT (0x00000001) - presence of this flag means that module can generate only 2 first bytes for purpose of quick check of the hash comparing with hash list in PasswordsPro instead of generating full hash. If the module has generated short hash, this flag is reset. For now this flag is used to generate hashes only together with MODULE_HASH_BINARY and MODULE_HASH_SIMPLE flags.

The function shall return length of generated hash.

GetSalt()
extern "C" __declspec(dllexport) int GetSalt(SALTINFO *);

If necessary, module shall contain GetSalt() function, if salt is stored with source hash, so this function shall extract salt using the following parameters of SALTINFO structure:

typedef struct {
        char *pSalt;         // Address of buffer to store salt
        char *szHash;        // Hash (like "$1$12345678$tRy4cXc3kmcfRZVj4iFXr/")
        int nHashLen;        // Hash length
        DWORD dwReserved[5]; // Reserved for future usage
} SALTINFO;

The function shall return length of extracted salt.

Additionally

Maximal length of hash returned - 256 bytes.

To initialize modules standard function DllMain(), shall be used which returns "FALSE" if initialization is failed.

In the \Sources\API subfolder you will find demonstrational example of module to support hashes for program RAdmin 2.x, written on Visual C++ .NET 2003, file "RAdmin_Sources.zip".

Any questions related to support of modules, as well as requests and comments about their work can be addressed to Support service or to the Forum.

©2007-2008, InsidePro. All rights reserved.


PasswordsPro

v1.3 [English]
PasswordsPro - Модули хэширования

Каждый модуль для генерации хэшей должен быть написан в виде отдельного DLL-файла и должен содержать функции GetInfo(), GetHash() и, при необходимости, GetSalt() (примеры кода ниже приведены в синтаксисе языка Microsoft Visual C++).

GetInfo()
extern "C" __declspec(dllexport) void GetInfo(MODULEINFO *);

Функция GetInfo() должна заполнять структуру MODULEINFO информацией об этом модуле:

typedef struct {
        DWORD dwFlags;        // Комбинация флагов, определяющая различные режимы хэширования
        char *szAbout;        // Адрес текстовой строки с версией модуля, авторских правах и т.д.
        char *szHashType;     // Адрес текстовой строки с названием хэша
        DWORD dwReserved[13]; // Зарезервировано для будущих применений
} MODULEINFO;

Поле dwFlags поддерживает следующие флаги:

MODULE_HASH_BINARY (0x00000001) - наличие этого флага означает, что возвращаемый модулем хэш будет в бинарном виде (к примеру, для алгоритма MD5 это будут 16 байт), а загружаемые в программу хэши должны представлять собой HEX-строку (к примеру, "202cb962ac59075b964b07152d234b70"), которую программа перед началом атаки будет сама преобразовывать в набор байт. При отсутствии этого флага модуль должен возвращать хэш в текстовом виде и его сравнение с хэшами пользователей будет происходить без дополнительных преобразований (пример такого хэша - MD5(Unix)).

MODULE_HASH_SIMPLE (0x00000002) - наличие этого флага означает, что для генерации хэша используется только текущий пароль (применяется только с бинарными хэшами) и это существенно ускорит одновременную работу PasswordsPro с большим количеством таких хэшей.

MODULE_HASH_BASE64 (0x00000004) - наличие этого флага означает, что модуль предназначен для работы с хэшами в Base64-кодировке (применяется только с бинарными хэшами) - к примеру, MD4-хэш от пароля "123" в Base64-кодировке будет выглядеть так: "xYzaSfAHSKO8D8+lEdUWyw==". Таким образом, программа перед атакой будет сама конвертировать хэши из формата Base64 в исходный формат, а модуль, соответственно, должен возвращать хэши без преобразования в Base64 (для приведенного выше примера это будет 16-байтовый MD4-хэш).

MODULE_SALT_BINARY (0x00000100) - наличие этого флага означает, что salt (или ключ) представляет собой HEX-строку (к примеру, "eb07f52d294b7034"), которую программа перед началом атаки будет сама преобразовывать в набор байт и передавать модулю.

MODULE_SALT_WITH_HASH (0x00000200) - наличие этого флага означает, что Salt хранится вместе с хэшем (пример таких хэшей - DES(Unix) или MD5(APR)). Если этот флаг присутствует, то модуль должен содержать функцию GetSalt(), которая будет возвращать Salt, извлеченный из исходной строки с хэшем.

MODULE_PASS_HUGE (0x00010000) - наличие этого флага означает, что модуль может генерировать хэш от входных данных любой длины - к примеру, от EXE-файла объемом в несколько Мб. При отсутствии этого флага длина входных данных (т.е. длина пароля) ограничена 127 символами.

MODULE_NAME_UPPER (0xC0000000) - наличие этого флага означает, что имя пользователя перед хэшированием необходимо конвертировать в верхний регистр.

MODULE_NAME_LOWER (0x80000000) - наличие этого флага означает, что имя пользователя перед хэшированием необходимо конвертировать в нижний регистр.

MODULE_NAME_UNICODE (0x20000000) - наличие этого флага означает, что имя пользователя перед хэшированием необходимо конвертировать в Unicode.
GetHash()
extern "C" __declspec(dllexport) int GetHash(HASHINFO *);

Функция GetHash() должна генерировать хэш, используя следующие параметры структуры HASHINFO:

typedef struct {
        unsigned char *pBuf; // Адрес буфера для сохранения сгенерированного хэша
        char *szPassword;    // Пароль
        int nPasswordLen;    // Длина пароля
        char *szSalt;        // Salt, HMAC-ключ или иной дополнительный ключ для хэширования
        int nSaltLen;        // Длина salt'а или ключа
        char *szName;        // Имя пользователя
        int nNameLen;        // Длина имени пользователя
        DWORD dwFlags;       // Комбинация флагов, определяющая различные режимы хэширования
        DWORD dwReserved[8]; // Зарезервировано для будущих применений
} HASHINFO;

Поле dwFlags поддерживает следующие флаги:

MODULE_RESULT_SHORT (0x00000001) - наличие этого флага означает, что модуль может генерировать хэш не целиком, а сгенерировать только его первые 2 байта для быстрой проверки хэша со списком хэшей в PasswordsPro. Если модуль сгенерировал неполный хэш, то он должен сбросить этот флаг. Пока этот флаг применяется только для генерации хэшей, имеющих флаги MODULE_HASH_BINARY и MODULE_HASH_SIMPLE.

Функция должна возвращать размер сгенерированного хэша.

GetSalt()
extern "C" __declspec(dllexport) int GetSalt(SALTINFO *);

При необходимости модуль должен содержать функцию GetSalt(), если salt хранится вместе с исходным хэшем, и эта функция должна извлекать salt, используя следующие параметры структуры SALTINFO:

typedef struct {
        char *pSalt;         // Адрес буфера для сохранения salt'а
        char *szHash;        // Хэш (например, "$1$12345678$tRy4cXc3kmcfRZVj4iFXr/")
        int nHashLen;        // Длина хэша
        DWORD dwReserved[5]; // Зарезервировано для будущих применений
} SALTINFO;

Функция должна возвращать длину полученного salt'а.

Дополнительно

Максимальная длина возвращаемого модулем хэша - 256 байт.

Для инициализации модулей необходимо использовать стандартную функцию DllMain(), которая должна возвращать "FALSE" в случае неудачной инициализации.

В подкаталоге \Sources\API находится демонстрационный пример модуля для поддержки хэшей от программы RAdmin версий 2.x, написанный на Visual C++ .NET 2003, файл "RAdmin_Sources.zip".

По всем вопросам, касающимся поддержки модулей, а также с предложениями и замечаниями по их работе обращайтесь в Службу поддержки или же на Форум сайта InsidePro.

©2007-2008, InsidePro. All rights reserved.