ディープラーニングによるマルウェア検出(準備編)
ディープラーニングの使いどころ
相変わらず、以下の書籍を参考にさせて頂いております。
以前、PEファイルの情報をランダムフォレストで分類させることをやった。
PEファイルをディープラーニングで分類させることも可能。
ディープラーニングの場合、スケーリング化する必要がある。
PEファイルに対しては、標準化を行っていた。標準化の場合は、StandardScalerを使い、平均0、標準偏差1のデータに変換する。
from sklearn.preprocessing import StandardScaler# 訓練用とテスト用の特徴量を標準化scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)
正規化は、MinMaxScalerを使って、0から1の間に値を変換する。
from sklearn.preprocessing import MinMaxScaler# 訓練用とテスト用の特徴量を正規化scaler =MinMaxScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)
書籍では、EMBERデータセットを用いて、Kerasを使った分類を行っていた。
EMBERは、データセットのみならず、マルウェア検出のスクリプトなども提供されているようです。こちらの情報が詳しかった。
ここまではPEファイルの情報を扱っているが、ディープラーニングの得意な画像を使った判定がある。
マルウェアの画像化
マルウェアをそのまま利用するには、感染のリスクが伴う。PEファイルの情報以外に、マルウェアのバイナリ情報を画像に変換することが行われている。
実行ファイルの画像化は、Pythonでは以下のコードになる。
import osimport numpy as npimport imageioimport array
filename = 'calc.exe'f = open(filename,'rb')ln = os.path.getsize(filename)width = 256rem = ln%widtha = array.array("B")a.fromfile(f,ln-rem)f.close()g = np.reshape(a,(len(a)//width,width))g = np.uint8(g)
計算機アプリ(calc.exe)を画像に変換すると、以下のイメージができる。
こんな画像を、マルウェア別に提供してくれているデータセットが以下。
25種類のマルウェアファミリ、9339件の画像データ。
Kaggleでは、画像化する前のバイナリのデータセットがコンペで使われていた。
実行ファイルをバイナリファイルにする方法が理解できていない。
バイナリファイルを画像にするには、以下のサイトにコードが掲載されている。
そのままだと動かないので、少し修正させてもらいました。
import matplotlib.pyplot as pltimport numpy as npfrom PIL import Image
## フォルダのパスroot = 'dataSample'
## This function allows us to process our hexadecimal files into png images##def convertAndSave(array,name):print('Processing '+name)if array.shape[1]!=16: #If not hexadecimalassert(False)b=2**(int(np.log(b)/np.log(2))+1)a=int(array.shape[0]*16/b)array=array[:a*b//16,:]array=np.reshape(array,(a,b))im = Image.fromarray(np.uint8(array))return im
#Get the list of filesfiles=os.listdir(root)print('files : ',files)#We will process files one by one.for counter, name in enumerate(files):#We only process .bytes files from our folder.if '.bytes' != name[-6:]:continuef=open(root+'/'+name)array=[]for line in f:xx=line.split()if len(xx)!=17:continuearray.append([int(i,16) if i!='??' else 0 for i in xx[1:] ])plt.imshow(convertAndSave(np.array(array),name))del arrayf.close()
マルウェア名のフォルダに、該当する画像ファイルを作成すれば、ディープラーニングによる、画像分類タスクでマルウェアを分類することができるようになる。
次回、実際にディープラーニングでのマルウェア検知を実装してみる。
*1:array.shape[0]*16)**(0.5