Ĺadny brzuch
Witam!
mam taki troche smieszny problem ;]
otoz chcialem dodac do mojego programu sprawdzanie crc32 pliku exe, zeby program nie dzialal majac inny crc (np po zmianie czegos hex edytorem)
mam taki kod pobierajacy crc pliku (wyszukane z googli):
const CRCPOLY = $EDB88320; var CRCTable: array[0..512] Of Longint; type Long = record LoWord: Word; HiWord: Word; end; procedure BuildCRCTable; var i, j: Word; r: Longint; begin FillChar(CRCTable, SizeOf(CRCTable), 0); for i := 0 to 255 do begin r := i shl 1; for j := 8 downto 0 do if (r and 1) <> 0 then r := (r Shr 1) xor CRCPOLY else r := r shr 1; CRCTable[i] := r; end; end; function RecountCRC(b: byte; CrcOld: Longint): Longint; begin RecountCRC := CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF) end; function HextW(w: Word): string; const h: array[0..15] Of char = '0123456789ABCDEF'; begin HextW := ''; HextW := h[Hi(w) shr 4] + h[Hi(w) and $F] + h[Lo(w) shr 4]+h[Lo(w) and $F]; end; function HextL(l: Longint): string; begin with Long(l) do HextL := HextW(HiWord) + HextW(LoWord); end; function GetCRC32(FileName: string): string; var Buffer: PChar; f: File of Byte; b: array[0..255] of Byte; CRC: Longint; e, i: Integer; begin BuildCRCTable; CRC := $FFFFFFFF; AssignFile(F, FileName); FileMode := 0; Reset(F); GetMem(Buffer, SizeOf(B)); repeat FillChar(b, SizeOf(b), 0); BlockRead(F, b, SizeOf(b), e); for i := 0 to (e-1) do CRC := RecountCRC(b[i], CRC); until (e < 255) or (IOresult <> 0); FreeMem(Buffer, SizeOf(B)); CloseFile(F); CRC := Not CRC; Result := '$' + HextL(CRC); end;
oraz taki kod wylaczajacy program wrazie innego crc:
var mycrc: string; begin mycrc:='$03A07ED7'; // aktualne crc if mycrc<>GetCRC32(application.ExeName) then halt();
i problem tkwi w tym, ze:
- sprawdzam crc mojego pliku
- zapisuje zmienna aktualnego crc do zmiennej mycrc
- kompiluje program <- i tutaj crc znow sie zmienia xP
czyli zeby program dzialal poprawnie musialbym wiedziec jakie crc 'otrzyma' po kompilacji xD
prosze o pomoc i pozdrawiam
Hmmm... Ciekawy problem :)
Ja bym rozwiązał go tak: (choć nie wiem, czy to by działało :D)
po prostu sprawdzasz w pliku projektu to crc pliku i zapisujesz do zmiennej ;)
Niech sprawdza czy crc programu zgadza się z crc zapisanym w dodatkowym pliku.
Nie da się zapisać w pliku jego własnej sumy kontrolnej, w żadnym wypadku i w żaden sposób =]
No chyba że ktoś by potrafił to zrobić jakimś cudacznym algorytmem w stylu algorytmu genetycznego, ale to już wyższa szkoła jazdy :>
@Einzeinbleth:
o osobnym pliku juz myslalem ale takie troche nieporeczne (aczkolwiek moze byc ;])
a wiecie moze jak zrobic "kontrole spojnosci programu" (czytalem o czyms takim w ksiazce Cracking bez tajemnic)?
najlepiej z pamieci i pliku (no i oczywiscie w delphi ;])
pozdrawiam
@EDIT:
wpadlem jeszcze na taki fajny pomysl ;]
mozna uzyc bindera, ktory bedzie w sobie przechowywal plik exe
tylko nie wiem jak to crc sie zmienia... czy po zmianie tego pliku ktory przechownuje glowny plik zmienilo by sie crc takze i tego glownego pliku... (jesli kumacie o co biega :P sorry ale nie moglem napisac prosciej)
Użytkownik tsukuyomi_reload edytował ten post 14 październik 2006, 21:04
ja bym zrobil to tak
Liczysz CRC osobnym programem po czym dopisujesz np. 4 konkretne (rozpoznawcze) bajty na koncu pliku a nastepnie zapisujesz CRC programu.
Przy odpalaniu programu liczysz CRC pliku, ale bez swoich 4 bajtow + crc.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
mam taki troche smieszny problem ;]
otoz chcialem dodac do mojego programu sprawdzanie crc32 pliku exe, zeby program nie dzialal majac inny crc (np po zmianie czegos hex edytorem)
mam taki kod pobierajacy crc pliku (wyszukane z googli):
const CRCPOLY = $EDB88320; var CRCTable: array[0..512] Of Longint; type Long = record LoWord: Word; HiWord: Word; end; procedure BuildCRCTable; var i, j: Word; r: Longint; begin FillChar(CRCTable, SizeOf(CRCTable), 0); for i := 0 to 255 do begin r := i shl 1; for j := 8 downto 0 do if (r and 1) <> 0 then r := (r Shr 1) xor CRCPOLY else r := r shr 1; CRCTable[i] := r; end; end; function RecountCRC(b: byte; CrcOld: Longint): Longint; begin RecountCRC := CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF) end; function HextW(w: Word): string; const h: array[0..15] Of char = '0123456789ABCDEF'; begin HextW := ''; HextW := h[Hi(w) shr 4] + h[Hi(w) and $F] + h[Lo(w) shr 4]+h[Lo(w) and $F]; end; function HextL(l: Longint): string; begin with Long(l) do HextL := HextW(HiWord) + HextW(LoWord); end; function GetCRC32(FileName: string): string; var Buffer: PChar; f: File of Byte; b: array[0..255] of Byte; CRC: Longint; e, i: Integer; begin BuildCRCTable; CRC := $FFFFFFFF; AssignFile(F, FileName); FileMode := 0; Reset(F); GetMem(Buffer, SizeOf(B)); repeat FillChar(b, SizeOf(b), 0); BlockRead(F, b, SizeOf(b), e); for i := 0 to (e-1) do CRC := RecountCRC(b[i], CRC); until (e < 255) or (IOresult <> 0); FreeMem(Buffer, SizeOf(B)); CloseFile(F); CRC := Not CRC; Result := '$' + HextL(CRC); end;
oraz taki kod wylaczajacy program wrazie innego crc:
var mycrc: string; begin mycrc:='$03A07ED7'; // aktualne crc if mycrc<>GetCRC32(application.ExeName) then halt();
i problem tkwi w tym, ze:
- sprawdzam crc mojego pliku
- zapisuje zmienna aktualnego crc do zmiennej mycrc
- kompiluje program <- i tutaj crc znow sie zmienia xP
czyli zeby program dzialal poprawnie musialbym wiedziec jakie crc 'otrzyma' po kompilacji xD
prosze o pomoc i pozdrawiam
Hmmm... Ciekawy problem :)
Ja bym rozwiązał go tak: (choć nie wiem, czy to by działało :D)
po prostu sprawdzasz w pliku projektu to crc pliku i zapisujesz do zmiennej ;)
Niech sprawdza czy crc programu zgadza się z crc zapisanym w dodatkowym pliku.
Nie da się zapisać w pliku jego własnej sumy kontrolnej, w żadnym wypadku i w żaden sposób =]
No chyba że ktoś by potrafił to zrobić jakimś cudacznym algorytmem w stylu algorytmu genetycznego, ale to już wyższa szkoła jazdy :>
@Einzeinbleth:
o osobnym pliku juz myslalem ale takie troche nieporeczne (aczkolwiek moze byc ;])
a wiecie moze jak zrobic "kontrole spojnosci programu" (czytalem o czyms takim w ksiazce Cracking bez tajemnic)?
najlepiej z pamieci i pliku (no i oczywiscie w delphi ;])
pozdrawiam
@EDIT:
wpadlem jeszcze na taki fajny pomysl ;]
mozna uzyc bindera, ktory bedzie w sobie przechowywal plik exe
tylko nie wiem jak to crc sie zmienia... czy po zmianie tego pliku ktory przechownuje glowny plik zmienilo by sie crc takze i tego glownego pliku... (jesli kumacie o co biega :P sorry ale nie moglem napisac prosciej)
Użytkownik tsukuyomi_reload edytował ten post 14 październik 2006, 21:04
ja bym zrobil to tak
Liczysz CRC osobnym programem po czym dopisujesz np. 4 konkretne (rozpoznawcze) bajty na koncu pliku a nastepnie zapisujesz CRC programu.
Przy odpalaniu programu liczysz CRC pliku, ale bez swoich 4 bajtow + crc.