контрольная сумма драйвера

Тема в разделе "WASM.BEGINNERS", создана пользователем katrus, 4 дек 2007.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Есть необходимость перед инсталяцией драйвера поменять в нем несколько байтов. Как я понял драйвер содержит контрольную сумму которую нужно соответствующим образом пересчитать. Никак не мого найти где она лежит и как ее вычислять.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    DWORD pe_checksum; // 58 59 5A 5B
    IMAGEHLP.MapFileAndCheckSum или руками
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    censored
    Большое спасибо! Вижу, что сумма лежит в драйвере по адресу 2A0h. Это всегда так?
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    katrus нет, курим формат ПЕ
    она лежит в IMAGE_OPTIONAL_HEADER[64].CheckSum, а опцинальный заголовок член структуры NT_IMAGE_HEADERS[64], которая в свою очередь лежит по IMAGE_DOS_HEADER.e_lfanew (IMAGE_DOS_HEADER - самое начало файла)
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я вот так вычисляю.
    Код (Text):
    1.     ntHdr = (PIMAGE_NT_HEADERS)((PUCHAR)pMem + ((PIMAGE_DOS_HEADER)pMem)->e_lfanew);
    2.     ntHdr->OptionalHeader.CheckSum = 0;
    3.     src = (PUSHORT)pMem;
    4.     len = (size + 1) / 2;
    5.     for (i = 0; i < len; i++){
    6.         chk += *src;
    7.         if (HIWORD(chk) != 0)
    8.             chk = LOWORD(chk) + HIWORD(chk);
    9.         src++;
    10.     }
    11.     chk = (WORD)(LOWORD(chk) + HIWORD(chk));
    12.     chk += size;
    13.     ntHdr->OptionalHeader.CheckSum = chk;
     
  6. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Более читабельный вариант:

    Код (Text):
    1. USHORT ChkSum(ULONG PartialSum,
    2.               PUSHORT Source,
    3.               ULONG Length)
    4. {
    5.     while (Length--)
    6.     {
    7.         PartialSum += *Source++;
    8.         PartialSum = (PartialSum >> 16) + (PartialSum & 0xffff);
    9.     }
    10.  
    11.     return (USHORT)(((PartialSum >> 16) + PartialSum) & 0xffff);
    12. }
    13.  
    14. ULONG CalcCheckSum(PVOID BaseAddress,
    15.                    ULONG FileLength)
    16. {
    17.     PUSHORT AdjustSum;
    18.     PIMAGE_NT_HEADERS NtHeaders;
    19.     USHORT PartialSum;
    20.     ULONG HeaderSum;
    21.     ULONG CheckSum;
    22.  
    23.     HeaderSum = 0;
    24.     PartialSum = ChkSum(0, (PUSHORT)BaseAddress, (FileLength + 1) >> 1);
    25.  
    26.     NtHeaders = PIMAGE_NT_HEADERS(PCHAR(BaseAddress) + PIMAGE_DOS_HEADER(BaseAddress)->e_lfanew);
    27.  
    28.     if (NtHeaders != NULL)
    29.     {
    30.         HeaderSum = NtHeaders->OptionalHeader.CheckSum;
    31.  
    32.         AdjustSum = (PUSHORT)(&NtHeaders->OptionalHeader.CheckSum);
    33.         PartialSum -= (PartialSum < AdjustSum[0]);
    34.         PartialSum -= AdjustSum[0];
    35.         PartialSum -= (PartialSum < AdjustSum[1]);
    36.         PartialSum -= AdjustSum[1];
    37.     }
    38.     else
    39.     {
    40.         PartialSum = 0;
    41.         HeaderSum = FileLength;
    42.     }
    43.  
    44.     CheckSum = (ULONG)PartialSum + FileLength;
    45.  
    46.     return CheckSum;
    47. }
    ULONG CalcCheckSum(PVOID BaseAddress, ULONG FileLength) - основная функция
    BaseAddress - адрес в памяти имеджа драйвера, коро копия файла в памяти
    FileLength - размер этого драйвера
    Вернет пересчитанную чек сумму.