/* * Verify the checksum of last opened file above. */ int verify_pe_checksum (const char *fname) { DWORD file_sum, header_sum, calc_chk_sum, rc; assert (nt); file_sum = nt->OptionalHeader.CheckSum; DEBUGF (1, "Opt magic: 0x%04X, file_sum: 0x%08lX\n", nt->OptionalHeader.Magic, file_sum); rc = MapFileAndCheckSum ((PTSTR)fname, &header_sum, &calc_chk_sum); DEBUGF (1, "rc: %lu, 0x%08lX, 0x%08lX\n", rc, header_sum, calc_chk_sum); return (header_sum == calc_chk_sum); }
int main(int argc, char *argv[]) { int i; int ar_file; size_t len; unsigned long crc = 0; char *path; char buf[4096], arbuf[4096]; FILE *fp; for (i = 1; i < argc; i++) { crc = crc32(0L, Z_NULL, 0); path = argv[i]; ar_file = !strcmp(endof(path) - 2, ".a"); if (ar_file) { snprintf(arbuf, sizeof(arbuf), "ar -p %s", path); if ((fp = popen(arbuf, "r"))) { while ((len = fread(buf, 1, sizeof(buf), fp))) { crc = crc32(crc, buf, len); } pclose(fp); } #ifdef WIN32 } else if (!strcmp(endof(path) - 4, ".obj")) { DWORD origsum; DWORD rc; rc = MapFileAndCheckSum(path, &origsum, &crc); if (rc != CHECKSUM_SUCCESS) { fprintf(stderr, "Error: %s: %ld\n", path, rc); } fp = stdin; // HACK #endif /*WIN32*/ } else { if ((fp = fopen(path, "r"))) { while ((len = fread(buf, 1, sizeof(buf), fp))) { crc = crc32(crc, buf, len); } fclose(fp); } } if (!fp) { fprintf(stderr, "Error: %s: %s\n", path, strerror(errno)); continue; } fprintf(stdout, "Zlib CRC32 of %s is %lu\n", path, crc); } return(0); }
void ComputeChecksum( char *szExeFile ) { DWORD dwHeaderSum = 0; DWORD dwCheckSum = 0; HANDLE hFile; DWORD cb; IMAGE_DOS_HEADER dosHdr; IMAGE_NT_HEADERS ntHdr; switch(MapFileAndCheckSum(szExeFile, &dwHeaderSum, &dwCheckSum)) { case CHECKSUM_OPEN_FAILURE : Warn(WARN_CHECKSUM_OPEN_FAILURE, szExeFile, NULL); break; case CHECKSUM_MAP_FAILURE : Warn(WARN_CHECKSUM_MAP_FAILURE, szExeFile, NULL); break; case CHECKSUM_MAPVIEW_FAILURE : Warn(WARN_CHECKSUM_MAPVIEW_FAILURE, szExeFile, NULL); break; default: break; } hFile = CreateFile( szExeFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); // seek to the beginning of the file SetFilePointer( hFile, 0, 0, FILE_BEGIN ); // read in the dos header if ((ReadFile(hFile, &dosHdr, sizeof(dosHdr), &cb, 0) == FALSE) || (cb != sizeof(dosHdr))) { CloseHandle(hFile); return; } // read in the pe header if ((dosHdr.e_magic != IMAGE_DOS_SIGNATURE) || (SetFilePointer(hFile, dosHdr.e_lfanew, 0, FILE_BEGIN) == -1L)) { CloseHandle(hFile); return; } // read in the nt header if ((!ReadFile(hFile, &ntHdr, sizeof(ntHdr), &cb, 0)) || (cb != sizeof(ntHdr))) { CloseHandle(hFile); return; } if (SetFilePointer(hFile, dosHdr.e_lfanew, 0, FILE_BEGIN) == -1L) { CloseHandle(hFile); return; } ntHdr.OptionalHeader.CheckSum = dwCheckSum; if (!WriteFile(hFile, &ntHdr, sizeof(ntHdr), &cb, NULL)) { CloseHandle(hFile); return; } CloseHandle(hFile); return; }