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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Hачнем как обычно, с Си-подобного заголовка .PWL файлов этой версии
Windows, продолжим пояснениями.

#define OSR_PwlSign 0x968582E3 // Hекоторые называют это "УВЕЦ"
#define OSR_PwlBase 0x290
#define OSR_PwlHdrOfs 0x252

typedef struct { /* OSR PWL checking sign */
byte CryptoSign[0x10]; /* Crypto sign */
byte CheckoSign[0x10]; /* Checko sign */
word ResOffsets[0xF]; /* Resources offsets. */
} check_pack;

typedef struct { /* version depended OSR PWL partition */
dword HdrOfs; /* Offset to CryptoHdr */
dword CryptoSeed[0x11]; /* Resource CryptoSeed */
word UnkAlign; /* ?? Just alignment */
check_pack Check; /* Checking crypt-sign */
} OSR_pwl_data;

typedef struct { /* PWL file header itself */
dword Sign; /* .PWL file signature */
dword UnknownC; /* ?? Strange counter */
byte ResLink[0x100]; /* Resource link index */
byte ResKey[0x100]; /* Resource key entry */
union {
W95_pwl_data W95_Data; /* W95 format PWL data */
OSR_pwl_data OSR_Data; /* OSR format PWL data */
} HdrV;
} pwl_hdr;

Общая структура файла осталась без изменений, те же ресурсные входы, механизм
доступа по каналам (точкам входа) и проч. Hо что-то ведь изменилось? Как
минимум, изменилась сигнатура файла, теперь это OSR_PwlSign, соответственно
изменилось и положение ресурсной информации, она теперь обычно располагается
по смещению OSR_PwlBase Появилось дополнительное поле HdrOfs имеющее как
правило значение OSR_PwlHdrOfs, по данному смещению располагаются описатели
ресурсных точек входа (смещения внутри файла, соответственно размер ресурсного
канала есть ResOffsets[i+1]-ResOffsets[i]), ну, если более точно, то структура
check_pack. Поскольку работа с ресурсами была описана выше, то перейдем к
новому моменту: открытию парольного кеша.
И вот теперь начинаются проблемы. Первоначально пароль вместе с константой
0xFFFFFFFF, а так же CryptoSeed[0x10], именем пользователя и паролем
сворачивается в MD5 хеш, длинной 4 DWord'a (за 2 прохода, вначале имя, затем
пароль). После этого расшифровывается участок файла check_pack (алгоритмом
RC4), затем выполняется еще одна MD5 свертка, в ней участвуют имя пользователя
и поле CryptoSign[] в результате должна получиться сигнатура CheckoSign[],
тогда и только тогда пароль расценивается допустимым. Как видим, исправлены
все недостатки предыдущего формата ресурсного файла. В частности, реализация