Есть необходимость перед инсталяцией драйвера поменять в нем несколько байтов. Как я понял драйвер содержит контрольную сумму которую нужно соответствующим образом пересчитать. Никак не мого найти где она лежит и как ее вычислять.
katrus нет, курим формат ПЕ она лежит в IMAGE_OPTIONAL_HEADER[64].CheckSum, а опцинальный заголовок член структуры NT_IMAGE_HEADERS[64], которая в свою очередь лежит по IMAGE_DOS_HEADER.e_lfanew (IMAGE_DOS_HEADER - самое начало файла)
я вот так вычисляю. Код (Text): ntHdr = (PIMAGE_NT_HEADERS)((PUCHAR)pMem + ((PIMAGE_DOS_HEADER)pMem)->e_lfanew); ntHdr->OptionalHeader.CheckSum = 0; src = (PUSHORT)pMem; len = (size + 1) / 2; for (i = 0; i < len; i++){ chk += *src; if (HIWORD(chk) != 0) chk = LOWORD(chk) + HIWORD(chk); src++; } chk = (WORD)(LOWORD(chk) + HIWORD(chk)); chk += size; ntHdr->OptionalHeader.CheckSum = chk;
Более читабельный вариант: Код (Text): USHORT ChkSum(ULONG PartialSum, PUSHORT Source, ULONG Length) { while (Length--) { PartialSum += *Source++; PartialSum = (PartialSum >> 16) + (PartialSum & 0xffff); } return (USHORT)(((PartialSum >> 16) + PartialSum) & 0xffff); } ULONG CalcCheckSum(PVOID BaseAddress, ULONG FileLength) { PUSHORT AdjustSum; PIMAGE_NT_HEADERS NtHeaders; USHORT PartialSum; ULONG HeaderSum; ULONG CheckSum; HeaderSum = 0; PartialSum = ChkSum(0, (PUSHORT)BaseAddress, (FileLength + 1) >> 1); NtHeaders = PIMAGE_NT_HEADERS(PCHAR(BaseAddress) + PIMAGE_DOS_HEADER(BaseAddress)->e_lfanew); if (NtHeaders != NULL) { HeaderSum = NtHeaders->OptionalHeader.CheckSum; AdjustSum = (PUSHORT)(&NtHeaders->OptionalHeader.CheckSum); PartialSum -= (PartialSum < AdjustSum[0]); PartialSum -= AdjustSum[0]; PartialSum -= (PartialSum < AdjustSum[1]); PartialSum -= AdjustSum[1]; } else { PartialSum = 0; HeaderSum = FileLength; } CheckSum = (ULONG)PartialSum + FileLength; return CheckSum; } ULONG CalcCheckSum(PVOID BaseAddress, ULONG FileLength) - основная функция BaseAddress - адрес в памяти имеджа драйвера, коро копия файла в памяти FileLength - размер этого драйвера Вернет пересчитанную чек сумму.