"Алекс Федченко. Описание механизма функционирования парольных кэшей Windows v4.xx" - читать интересную книгу автора

переборщика показала, что скорость снизилась в 2 раза, по сравнению с
вариантом из Windows v4.0 (38 тыс. pps против 55 тыс. pps) Исправлены также
недостатки малой длинны свертки пароля и тривиальная зависимость свертки от
пароля. Хочется отметить такой факт, что поля ввода в диалогах позволяют
ввести пароль максимально до 14 символов и преобразуют его к верхнему регистру
(справедливо для версий Windows v4.0-4.0.1111). Это существенно сокращает
пространство для перебора. А как с одиноковой гаммой для каждого ресурсного ка-
нала? Теперь, при создании ключа для шифрования, используют поля CryptoSeed[i],
причем пропускание этой информации сквозь MD5 не позволяет говорить о прямой
реконструкции гаммы даже при знании некоторых ресурсов.


[3] Дополнения и изменения в операционной системе Windows v4.1 (a.k.a. 98)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Их очень немного, прежде всего, сняли ограничения с полей ввода в диалоговых
окнах (теперь можно ввести свыше сотни символов в имя пользователя и в
пароль). Так же, при логине имя пользователя выбирается из списка, что
позволяет достаточно просто использовать длинные имена пользователей (что
очень замедляет перебор). Жаль, но пароль из списка выбирать нельзя ;-) Вот и
все, форматы файлов изменений не претерпели. Была дополнительно переписана
MSPWL32.dll, конечно же она стала в 2 раза больше объемом (такое ощущение, что
мировые производители винчестеров - одно из подразделений фирмы Micro$oft).
Больше назвать нечего.


[4] Детали реализации алгоритмов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Здесь я бы хотел рассмотреть особенности использованных алгоритмов: RC4 и
MD5, а так же кое что из Windows v4.x Hачнем с RC4.

typedef struct { /* main cryptotable */
byte body[0x100]; /* data table itself */
byte c1,c2; /* crypto pointers into data table */
dword keylen; /* len of key */
void* key; /* key for table building */
} RC4_table;


void init_RC4_table(RC4_table* x) { /* initializing cryptotable */
int i,p,t,tt; x->c1=0,x->c2=0;
for (i=0;i<=255;x->body[i]=i,i++);
t=0; for (i=0,p=0;i<=255;i++,p=i & 0x0F) {
t+=x->key[p]+x->body[i]; t&=0xFF;
tt=x->body[i]; x->body[i]=x->body[t]; x->body[t]=tt;
}
}

void use_RC4_table(xor_table* x, void* data, word datalen) {
byte p1,p2,t; /* en/decrypting the data via cryptotable */
p1=x->c1; p2=x->c2;