From anonymous, 9 Years ago, written in Python.
Embed
  1. """
  2. The BSD License
  3.  
  4. Copyright (c) 2012, Adobe Systems Incorporated
  5. All rights reserved.
  6.  
  7. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
  8.  
  9. -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  10. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  11. -Neither the name of the Adobe Systems Incorporated nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
  12.  
  13. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Adobe Systems Incorporated OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  
  15. """
  16. # Adobe(R) Malware Classifier
  17. # Contributor: Karthik Raman, Adobe Systems Incorporated
  18. # Dependencies: Python pefile, Python argparse
  19. # Program to classify unknown Win32 binaries (EXEs or DLLs)  into
  20. # 0 = CLEAN
  21. # 1 = DIRTY
  22. # UNKNOWN
  23. """ Results on dataset of ~130000 dirty, ~ 16000 clean files:
  24.                 (False Positives, True Negatives, True Positives, rates
  25. J48     FP      TN      TP      FN      TP Rate                 FP Rate                 Accuracy
  26.       7683    37171   130302  3451    0.97419871      0.171289071     0.937662018
  27.  
  28. J48Graft FP      TN      TP      FN      TP Rate                FP Rate                 Accuracy
  29.       6780    38074   129087  4666    0.965114801     0.151157087     0.935915166
  30.  
  31.  
  32. PART    FP      TN      TP      FN      TP Rate                 FP Rate                 Accuracy
  33.       7074    36492   125060  9412    0.930007734     0.162374329     0.907401791
  34.  
  35.  
  36. Ridor   FP      TN      TP      FN      TP Rate                 FP Rate                 Accuracy
  37.       7390    37935   114194  20930   0.845105237     0.163044677     0.843058149
  38. """        
  39.  
  40. import pefile
  41. import argparse
  42. import sys
  43.  
  44. DEBUG = 0;
  45. isDirty = 0;
  46.  
  47. # Class to extract data values from PE file and hold them as member variables
  48. class PEFile:
  49.         def __init__(self,filename):
  50.                 self.pe =  pefile.PE(filename,fast_load=True)
  51.                 self.filename=filename
  52.                 self.DebugSize          = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[6].Size
  53.                 self.ImageVersion       = ((self.pe.OPTIONAL_HEADER.MajorImageVersion*100)+self.pe.OPTIONAL_HEADER.MinorImageVersion)*1000
  54.                 self.IatRVA                     = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[1].VirtualAddress
  55.                 self.ExportSize         = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[0].Size
  56.                 self.ResourceSize       = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[2].Size
  57.                 self.VirtualSize2       = self.pe.sections[1].Misc_VirtualSize
  58.                 self.NumberOfSections = self.pe.FILE_HEADER.NumberOfSections           
  59.         def DataDump(self):
  60.                 print('Starting dump of ' + self.filename)
  61.                 print('DebugSize:       ' + str(self.DebugSize )) # DebugSize
  62.                 print('ImageVersion:    ' + str(self.ImageVersion)) # ImageVersion
  63.                 print('IatRVA:          ' + str(self.IatRVA)) #IatRVA
  64.                 print('ExportSize:      ' + str(self.ExportSize)) # ExportSize
  65.                 print('ResourceSize:    ' + str(self.ResourceSize)) # ResourceSize
  66.                 print('VirtualSize2:    ' + str(self.VirtualSize2)) # VirtualSize2
  67.                 print('NumberOfSections:' + str(self.NumberOfSections)) # NumberOfSections
  68.                 print('Stop')
  69.  
  70. def printResult(classification):
  71.     if classification == 0:
  72.                 print '0'
  73.     else:
  74.                 print '1'
  75.                
  76. def runJ48():
  77.         isDirty = 0
  78.         if input.DebugSize <=0:
  79.                 if input.ExportSize <= 211:
  80.                         if input.ImageVersion <= 520:
  81.                                 if input.VirtualSize2 <= 130:
  82.                                         if input.VirtualSize2 <= 5:
  83.                                                 if input.ResourceSize <= 37520:
  84.                                                         isDirty = 1
  85.                                                 elif input.ResourceSize > 37520:
  86.                                                         if input.NumberOfSections <= 2:
  87.                                                                 if input.IatRVA <= 2048:
  88.                                                                         isDirty = 0
  89.                                                                 else:
  90.                                                                         isDirty = 1
  91.                                                         else:
  92.                                                                 isDirty = 1
  93.                                         else:
  94.                                                 if input.VirtualSize2 <= 12:
  95.                                                         if input.NumberOfSections <= 3:
  96.                                                                 isDirty = 0
  97.                                                         else:
  98.                                                                 isDirty = 1
  99.                                                 else:
  100.                                                         isDirty = 1
  101.                                 else:
  102.                                         isDirty = 1
  103.                         else:
  104.                                 if input.ResourceSize <= 0:
  105.                                         if input.ImageVersion <= 1000:
  106.                                                 if input.NumberOfSections <= 4:
  107.                                                         isDirty = 1
  108.                                                 else:
  109.                                                         if input.ExportSize <= 74:
  110.                                                                 if input.VirtualSize2 <= 1556:
  111.                                                                         isDirty = 1
  112.                                                                 else:
  113.                                                                         isDirty = 0
  114.                                                         else:
  115.                                                                 isDirty = 0
  116.                                         else:
  117.                                                 isDirty = 1
  118.                                 else:
  119.                                         if input.NumberOfSections <= 2:
  120.                                                 if input.ImageVersion <= 3420:
  121.                                                         isDirty = 1
  122.                                                 else:
  123.                                                         isDirty = 0
  124.                                         else:
  125.                                                 isDirty = 1
  126.                 else:
  127.                         if input.ImageVersion <= 0:
  128.                                 if input.ExportSize <= 23330:
  129.                                         if input.IatRVA <= 98304:
  130.                                                 if input.NumberOfSections <= 3:
  131.                                                         isDirty = 1
  132.                                                 else:
  133.                                                         if input.IatRVA <= 53872:
  134.                                                                 isDirty = 0
  135.                                                         else:
  136.                                                                 if input.ExportSize <= 273:
  137.                                                                         isDirty = 1
  138.                                                                 else:
  139.                                                                         if input.ResourceSize <= 1016:
  140.                                                                                 isDirty = 1
  141.                                                                         else:
  142.                                                                                 isDirty = 0
  143.                                         else:
  144.                                                 isDirty = 0
  145.                                 else:
  146.                                         isDirty = 1
  147.                         else:
  148.                                 isDirty = 0
  149.         else:
  150.                 if input.ResourceSize <= 545:
  151.                         if input.ExportSize <= 92:
  152.                                 if input.NumberOfSections <= 4:
  153.                                         isDirty = 0
  154.                                 else:
  155.                                         isDirty = 1
  156.                 else:
  157.                         if input.IatRVA <= 94208:
  158.                                 if input.NumberOfSections <= 5:
  159.                                         if input.ExportSize <= 0:
  160.                                                 if input.NumberOfSections <= 4:
  161.                                                         if input.IatRVA <= 13504:
  162.                                                                 if input.ImageVersion <= 353:
  163.                                                                         if input.NumberOfSections <= 3:
  164.                                                                                 if input.IatRVA <= 6144:
  165.                                                                                         if input.IatRVA <= 2048:
  166.                                                                                                 isDirty = 0
  167.                                                                                         else:
  168.                                                                                                 if input.VirtualSize2 <= 496:
  169.                                                                                                         isDirty = 1
  170.                                                                                                 else:
  171.                                                                                                         isDirty = 0
  172.                                                                                 else:
  173.                                                                                         isDirty = 0
  174.                                                                         else:
  175.                                                                                 if input.DebugSize <= 41:
  176.                                                                                         if input.ResourceSize <= 22720:
  177.                                                                                                 isDirty = 1
  178.                                                                                         else:
  179.                                                                                                 isDirty = 0
  180.                                                                                 else:
  181.                                                                                         isDirty = 0
  182.                                                                 else:
  183.                                                                         isDirty = 0
  184.                                                         else:
  185.                                                                 if input.ResourceSize <= 35328:
  186.                                                                         isDirty = 0
  187.                                                                 else:
  188.                                                                         isDirty = 1
  189.                                                 else:
  190.                                                         if input.IatRVA <= 2048:
  191.                                                                 isDirty = 1
  192.                                                         else:
  193.                                                                 isDirty = 0
  194.                                         else:
  195.                                                 isDirty = 0
  196.                                 else:
  197.                                         if input.IatRVA <= 1054:
  198.                                                 if input.ExportSize <= 218:
  199.                                                         if input.IatRVA <= 704:
  200.                                                                 isDirty = 1
  201.                                                         else:
  202.                                                                 if input.NumberOfSections <= 6:
  203.                                                                         isDirty = 1
  204.                                                                 else:
  205.                                                                         isDirty = 0
  206.                                                 else:
  207.                                                         isDirty = 0
  208.                                         else:
  209.                                                 isDirty = 0
  210.                         else:
  211.                                 if input.ExportSize <= 0:
  212.                                         if input.VirtualSize2 <= 78800:
  213.                                                 if input.NumberOfSections <= 4:
  214.                                                         isDirty = 0
  215.                                                 else:
  216.                                                         if input.ImageVersion <= 2340:
  217.                                                                 if input.ResourceSize <= 7328:
  218.                                                                         isDirty = 1
  219.                                                                 else:
  220.                                                                         isDirty = 0
  221.                                                         else:
  222.                                                                 isDirty = 0
  223.                                         else:
  224.                                                 isDirty = 1
  225.                                 else:
  226.                                         if input.IatRVA <= 106496:
  227.                                                 if input.ResourceSize <= 2800:
  228.                                                         isDirty = 0
  229.                                                 else:
  230.                                                         isDirty = 1
  231.                                         else:
  232.                                                 isDirty = 0
  233.         return isDirty
  234. # Might need to add a isDirty = 0 statement if tree results in unclassified result                                     
  235.  
  236. def runJ48Graft():
  237.         isDirty = 0
  238.         if input.DebugSize <=0:
  239.                 if input.ExportSize <= 211:
  240.                         if input.ImageVersion <= 520:
  241.                                 if input.VirtualSize2 <= 130:
  242.                                         if input.VirtualSize2 <= 5:
  243.                                                 if input.ResourceSize <= 37520:
  244.                                                         isDirty = 1
  245.                                                 elif input.ResourceSize > 37520:
  246.                                                         if input.NumberOfSections <= 2:
  247.                                                                 if input.IatRVA <= 2048:
  248.                                                                         if input.ExportSize <= 67.5:
  249.                                                                                 isDirty = 0
  250.                                                                         else:                                                          
  251.                                                                                 isDirty = 1
  252.                                                                 else:
  253.                                                                         isDirty = 1
  254.                                                         else:
  255.                                                                 isDirty = 1
  256.                                         else:
  257.                                                 if input.VirtualSize <= 12:
  258.                                                         if input.NumberOfSections <= 3:
  259.                                                                 isDirty = 0
  260.                                                         else:
  261.                                                                 isDirty = 1
  262.                                                 else:
  263.                                                         isDirty = 1
  264.                                 else:
  265.                                         isDirty = 1
  266.                         else:
  267.                                 if input.ResourceSize <= 0:
  268.                                         if input.ImageVersion <= 1000:
  269.                                                 if input.NumberOfSections <= 4:
  270.                                                         isDirty = 1
  271.                                                 else:
  272.                                                         if input.ExportSize <= 74:
  273.                                                                 if input.VirtualSize2 <= 1556:
  274.                                                                         isDirty = 1
  275.                                                                 else:
  276.                                                                         if input.IatRVA <= 5440:
  277.                                                                                 if input.VirtualSize2 <= 126474:
  278.                                                                                         if input.ExportSize <= 24:
  279.                                                                                                 isDirty = 0
  280.                                                                                         else:
  281.                                                                                                 isDirty = 1
  282.                                                                                 else:
  283.                                                                                         isDirty = 1
  284.                                                                         else:
  285.                                                                                 isDirty = 1
  286.                                                         else:
  287.                                                                 isDirty = 0
  288.                                         else:
  289.                                                 isDirty = 1
  290.                                 else:
  291.                                         if input.NumberOfSections <= 2:
  292.                                                 if input.ImageVersion <= 3420:
  293.                                                         isDirty = 1
  294.                                                 else:
  295.                                                         isDirty = 0
  296.                                         else:
  297.                                                 isDirty = 1
  298.                 else:
  299.                         if input.ImageVersion <= 0:
  300.                                 if input.ExportSize <= 23330:
  301.                                         if input.IatRVA <= 98304:
  302.                                                 if input.NumberOfSections <= 3:
  303.                                                         isDirty = 1
  304.                                                 else:
  305.                                                         if input.IatRVA <= 53872:
  306.                                                                 if input.VirtualSize2 <= 17.5:
  307.                                                                         isDirty = 1
  308.                                                                 else:
  309.                                                                         if input.NumberOfSections <= 10.5:
  310.                                                                                 if input.ResourceSize <= 3103192:
  311.                                                                                         if input.ExportSize <= 10858.5:
  312.                                                                                                 if input.VirtualSize2 <= 116016.5:
  313.                                                                                                         isDirty = 0
  314.                                                                                                 else:
  315.                                                                                                         isDirty = 1
  316.                                                                                         else:
  317.                                                                                                 isDirty = 0
  318.                                                                                 else:
  319.                                                                                         isDirty = 1
  320.                                                                         else:
  321.                                                                                 isDirty = 1
  322.                                                         else:
  323.                                                                 if input.ExportSize <= 273:
  324.                                                                         isDirty = 1
  325.                                                                 else:
  326.                                                                         if input.ResourceSize <= 1016:
  327.                                                                                 isDirty = 1
  328.                                                                         else:
  329.                                                                                 isDirty = 0
  330.                                         else:
  331.                                                 isDirty = 0
  332.                                 else:
  333.                                         isDirty = 1
  334.                         else:
  335.                                 if input.ExportSize <= 1006718985:
  336.                                         isDirty = 0
  337.                                 else:
  338.                                         isDirty = 1
  339.         else:
  340.                 if input.ResourceSize <= 545:
  341.                         if input.ExportSize <= 92:
  342.                                 if input.NumberOfSections <= 4:
  343.                                         isDirty = 0
  344.                                 else:
  345.                                         if input.ImageVersion <= 6005:
  346.                                                 if input.ExportSize <= 6714:
  347.                                                         isDirty = 1
  348.                                                 else:
  349.                                                         isDirty = 0
  350.                                         else:
  351.                                                 isDirty = 0                                                    
  352.                 else:
  353.                         if input.IatRVA <= 94208:
  354.                                 if input.NumberOfSections <= 5:
  355.                                         if input.ExportSize <= 0:
  356.                                                 if input.NumberOfSections <= 4:
  357.                                                         if input.IatRVA <= 13504:
  358.                                                                 if input.ImageVersion <= 353:
  359.                                                                         if input.NumberOfSections <= 3:
  360.                                                                                 if input.IatRVA <= 6144:
  361.                                                                                         if input.IatRVA <= 2048:
  362.                                                                                                 if input.ResourceSize <= 934:
  363.                                                                                                         isDirty = 1
  364.                                                                                                 else:
  365.                                                                                                         if input.VirtualSize2 <= 2728:
  366.                                                                                                                 isDirty = 0
  367.                                                                                                         else:
  368.                                                                                                                 isDirty = 1
  369.                                                                                         else:
  370.                                                                                                 if input.VirtualSize2 <= 496:
  371.                                                                                                         isDirty = 1
  372.                                                                                                 else:
  373.                                                                                                         isDirty = 0
  374.                                                                                 else:
  375.                                                                                         isDirty = 0
  376.                                                                         else:
  377.                                                                                 if input.DebugSize <= 41: # debug here
  378.                                                                                         if input.ResourceSize <= 22720:
  379.                                                                                                 if input.IatRVA <= 2048:
  380.                                                                                                         isDirty = 1
  381.                                                                                                 else:
  382.                                                                                                         if input.VirtualSize2 <= 46:
  383.                                                                                                                 isDirty = 0
  384.                                                                                                         else:
  385.                                                                                                                 isDirty = 1
  386.                                                                                         else:
  387.                                                                                                         if input.VirtualSize2 <= 43030:
  388.                                                                                                                 if input.ResourceSize <= 3898348:
  389.                                                                                                                         if input.IatRVA <= 2048:
  390.                                                                                                                                 isDirty = 1
  391.                                                                                                                         else:
  392.                                                                                                                                 isDirty = 0
  393.                                                                                                                 else:
  394.                                                                                                                         isDirty = 1
  395.                                                                                                         else:
  396.                                                                                                                 isDirty = 0
  397.                                                                                 else:
  398.                                                                                         isDirty = 0
  399.                                                                 else:
  400.                                                                         isDirty = 0
  401.                                                         else:
  402.                                                                 if input.ResourceSize <= 35328:
  403.                                                                         if input.ImageVersion <= 4005:
  404.                                                                                 if input.NumberOfSections <= 1.5:
  405.                                                                                         isDirty = 1
  406.                                                                                 else:
  407.                                                                                         isDirty = 0
  408.                                                                         else:
  409.                                                                                 isDirty = 0
  410.                                                                 else:
  411.                                                                         if input.ImageVersion <= 5510:
  412.                                                                                 if input.DebugSize <= 42:
  413.                                                                                         if input.VirtualSize2 <= 144328:
  414.                                                                                                 if input.NumberOfSections <= 3.5:
  415.                                                                                                         isDirty = 0
  416.                                                                                                 else:
  417.                                                                                                         isDirty = 1
  418.                                                                                         else:
  419.                                                                                                 isDirty = 0
  420.                                                                                 else:
  421.                                                                                         isDirty = 0
  422.                                                                         else:
  423.                                                                                 isDirty = 0                                                                            
  424.                                                 else:
  425.                                                         if input.IatRVA <= 2048:
  426.                                                                 isDirty = 1
  427.                                                         else:
  428.                                                                 isDirty = 0
  429.                                         else:
  430.                                                 isDirty = 0
  431.                                 else:
  432.                                         if input.IatRVA <= 1054:
  433.                                                 if input.ExportSize <= 218:
  434.                                                         if input.IatRVA <= 704:
  435.                                                                 isDirty = 1
  436.                                                         else:
  437.                                                                 if input.NumberOfSections <= 6:
  438.                                                                         isDirty = 1
  439.                                                                 else:
  440.                                                                         isDirty = 0
  441.                                                 else:
  442.                                                         if input.ExportSize <= 1006699445:
  443.                                                                 if input.ImageVersion <= 5510:
  444.                                                                         if input.ImageVersion <= 500:
  445.                                                                                 isDirty = 1
  446.                                                                         else:
  447.                                                                                 isDirty = 0
  448.                                                                 else:
  449.                                                                         isDirty = 0
  450.                                                         else:
  451.                                                                 isDirty = 1
  452.                                         else:
  453.                                                 isDirty = 0
  454.                         else:
  455.                                 if input.ExportSize <= 0:
  456.                                         if input.VirtualSize2 <= 78800:
  457.                                                 if input.NumberOfSections <= 4:
  458.                                                         isDirty = 0
  459.                                                 else:
  460.                                                         if input.ImageVersion <= 2340:
  461.                                                                 if input.ResourceSize <= 7328:
  462.                                                                         isDirty = 1
  463.                                                                 else:
  464.                                                                         if input.VirtualSize2 <= 8288.5:
  465.                                                                                 isDirty = 1
  466.                                                                         else:
  467.                                                                                 if input.NumberOfSections <= 6.5:
  468.                                                                                         isDirty = 0
  469.                                                                                 else:
  470.                                                                                         isDirty = 1
  471.                                                         else:
  472.                                                                 isDirty = 0
  473.                                         else:
  474.                                                 if input.ImageVersion <= 5515:
  475.                                                         isDirty = 1
  476.                                                 else:
  477.                                                         isDirty = 0
  478.                                 else:
  479.                                         if input.IatRVA <= 106496:
  480.                                                 if input.ResourceSize <= 2800:
  481.                                                         isDirty = 0
  482.                                                 else:
  483.                                                         if input.ImageVersion <= 500:
  484.                                                                 if input.ResourceSize <= 5360:
  485.                                                                         if input.NumberOfSections <= 4.5:
  486.                                                                                 isDirty = 0
  487.                                                                         else:
  488.                                                                                 if input.VirtualSize2 <= 22564.5:
  489.                                                                                         if input.ExportSize <= 191.5:
  490.                                                                                                 if input.DebugSize <= 42:
  491.                                                                                                         if input.ExportSize <= 162.5:
  492.                                                                                                                 isDirty = 0
  493.                                                                                                         else:
  494.                                                                                                                 if input.VirtualSize2 <= 10682:
  495.                                                                                                                         isDirty = 0
  496.                                                                                                                 else:
  497.                                                                                                                         if input.ResourceSize <= 3412:
  498.                                                                                                                                 isDirty = 0
  499.                                                                                                                         else:
  500.                                                                                                                                 isDirty = 1
  501.                                                                                                 else:
  502.                                                                                                         isDirty = 0
  503.                                                                                         else:
  504.                                                                                                 isDirty = 0
  505.                                                                                 else:
  506.                                                                                         isDirty = 0
  507.                                                                 else:
  508.                                                                         isDirty = 0
  509.                                                         else:
  510.                                                                 isDirty = 0
  511.                                         else:
  512.                                                 isDirty = 0
  513.         return isDirty
  514. # Might need to add a isDirty = 0 statement if tree results in unclassified result                                     
  515.  
  516. def runPART():
  517.         isDirty = 0
  518.         if input.DebugSize > 0  and input.ResourceSize > 545 and input.IatRVA <= 94208 and input.NumberOfSections <= 5 and input.ExportSize > 0 and input.NumberOfSections > 3:
  519.                 isDirty = 0
  520.         elif input.DebugSize <=0 and input.ImageVersion <= 4900 and input.ExportSize <= 71 and input.ImageVersion <= 520 and input.VirtualSize2 > 130 and input.IatRVA <= 24576:
  521.                 isDirty = 1
  522.         elif input.DebugSize <=0 and input.ImageVersion <= 4900 and input.ExportSize <= 211 and input.ResourceSize <= 32272 and input.NumberOfSections <= 10 and input.VirtualSize2 <= 5 and input.ImageVersion <= 3420:
  523.                 isDirty = 1
  524.         elif input.DebugSize > 0 and input.ResourceSize > 598 and input.VirtualSize2 <= 105028 and input.VirtualSize2 > 1 and input.ImageVersion > 5000:
  525.                 isDirty = 0
  526.         elif input.IatRVA <= 0 and input.ImageVersion > 4180 and input.ResourceSize > 2484:
  527.                 isDirty = 0
  528.         elif input.DebugSize <= 0 and input.NumberOfSections <= 1 and input.ResourceSize > 501:
  529.                 isDirty = 0
  530.         elif input.DebugSize <= 0 and input.ExportSize <= 211 and input.NumberOfSections > 2 and input.ImageVersion > 1000 and input.ResourceSize <= 12996:
  531.                 isDirty = 1
  532.         elif input.DebugSize <= 0 and input.ExportSize <= 211 and input.NumberOfSections > 2 and input.ResourceSize > 0 and input.VirtualSize2 > 1016:
  533.                 isDirty = 1
  534.         elif input.NumberOfSections > 8 and input.VirtualSize2 <= 2221:
  535.                 isDirty = 1
  536.         elif input.ResourceSize <= 736 and input.NumberOfSections <= 3:
  537.                 isDirty = 1
  538.         elif input.NumberOfSections <= 3 and input.IatRVA > 4156:
  539.                 isDirty = 0
  540.         elif input.ImageVersion <= 6000 and input.ResourceSize <= 523 and input.IatRVA > 0 and input.ExportSize <= 95:
  541.                 isDirty = 1
  542.         elif input.ExportSize <= 256176 and input.DebugSize > 0 and input.ImageVersion <= 5450 and input.IatRVA > 1664 and input.ResourceSize <= 2040 and input.DebugSize <= 41:
  543.                 isDirty = 0
  544.         elif input.ExportSize <= 256176 and input.ImageVersion > 5450:
  545.                 isDirty = 0
  546.         elif input.ExportSize > 256176:
  547.                 isDirty = 1
  548.         elif input.ImageVersion > 0 and input.ResourceSize > 298216 and input.IatRVA <= 2048:
  549.                 isDirty = 1
  550.         elif input.ImageVersion > 0 and input.ExportSize > 74 and input.DebugSize > 0:
  551.                 isDirty = 0
  552.         elif input.ImageVersion > 0 and input.VirtualSize2 > 4185 and input.ResourceSize <= 215376 and input.IatRVA <= 2048 and input.NumberOfSections <= 5:
  553.                 isDirty = 0
  554.         elif input.ImageVersion > 1010 and input.DebugSize <= 56 and input.VirtualSize2 <= 215376:
  555.                 isDirty = 0
  556.         elif input.ExportSize > 258 and input.NumberOfSection > 3 and input.DebugSize > 0:
  557.                 isDirty = 0
  558.         elif input.ExportSize > 262 and input.ImageVersion > 0 and input.NumberOfSections > 7:
  559.                 isDirty = 0
  560.         elif input.DebugSize > 41 and input.NumberOfSections <= 4:
  561.                 isDirty = 0
  562.         elif input.ExportSize <= 262 and input.NumberOfSections > 3 and input.VirtualSize2 <= 37:
  563.                 isDirty = 1
  564.         elif input.VirtualSize2 > 40 and input.ExportSize <= 262 and input.DebugSize <= 0 and input.ImageVersion <= 353 and input.ExportSize <= 142:
  565.                 isDirty = 1
  566.         elif input.VirtualSize2 > 72384 and input.VirtualSize2 <= 263848:
  567.                 isDirty = 1
  568.         elif input.IatRVA > 106496 and input.IatRVA <= 937984 and input.DebugSize > 0 and input.ResourceSize > 4358:
  569.                 isDirty = 0
  570.         elif input.VirtualSize2 <= 64 and input.IatRVA <= 2048 and input.DebugSize <= 0 and input.ImageVersion <= 353 and input.ExportSize <= 0 and input.VirtualSize2 <= 4 and input.NumberOfSections <= 2:
  571.                 isDirty = 0
  572.         elif input.DebugSize <= 0 and input.NumberOfSections <= 4 and input.IatRVA > 45548:
  573.                 isDirty = 1
  574.         elif input.DebugSize > 0 and input.DebugSize <= 56 and input.IatRVA <= 94208 and input.ResourceSize <= 4096:
  575.                 isDirty = 1
  576.         elif input.DebugSize <= 0 and input.IatRVA <= 98304 and input.NumberOfSections > 6 and input.ResourceSize <= 864 and input.ExportSize > 74 and input.ImageVersion > 353 and input.ExportSize <= 279:
  577.                 isDirty = 0
  578.         elif input.DebugSize <= 0 and input.IatRVA <= 98304 and input.NumberOfSections <= 2 and input.ResourceSize <= 1264128:
  579.                 isDirty = 1
  580.         elif input.VirtualSize2 <= 64 and input.IatRVA <= 2048 and input.DebugSize > 0:
  581.                 isDirty = 0
  582.         elif input.ExportSize <= 276 and input.NumberOfSections > 5 and input.ResourceSize <= 1076:
  583.                 isDirty = 0
  584.         elif input.DebugSize > 0 and input.IatRVA <= 94208 and input.ExportSize <= 82 and input.DebugSize <= 56 and input.NumberOfSections > 2 and input.ImageVersion <= 2340 and input.ResourceSize <= 118280 and input.VirtualSize2 > 5340:
  585.                 isDirty = 0
  586.         elif input.DebugSize > 0 and input.ImageVersion <= 2340 and input.DebugSize <= 56 and input.NumberOfSections > 3 and input.VirtualSize2 > 360 and input.NumberOfSections <= 5:
  587.                 isDirty = 1
  588.         elif input.IatRVA > 37380 and input.ImageVersion <= 0 and input.NumberOfSections <= 5 and input.VirtualSize2 > 15864:
  589.                 isDirty = 0
  590.         elif input.DebugSize <= 0 and input.VirtualSize2 <= 80 and input.IatRVA <= 4096 and input.ExportSize <= 0 and input.VirtualSize2 > 4 and input.VirtualSize2 <= 21:
  591.                 isDirty = 0
  592.         elif input.DebugSize <= 0:
  593.                 isDirty = 1
  594.         elif input.ExportSize <= 82 and input.DebugSize <= 56 and input.NumberOfSections <= 5 and input.NumberOfSections > 2 and input.IatRVA <= 6144 and input.ImageVersion > 2340:
  595.                 isDirty = 0
  596.         elif input.ImageVersion > 2340:
  597.                 isDirty = 1
  598.         elif input.ResourceSize > 5528:
  599.                 isDirty = 0
  600.         else:
  601.                 isDirty = 1
  602.         return isDirty
  603.  
  604.        
  605. def runRidor():
  606.         isDirty = 0
  607.         #Except (DebugSize <= 14) and (ImageVersion <= 760) and (VirtualSize2 > 992) and (ExportSize <= 80.5) => isDirty = 1  (1702.0/16.0) [855.0/5.0]
  608.         if input.DebugSize <= 14 and input.ImageVersion <= 760 and input.VirtualSize2 > 992 and input.ExportSize <= 80.5:
  609.                 isDirty = 1
  610. #Except (DebugSize <= 14) and (ImageVersion <= 4525) and (ExportSize <= 198.5) and (ResourceSize <= 37532) and (VirtualSize2 <= 6) and (ResourceSize <= 7348) and (ResourceSize > 1773) => isDirty = 1  (106.0/0.0) [48.0/0.0]
  611.         elif input.DebugSize <= 14 and input.ImageVersion <= 4525  and input.ExportSize <= 198.5 and input.ResourceSize <= 7348 and input.VirtualSize2 <=6 and input.ResourceSize > 1773:
  612.                 isDirty = 1
  613. #Except (DebugSize <= 14) and (ImageVersion <= 4950) and (ExportSize <= 192) and (IatRVA > 256) and (VirtualSize2 > 42) and (ExportSize <= 56) and (NumberOfSections > 3.5) => isDirty = 1  (193.0/0.0) [91.0/0.0]
  614.         elif input.DebugSize <= 14 and input.ImageVersion <= 4950 and input.ExportSize <= 56 and input.IatRVA > 256 and input.VirtualSize2 > 42 and input.NumberOfSections > 3.5:
  615.                 isDirty = 1
  616. #Except (DebugSize <= 14) and (ImageVersion <= 4950) and (VirtualSize2 <= 6) and (ResourceSize <= 37532) and (ResourceSize <= 17302) => isDirty = 1  (388.0/0.0) [216.0/7.0]
  617.         elif input.DebugSize <= 14 and input.ImageVersion <= 4950 and input.VirtualSize2 <= 6 and input.ResourceSize > 17302:
  618.                 isDirty = 1
  619. #Except (DebugSize <= 14) and (NumberOfSections > 2.5) and (ResourceSize > 1776) and (IatRVA <= 6144) and (ExportSize <= 219.5) and (VirtualSize2 > 2410) and (VirtualSize2 <= 61224) => isDirty = 1  (238.0/0.0) [116.0/0.0]
  620.         elif input.DebugSize <= 14 and input.NumberOfSections >= 2.5 and input.ResourceSize <= 1776 and input.IatRVA <= 6144 and input.ExportSize <= 219.5 and input.VirtualSize2 > 2410 and input.VirtualSize2 <= 61224:
  621.                 isDirty = 1
  622. #Except (DebugSize <= 14) and (NumberOfSections > 2.5) and (ExportSize <= 198) and (ResourceSize > 8) and (VirtualSize2 > 83) and (ResourceSize <= 976) => isDirty = 1  (151.0/2.0) [83.0/2.0]
  623.         elif input.DebugSize <= 14 and input.NumberOfSections >= 2.5 and input.ExportSize  <= 198 and input.ResourceSize > 8 and input.VirtualSize2 > 83 and input.ResourceSize <= 976:
  624.                 isDirty = 1
  625. #Except (DebugSize <= 14) and (NumberOfSections > 2.5) and (ResourceSize > 1418) and (IatRVA <= 6144) and (VirtualSize2 <= 4) => isDirty = 1  (94.0/0.0) [44.0/0.0]
  626.         elif input.DebugSize <= 14 and input.NumberOfSections >= 2.5 and input.ResourceSize > 1418 and input.IatRVA > 6144 and input.VirtualSize2 <= 4:
  627.                 isDirty = 1
  628. #Except (DebugSize <= 14) and (VirtualSize2 > 14) and (NumberOfSections <= 4.5) and (ResourceSize > 8) and (VirtualSize2 <= 2398) and (ResourceSize > 1550) => isDirty = 1  (84.0/0.0) [41.0/1.0]
  629.         elif input.DebugSize <= 14 and input.VirtualSize2 > 14 and input.NumberOfSections > 4.5 and input.ResourceSize > 1550 and input.VirtualSize2 <= 2398:
  630.                 isDirty = 1
  631. #Except (DebugSize <= 14) and (VirtualSize2 > 14) and (NumberOfSections <= 4.5) and (ExportSize <= 138.5) and (ImageVersion > 1005) => isDirty = 1  (37.0/0.0) [17.0/0.0]
  632.         elif input.DebugSize <= 14 and input.VirtualSize2 > 14 and input.NumberOfSections > 4.5 and input.ExportSize > 138.5 and input.ImageVersion > 1005:
  633.                 isDirty = 1
  634. #Except (ImageVersion <= 5005) and (DebugSize <= 14) and (VirtualSize2 > 14) and (NumberOfSections <= 4.5) => isDirty = 1  (182.0/20.0) [88.0/6.0]
  635.         elif input.ImageVersion <= 5005 and input.DebugSize <= 14 and input.VirtualSize2 > 14 and input.NumberOfSections <= 4.5:
  636.                 isDirty = 1
  637. #Except (ImageVersion <= 5005) and (DebugSize <= 14) and (ImageVersion <= 5) and (NumberOfSections > 3.5) and (ExportSize <= 164.5) and (IatRVA <= 73728) and (ResourceSize <= 8722) => isDirty = 1  (47.0/0.0) [18.0/2.0]
  638.         elif input.ImageVersion <= 5005 and input.DebugSize <= 14 and input.ImageVersion <=5 and input.NumberOfSections > 3.5 and input.ExportSize <= 164.5 and input.IatRVA <= 73728 and input.ResourceSize <= 8722:
  639.                 isDirty = 1
  640. #Except (ImageVersion <= 5005) and (DebugSize <= 14) and (ResourceSize > 21108) and (ResourceSize <= 37272) and (ImageVersion <= 760) => isDirty = 1  (51.0/0.0) [30.0/3.0]
  641.         elif input.ImageVersion <= 5005 and input.DebugSize <= 14 and input.ResourceSize > 21108 and input.ResourceSize <= 37272 and input.ImageVersion <= 760:
  642.                 isDirty = 1
  643. #Except (NumberOfSections > 4.5) and (ExportSize <= 25.5) and (ImageVersion > 1505) and (ResourceSize <= 1020) => isDirty = 1  (51.0/0.0) [30.0/2.0]
  644.         elif input.NumberOfSections > 4.5 and input.ExportSize <= 25.5 and input.ImageVersion > 1505 and input.ResourceSize <= 1020:
  645.                 isDirty = 1
  646. # Except (ImageVersion <= 1500) and (NumberOfSections > 5.5) and (ExportSize <= 101) and (ResourceSize <= 3168) => isDirty = 1  (16.0/0.0) [8.0/1.0]
  647.         elif input.ImageVersion <= 1500 and input.NumberOfSections > 5.5 and input.ExportSize <= 101 and input.ResourceSize <= 3168:
  648.                 isDirty = 1
  649. #Except (ImageVersion <= 3025) and (DebugSize <= 14) and (ResourceSize > 1182) and (VirtualSize2 > 164) and (ExportSize <= 330.5) => isDirty = 1  (32.0/7.0) [20.0/4.0]
  650.         elif input.ImageVersion <= 3025 and input.DebugSize <= 14 and input.ResourceSize > 1182 and input.VirtualSize2 > 164 and input.ExportSize <= 330.5:
  651.                 isDirty = 1
  652. # Except (ImageVersion <= 1010) and (ResourceSize > 2352) and (VirtualSize2 > 39914) and (VirtualSize2 <= 153258) and (VirtualSize2 > 115254) => isDirty = 1  (19.0/0.0) [8.0/2.0]
  653.         elif input.ImageVersion <= 1010 and input.ResourceSize > 2352 and input.VirtualSize2 > 115254 and input.VirtualSize2 <= 153258:
  654.                 isDirty = 1
  655. #Except (ImageVersion <= 1500) and (NumberOfSections > 5.5) and (ImageVersion <= 500) and (ExportSize <= 164) and (IatRVA <= 2048) => isDirty = 1  (7.0/0.0) [3.0/0.0]
  656.         elif input.ImageVersion <= 1500 and input.NumberOfSections > 5.5 and input.ImageVersion <= 500 and input.ExportSize <= 164 and input.IatRVA <= 2048:
  657.                 isDirty = 1
  658. # Except (ImageVersion <= 1010) and (ResourceSize <= 474) and (IatRVA > 26624) and (VirtualSize2 > 1802) and (IatRVA <= 221348) => isDirty = 1  (15.0/0.0) [5.0/2.0]
  659.         elif input.ImageVersion <= 1010 and input.ResourceSize <= 474 and input.IatRVA > 26624 and input.VirtualSize2 > 1802 and input.IatRVA <= 221348:
  660.                 isDirty = 1
  661. # Except (ImageVersion <= 2500) and (DebugSize <= 14) and (ResourceSize > 4320) and (ResourceSize <= 389246) and (ResourceSize > 78678) and (NumberOfSections <= 4) and (ResourceSize <= 120928) => isDirty = 1  (7.0/0.0) [3.0/1.0]
  662.         elif input.ImageVersion <= 2500 and input.DebugSize <= 14 and input.ResourceSize > 78678 and input.ResourceSize <= 120928 and input.NumberOfSections <= 4:
  663.                 isDirty = 1
  664. # Except (ImageVersion <= 5005) and (ExportSize <= 25.5) and (NumberOfSections > 3.5) and (ResourceSize > 35814) and (VirtualSize2 > 215352) => isDirty = 1  (5.0/0.0) [1.0/0.0]
  665.         elif input.ImageVersion <= 5005 and input.ExportSize <= 25.5 and input.NumberOfSections > 3.5 and input.ResourceSize > 35814 and input.VirtualSize2 > 215352:
  666.                 isDirty = 1
  667. # Except (ImageVersion <= 4005) and (IatRVA <= 2560) and (NumberOfSections > 3.5) and (ImageVersion <= 500) and (ResourceSize > 648) and (ResourceSize <= 62291) => isDirty = 1  (9.0/0.0) [4.0/1.0]
  668.         elif input.ImageVersion <= 500 and input.IatRVA <= 2560 and input.NumberOfSections > 3.5 and input.ResourceSize > 648 and input.ResourceSize <= 62291:
  669.                 isDirty = 1
  670. # Except (ExportSize <= 25.5) and (NumberOfSections > 4.5) and (VirtualSize2 > 50765) and (ResourceSize <= 741012) and (ResourceSize > 2512) => isDirty = 1  (13.0/0.0) [6.0/0.0]
  671.         elif input.ExportSize <= 25.5 and input.NumberOfSections > 4.5 and input.VirtualSize2 > 50765 and input.ResourceSize <= 741012 and input.ResourceSize > 2512:
  672.                 isDirty = 1
  673. # Except (ImageVersion <= 1010) and (ExportSize <= 25.5) and (VirtualSize2 > 63) and (VirtualSize2 <= 3448) and (ResourceSize > 2032) and (VirtualSize2 > 1200) and (VirtualSize2 <= 3278) => isDirty = 1  (7.0/0.0) [4.0/2.0]
  674.         elif input.ImageVersion <= 1010 and input.ExportSize <= 25.5 and input.VirtualSize2 <= 3278 and input.VirtualSize2 > 1200 and input.ResourceSize > 2032:
  675.                 isDirty = 1
  676. #Except (ResourceSize <= 474) and (ExportSize <= 76) and (VirtualSize2 <= 1556) and (IatRVA <= 2368) => isDirty = 1  (13.0/0.0) [2.0/0.0]
  677.         elif input.ResourceSize <= 474 and input.ExportSize <= 76 and input.VirtualSize2 <= 1556 and input.IatRVA <= 2368:
  678.                 isDirty = 1
  679. # Except (ImageVersion <= 1500) and (VirtualSize2 <= 6) and (IatRVA > 2048) => isDirty = 1  (8.0/0.0) [4.0/1.0]
  680.         elif input.ImageVersion <= 1500 and input.VirtualSize2 <= 6 and input.IatRVA > 2048:
  681.                 isDirty = 1
  682.         else:
  683.                 isDirty = 0
  684.         return isDirty
  685.  
  686. # Each algo once; chain results together with equal weight
  687. # IO routine: supply input file in CMD line; output is MALWARE or CLEAN or UNKNOWN
  688. # opts: -i=input file; -n=algorithm number (0 for all)| -h = help
  689. # Possibilities for features in future versions:
  690. # v2: Display verbose - display the rules that were invoked while classifying this file as malware
  691. # v3: Allow rules to be updated (assisted learning occurs)
  692.  
  693. parser = argparse.ArgumentParser(description='Classify an unknown binary as MALWARE or CLEAN.')
  694. parser.add_argument('-f', metavar='filename', help='The name of the input file')
  695. parser.add_argument('-n', metavar='model', help='The ordinal for model classifier: 0=all (default) | 1=J48 | 2=J48Graft | 3=PART | 4=Ridor')
  696. parser.add_argument('-v', nargs='?', metavar='verbose', help='Dump the PE data being processed', const='verbose')
  697.  
  698. args = parser.parse_args()
  699.  
  700. if not args.f:
  701.         parser.print_help()
  702.         sys.exit(0)
  703.  
  704. input = PEFile(args.f)
  705.  
  706. # All variables accessible as values of the 'input' object
  707. if(args.v):
  708.         input.DataDump()
  709.  
  710. # Test input args
  711. if not args.n:
  712.         args.n = 0
  713. args.n = int(args.n)
  714. if args.n < 0 or args.n > 4:
  715.         parser.print_help()
  716.         sys.exit(0)
  717.        
  718. # Options 0: Run all models    
  719. if(args.n == 0):
  720.         if DEBUG:
  721.                 print 'Processing all...'
  722.         result1 = runJ48()
  723.         result2 = runJ48Graft()
  724.         result3 = runPART()
  725.         result4 = runRidor()
  726.         if ((result1 == result2) and (result2 == result3) and (result3 == result4)):
  727.                 printResult(result1)
  728.         else:
  729.                 print 'UNKNOWN'
  730.        
  731. # Options 1:  Run J48  
  732. if(args.n == 1):
  733.         if DEBUG:
  734.                 print 'Processing J48...'
  735.         printResult(runJ48())
  736.        
  737. # Options 2:  Run J48
  738. if(args.n == 2):
  739.         if DEBUG:
  740.                 print 'Processing J48Graft...'
  741.         printResult(runJ48Graft())     
  742.        
  743. # Option 3:  Run PART
  744. if(args.n == 3):
  745.         if DEBUG:
  746.                 print 'Processing PART...'
  747.         printResult(runPART())
  748.  
  749. # Option 4:  Run Ridor
  750. if(args.n == 4):
  751.         if DEBUG:
  752.                 print 'Processing Ridor...'
  753.         printResult(runRidor())
  754.