Guest User

Untitled

a guest
Feb 23rd, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.45 KB | None | 0 0
  1. ####################################################
  2. # [ 演習1 ] pefileを使ってファイルアクセスをしてみる
  3. # pefile : PEファイルにアクセスするためのmodule
  4. # `pip install pefile`
  5. # exeファイルはPEヘッダに値を複数持っている
  6. # DOS_HEADER/FILE_HEADER/OPTIONAL_HEADERを参照する
  7. ####################################################
  8. import pefile
  9.  
  10. PATH = 'data/PE-samples/TestApp.exe'
  11. pe = pefile.PE(PATH)
  12. print("{0}".format(pe.DOS_HEADER))
  13. print("{0}".format(pe.FILE_HEADER))
  14. print("{0}".format(pe.OPTIONAL_HEADER))
  15.  
  16. if pe.FILE_HEADER.Characteristics & 0x0002:
  17. print('IMAGE_FILE_EXECUTABLE_IMAGE')
  18. if pe.FILE_HEADER.Characteristics & 0x0100:
  19. print('IMAGE_FILE_32BIT_MACHINE')
  20.  
  21. ####################################################
  22. # [ 演習2 ] 正規なデータのPEヘッダの値を覗いてみる
  23. # pandas : データ操作をしやすくするもの(配列など)
  24. # data/PE-samples/以下に特徴抽出対象のファイルがある
  25. # PEヘッダの値を特徴量として抽出する
  26. ####################################################
  27. import glob
  28. import pandas as pd
  29.  
  30. df = pd.DataFrame(columns = ['malware', 'VirtualAddress', 'ResourceSize', 'DebugSize', 'IATSize'])
  31. PATH = 'data/PE-samples/*'
  32. files = glob.glob(PATH)
  33. for file in files:
  34. data = pefile.PE(file)
  35. VA = data.OPTIONAL_HEADER.DATA_DIRECTORY[1].VirtualAddress
  36. RS = data.OPTIONAL_HEADER.DATA_DIRECTORY[2].Size
  37. DS = data.OPTIONAL_HEADER.DATA_DIRECTORY[6].Size
  38. IATSize = data.OPTIONAL_HEADER.DATA_DIRECTORY[1].Size
  39. newdf = pd.DataFrame([[0, VA, RS, DS, IATSize]], columns = ['malware', 'VirtualAddress', 'ResoureSize', 'DebugSize', 'IATSize'])
  40. df = df.append(newdf, ignore_index = True)
  41. df
  42.  
  43. ####################################################
  44. # [ 演習3 ] データの可視化
  45. ## malware.csv : マルウェアから抽出したデータファイル
  46. ## benign.csv : 正規ファイルから抽出したデータファイル
  47. ## マルウェアから抽出した値を赤色で、
  48. ## 正規データから抽出した値を青色で表し二次元で描画する
  49. ####################################################
  50. import numpy as np
  51. import matplotlib.pyplot as plt
  52. from sklearn.decomposition import PCA
  53.  
  54. df = pd.read_csv('data/malware.csv')
  55. df2 = pd.read_csv('data/benign.csv')
  56.  
  57. X_reduced = PCA(n_components = 2).fit_transform(np.array(df)[:, 2:])
  58. Y_reduced = PCA(n_components = 2).fit_transform(np.array(df2)[:, 2:])
  59.  
  60. plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c = 'red')
  61. plt.scatter(Y_reduced[:, 0], Y_reduced[:, 1], c = 'blue')
  62. plt.show()
  63.  
  64. ####################################################
  65. # [ 演習4 ] 教師ありデータの作成
  66. ## 次元削減をして一次元で描画する
  67. ####################################################
  68. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
  69.  
  70. df = pd.read_csv('data/union.csv')
  71. X_reduced = LDA(n_components = 1).fit_transform(np.array(df)[:, 2:], np.array(df)[:, 1])
  72. plt.plot(X_reduced[:, 0], c = 'red')
  73. plt.hlines(y = 0.2, xmin = 0, xmax = 355, linestyles = 'dashed')
  74. plt.show()
  75.  
  76. ####################################################
  77. # [ 演習5 ] マルウェアかどうか予測する
  78. ####################################################
  79. from sklearn.neighbors import KNeighborsClassifier
  80.  
  81. df = pd.read_csv('data/union.csv')
  82. clf_k = KNeighborsClassifier(n_neighbors = 3)
  83. clf_k.fit(np.array(df)[:, 2:], np.array(df)[:, 1])
  84.  
  85. test_df = pd.read_csv('data/test2.csv')
  86. output = clf_k.predict(np.array(test_df)[:, 2:])
  87.  
  88. for i in output:
  89. if i == 0:
  90. print('not malware')
  91. elif i == 1:
  92. print('malware')
  93.  
  94. ####################################################
  95. # [ 演習6 ] 判定の精度を見てみる
  96. ## 56%なので割と精度が低い
  97. ####################################################
  98. from sklearn.metrics import accuracy_score
  99. print(accuracy_score(np.array(test_df)[:, 1], output)) # => 0.56
  100.  
  101. ####################################################
  102. # [ 演習7 ] 精度を上げるために抽出量のチューニングをする
  103. ## K近傍法で判定する
  104. ## Kの個数でチューニングを行う
  105. ## K=13で精度が 56% => 76% に向上していることがわかる
  106. ####################################################
  107. for i in range(1, 20):
  108. clf_k = KNeighborsClassifier(n_neighbors = i)
  109. clf_k.fit(np.array(df)[:, 2:], np.array(df)[:, 1])
  110. output = clf_k.predict(np.array(test_df)[:, 2:])
  111. print("n_neighbors={0} {1}".format(i, accuracy_score(np.array(test_df)[:, 1], output)))
Add Comment
Please, Sign In to add comment