Криптография - статьи

       

Алгоритм декодирования ресурсов из 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), а в этой таблице будет точное указание - в каком блоке сколько ресурсов.



    • Содержание раздела