VALIDCRC.PAS
上传用户:cuilin0620
上传日期:2007-01-13
资源大小:33k
文件大小:4k
源码类别:

杀毒

开发平台:

C/C++

  1. {$I-}
  2. {
  3. VALIDCRC.PAS
  4. Kevin Dean
  5. Fairview Mall P.O. Box 55074
  6. 1800 Sheppard Avenue East
  7. Willowdale, Ontario
  8. CANADA    M2J 5B9
  9. CompuServe ID: 76336,3114
  10. March 24, 1991
  11. This module validates the CRC of the program in which it is linked.
  12. The code was designed as an anti-virus algorithm.  The CRC is a very effective
  13. method of detecting viruses; any virus that attaches itself to the program
  14. changes the CRC of the program.  The response to an invalid CRC is entirely up
  15. to the programmer.
  16. This code is public domain.
  17. }
  18. unit ValidCRC;
  19. interface
  20. uses
  21.   DOS, AllocBuf;
  22. type
  23.   crc32_t =
  24.     longint;
  25.   FileCRC =
  26.     record
  27.     case boolean of
  28.       false:
  29. (
  30. SearchStr : array [1 .. 8] of char; { String to search for. }
  31. );
  32.       true:
  33. (
  34. Polynomial : crc32_t; { Polynomial for this file. }
  35. CRC : crc32_t; { Calculated CRC for this file. }
  36. )
  37.     end;
  38. const
  39.   crcValid = { CRC is valid. }
  40.     0;
  41.   crcInvalid = { CRC is invalid. }
  42.     1;
  43.   crcIsZero = { CRC polynomial has been reset to zero. }
  44.     2;
  45.   crcNoMem = { No memory for data buffer. }
  46.     3;
  47.   crcFileErr = { Program file not found. }
  48.     4;
  49. function ValidateCRC(ProgName : string) : integer;
  50. function IsValidCRC(ProgName : string) : boolean;
  51. implementation
  52. const _VirusCRC : FileCRC =
  53.   (
  54.   SearchStr : ('D', 'E', 'A', 'N', '_', 'C', 'R', 'C')
  55.   );
  56. type
  57.   dwordrec =
  58.     record
  59.     Lo, Hi : word
  60.     end;
  61.   BytePtr =
  62.     ^byte;
  63. {***}
  64. { Extract the low word of a dword. }
  65. function LowW(dword : longint) : word;
  66. begin
  67. LowW := (dwordrec(dword)).Lo
  68. end;
  69. {***}
  70. { Extract the high word of a dword. }
  71. function HiW(dword : longint) : word;
  72. begin
  73. HiW := (dwordrec(dword)).Hi
  74. end;
  75. {***}
  76. { Calculate CRC of active program and compare it to CRC in _VirusCRC. }
  77. function ValidateCRC(ProgName : string) : integer;
  78. var
  79.   Buffer : BytePtr; { Buffer for file's data. }
  80.   BufSize : word; { Buffer size. }
  81.   PN : string[79]; { Program name. }
  82.   ProgFile : file; { Program file. }
  83.   Table : array [0 .. 255] of crc32_t; { CRC table. }
  84.   HalfI : ^crc32_t; { Pointer to CRC of I div 2. }
  85.   CRC : crc32_t; { Current CRC. }
  86.   I : word; { Byte counter. }
  87.   BufPtr : BytePtr; { Pointer to Buffer. }
  88. begin
  89. if _VirusCRC.Polynomial <> 0 then
  90.   begin
  91.   { Allocate 8k buffer if possible, but get at least 512 bytes. }
  92.   BufSize := 8192;
  93.   Buffer := BufAlloc(BufSize, 512);
  94.   if Buffer <> nil then
  95.     begin
  96.     if Lo(DosVersion) < 3 then
  97.       { Search PATH for program file. }
  98.       PN := FSearch(ProgName, GetEnv('PATH'))
  99.     else
  100.       { Under DOS versions 3 and above, the program name is in ParamStr(0). }
  101.       PN := ParamStr(0);
  102.     Assign(ProgFile, PN);
  103.     Reset(ProgFile, 1);
  104.     if IOResult = 0 then
  105.       begin
  106.       { Generate a CRC lookup table for faster calculation. }
  107.       HalfI := @Table[0];
  108.       Table[0] := 0;
  109.       I := 0;
  110.       while I < 256 do
  111. begin
  112. if Hi(HiW(HalfI^)) and $80 = $80 then
  113.   begin
  114.   Table[I + 1] := HalfI^ shl 1;
  115.   Table[I] := Table[I + 1] xor _VirusCRC.Polynomial
  116.   end
  117. else
  118.   begin
  119.   Table[I] := HalfI^ shl 1;
  120.   Table[I + 1] := Table[I] xor _VirusCRC.Polynomial
  121.   end;
  122. Inc(I, 2);
  123. Inc(longint(HalfI), sizeof(crc32_t))
  124. end;
  125.       CRC := 0;
  126.       BlockRead(ProgFile, Buffer^, BufSize, I);
  127.       while I <> 0 do
  128. begin
  129. BufPtr := Buffer;
  130. while I <> 0 do
  131.   begin
  132.   CRC := (CRC shl 8) xor Table[Hi(HiW(CRC)) xor BufPtr^];
  133.   Dec(I);
  134.   Inc(longint(BufPtr))
  135.   end;
  136. BlockRead(ProgFile, Buffer^, BufSize, I)
  137. end;
  138.       Close(ProgFile);
  139.       if CRC = _VirusCRC.CRC then
  140. ValidateCRC := crcValid
  141.       else
  142. ValidateCRC := crcInvalid
  143.       end
  144.     else
  145.       ValidateCRC := crcFileErr;
  146.     FreeMem(Buffer, BufSize)
  147.     end
  148.   else
  149.     ValidateCRC := crcNoMem
  150.   end
  151. else
  152.   { CRC polynomial must be something other than 0. }
  153.   ValidateCRC := crcIsZero
  154. end;
  155. {***}
  156. { Defined for compatibility with earlier releases of CRCSET. }
  157. function IsValidCRC(ProgName : string) : boolean;
  158. begin
  159. IsValidCRC := ValidateCRC(Progname) = crcValid
  160. end;
  161. end.