ロード・トゥ・ザ・ホワイトハッカー

ホワイトハッカーはじめました

ディープラーニングによるマルウェア検出(準備編)

ディープラーニングの使いどころ

相変わらず、以下の書籍を参考にさせて頂いております。

以前、PEファイルの情報をランダムフォレストで分類させることをやった。

chikuwamarux.hatenablog.com

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を使った分類を行っていた。

github.com

EMBERは、データセットのみならず、マルウェア検出のスクリプトなども提供されているようです。こちらの情報が詳しかった。

qiita.com

ここまではPEファイルの情報を扱っているが、ディープラーニングの得意な画像を使った判定がある。

マルウェアの画像化

マルウェアをそのまま利用するには、感染のリスクが伴う。PEファイルの情報以外に、マルウェアのバイナリ情報を画像に変換することが行われている。

chikuwamarux.hatenablog.com

実行ファイルの画像化は、Pythonでは以下のコードになる。

import os
import numpy as np
import imageio
import array

filename = 'calc.exe'
f = open(filename,'rb')
ln = os.path.getsize(filename)
width = 256
rem = ln%width
a = array.array("B")
a.fromfile(f,ln-rem)
f.close()
g = np.reshape(a,(len(a)//width,width))
g = np.uint8(g)
imageio.imwrite('calc.exe.png',g)

計算機アプリ(calc.exe)を画像に変換すると、以下のイメージができる。

 

こんな画像を、マルウェア別に提供してくれているデータセットが以下。

www.dropbox.com

25種類のマルウェアファミリ、9339件の画像データ。

 

Kaggleでは、画像化する前のバイナリのデータセットがコンペで使われていた。

www.kaggle.com

実行ファイルをバイナリファイルにする方法が理解できていない。

バイナリファイルを画像にするには、以下のサイトにコードが掲載されている。

towardsdatascience.com

 

そのままだと動かないので、少し修正させてもらいました。

import matplotlib.pyplot as plt
import numpy as np
from 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 hexadecimal
        assert(False)
    b=int*1
    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))
    im.save(root+'\\'+name+'.png'"PNG")
    return im

#Get the list of files
files=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:]:
            continue
        f=open(root+'/'+name)
        array=[]
        for line in f:
            xx=line.split()
            if len(xx)!=17:
                continue
            array.append([int(i,16if i!='??' else 0 for i in xx[1:] ])
        plt.imshow(convertAndSave(np.array(array),name))
        del array
        f.close()

マルウェア名のフォルダに、該当する画像ファイルを作成すれば、ディープラーニングによる、画像分類タスクでマルウェアを分類することができるようになる。

次回、実際にディープラーニングでのマルウェア検知を実装してみる。

 

*1:array.shape[0]*16)**(0.5