"Алекс Федченко. Описание механизма функционирования парольных кэшей 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 */ 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[], тогда и только тогда пароль расценивается допустимым. Как видим, исправлены все недостатки предыдущего формата ресурсного файла. В частности, реализация |
|
|