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

杀毒

开发平台:

C/C++

  1.                               CRCSET version 1.31
  2.                        Copyright (c) 1991 by Kevin Dean
  3.                                   Kevin Dean
  4.                          Fairview Mall P.O. Box 55074
  5.                            1800 Sheppard Avenue East
  6.                               Willowdale, Ontario
  7.                                CANADA    M2J 5B9
  8.                            CompuServe ID: 76336,3114
  9.                                    Contents
  10.                                    --------
  11.                    Warranty ............................  1
  12.                    License .............................  2
  13.                    Introduction ........................  3
  14.                    What is a CRC? ......................  4
  15.                    How CRCSET Works ....................  8
  16.                    How to Use CRCSET ................... 13
  17.                    Vulnerability ....................... 16
  18.                                    Warranty
  19.         The author of CRCSET (hereafter referred to as "the author") makes no
  20. warranty of any kind, expressed or implied, including without limitation, any
  21. warranties of merchantability and/or fitness for a particular purpose.  The
  22. author shall not be liable for any damages, whether direct, indirect, special,
  23. or consequential arising from a failure of this program to operate in the
  24. manner desired by the user.  The author shall not be liable for any damage to
  25. data or property which may be caused directly or indirectly by use of the
  26. program.
  27.         In no event will the author be liable to the user for any damages,
  28. including any lost profits, lost savings, or other incidental or consequential
  29. damages arising out of the use or inability to use the program, or for any
  30. claim by any other party.
  31.                                   - Page 1 - 
  32.                                     License
  33.         This program is public domain.  As such, it may be freely distributed
  34. by anyone by any means.  No person or organization may charge for this program
  35. except for a minimal charge to cover handling and distribution.
  36.         Having said that, I would also like to add that this algorithm has
  37. taken a lot of time and work to develop.  If you like this program, send me a
  38. postcard and let me know.  I would also be interested in copies of your own
  39. programs if you feel that that is appropriate.
  40.         Also, if you have any questions or would like to see some more
  41. features in the program, drop me a note by surface or electronic mail (my
  42. address is on the first page of this file).  I will answer all mail regarding
  43. this program.
  44.         Customization is available.
  45.                                   - Page 2 - 
  46.                                  Introduction
  47.         CRCSET is an anti-virus utility.  Its purpose is to protect programs
  48. (in which supporting code is linked) with one of the most effective weapons
  49. against computer viruses: the Cyclic Redundancy Check, or CRC.  A full
  50. understanding of the CRC is not required to use this utility; if you like, you
  51. can skip over the discussion of the CRC to the section entitled "How to Use
  52. CRCSET".
  53.         There are many utilities that perform CRC checks on other programs
  54. (VALIDATE.COM by McAfee associates is one) but most of these are external
  55. programs that are usually run only once, if at all.  The CRC generated by
  56. these utilities must be compared to a value in an external file; if the values
  57. match, the program is not infected.
  58.         This approach has two problems: the first is that the CRC check is
  59. run only once when the user gets the program, if at all.  Most people would
  60. never run the check a second time.  The second problem is that the CRC is
  61. stored in an external file (e.g. the documentation).  If someone wants to tack
  62. a virus onto the program, it becomes a simple matter to run the validation
  63. program, copy the CRC values to the documentation, and distribute the infected
  64. program.  Anyone running the validation program would find the same CRC in the
  65. program as in the documentation, and in comes the virus.
  66.         Another (increasingly popular) approach is for the CRC to be stored in
  67. the program itself (the .EXE file) and for the program to do its own check
  68. every time it is loaded.  This method is much more effective than the previous
  69. one because it means that the moment the program is infected and the CRC
  70. changes, the infection will be detected the next time the program is run.
  71.         There is a potential problem with this method, but before I get into
  72. that, we need some background.
  73.                                   - Page 3 - 
  74.                                 What is a CRC?
  75.         The CRC, or Cyclic Redundancy Check, is an error-checking algorithm
  76. used in many types of computer operations, especially in data transfer.  For
  77. example, whenever your computer writes to disk, the disk controller calculates
  78. the CRC of the data being written and writes it with the data.  If your disk
  79. should somehow become corrupted, the CRC check will fail when you next try to
  80. read the data and the disk controller will return with an error, forcing DOS
  81. to display the critical error "Data error reading drive C:".  Most file
  82. transfer protocols (like Xmodem, Zmodem, and some derivatives of Kermit) also
  83. use a CRC check to validate the data being transmitted; if the CRC transmitted
  84. with the data does not match the CRC calculated by the receiving program, then
  85. the transmission has failed and the sending program is asked to retry the
  86. transmission.
  87.         The actual calculation of the CRC is very simple.  The algorithm
  88. consists of two parts, a CRC polynomial and a CRC register, and is really an
  89. exercise in modulo-2 arithmetic.  The rules for modulo-2 arithmetic are shown
  90. in the following table:
  91.                                    0 + 0 = 0
  92.                                    0 + 1 = 1
  93.                                    1 + 0 = 1
  94.                                    1 + 1 = 0
  95. For those of you familiar with binary logic, these rules are equivalent to
  96. the exclusive-or operation.  Note: under modulo-2 arithmetic, subtraction is
  97. equivalent to addition.
  98.         There is nothing magical about modulo-2 arithmetic and it has no
  99. special properties that make it better suited to CRC calculations than
  100. standard arithmetic; rather, since modulo-2 arithmetic doesn't carry from one
  101. column to the next (i.e. 1 + 1 = 0 with no carry), it's just easier to
  102. implement in hardware and software than any other method.  Consider the
  103. following:
  104. 1. Binary addition, normal rules of carry
  105.      101101001
  106.    + 110110111
  107.    -----------
  108.     1100100000
  109. 2. Binary addition, modulo-2 arithmetic (no carry)
  110.      101101001
  111.    + 110110111
  112.    -----------
  113.      011011110
  114. The first addition requires us to carry any overflow from right to left.  The
  115. second addition requires no carry operations and can be performed much faster
  116. both by humans and by computers.
  117.         The CRC algorithm can best be illustrated by the following diagram of
  118. a 4-bit CRC generator:
  119.                                   - Page 4 - 
  120.                                  CRC polynomial
  121.                ------------1-----------0-----------1-----------1
  122.                |     3     |     2           1     |     0     |
  123.                |   -----   v   -----       -----   v   -----   v
  124.                + <-| x |<- + <-| x |<------| x |<- + <-| x |<- +
  125.                ^   -----       -----       -----       -----
  126.                |                  CRC register
  127.                ---- binary data stream
  128. Each '+' symbol represents modulo-2 addition.  The numbers above the CRC
  129. register are the bit numbers of the register.
  130.         The CRC is calculated as follows:
  131. 1. Initialize the CRC register to 0.
  132. 2. Add the incoming bit of the data stream to the outgoing bit (bit 3) of the
  133.    CRC register.
  134. 3. Send the result of step 1 into the polynomial feedback loop.
  135. 4. Add the value in the feedback loop to the bits in the CRC register as it is
  136.    shifted left.  The bits affected are determined by the CRC polynomial (i.e.
  137.    there is an addition for every bit in the polynomial that is equal to 1; if
  138.    the bit is 0, it is not fed back into the register).  In this case, the
  139.    polynomial represented is 1011.
  140. 5. Repeat steps 2-4 for every bit in the data stream.
  141. 6. The CRC is the final value in the register.
  142. Let's try this with the data stream 11010111 and the polynomial 1011.  The
  143. result will be a 4-bit CRC.
  144.         The output stream to the left is the result of each addition operation
  145. at the left-most gate.  This is the value that is fed into the polynomial
  146. feedback loop during the left shift.
  147.                      ------------1-----------0-----------1-----------1
  148.                      |     3     |     2           1     |     0     |
  149.                      |   -----   v   -----       -----   v   -----   v
  150.                      + <-| 0 |<- + <-| 0 |<------| 0 |<- + <-| 0 |<- +
  151.                      ^   -----       -----       -----       -----
  152.                      |
  153.                      ---- 11010111
  154.                      ------------1-----------0-----------1-----------1
  155.                      |     3     |     2           1     |     0     |
  156.                      |   -----   v   -----       -----   v   -----   v
  157.                 1 <- + <-| 1 |<- + <-| 0 |<------| 1 |<- + <-| 1 |<- +
  158.                      ^   -----       -----       -----       -----
  159.                      |
  160.                      ---- 1010111
  161.                                   - Page 5 - 
  162.                      ------------1-----------0-----------1-----------1
  163.                      |     3     |     2           1     |     0     |
  164.                      |   -----   v   -----       -----   v   -----   v
  165.                10 <- + <-| 0 |<- + <-| 1 |<------| 1 |<- + <-| 0 |<- +
  166.                      ^   -----       -----       -----       -----
  167.                      |
  168.                      ---- 010111
  169.                      ------------1-----------0-----------1-----------1
  170.                      |     3     |     2           1     |     0     |
  171.                      |   -----   v   -----       -----   v   -----   v
  172.               100 <- + <-| 1 |<- + <-| 1 |<------| 0 |<- + <-| 0 |<- +
  173.                      ^   -----       -----       -----       -----
  174.                      |
  175.                      ---- 10111
  176.                      ------------1-----------0-----------1-----------1
  177.                      |     3     |     2           1     |     0     |
  178.                      |   -----   v   -----       -----   v   -----   v
  179.              1000 <- + <-| 1 |<- + <-| 0 |<------| 0 |<- + <-| 0 |<- +
  180.                      ^   -----       -----       -----       -----
  181.                      |
  182.                      ---- 0111
  183.                      ------------1-----------0-----------1-----------1
  184.                      |     3     |     2           1     |     0     |
  185.                      |   -----   v   -----       -----   v   -----   v
  186.             10001 <- + <-| 1 |<- + <-| 0 |<------| 1 |<- + <-| 1 |<- +
  187.                      ^   -----       -----       -----       -----
  188.                      |
  189.                      ---- 111
  190.                      ------------1-----------0-----------1-----------1
  191.                      |     3     |     2           1     |     0     |
  192.                      |   -----   v   -----       -----   v   -----   v
  193.           100010 <- + <-| 0 |<- + <-| 1 |<------| 1 |<- + <-| 0 |<- +
  194.                      ^   -----       -----       -----       -----
  195.                      |
  196.                      ---- 11
  197.                      ------------1-----------0-----------1-----------1
  198.                      |     3     |     2           1     |     0     |
  199.                      |   -----   v   -----       -----   v   -----   v
  200.           1000101 <- + <-| 0 |<- + <-| 1 |<------| 1 |<- + <-| 1 |<- +
  201.                      ^   -----       -----       -----       -----
  202.                      |
  203.                      ---- 1
  204.                      ------------1-----------0-----------1-----------1
  205.                      |     3     |     2           1     |     0     |
  206.                      |   -----   v   -----       -----   v   -----   v
  207.          10001011 <- + <-| 0 |<- + <-| 1 |<------| 0 |<- + <-| 1 |<- +
  208.                      ^   -----       -----       -----       -----
  209.                      |
  210.                      ----
  211.         The CRC is 0101.
  212.                                   - Page 6 - 
  213.         What should be obvious at this point is that if a single bit in the
  214. data stream is changed, the value in the CRC register is corrupted completely.
  215. The feedback loop ensures that the error is propagated throughout the entire
  216. calculation.
  217.         Most CRC algorithms use either a 16- or 32-bit polynomial.  The longer
  218. the polynomial, the more effective it is at catching errors; a 16-bit CRC, for
  219. example, catches more than 99.99% of all errors in a data stream.
  220.         All other CRC algorithms are analogous to the 4-bit algorithm
  221. presented here.  There are some optimizations that can process several bits at
  222. a time; the source code included with this program uses a lookup table that
  223. can process 8 bits at once.  For further discussion of the CRC algorithm and
  224. its variations, I recommend "C Programmer's Guide to Serial Communications" by
  225. Joe Campbell, published by Howard W. Sams & Company.
  226.                                   - Page 7 - 
  227.                                How CRCSET Works
  228.         The idea of storing a program's CRC in the executable file itself has
  229. one drawback: since the CRC is part of the program, it becomes part of the
  230. data stream that is used to calculate the CRC.  In other words, you have to
  231. know what the CRC of the program is in order to calculate it!  At compile and
  232. link time, this is downright impossible; changing the slightest thing in your
  233. code will change the CRC the next time you recompile.
  234.         Most algorithms that store the CRC in the program itself get around
  235. this drawback by breaking up the program into three chunks:
  236.            +------------------------+-----+------------------------+
  237.            | <-- Program part 1 --> | CRC | <-- Program part 2 --> |
  238.            +------------------------+-----+------------------------+
  239. The CRC is then calculated as the concatenation of parts 1 and 2, i.e. when
  240. the CRC is calculated, it skips over itself completely in the calculation.
  241. What it sees is this:
  242.               +------------------------+------------------------+
  243.               | <-- Program part 1 --> | <-- Program part 2 --> |
  244.               +------------------------+------------------------+
  245.         In order for a virus to infect any program that uses this method, it
  246. must somehow find the location of the CRC within the file and recalculate the
  247. CRC using the following data stream:
  248.       +------------------------+------------------------+---------------+
  249.       | <-- Program part 1 --> | <-- Program part 2 --> | <-- Virus --> |
  250.       +------------------------+------------------------+---------------+
  251. It must then overwrite the old CRC with the new one.
  252.         I won't explain how (I don't want to give any virus-writers any
  253. ideas), but with the right technique the CRC can be found, recalculated, and
  254. rewritten in under 30 seconds.
  255.         CRCSET overcomes this limitation by making both the polynomial and the
  256. CRC part of the data stream.  In order to calculate the CRC, CRCSET looks for
  257. a predefined string in the program (the default is DEAN_CRC), replaces the
  258. first four bytes with a 32-bit polynomial, sets the next four bytes (the true
  259. CRC) to 0, and calculates an intermediate CRC assuming that the true CRC is 0.
  260. Then, through the magic of matrix algebra, CRCSET calculates what the true CRC
  261. should have been in order to yield itself instead of the intermediate CRC at
  262. the end.  Let's take a look at a 4-bit CRC calculation as an example.
  263.         Let's assume that the polynomial in use is 1011, that the CRC
  264. calculated up to the point where we reach the search string (represented by
  265. the bit pattern STUVWXYZ) is 0010, and that the bit pattern 1100 follows the
  266. search string:
  267.                                   - Page 8 - 
  268.                ------------1-----------0-----------1-----------1
  269.                |     3     |     2           1     |     0     |
  270.                |   -----   v   -----       -----   v   -----   v
  271.                + <-| 0 |<- + <-| 0 |<------| 1 |<- + <-| 0 |<- +
  272.                ^   -----       -----       -----       -----
  273.                |
  274.                ---- STUVWXYZ1100
  275. 1. Replace the first four bits (STUV) with the CRC polynomial (1011):
  276.                ------------1-----------0-----------1-----------1
  277.                |     3     |     2           1     |     0     |
  278.                |   -----   v   -----       -----   v   -----   v
  279.                + <-| 0 |<- + <-| 0 |<------| 1 |<- + <-| 0 |<- +
  280.                ^   -----       -----       -----       -----
  281.                |
  282.                ---- 1011WXYZ1100
  283. 2. Calculate the value of the CRC register with the polynomial in the data
  284.    stream:
  285.                ------------1-----------0-----------1-----------1
  286.                |     3     |     2           1     |     0     |
  287.                |   -----   v   -----       -----   v   -----   v
  288.                + <-| 1 |<- + <-| 0 |<------| 0 |<- + <-| 1 |<- +
  289.                ^   -----       -----       -----       -----
  290.                |
  291.                ---- WXYZ1100
  292. 3. Replace the next four bits (WXYZ) with simple variables (X3, X2, X1, X0):
  293.                ------------1-----------0-----------1-----------1
  294.                |     3     |     2           1     |     0     |
  295.                |   -----   v   -----       -----   v   -----   v
  296.                + <-| 1 |<- + <-| 0 |<------| 0 |<- + <-| 1 |<- +
  297.                ^   -----       -----       -----       -----
  298.                |
  299.                ---- (X3)(X2)(X1)(X0)1100
  300. 4. Propagate X3+(bit 3) through the feedback loop:
  301.            ---------------1-----------0------------1--------------1
  302.            |     3        |     2           1      |     0        |
  303.            |   --------   v   -----       ------   v   --------   v
  304.            + <-| X3+1 |<- + <-| 0 |<------| X3 |<- + <-| X3+1 |<- +
  305.            ^   --------       -----       ------       --------
  306.            |
  307.            ---- (X2)(X1)(X0)1100
  308.                                   - Page 9 - 
  309. 5. Propagate X2+(bit 3) through the feedback loop:
  310.         ------------------1------------0------------1-----------------1
  311.         |     3           |     2            1      |     0           |
  312.         |   -----------   v   ------       ------   v   -----------   v
  313.         + <-| X3+X2+1 |<- + <-| X3 |<------| X2 |<- + <-| X3+X2+1 |<- +
  314.         ^   -----------       ------       ------       -----------
  315.         |
  316.         ---- (X1)(X0)1100
  317.    In bit 1, for example, we have (X2+(bit 3))+(bit 0) = (X2+X3+1)+(X3+1) = X2
  318.    since the X3 terms cancel, no matter what the value of X3 is.
  319. 6. Propagate X1+(bit 3) through the feedback loop:
  320.         ------------------1------------0------------1--------------------1
  321.         |     3           |     2            1      |     0              |
  322.         |   -----------   v   ------       ------   v   --------------   v
  323.         + <-| X2+X1+1 |<- + <-| X2 |<------| X1 |<- + <-| X3+X2+X1+1 |<- +
  324.         ^   -----------       ------       ------       --------------
  325.         |
  326.         ---- (X0)1100
  327. 7. Propagate X0+(bit 3) through the feedback loop:
  328.      ------------------1------------0---------------1--------------------1
  329.      |     3           |     2            1         |     0              |
  330.      |   -----------   v   ------       ---------   v   --------------   v
  331.      + <-| X1+X0+1 |<- + <-| X1 |<------| X3+X0 |<- + <-| X2+X1+X0+1 |<- +
  332.      ^   -----------       ------       ---------       --------------
  333.      |
  334.      ---- 1100
  335. 8. Propagate the next bit through the feedback loop:
  336.          -------------1---------------0--------------1---------------1
  337.          |     3      |     2               1        |     0         |
  338.          |   ------   v   ---------       --------   v   ---------   v
  339.          + <-| X0 |<- + <-| X3+X0 |<------| X2+1 |<- + <-| X1+X0 |<- +
  340.          ^   ------       ---------       --------       ---------
  341.          |
  342.          ---- 100
  343. 9. Repeat step 8 for all remaining bits:
  344.      ---------------------1---------------0--------------1---------------1
  345.      |     3              |     2               1        |     0         |
  346.      |   --------------   v   ---------       --------   v   ---------   v
  347.      + <-| X3+X2+X1+1 |<- + <-| X3+X0 |<------| X2+1 |<- + <-| X3+X2 |<- +
  348.      ^   --------------       ---------       --------       ---------
  349.      |
  350.      ----
  351.                                  - Page 10 - 
  352.         We want the CRC in the register to be equal to the unknown CRC we
  353. started inserting at step 4, i.e. we need:
  354.                      N   Value calculated for bit N  Bit N
  355.                     ---  --------------------------  -----
  356.                      3      X3 + X2 + X1      + 1   =  X3
  357.                      2      X3           + X0       =  X2
  358.                      1           X2           + 1   =  X1
  359.                      0      X3 + X2                 =  X0
  360. If we collect all the variables on the left and all the constants on the
  361. right (keeping in mind that we are dealing with modulo-2 arithmetic):
  362.                                   X2 + X1      = 1
  363.                              X3 + X2      + X0 = 0
  364.                                   X2 + X1      = 1
  365.                              X3 + X2      + X0 = 0
  366. The value 1010 is the intermediate CRC mentioned earlier.
  367.         Here we have an interesting situation.  The first and third equations
  368. are the same and so are the second and fourth.  What we come down to is this:
  369.                                   X2 + X1      = 1
  370.                              X3 + X2      + X0 = 0
  371. We have four variables and only two equations.  There is no unique solution;
  372. in fact, there are four (2 to the power of (4 - number of independent
  373. equations)) separate and distinct sets of values that will satisfy these
  374. equations.
  375.         Since CRCSET needs a numeric solution, we have to arbitrarily set bits
  376. to get one.  For arguments sake, let's set X2 to 1.
  377.                                    1 + X1      = 1
  378.                              X3 +  1      + X0 = 0
  379. In other words:
  380.                                        X1      = 0
  381.                              X3 +         + X0 = 1
  382. By setting X2 to 1, we have also fixed X1.  Now let's set X0 to 0.
  383.                              X3 +         +  0 = 1
  384. In other words:
  385.                              X3                = 1
  386. We now have a solution for the CRC of the program: 1100.  There are three
  387. others: 0101, 0010, and 1011.  If we replace the string WXYZ with any of these
  388. values, the CRC calculation process will yield that value at the end, e.g.:
  389.                                  - Page 11 - 
  390.                ------------1-----------0-----------1-----------1
  391.                |     3     |     2           1     |     0     |
  392.                |   -----   v   -----       -----   v   -----   v
  393.                + <-| 0 |<- + <-| 0 |<------| 1 |<- + <-| 0 |<- +
  394.                ^   -----       -----       -----       -----
  395.                |
  396.                ---- 101111001100
  397.                         ----
  398. yields
  399.                ------------1-----------0-----------1-----------1
  400.                |     3     |     2           1     |     0     |
  401.                |   -----   v   -----       -----   v   -----   v
  402.                + <-| 1 |<- + <-| 1 |<------| 0 |<- + <-| 0 |<- +
  403.                ^   -----       -----       -----       -----
  404.                |
  405.                ----
  406. If you're not sure about this, try it with pen and paper.  Plug in each of the
  407. four values and you should get that same value at the end of the CRC
  408. calculation process.  To help you out, here are the values of the CRC register
  409. for each step of the solution (the first value is the value after step 2 of
  410. the calculation):
  411.            CRC
  412.           -----
  413.           1100: 1001, 0010, 1111, 0101, 1010, 0100, 0011, 0110, 1100
  414.           0101: 1001, 1001, 0010, 0100, 0011, 1101, 1010, 1111, 0101
  415.           0010: 1001, 1001, 1001, 0010, 0100, 0011, 1101, 0001, 0010
  416.           1011: 1001, 0010, 0100, 0011, 1101, 1010, 0100, 1000, 1011
  417.         The fact that there is not a unique solution isn't really important;
  418. only about 30% of the time will there be a unique solution.  This does not
  419. diminish the effectiveness of the CRC calculation because whichever of the
  420. four values the CRC is set to, any virus installing itself in the program will
  421. still change it.  The fact that we did not get a unique solution does mean,
  422. however, that it is possible to get the following situation:
  423.                                   X2 + X1      = 1
  424.                              X3 + X2      + X0 = 1
  425.                                   X2 + X1      = 1
  426.                              X3 + X2      + X0 = 0
  427. Here equations 2 and 4 contradict each other.  There are no values of X3 to X0
  428. that will satisfy these equations.  If the CRCSET program comes across this
  429. situation, it will simply try again with another polynomial.
  430.         For illustration, I have used only a 4-bit CRC; the CRCSET algorithm
  431. uses 32 bits.  The principle is the same; it just takes more time (and ink,
  432. paper, patience, caffeine, pizza, and chocolate chip cookies).
  433.                                  - Page 12 - 
  434.                                How to Use CRCSET
  435.         This is the easy part.
  436.         For C programmers, add the files VALIDCRC.C, VIRUSDAT.C, and
  437. BUFALLOC.C to the list of files required to build the program you are working
  438. on (in Turbo C, for example, add them to the project file).  Add a call to
  439. validatecrc("PROGNAME.EXE") somewhere in your program.  The function
  440. validatecrc() returns:
  441.         - CRC_VALID (0) if the CRC is valid,
  442.         - CRC_INVALID (1) if it is invalid,
  443.         - CRC_ISZERO (2) if the CRC polynomial has been reset to 0 (which will
  444.           always yield a CRC of 0),
  445.         - CRC_NOMEM (3) if not enough memory was available to load the
  446.           program's image, or
  447.         - CRC_FILEERR (4) if the program file was not found or some other
  448.           error occurred trying to open it.
  449. Return values and function prototypes are defined in the header file
  450. VIRUSCRC.H.
  451.         NOTE: For compatibility with earlier releases of CRCSET, the function
  452. isvalidcrc() has been defined as a macro in VIRUSCRC.H; isvalidcrc() returns 1
  453. if the CRC is valid and 0 if it is not.
  454.         For Turbo Pascal programmers, add the unit VirusCRC to your "uses"
  455. clause and call the function ValidateCRC('PROGNAME.EXE').  ValidateCRC
  456. returns:
  457.         - crcValid (0) if the CRC is valid,
  458.         - crcInvalid (1) if it is invalid,
  459.         - crcIsZero (2) if the CRC polynomial has been reset to 0 (which will
  460.           always yield a CRC of 0),
  461.         - crcNoMem (3) if not enough memory was available to load the
  462.           program's image, or
  463.         - crcFileErr (4) if the program file was not found or some other error
  464.           occurred trying to open it.
  465. Return values are defined in the interface part of the VirusCRC unit.
  466.         NOTE: For compatibility with earlier releases of CRCSET, the function
  467. IsValidCRC has been defined in the VirusCRC unit; IsValidCRC returns TRUE if
  468. the CRC is valid and FALSE if it is not.
  469.         Example programs TESTCRC.C and TESTCRC.PAS have been provided.  You
  470. may also find the files BUFALLOC.C and ALLOCBUF.PAS useful in other programs.
  471. Each contains a C or Pascal function that allocates a buffer of flexible size
  472. depending on the amount of memory available.  This function is used by the CRC
  473. validation routine to allocate a file buffer.  Its use should be clear from
  474. the internal documentation.
  475.         Once you have compiled your program, you have to calculate its CRC.
  476. The program CRCSET.EXE has been provided for this purpose.  The syntax is:
  477.     CRCSET [-<string>] file [file [file [...]]]
  478.     <string> is an 8-character (0-padded) string in which to store CRC data
  479.              (default is DEAN_CRC),
  480.                                  - Page 13 - 
  481.     [file]   is one or more files for which a CRC is to be calculated.
  482. The string for which CRCSET.EXE searches is stored in the variable _viruscrc
  483. in C and _VirusCRC in Turbo Pascal.  The default is DEAN_CRC but you may
  484. change it if there is a conflict (i.e. if there is more than one instance of
  485. DEAN_CRC in the program, CRCSET.EXE will not know which one holds the CRC and
  486. so will not set it).  CRCSET replaces the string with a randomly-generated
  487. polynomial and the CRC itself.
  488.         For example, to set the CRC for either of the test programs, the
  489. command is:
  490.                               CRCSET TESTCRC.EXE
  491. If you change the string in one of the test programs to something like
  492. "MyName", you would enter:
  493.                           CRCSET -MyName TESTCRC.EXE
  494. The case of the string on the command line must match exactly the case of the
  495. string in the program.  Also, any strings shorter than 8 characters must be
  496. padded with 0's (ASCII 0, not the character '0') in the program.
  497.         If you run TESTCRC before running CRCSET on it, TESTCRC will abort
  498. with a warning that it may have been infected.  After you set the CRC, run
  499. TESTCRC to assure yourself that its CRC is valid.
  500.         If you want to test the reliability of the CRC check, change a few
  501. bytes in TESTCRC.EXE (be careful, changing bytes in the code segment can hang
  502. the program, so try bytes in the data segment, towards the end).  Run TESTCRC
  503. again, and it should warn you that it may have been infected.
  504.         Despite its complexity, CRCSET.EXE takes only a few seconds to
  505. calculate the CRC of the target file.  I have made some optimizations to the
  506. algorithm that make the calculation time almost constant regardless of the
  507. size of the file.
  508.         Once a CRC has been determined for your program, it takes little time
  509. for the validation function to verify it every time the program is run.
  510.         CRCSET will display the name of the file that it is working on and
  511. one or more of the following messages:
  512.         CRC search string "<string>" found more than once.
  513.                 The search string specified occurs more than once in the file.
  514.         This is an error, since CRCSET has no way of knowing which occurrence
  515.         of the string it is supposed to replace with the polynomial and CRC.
  516.         Change the search string in _viruscrc (C version) or _VirusCRC (Turbo
  517.         Pascal version), recompile, and try again with the new string as an
  518.         argument to CRCSET (e.g. CRCSET -NewStrng PROG.EXE).
  519.                                  - Page 14 - 
  520.         CRC search string "<string>" not found.
  521.                 The search string specified does not occur in the file.  Make
  522.         sure that the string passed to CRCSET is correct and also that the
  523.         validation module is being linked (i.e. that there is a call to the
  524.         validatecrc() or ValidateCRC somewhere in your program).
  525.         Testing polynomial abcdef12 ... no solution.
  526.                 The matrix generated by CRCSET using the polynomial abcdef12
  527.         does not have a solution.  CRCSET will try again with another
  528.         polynomial.
  529.         Testing polynomial abcdef12 ... CRC is 34567890.
  530.         It is unique.
  531.                 The matrix generated by CRCSET using the polynomial abcdef12
  532.         has the unique solution 34567890, i.e. 34567890 is the CRC of your
  533.         program under the polynomial abcdef12.  A unique solution will occur
  534.         only about 30% of the time.
  535.         Testing polynomial abcdef12 ... CRC is 34567890.
  536.         It is not unique (2^N solutions).
  537.                 The matrix generated by CRCSET using the polynomial abcdef12
  538.         has the non-unique solution 34567890, i.e. 34567890 is the CRC of your
  539.         program under the polynomial abcdef12.  The number of free variables
  540.         (the number of bits in the CRC whose value is irrelevant to the
  541.         solution) is N; each bit has two possible values, so there are 2^N
  542.         possible solutions.  It is theoretically possible that all 32 bits
  543.         will be free variables, but this is extremely unlikely.  The fact that
  544.         there is not a unique solution does not diminish the effectiveness of
  545.         the CRC validation in any way.
  546.         Note: the validation function (both the C and Pascal versions) finds
  547. the name of the running program in _argv[0] or ParamStr(0) if the program is
  548. running under DOS versions 3 or greater and searches the DOS PATH for the
  549. program under DOS version 2.
  550.                                  - Page 15 - 
  551.                                  Vulnerability
  552.         The CRCSET algorithm, like every other anti-virus algorithm, is
  553. vulnerable to attack.  Hand-tweaking the code to bypass the virus protection
  554. is always possible.  Direct attack to determine the storage location of the
  555. polynomial and the CRC and to change it is also possible, but, on a program of
  556. any reasonable size (greater than 20k), this can take upwards of half an hour
  557. on a 386.  Any virus that ties up the computer for that long wins no points
  558. for discretion.  Any user that doesn't do anything about a system lockup
  559. lasting over 30 seconds probably has many other doors open for viruses anyway.
  560. :-)
  561.         There is no substitute for proper precautions: downloading from a
  562. reputable BBS, avoiding pirated software, scanning programs for viruses before
  563. using them, and so on.  This program was developed with the knowledge that
  564. most people don't take these precautions (based on a sample size of at least 1
  565. - me); rather than leave it up to the end user to protect against viruses,
  566. with this we programmers can take on some of the burden by protecting the
  567. programs we write against them.
  568.                                  - Page 16 -