Алгоритм декодирования ресурсов из PWL-файла с правильным паролем
После нахождения правильного пароля прогоняем функцию XorT с индексами не 1...33, а 33...63. Таким образом мы декодируем 15 адресов блоков с ресурсами. Должны получиться значения типа 0x292, 0x294 и т.д. Как мы помним, адрес 1-го блока всегда равен 0x290. Таким образом, у нас будет массив Res[17] типа WORD, в первое значение - 0x290, далее 15 декодированных адресов, а последний WORD - это размер файла (в примере выше это будет значение 0x2DC).
Далее следует цикл на 16 (проверка блоков с ресурсами), в начале его вычисляем разницу между соседними адресами N - если разница между ними равна 2, то переход на следующий адрес.
Если N > 2, то данный i-й блок содержит ресурсы.
Формируем новый массив X (размером 64 байта) следующим образом:
0xFFFFFFFF (DWORD)
Логин в верхнем регистре
0x0 (1 байт)
CryptoSeed[i] (DWORD) - это значение берем из массива по адресу 0x20C, причем i - это номер блока ресурсов.
0x80 (1 байт)
0x0 (по адрес 0x37 включительно)
По адресу 0x38 записываем (0x48 + (длина логина << 3)) (DWORD)
0x0 (до конца массива)
Выполняем MD5 (массив X), получаем массив Cnt (16 байт), т.е. производим свертку логина с нужным CryptoSeed.
Формируем массив Z (размером 64 байта) следующим образом:
Пароль
0x0 (1 байт)
Cnt (16 байт)
0x80 (1 байт)
0x0 (по адрес 0x37 включительно)
По адресу 0x38 записываем (0x88 + (длина пароля << 3)) (DWORD)
0x0 (до конца массива)
Выполняем MD5 (массив Z), получаем массив Key (16 байт), т.е. производим свертку пароля.
Выполняем RC4, используя в качестве ключа Key.
И теперь полученным массивом M начинаем декодировать весь блок с ресурсами длиной N процедурой, аналогичной XorT. Причем начинаем использовать массив M также с 1-го значения (не с нулевого(!)) до 255, если ресурс больше 255 символов, то i "переваливает" байтовую границу и уже массив M начинает использоваться с нуля, а не с единицы.
Посмотрим на приведенном выше примере структуру первого из наших декодированных ресурсов:
0290: .. .. .. .. .. .. 1A 00 0A 00 08 00 01 03 43 52 |..............CR
02A0: 49 53 54 49 41 4E 5C 44 68 65 6C 6C 67 61 74 65 |ISTIAN\Dhellgate
Ее формат такой:
? длина ресурса (WORD), в нашем примере - 26(0x1A) байт.
? длина логина (WORD), в нашем примере - 10 символов.
? длина пароля (WORD), в нашем примере - 8 символов.
? BYTE, назначение которого пока точно не известно.
? тип хранимого ресурса (BYTE):
1 = NT Domain
2 = NT Server
3 = Shared
4 = MAPI
6 = Dial-Up
18 = NetWare
19 = WWW
Далее располагаются логин, а после него - пароль.
В нашем примере - тип ресурса
"Shared", логин
"CRISTIAN\D", пароль
"hellgate".
(Примечание: для
Shared-ресурсов запись
CRISTIAN\D будет означать следующее:
CRISTIAN - имя компьютера, а
D - ресурс, предоставленный для общего пользования.)
Далее анализируем текущий блок с ресурсами, пока не перевалили за N, "поглядывая" в таблицу по адресу 0x109, т.к. в PWL-файлах между блоками ресурсов очень часто бывает "мусор" (неисповедимы пути Microsoft), а в этой таблице будет точное указание - в каком блоке сколько ресурсов.
Содержание раздела