home *** CD-ROM | disk | FTP | other *** search
/ Dr. CD ROM (Annual Premium Edition) / premium.zip / premium / DOSUTIL1 / CATCHMTE.ZIP / MTE-INFO.TXT < prev   
Text File  |  1992-06-29  |  26KB  |  479 lines

  1.  
  2.                           Mutation Engine Report (2)
  3.  
  4.  
  5.             Copyright (c) 1992 by  VDS Advanced Research Group
  6.                            All Rights Reserved
  7.  
  8.                              P.O. Box 9393
  9.                           Baltimore, MD 21228
  10.                             (410) 247-7117
  11.  
  12.                               prepared by
  13.  
  14.                              Tarkan Yetiser
  15.  
  16.  
  17.       This report is provided to satisfy the curiosity of the
  18.       public. We were approached by some third parties to perform an
  19.       analysis on MtE. We would like to share the results of our
  20.       analysis with everyone. If you find an error or inaccuracy in
  21.       this report, please feel free to contact us. All constructive
  22.       criticism is welcome. We thank all those who took the time to
  23.       read and bring inaccurate or ambiguous parts of this report
  24.       to our attention.
  25.  
  26.  
  27.                                TABLE of CONTENTS
  28.  
  29.               I.   Mutation Engine and Viruses
  30.               II.  How to Catch Viruses and MtE-based Viruses
  31.               III. Mutation Types and Detection Algorithms
  32.                       A. Sample Decryptor Disassembly
  33.               IV.  Live Tests and Results
  34.                       A. Comments on Test Results
  35.               V.   A Simple Message
  36.  
  37. ------------------------------------------------------------------------
  38.  
  39.                   I. Mutation Engine and Viruses
  40.  
  41.       We have analyzed the so-called MtE (Mutation Engine by a "Dark
  42. Avenger" from Bulgaria), and sample viruses based on it; namely,
  43. Pogue and Dedicated. We have also conducted tests to examine what
  44. kind of a potential this miscreant has, and collected empirical
  45. data on how popular scanners deal with the MtE. We have also implemented a
  46. little program (CatchMtE) that can recognize MtE-based code using an
  47. algorithmic technique. The program in executable form is available free of
  48. charge as a service to the public. Due to possible misuse, the source code
  49. and a more detailed (at the opcode and bit-mask level) analysis with
  50. decryptor samples and algorithms necessary to detect MtE will be made
  51. available in a limited fashion. Under no circumstances, actual virus
  52. samples will be provided; except the missed samples can be sent to known
  53. anti-viral product developers who wish to enhance their programs.
  54.  
  55.       For those who are not familiar with the MtE, some preliminary
  56. information will be presented first:
  57.  
  58.       MtE is NOT a virus per se, but an object module that can be
  59. linked into a virus to give it polymorphic capabilities. MtE
  60. expects to be called as a routine that can encrypt a certain
  61. portion of code and can generate a suitable decryption routine. It
  62. uses a random number generator to vary each mutation so that it
  63. will not be possible to recognize the new variant by using simple
  64. scanning techniques. The random number generator is not part of the
  65. MtE object module. A sample pseudo-random number generator is
  66. included with the archive Dark Avenger distributes. A virus writer
  67. could also supply his own random number generator.
  68.       It's not trivial to take an existing virus and link it with MtE
  69. and turn it into a polymorphic virus. The concern is that having
  70. MtE available greatly reduces the effort needed to craft such a virus.
  71. It's more like an "off-the-shelf" component that other virus writers
  72. can use. Many of those virus writers would probably not be able to code
  73. a polymorphic virus from scratch. Analysis of many viruses indicate
  74. that their authors are not that skilled at all. It is this majority
  75. that could benefit from something like MtE.
  76.      Though all this may sound ordinary, MtE got so much attention
  77. not because it is just another encryptive virus but because it can
  78. provide even simple viruses with a feature that makes it difficult
  79. to scan for them. MtE is just like a library routine that you link
  80. into your virus and call when needed. It is a little over 2K in an
  81. object module named MTE.OBJ. A person who calls himself "Dark
  82. Avenger" claims to have developed MtE, and distributes it by
  83. uploading to BBSes in Bulgaria. The archive contains a fairly
  84. detailed documentation on how to use MtE, and even includes a
  85. demonstration virus, a non-resident COM infector known as "Dedicated".
  86. Shortly after MtE made its appearance, a modified copy of this virus
  87. called "Fear" is also seen. We are informed that a few other MtE-based
  88. viruses have been recently reported.
  89.      Why this person is engaged in such potentially harmful activity,
  90. or how he/she gets away with it is not something we know about. Curious
  91. individuals who would like to learn more about the history of virus
  92. production in Bulgaria and other social as well as technical issues
  93. are invited to read an excellent paper written by anti-virus researcher
  94. Mr. Vesselin Bontchev of Virus Testing Center, University of Hamburg.
  95. The paper is titled "Bulgarian Virus Factory", and it is available via
  96. anonymous FTP. It provides insight into some of the cultural aspects of
  97. the virus underground in Bulgaria. Mr. Bontchev's contribution to
  98. anti-virus research is much appreciated; otherwise, we probably would
  99. have never known what goes on inside the Bulgarian virus factories.
  100.  
  101.             II. How to Catch Viruses and MtE-based Viruses
  102.  
  103.       Scanning for many  known viruses is usually a trivial task.
  104. You disassemble a sample, extract a sequence of bytes that would
  105. exist in each infected executable object, put it into a pattern
  106. matching engine, and then look for that pattern in executable
  107. objects that that virus is known to target. This method proved to
  108. be quite useful in fighting many viruses seen in the wild. Assuming
  109. a carefully chosen scan string, you can find the virus easily
  110. without too many false positives. Not so for polymorphic viruses.
  111.       These viruses try to defeat common scanning methods. They keep
  112. their body encrypted to defy analysis, and encrypt the new copy
  113. inserted into an executable object using a different key so that it
  114. will "look" as if a different virus infection has occurred. However, 
  115. even these viruses require a plaintext code that will decrypt the rest
  116. of the virus. Scanners can use strings extracted from the plaintext
  117. portion of the virus to identify them. It is usually necessary to
  118. include wildcard bytes (don't-care bytes) to be able to deal with the
  119. varying parts of the decryption routine. Naturally, false alarms are
  120. more likely to occur. MtE-based viruses are more advanced than such 
  121. viruses seen before.
  122.       We would like to emphasize that the contents of each mutation
  123. and the corresponding decryption routine MtE generates is far too
  124. variable to extract a simple (or even wildcard) scan string. It is
  125. necessary to analyze the MtE itself as well as many sample mutations.
  126. After that, certain characteristics of the code MtE generates can be
  127. used as telltale signs to detect its presence. Avoiding false positives
  128. while maintaining 100% detection ratio is quite difficult.
  129.       Armed with an 80x86 instruction set guide (we used Turbo
  130. Assembler 3.0 Quick Reference Guide), and a good disassembler (we
  131. used Mr. Zandt's DIS86 available via anonymous FTP), and a few
  132. known viruses based on MtE (Pogue and Dedicated with payload
  133. removed), we analyzed the MtE code, and the mutations generated.
  134. Tests were conducted on a 40Mhz 386 with a 100 meg HD and MS-DOS
  135. 5.0, and a 4.77Mhz IBM/XT with a 30 meg HD and PC-DOS 3.3 installed.
  136. A simple program that generated decoys (small, fully functional programs)
  137. was used to create a large number of samples.
  138.       In the case of Pogue, the virus was allowed to remain resident and
  139. infect each decoy program as it is created. Since the Dedicated
  140. virus is not resident, it was necessary to create decoys first and
  141. then infect them by running the virus (infects in the current
  142. directory). After the tests, we archived the samples and stored
  143. them on floppy diskettes, and removed them from the hard drives of
  144. the test machines.
  145.       In the Intel 80x86 architecture, it is possible to express a
  146. computation in very dissimilar ways. This is possible because
  147. certain registers can be substituted in place of another one and
  148. still achieve the same result. For example, you can index an array
  149. by using SI, DI, BP or BX registers. Or you could XOR a certain
  150. value at a given memory location by loading that value in AX, BX,
  151. CX or DX first, and performing the XOR on that register, and then
  152. putting the result back into memory, etc. Even other possibilities
  153. exist. When stepping through elements in an array, you can
  154. increment the index register by ADDing to it, INCing it, or ADDing
  155. and then SUBtracting from it. It should be clear that such
  156. flexibility helps MtE significantly. Of course, variability is
  157. something string scanners do not handle too well, since there are
  158. many combinations to search for.
  159.       MtE goes even further than that. The size of the decryption
  160. routine is also variable, making it infeasible to assume certain
  161. things that would hold for many polymorphic viruses. It also sets
  162. up a lengthy sequence of redundant instructions before the decryptor
  163. enters the decryption loop.
  164.       For over 90% of the mutations, MtE generates a convoluted
  165. 16-bit XOR-type encryption; however, in many cases it uses indirect
  166. ways to apply the XOR mask to a memory value. For example, it
  167. computes the mask, and then gets the value to be decrypted into a
  168. register, applies the mask and puts the result back into that memory
  169. location. Besides, memory access is done using many different
  170. instructions such as MOV and XCHG. Sometimes, it uses a SUB and NEG
  171. instruction sequence instead of XOR. There are also many redundant
  172. instructions peppered freely throughout the decryptor.
  173.       In some cases (5.5%), MtE generates a decryptor with a null
  174. effect. The decryptor does not actually decrypt anything, and the
  175. virus code is in plaintext. The frequency of such cases seems to
  176. depend on the random number generator. It is funny to note that some
  177. popular scanners misidentify such extreme cases where the virus
  178. is not even encrypted. To handle these mutations, it is sufficient
  179. to extract a signature from the MtE itself. It is also possible to
  180. extract one from known MtE-based viruses and identify the virus
  181. directly. At any rate, a scan string from MtE itself should be used
  182. in case a future virus creates a plaintext variant.
  183.       We must also mention that even these plaintext mutations
  184. contained a fully working copy of MtE. They successfully propagated
  185. and generated encrypted mutations in future generations. MtE appears
  186. to generate correct code in all cases. The deviation between new
  187. generations started using plaintext parents and new generations started
  188. using encrypted parents was negligible.
  189.  
  190.                        III. Mutation Types and Detection Algorithms
  191.  
  192.       MtE generates 3 "types" of mutations. They are as follows:
  193.  
  194.       1.  Double-reference (detectable using Method-1) ( ~ 93.0% )
  195.       2.  Single-reference (detectable using Method-2) ( ~  1.5% )
  196.       3.  Plaintext or no-reference  ( ~  5.5% )
  197.  
  198.       By implementing two algorithms and one scan string for the
  199. plain mutations, it is possible to recognize MtE-based viruses
  200. while keeping false positives to an acceptable level. We have one
  201. such program that achieved 100% hit rate during our tests. Some
  202. others also claim 100% hit rate; and we have tested them as well.
  203.       Double-reference mutations contain two memory accesses. The
  204. first one usually (but not always) fetches a word to be decrypted.
  205. The second one updates the same memory location after the word is
  206. decrypted. We must mention that neither fetching nor updating is
  207. always by simple MOVs; in fact, XCHG as well as SUB and NEG
  208. instructions are used sometimes.
  209.      Single-reference mutations contain only one memory reference.
  210. The instruction that decrypts using one memory access is XOR. It
  211. simply applies an XOR-mask, computed in a very convoluted way, to
  212. a memory location. There are some irregularities in this type of
  213. mutations. Popular scanners we tested had difficulty in dealing with
  214. this type of samples.
  215.      Our CatchMtE implements extra checks to reduce false alarms while
  216. maintaining 100% hit rate on this type of mutations. Many self-modifying
  217. programs (especially the compressed ones) trigger a false alarm, since
  218. they may contain similar memory references while they are modifying
  219. themselves. However, there is one characteristic of MtE that easily
  220. gives it away and simplifies positive identification. Once you verify
  221. the presence of that characteristic, you can achieve 100% hit rate even
  222. if MtE is enhanced! We will not go into further detail here for security
  223. reasons.
  224.  
  225.       In the case of plaintext mutations, there are two subcategories:
  226.  
  227.           1. Null-effect decryptor with no memory reference
  228.           2. Null-effect decryptor with memory reference but with a 0-key
  229.  
  230.       The mutations in the first category contain nothing more than a
  231. series of MOVs, ROLs, ANDs and so on. Their overall effect is null since
  232. no reference to the code to be decrypted (in plaintext in this case) is
  233. present. The body of the virus as well as the MtE itself are both in
  234. plaintext and can be disassembled directly.
  235.       The mutations in the second category are a little more interesting
  236. in that the decryptor actually fetches from and stores words to memory. In
  237. binary arithmetic, if you XOR a value with 0, that value does not change;
  238. just like if you multiply a number by 1, you get the same number. Again,
  239. the overall effect of the decryptor is null since it uses a 0-key. The
  240. virus code as well as the MtE itself are both in plaintext.
  241.       A more detailed analysis of mutation types is not made public
  242. due to possible misuse of such information. We will only show here
  243. a sample decryptor and its commented disassembly.
  244.  
  245.                   A. Sample Decryptor Disassembly
  246.  
  247.     Following is a sample decryption routine MtE generated during a live
  248. Pogue test. The rest of the disassembly is omitted for security reasons.
  249. This sample was missed by SCAN 91, and F-PROT 2.04; though F-PROT 2.04a
  250. detects it. Following code is NOT a virus.
  251.  
  252. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  253. ; Virus      : Pogue mutation, encrypted, resident COM infector, 21h,1Ch
  254. ; Analyst    : -
  255. ; Date       : June 1992
  256. ; Type       : Single-reference
  257. ; File name  : PMUT1220.COM, in PDF
  258. ; File size  : 3608
  259. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  260.                 ***** START of DISASSEMBLY *****
  261. COM_PROG_ENTRY:
  262.  
  263. ; In determining the program entry point, it is necessary to use a
  264. ; "sliding-window" approach since the first instruction is not a JMP
  265. ; or CALL. Second byte is a JMP (e9) and the offset follows it.
  266.  
  267. 0000:0100      4d                  dec            bp
  268. 0000:0101      e9 fc 01            jmp            DECRYPTOR_ENTRY (0300)
  269.  
  270. ; junk deleted
  271.  
  272. ; In this mutation, BX register is used to step thru the code word at
  273. ; a time. Note the way XOR-mask is computed on the first iteration,
  274. ; DI will be 7DCCh the first time, and it will change as BX is incremented.
  275. ; We are looking at a piece of code that uses BASED-addressing.
  276. ; Since the XOR instruction at 0000:030c includes a constant offset 0f18h,
  277. ; we must add that value to the initial value of BX, which is set to f420h
  278. ; before the loop. Now if you add 0f18h and f420h, you will get 0338h! Why?
  279. ; Because BX is a 16-bit register, and it will wrap around after 64K with
  280. ; the carry flag set during the process. CF is not important here.
  281. ; In other words, the block that is being decrypted is at 0000:0338h.
  282. ; The constant 0dee is XORed with the current value of index, and another
  283. ; constant 7c02 is subtracted to obtain the final XOR-mask to be applied
  284. ; to the word at 0f18+BX.
  285.  
  286. DECRYPTOR_ENTRY:
  287.  
  288. 0000:0300      bb 20 f4            mov            bx,f420
  289.  
  290. DEC_LOOP_TOP:
  291.  
  292. 0000:0303      bf ee 0d            mov            di,0dee
  293. 0000:0306      33 fb               xor            di,bx
  294. 0000:0308      81 ef 02 7c         sub            di,7c02
  295. 0000:030c      31 bf 18 0f         xor            [0f18+bx],di
  296.  
  297. ; Following is an example of redundant instructions peppered throughout the
  298. ; decryptors. After these two instructions, BX will not change, and SI
  299. ; is not used anyway. In a non-virus program, you would not often see such a
  300. ; sequence.
  301.  
  302. 0000:0310      8b f3               mov            si,bx
  303. 0000:0312      8b de               mov            bx,si
  304.  
  305. ; Now BX will be incremented by 2 to step word at a time
  306. ; This is the simple case; in some mutations, the two INC instructions
  307. ; are not used at all.
  308.  
  309. 0000:0314      43                  inc            bx
  310. 0000:0315      43                  inc            bx
  311.  
  312. 0000:0316      75 eb               jnz            DEC_LOOP_TOP (0303)
  313.  
  314. ; Now how do we calculate the number of iterations? Not too difficult.
  315. ; Above you see an implicit terminating condition for the loop. Again,
  316. ; it uses the fact that BX is a 16-bit register, and when it hits 64K
  317. ; it will wrap around to 0, in which case the loop will be done.
  318. ; Since the initial BX is F420h, and we are stepping 2 bytes at a time,
  319. ; the number of iterations is: (64K - F420h + 1) / 2 = 1520 in decimal
  320. ; In other words, the size of the block being decrypted is 3040 bytes.
  321. ; Let's check to see if this makes sense numerically.
  322. ; The file size on this sample was 3608 bytes. Adjusting for 100h ORG,
  323. ; we can see that 0218h bytes are above the loop end.
  324. ;
  325. ; 3608 - 536 (0218h) = 3072 bytes from loop end to end of file
  326. ; 3608 - 568 (0238h) = 3040 bytes in encrypted block
  327. ;
  328. ; There is a discrepancy of 32 bytes? Not really, they are padding bytes
  329. ; as documented by Dark Avenger in MtE! 32 (MAX_ADD_LEN) bytes, as it says.
  330. ; This is only one of the ways it achieves variable length.
  331. ; Following are the padding bytes, which are all valid instructions!
  332.  
  333. 0000:0318      bd 22 b9            mov            bp,b922
  334. 0000:031b      b1 03               mov            cl,03
  335. 0000:031d      d3 c5               rol            bp,cl
  336. 0000:031f      8b fd               mov            di,bp
  337. 0000:0321      bd ae 4f            mov            bp,4fae
  338. 0000:0324      81 e5 25 e7         and            bp,e725
  339. 0000:0328      8b dd               mov            bx,bp
  340. 0000:032a      8b ee               mov            bp,si
  341. 0000:032c      81 f5 60 fb         xor            bp,fb60
  342. 0000:0330      8a cb               mov            cl,bl
  343. 0000:0332      d3 c5               rol            bp,cl
  344. 0000:0334      8b cf               mov            cx,di
  345. 0000:0336      d3 c5               rol            bp,cl
  346.  
  347. ; from this point on, the code is encrypted
  348. 0000:0338
  349.                 ***** END of DISASSEMBLY *****
  350. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  351.                   IV.   Live Tests and Results
  352.  
  353.       Test #1     Base Virus Name: Dedicated
  354.  
  355.                              SCAN 91     F-PROT 2.04       CatchMTE 1.0
  356.  
  357.       by Name (1)             67                69          60
  358.       as MtE  (2)             933               931         940
  359.       misidentified           -0                -0          N/A
  360.       missed                  -0                -0          -0
  361.       Hit Rate                100%              100%        100%
  362.  
  363. (1)  SCAN91 --> [Mut],  F-PROT 2.04 --> Dedicated, CatchMTE --> Dedicated
  364. (2)  SCAN91 --> [DAME], F-PROT 2.04 --> MtE,       CatchMTE --> MtE-based
  365.  
  366.       Test #2     Base Virus Name: Pogue
  367.  
  368.                              SCAN 91     F-PROT 2.04       CatchMTE 1.0
  369.  
  370.       by Name (1)             0               0                 56
  371.       as MtE  (2)             935           936                944
  372.       misidentified (3)       -65           -61                N/A
  373.       missed                  -0             -3                 -0
  374.       Hit Rate                93.5%          93.6%             100%
  375.  
  376. (1)  SCAN91 --> N/A,  F-PROT 2.04 --> N/A,    CatchMTE --> Pogue
  377. (2)  SCAN91 --> [DAME], F-PROT 2.04 --> MtE,  CatchMTE --> MtE-based
  378. (3)  SCAN91 --> [7S], F-PROT 2.04 --> Gotcha, CatchMTE --> N/A
  379.  
  380.       Test #3     Base Virus Name: Pogue
  381.  
  382.                              SCAN 91     F-PROT 2.04a       CatchMTE 1.0
  383.  
  384.       by Name (1)             0               0                141
  385.       as MtE  (2)            2399          2398               2259
  386.       misidentified (3)        ?              ?                N/A
  387.       missed                  -1             -2                 -0
  388.       Hit Rate              99.96%       99.92%               100%
  389.  
  390. (1)  SCAN91 --> N/A,  F-PROT 2.04 --> N/A,    CatchMTE --> Pogue
  391. (2)  SCAN91 --> [DAME], F-PROT 2.04 --> MtE,  CatchMTE --> MtE-based
  392. (3)  Not counted
  393.  
  394.                       A.    Comments on Test Results
  395.  
  396.       The amount of time it took each program to complete the tests
  397. are not published not to distract from the main purpose of these
  398. tests: to determine if they can achieve 100% hit rate.
  399.       It seems that both F-PROT 2.04 and SCAN 91 misidentify some
  400. Pogue mutations that are in plaintext. F-PROT "quickscan" missed
  401. ALL mutations. You are advised to use SECURE scan mode of this
  402. product. The extra speed comes with 0% hit rate on MtE-based viruses!
  403.       In test #2, F-PROT 2.04 missed three encrypted Pogue mutations.
  404. We examined these samples and found them to be of Single-reference type,
  405. and detectable using Method-2. The samples worked as expected. We can
  406. only speculate that F-PROT lacks Method-2 detection algorithm and uses
  407. a heuristic in such cases.
  408.       One of those three that were missed was called "suspicious" and
  409. guessed to be a variant of the Gotcha virus.  Surprisingly, Virx 2.3
  410. missed one of these same mutations. We did not include Virx 2.3 in our
  411. full test suite.
  412.       Further testing was done with F-PROT 2.04a. This new release
  413. caught all the ones that the previous one missed in test #2; but still
  414. some others, of single-reference type again, were missed in test #3.
  415. SCAN 91 also missed 1 mutation completely. This mutation was NOT one
  416. of the two that F-PROT 2.04a missed; they were identified as [DAME].
  417.       It should be noted that misidentification of 6% of Pogue
  418. mutations is a little alarming. All these misidentified mutations
  419. were found to be working and capable of generating new mutations.
  420. Some people may take an MtE-based infestation more seriously than an
  421. infection by "Seventh Son" virus. This leaves a chance for an unrecognized
  422. mutation to escape detection. We must remember that it takes only one
  423. virus to continue the infection unless other precautions such as
  424. integrity checking are in place.
  425.       Someone brought to our attention that TBSCAN 3.3 can use MtE AVR
  426. module in VIRSCAN.DAT (revision 920617) to detect MtE-based viruses. A
  427. copy was downloaded from an FTP-site, and it was tested against the
  428. sample set in test #3. It detected no viruses at all!
  429.       One of our researchers mentioned that this product is highly
  430. optimized, and that it may not be checking for MtE if the file size
  431. is less than a certain number of bytes. Samples in test #3 were of
  432. varying sizes: as small as 3500 bytes and never larger than 4000 bytes.
  433. When we tested this scanner with a few larger samples (11K), TBSCAN 3.3
  434. seemed to be able to detect MtE. We did not conduct comprehensive tests
  435. using TBSCAN.
  436.       This reminded us legendary algorist and computer scientist
  437. Dr. Donald Knuth's famous saying: "Premature optimization is the root
  438. of all programming evil". Improving the performance of one's scanner
  439. is always desirable, as long as one does not try to "cut corners" and
  440. sacrifice reliability. F-PROT quickscan also missed all MtE mutations,
  441. but at least F-PROT has a secure mode that catches most of them. TBSCAN
  442. did not have such a mode, in fact, it has an even faster mode that missed
  443. the samples faster!
  444.       It is not acceptable for a scanner not to find viruses that it
  445. has scan strings for (or algorithms in this case). The primary function
  446. of a virus scanner is to find viruses known to that scanner. If it performs
  447. this task in a speedy manner, that's nice indeed; and it may even give it
  448. a competitive edge. Failing to perform its primary function, on the other
  449. hand, defeats the purpose of such a tool.
  450.  
  451.                     V. A Simple Message
  452.  
  453.       It is dangerous to assume that scanning is adequate since
  454. there are some products that can detect MtE-based viruses 100% of
  455. the time. We identified at least two ways to make MtE less
  456. predictable. Of course, such information will not be disseminated.
  457. However, considering the availability of MtE to the hackers all
  458. around the world, and the "glory" Dark Avenger will enjoy due to
  459. media hype, it's only a matter of time such improvements will be
  460. discovered by irresponsible individuals. Besides, this may start a
  461. new trend among virus writers to create things like MtE. Keeping up
  462. with new virus signatures was hard enough (though manageable), but
  463. keeping up with many mutation engines is not going to be trivial.
  464. Unfortunately, locking up these "mutant engineers" is not a practical
  465. solution, and not even legally possible in many parts of the world.
  466.       The message is clear. The first line of defense against
  467. viruses is NOT using scanners. Although they proved to be very
  468. useful, you are highly encouraged to consider other approaches such
  469. as integrity checkers as a first line of defense. Even the less
  470. sophisticated integrity checkers have a better chance to catch
  471. mutating viruses, long before their developers get a chance to
  472. analyze the virus samples. The reason is that viruses have a tendency
  473. to modify existing code to propagate in most cases. Their spread
  474. can be controlled using a non-virus-specific solution that
  475. concentrates on the main characteristic of most viruses. Such an
  476. approach is not only more cost-effective but also more secure. If
  477. your company still relies on a virus scanner to protect its PC-based
  478. computing resources against viruses, you are walking on thin ice.
  479.