SoftIce's osinfo.dat формат

Тема в разделе "WASM.RESEARCH", создана пользователем wasm_test, 29 дек 2009.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Что-то понесло меня посмотреть, как устроен формат файла с сигнатурами osinfo.dat у софт-айса. Очень хочется запустить его на XP SP3. Поиск в гугле дал сообщения, где в лучшем случае удавалось запустить его с кучей ошибок, сайс плевался, что не может найти MiCopyOnWrite и другие функции, что чревато его кривой работой.
    Предлагается разреверсить формат osinfo.dat и сделать сигнатуры для XP SP3.
    Вопрос первый - это кому-нибудь нужно? Если нет, то я не буду выкладывать наработки и буду делать для себя.
    Вопрос второй - можно ли этот файл чем-нибудь сгенерировать? Где-то был линк на какой-то способ, но линк мертвый.

    Путем продолжительного втыкания в хексдамп этого файла удалось обнаружить закономерности в размещении блоков в нем. Файл состоит из последовательных блоков, первый ворд у них содержит длину блока, второй ворд - какие-то флаги, остальные байты блока содержат полезную информацию. Дальше идет следующий блок и тп. до конца файла.
    Блоки бывают нескольких типов. Один из типов удалось опознать - там идет список версий ядра (major.minor, service pack, build number), имена модулей, имена функций и их сигнатуры. Немного удалось узнать и про другие типы блоков.
    Остальное придется доузнавать путем реверсинга самого сайса в месте, где он подгружает этот файл.

    Если кому интересно, могу выложить наработки.
     
  2. InsidE

    InsidE Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    357
    Адрес:
    Over the hills and far away...
    ну конечно же выкладывай ))

    п.с.
    нагуглив однажды soft-ice cover,и был приятно удивлен что на хр3 спокойно запустился айс...
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    смотря какой формат


    на XP SP3 Софтайс запускается без каких-либо проблем, вот только в лог пишет
    ругательства, где-то на руборде я приводил текст из лога
     
  4. JohnFive

    JohnFive New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2009
    Сообщения:
    6
    конечно интересно, инфо по теме:
    deciphering osinfo.dat for softice
    http://www.woodmann.com/forum/showthread.php?t=12234
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    JohnFive
    Спасибо за ссылку. Я подтвердил свою догадку насчет одного из типов блоков.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Формат файлов osinfo.dat и osinfob.dat (в чем разница между ними я не знаю - формат один и содержание похоже) следующий. Файлы разделены на блоки нескольких типов.
    Блок начинается с ворда, содержащего размер блока, включая заголовок, потом идет ворд неизвестных пока что флагов (я видел только значение 0001), далее идет содержимое длиной (размер_блока-4), где 4 - размер этого заголовка. После него идет следующий блок и так далее до конца файла.
    В начале файла располагаются блоки неизвестного назначения, в которых лежат копирайты Compuware, вероятно, они информационные и служат описателем содержимого файла. Далее идут блоки двух типов неизвестного назначения, в которых в том числе содержатся: версия Windows в формате Major.Minor, версия сервиспака, build number. Я их назвал в исходнике OS1 и OS2.
    Далее идут блоки с сигнатурами функций. В них так же содержатся версия Windows (Major.Minor, SP, build number), имя модуля, имя функции, сигнатура функции а так же имя экспортируемой функции, начиная с которой надо искать эту сигнатуру. (это я подтвердил по ссылке JohnFive). Эти блоки нужны для определения адресов неэкспортируемых функций.
    Дальше идут блоки неизвестного назначения, названные у меня коротко DATA.

    В общем структура блока может быть описана следующей структурой (Си):
    Код (Text):
    1. #pragma pack(push,1)
    2. struct OSINFOHEADER
    3. {
    4.     WORD structLength; // block length, bytes
    5.     WORD flags; // flags, always 0001
    6.     union
    7.     {
    8.         struct
    9.         {
    10.             char infoBlock[362]; // copyright block
    11.         } info;
    12.         struct
    13.         {
    14.             BYTE reserved1;
    15.             BYTE minorKernel; // major.minor windows version
    16.             BYTE majorKernel;
    17.             WORD buildNumber; // build number
    18.             char spNumber[4]; // asciiz string 'sp0', 'sp1', ... with service pack number
    19.             WORD reserved2[7]; // [7] in OS2 or [6] in OS1
    20.         } os;
    21.         struct
    22.         {
    23.             BYTE alwaysZero; // Always 0
    24.             BYTE minorKernel; // Версия Windows - Major.Minor
    25.             BYTE majorKernel;
    26.             WORD buildNumber; // Kernel build number
    27.             char spNumber; // Service pack number
    28.             BYTE reserved[21];
    29.             WORD reserved2;
    30.             char moduleName[40]; // module name (asciiz)
    31.             char routineName[60]; // internal routine name (asciiz)
    32.             char routine2Name[60]; // exported routine name (asciiz)
    33.             BYTE signature1[41]; // internal routine signature
    34.             BYTE signature2[42]; // exported routine signature
    35.         } func;
    36.         struct
    37.         {
    38.             BYTE alwaysZero;
    39.             BYTE minorKernel;
    40.             BYTE majorKernel;
    41.             WORD buildNumber;
    42.             char spNumber;
    43.             BYTE reserved[58];
    44.         } data;
    45.     };
    46. };
    47. #pragma pack(pop)
    48. #define OSINFO_INFOBLOCK_LENGTH 366
    49. #define OSINFO_OS1BLOCK_LENGTH 25
    50. #define OSINFO_OS2BLOCK_LENGTH 27
    51. #define OSINFO_FUNCBLOCK_LENGTH 276
    52. #define OSINFO_DATABLOCK_LENGTH 68
    Как видно, файл содержит блоки 5 разных типов. Назначение одного из них (FUNCBLOCK) удалось достоверно определить.
    Пока что эти данные получены лишь продолжительным втыканием в хексдамп osinfo.dat.
    Назначение блоков OS1, OS2, DATA все еще не ясно - возможно, какие-то из них содержат адреса патчей или что-то подобное.

    Пример программы, анализирующей osinfo.dat: (единственный аргумент командной строки - путь к osinfo.dat/osinfob.dat)
    Код (Text):
    1. /*
    2.  * osinfo.dat/osinfob.dat parser for SoftICE
    3.  * [C] Great, 2009
    4.  */
    5. #include <windows.h>
    6. #include <stdio.h>
    7.  
    8. #pragma pack(push,1)
    9. struct OSINFOHEADER
    10. {
    11.     WORD structLength;
    12.     WORD flags;
    13.     union
    14.     {
    15.         struct
    16.         {
    17.             char infoBlock[362];
    18.         } info;
    19.         struct
    20.         {
    21.             BYTE reserved1;
    22.             BYTE minorKernel;
    23.             BYTE majorKernel;
    24.             WORD buildNumber;
    25.             char spNumber[4];
    26.             WORD reserved2[7]; // or [6]
    27.         } os;
    28.         struct
    29.         {
    30.             BYTE alwaysZero;
    31.             BYTE minorKernel;
    32.             BYTE majorKernel;
    33.             WORD buildNumber;
    34.             char spNumber;
    35.             BYTE reserved[21];
    36.             WORD reserved2;
    37.             char moduleName[40];
    38.             char routineName[60];
    39.             char routine2Name[60];
    40.             BYTE signature1[41];
    41.             BYTE signature2[42];
    42.         } func;
    43.         struct
    44.         {
    45.             BYTE alwaysZero;
    46.             BYTE minorKernel;
    47.             BYTE majorKernel;
    48.             WORD buildNumber;
    49.             char spNumber;
    50.             BYTE reserved[58];
    51.         } data;
    52.     };
    53. };
    54. #pragma pack(pop)
    55. #define OSINFO_INFOBLOCK_LENGTH 366
    56. #define OSINFO_OS1BLOCK_LENGTH 25
    57. #define OSINFO_OS2BLOCK_LENGTH 27
    58. #define OSINFO_FUNCBLOCK_LENGTH 276
    59. #define OSINFO_DATABLOCK_LENGTH 68
    60.  
    61. struct SYSTEM_SUPPORTED
    62. {
    63.     WORD buildNumber;
    64.     WORD SpNumber;
    65.     BYTE major;
    66.     BYTE minor;
    67.     int refs;
    68. };
    69.  
    70. SYSTEM_SUPPORTED Systems[200];
    71. int nSystems = 0;
    72.  
    73. void AddSystem (WORD build, WORD sp, BYTE major, BYTE minor)
    74. {
    75.     for (int i=0; i<200; i++)
    76.     {
    77.         if (Systems[i].buildNumber == build && Systems[i].SpNumber == sp && Systems[i].major == major && Systems[i].minor == minor)
    78.         {
    79.             Systems[i].refs++;
    80.             return;
    81.         }
    82.     }
    83.  
    84.     Systems[nSystems].buildNumber = build;
    85.     Systems[nSystems].SpNumber = sp;
    86.     Systems[nSystems].refs = 1;
    87.     Systems[nSystems].major = major;
    88.     Systems[nSystems].minor = minor;
    89.     nSystems++;
    90. }
    91.  
    92. int main (int argc, char** argv)
    93. {
    94.     printf("osinfo.dat parser for SoftICE. [C] Great, 2009\n");
    95.  
    96.     if (argc != 2) return printf("use: %s path-to-osinfo.dat\n", argv[0]);
    97.  
    98.     char *osinfo = argv[1];
    99.     HANDLE hFile = CreateFile (osinfo, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    100.     HANDLE hSection = CreateFileMapping (hFile, 0, PAGE_READONLY, 0, 0, 0);
    101.     LPVOID lpMapping = MapViewOfFile (hSection, FILE_MAP_READ, 0, 0, 0);
    102.  
    103.     if (lpMapping == 0) return printf("failed\n");
    104.  
    105.     DWORD len = GetFileSize (hFile, 0);
    106.  
    107.     OSINFOHEADER *rec = (OSINFOHEADER*) lpMapping;
    108.  
    109.     do
    110.     {
    111.         switch (rec->structLength)
    112.         {
    113.         case OSINFO_INFOBLOCK_LENGTH:
    114.             printf("infoblock[%x]: %s\n", (DWORD)rec - (DWORD)lpMapping, rec->info.infoBlock);
    115.             break;
    116.  
    117.         case OSINFO_OS1BLOCK_LENGTH:
    118.         case OSINFO_OS2BLOCK_LENGTH:
    119.             AddSystem (rec->os.buildNumber, rec->os.spNumber[2]-'0', rec->os.majorKernel, rec->os.minorKernel);
    120.             break;
    121.  
    122.         case OSINFO_FUNCBLOCK_LENGTH:
    123.             //if (!stricmp (rec->func.routineName, "MiCopyOnWrite") || !stricmp (rec->func.routine2Name, "MiCopyOnWrite"))
    124.             printf("modblock[%x]: kernel %d.%d SP%c build %d reserved2 %d (%x) module %s functions %s %s [%02x %02x]\n", (DWORD)rec - (DWORD)lpMapping,
    125.                 rec->func.majorKernel, rec->func.minorKernel, rec->func.spNumber, rec->func.buildNumber,
    126.                 rec->func.reserved2, rec->func.reserved2,
    127.                 rec->func.moduleName, rec->func.routineName, rec->func.routine2Name,
    128.                 rec->func.signature1[0], rec->func.signature2[0]);
    129.             break;
    130.  
    131.         case OSINFO_DATABLOCK_LENGTH:
    132.             printf("data[%x]: kernel %d.%d SP%c build %d\n", (DWORD)rec - (DWORD)lpMapping, rec->data.majorKernel, rec->data.minorKernel, rec->data.spNumber, rec->data.buildNumber);
    133.             break;
    134.  
    135.         default:
    136.             printf("unknown[%x]: length %d\n", (DWORD)rec - (DWORD)lpMapping, rec->structLength);
    137.         }
    138.  
    139.         *(DWORD*)&rec += rec->structLength;
    140.     }
    141.     while ((DWORD)rec - (DWORD)lpMapping < len);
    142.  
    143.     for (int i=0; i<nSystems; i++)
    144.     {
    145.         printf("System[%-4d] %d.%d build %d (%04x) sp%d  %d signatures\n", i, Systems[i].major, Systems[i].minor, Systems[i].buildNumber, Systems[i].buildNumber, Systems[i].SpNumber, Systems[i].refs);
    146.     }
    147.  
    148.     return 0;
    149. }
    Её вывод наглядно показывает содержимое этого файла.
    Reversing in progress...

    PS. Обращаю внимание на то, что некоторые Osinfo.dat содержат сигнатуры для ядра 6.0 билды 40xx - это виста, когда она еще была бетой и звалась longhorn! =)
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    простите за глупый вопрос - а поотлаживать сам айс можно ??? если на виртуалку поставить 2ksp4 bkb xp2 c рабочим айсом это чтонибудь даст ???
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проще запихнуть ntice.sys в IDA и реверсить момент, где оно грузит osinfo.dat, чем я в принципе щас и занимаюсь
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    WinDBG'ом должно получиться
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    в нете еще валяется такая штука
    "ntice.rar - декомпилированый mamaich'em SoftIce для NT 4.0.5 (Build 526). Большая часть адресов и имен функций взята из сырцов IceDump"
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    правда судя по всему эта старая версия про OSINFO.DAT ничего не знала
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    тем не менее там много чего поименовано, что может быть полезно
     
  13. WRP

    WRP New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2009
    Сообщения:
    29
    Great

    "Вопрос первый - это кому-нибудь нужно? Если нет, то я не буду выкладывать наработки и буду делать для себя."

    Безусловно нужно . Наконец-то хоть кто-то ( а тем более сам Great ) взялся за это !
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Мне кажется, максимум чего можно добиться через osinfo.dat - запустить SICE на новых сервиспаках XP/2k3.
    Под Vista/7 он таким макаром почти наверняка не заработает - разве что серьёзно хачить под него саму винду.
     
  15. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вроде бы это из-за новой модели видеодрайверов, да и самих карточек тоже, не? Этот момент уже как-то обсуждался, надо поискать просто.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это только одна из причин.
     
  17. bbuc

    bbuc New Member

    Публикаций:
    0
    Регистрация:
    19 май 2004
    Сообщения:
    20
  18. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    x64
    Нет. AFAIK, основная причина отказа Compuware oт SICE - тенденция развития ядра виндовс (PatchGuard и проч), сильно повышающая сложность разработки и требующая изменения настроек винды под себя в объёме, неприемлемом для такого продукта. С другой стороны сыграло роль значительно возросшие стабильность и возможности MS DbgTools.

    SICE вполне юзабелен и без видео, в 2-х комповой конфигурации. Я его, кстати, под ВМваре только так и пользовал. В ряде задач он показал себя намного лучше WinDBG в плане производительности (например, если нужны условные бряки в "горячих" точках) из-за того, что обработка бряков производится на отлаживаемом компе, а не гоняется по медленному COMу.
     
  19. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    У SyserSoft совсем другой уровень пользователей и ответственности. :derisive:
     
  20. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    а больше ничего и не нужно, пока жива XP народ будет на ней сидеть