CRC32 w jedną i w drugą stronę

0

Siema,
napisałem ostatnio program który zwraca uwagę na swój CRC32, lecz numer muszę trzymać w innym pliku. Czy ktoś mógł by mi powiedzieć jak go dodać (po skompilowaniu) do programu. Próbowałem w programie zmienić ale wtedy CRC32 się sypie i program nie działa. Może jakaś metoda oblicznia czy coś takiego. W końcu ochrona naszych programów to poważna rzecz

[angel]

0

Z tego co samemu kiedyś sobie zrobiłem, wiem że w nagłówku exeka są 2 bajty przeznaczone na crc - negacja sumy wszystkich bajtów, choć pod dosem można zliczać i sprawdzać innym algorytmem i system nie będzie się czepiał. Bajty 12h i 13h (od zera licząc). W przykładzie szukaj w źródle słowa/słów checksum (w vga_dpmi.pas).

// Mowa oczywiście o exe 16 bit (z syganturą 'MZ')
// Dla 'NE' jest long - offset 08h

// Po weryfikacji... Chyba nagłówek windowsowego MZ, coś inczej wygląda... Sam już nie wiem.

0

W 'windows.pas' masz gotowe rekordy do nagłówków MZ i NE:
TImageDosHeader - MZ
TImageOptionalHeader - NE
Chociaz NE nie bedzie ci chyba potrzebny tylko PE (delphi właśnie takie nagłówki tworzy). 4 bajty pod adresem 3Ch (liczac od poczatku pliku) to adres do nagłówka PE. Potem liczac od początku PE, 4 bajty pod adresem 2Fh to crc.
Możesz też zapisać coś do nagłówka MZ bo zawiera on 8 + 20 bajtów zarezerwowanych poczynając od adresu 1Ch (8 bajtów) i chyba 20h (20 bajtów). Chyba nie są używane... sam tam zapisywałem jakiś tekst i program chodził bezbłędnie :)
Tak w ogóle to polecam zajrzeć do specyfikacji, tam jest wszytko dokładnie opisane.
Podam przykład jak odczytać CRC z nagłówka PE:

var
 H: TImageDosHeader;
 CRC: DWord;
 F: file of byte;
begin

 AssignFile(F, 'c:\plik.exe');
 try
    Reset(F);
    BlockRead(F, H, SizeOf(H));
    if H._lfanew <> 0 then
    begin
        Seek(F, H._lfanew + $2F);
        BlockRead(F, CRC, SizeOf(CRC));
        { ...i tu juz masz CRC w }
    end;
 finally
    CloseFile(F);
 end;

end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1