├── README.md ├── calls.zip ├── deep_learnin_lstm_malware_detection.ipynb ├── fig-1.png └── types.zip /README.md: -------------------------------------------------------------------------------- 1 | # Deep LSTM based Malware Analysis 2 | 3 | ## Deep learning based Sequential model for malware analysis using Windows exe API Calls 4 | 5 | Malware development has seen diversity in terms of architecture and features. This advancement in the competencies of malware poses a severe threat and opens new research dimensions in malware detection. This study is focused on metamorphic malware that is the most advanced member of the malware family. It is quite impossible for anti-virus applications using traditional signature-based methods to detect metamorphic malware, which makes it difficult to classify this type of malware accordingly. Recent research literature about malware detection and classification discusses this issue related to malware behavior. 6 | 7 | **Cite The DataSet** 8 | If you find this implementation useful please cite it: 9 | 10 | @article{10.7717/peerj-cs.285, 11 | title = {Deep learning based Sequential model for malware analysis using Windows exe API Calls}, 12 | author = {Catak, Ferhat Ozgur and Yazı, Ahmet Faruk and Elezaj, Ogerta and Ahmed, Javed}, 13 | year = 2020, 14 | month = jul, 15 | keywords = {Malware analysis, Sequential models, Network security, Long-short-term memory, Malware dataset}, 16 | volume = 6, 17 | pages = {e285}, 18 | journal = {PeerJ Computer Science}, 19 | issn = {2376-5992}, 20 | url = {https://doi.org/10.7717/peerj-cs.285}, 21 | doi = {10.7717/peerj-cs.285} 22 | } 23 | 24 | You can access the dataset from my [My GitHub Repository](https://github.com/ocatak/lstm_malware_detection). 25 | 26 | ## Introduction 27 | 28 | Malicious software, commonly known as malware, is any software intentionally designed to cause damage to computer systems and compromise user security. An application or code is considered malware if it secretly acts against the interests of the computer user and performs malicious activities. Malware targets various platforms such as servers, personal computers, mobile phones, and cameras to gain unauthorized access, steal personal data, and disrupt the normal function of the system. 29 | 30 | One approach to deal with malware protection problem is by identifying the malicious software and evaluating its behavior. Usually, this problem is solved through the analysis of malware behavior. This field closely follows the model of malicious software family, which also reflects the pattern of malicious behavior. There are very few studies that have demonstrated the methods of classification according to the malware families. 31 | 32 | All operating system API calls made to act by any software show the overall direction of this program. Whether this program is malware or not can be learned by examining these actions in-depth. If it is malware, then what is its malware family. The malware-made operating system API call is a data attribute, and the sequence in which those API calls are generated is also critical to detect the malware family. Performing specific API calls is a particular order that represents a behavior. One of the deep learning methods LSTM (long-short term memory) has been commonly used in the processing of such time-sequential data. 33 | 34 | ## System Architecture 35 | 36 | This research has two main objectives; first, we created a relevant dataset, and then, using this dataset, we did a comparative study using various machine learning to detect and classify malware automatically based on their types. 37 | 38 | ### Dataset Creation 39 | 40 | One of the most important contributions of this work is the new Windows PE Malware API sequence dataset, which contains malware analysis information. There are 7107 malware from different classes in this dataset. The Cuckoo Sandbox application, as explained above, is used to obtain the Windows API call sequences of malicious software, and VirusTotal Service is used to detect the classes of malware. 41 | 42 | The following figure illustrates the system architecture used to collect the data and to classify them using LSTM algorithms. 43 | ![Malware dataset](fig-1.png) 44 | 45 | Our system consists of three main parts, data collection, data pre-processing and analyses, and data classification. 46 | 47 | The following steps were followed when creating the dataset. 48 | 49 | Cuckoo Sandbox application is installed on a computer running Ubuntu Linux distribution. The analysis machine was run as a virtual server to run and analyze malware. The Windows operating system is installed on this server. 50 | -------------------------------------------------------------------------------- /calls.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ocatak/lstm_malware_detection/5110304a56a3abc7d4ec551b529b321cc666fccb/calls.zip -------------------------------------------------------------------------------- /deep_learnin_lstm_malware_detection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Deep LSTM based Malware Analysis" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## Deep learning based Sequential model for malware analysis using Windows exe API Calls" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Malware development has seen diversity in terms of architecture and features. This advancement in the competencies of malware poses a severe threat and opens new research dimensions in malware detection. This study is focused on metamorphic malware that is the most advanced member of the malware family. It is quite impossible for anti-virus applications using traditional signature-based methods to detect metamorphic malware, which makes it difficult to classify this type of malware accordingly. Recent research literature about malware detection and classification discusses this issue related to malware behavior." 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "**Cite The DataSet** \n", 29 | "If you find this implementation useful please cite it:\n", 30 | "\n", 31 | " @article{catak_lstm2020,\n", 32 | " author = {Ferhat Ozgur Catak}, \n", 33 | " title = {Deep learning based Sequential model for malware analysis using Windows exe API Calls},\n", 34 | " journal = {Peerj Computer Science},\n", 35 | " year = 2020,\n", 36 | " pages = {1-17},\n", 37 | " month = 7\n", 38 | " }\n", 39 | " \n", 40 | "You can access the dataset from my [My GitHub Repository](https://github.com/ocatak/lstm_malware_detection)." 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "## Introduction" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "Malicious software, commonly known as malware, is any software intentionally designed to cause damage to computer systems and compromise user security. An application or code is considered malware if it secretly acts against the interests of the computer user and performs malicious activities. Malware targets various platforms such as servers, personal computers, mobile phones, and cameras to gain unauthorized access, steal personal data, and disrupt the normal function of the system. \n", 55 | "\n", 56 | "One approach to deal with malware protection problem is by identifying the malicious software and evaluating its behavior. Usually, this problem is solved through the analysis of malware behavior. This field closely follows the model of malicious software family, which also reflects the pattern of malicious behavior. There are very few studies that have demonstrated the methods of classification according to the malware families.\n", 57 | "\n", 58 | "All operating system API calls made to act by any software show the overall direction of this program. Whether this program is malware or not can be learned by examining these actions in-depth. If it is malware, then what is its malware family. The malware-made operating system API call is a data attribute, and the sequence in which those API calls are generated is also critical to detect the malware family. Performing specific API calls is a particular order that represents a behavior. One of the deep learning methods LSTM (long-short term memory) has been commonly used in the processing of such time-sequential data." 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "## System Architecture" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "This research has two main objectives; first, we created a relevant dataset, and then, using this dataset, we did a comparative study using various machine learning to detect and classify malware automatically based on their types." 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "### Dataset Creation" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "One of the most important contributions of this work is the new Windows PE Malware API sequence dataset, which contains malware analysis information. There are 7107 malware from different classes in this dataset. The Cuckoo Sandbox application, as explained above, is used to obtain the Windows API call sequences of malicious software, and VirusTotal Service is used to detect the classes of malware.\n", 87 | "\n", 88 | "The following figure illustrates the system architecture used to collect the data and to classify them using LSTM algorithms.\n", 89 | "![Malware dataset](fig-1.png)\n", 90 | "\n", 91 | "Our system consists of three main parts, data collection, data pre-processing and analyses, and data classification.\n", 92 | "\n", 93 | "The following steps were followed when creating the dataset.\n", 94 | "\n", 95 | "Cuckoo Sandbox application is installed on a computer running Ubuntu Linux distribution. The analysis machine was run as a virtual server to run and analyze malware. The Windows operating system is installed on this server." 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "## Let’s coding\n", 103 | "We import the usual standard libraries to build an LSTM model to detect the malware." 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 1, 109 | "metadata": {}, 110 | "outputs": [], 111 | "source": [ 112 | "import pandas as pd\n", 113 | "import matplotlib.pyplot as plt\n", 114 | "import seaborn as sns\n", 115 | "from sklearn.preprocessing import LabelEncoder\n", 116 | "from sklearn.model_selection import train_test_split\n", 117 | "from sklearn.metrics import confusion_matrix\n", 118 | "from keras.preprocessing.text import Tokenizer\n", 119 | "from keras.layers import LSTM, Dense, Dropout, Embedding\n", 120 | "from keras.preprocessing import sequence\n", 121 | "from keras.utils import np_utils\n", 122 | "from keras.models import Sequential\n", 123 | "from keras.layers import SpatialDropout1D\n", 124 | "from mlxtend.plotting import plot_confusion_matrix" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "In this work, we will use standard our malware dataset to show the results. You can access the dataset from [My GitHub Repository](https://github.com/ocatak/lstm_malware_detection). We need to merge the call and the label datasets." 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 2, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [ 140 | "malware_calls_df = pd.read_csv(\"calls.zip\", compression=\"zip\",\n", 141 | " sep=\"\\t\", names=[\"API_Calls\"])\n", 142 | "\n", 143 | "malware_labels_df = pd.read_csv(\"types.zip\", compression=\"zip\",\n", 144 | " sep=\"\\t\", names=[\"API_Labels\"])\n", 145 | "\n", 146 | "malware_calls_df[\"API_Labels\"] = malware_labels_df.API_Labels\n", 147 | "malware_calls_df[\"API_Calls\"] = malware_calls_df.API_Calls.apply(lambda x: \" \".join(x.split(\",\")))\n", 148 | "\n", 149 | "malware_calls_df[\"API_Labels\"] = malware_calls_df.API_Labels.apply(lambda x: 1 if x == \"Virus\" else 0)" 150 | ] 151 | }, 152 | { 153 | "cell_type": "markdown", 154 | "metadata": {}, 155 | "source": [ 156 | "Let's analyze the class distribution" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 15, 162 | "metadata": {}, 163 | "outputs": [ 164 | { 165 | "data": { 166 | "image/png": "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\n", 167 | "text/plain": [ 168 | "
" 169 | ] 170 | }, 171 | "metadata": { 172 | "needs_background": "light" 173 | }, 174 | "output_type": "display_data" 175 | } 176 | ], 177 | "source": [ 178 | "sns.countplot(malware_calls_df.API_Labels)\n", 179 | "plt.xlabel('Labels')\n", 180 | "plt.title('Class distribution')\n", 181 | "plt.savefig(\"class_distribution.png\")\n", 182 | "plt.show()" 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": {}, 188 | "source": [ 189 | "![Class distribution](class_distribution.png)" 190 | ] 191 | }, 192 | { 193 | "cell_type": "markdown", 194 | "metadata": {}, 195 | "source": [ 196 | "Now we can create our sequence matrix. In order to build an LSTM model, you need to create a tokenization based sequence matrix as the input dataset" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 4, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "name": "stdout", 206 | "output_type": "stream", 207 | "text": [ 208 | "Found 278 unique tokens.\n", 209 | "Shape of data tensor: (7107, 100)\n" 210 | ] 211 | } 212 | ], 213 | "source": [ 214 | "max_words = 800\n", 215 | "max_len = 100\n", 216 | "\n", 217 | "X = malware_calls_df.API_Calls\n", 218 | "Y = malware_calls_df.API_Labels.astype('category').cat.codes\n", 219 | "\n", 220 | "tok = Tokenizer(num_words=max_words)\n", 221 | "tok.fit_on_texts(X)\n", 222 | "print('Found %s unique tokens.' % len(tok.word_index))\n", 223 | "X = tok.texts_to_sequences(X.values)\n", 224 | "X = sequence.pad_sequences(X, maxlen=max_len)\n", 225 | "print('Shape of data tensor:', X.shape)\n", 226 | "\n", 227 | "X_train, X_test, Y_train, Y_test = train_test_split(X, Y,\n", 228 | " test_size=0.15)\n", 229 | "\n", 230 | "le = LabelEncoder()\n", 231 | "Y_train_enc = le.fit_transform(Y_train)\n", 232 | "Y_train_enc = np_utils.to_categorical(Y_train_enc)\n", 233 | "\n", 234 | "Y_test_enc = le.transform(Y_test)\n", 235 | "Y_test_enc = np_utils.to_categorical(Y_test_enc)" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "The LSTM based classification model is then given for example as exercise here:" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": 5, 248 | "metadata": {}, 249 | "outputs": [], 250 | "source": [ 251 | "def malware_model(act_func=\"softsign\"):\n", 252 | " model = Sequential()\n", 253 | " model.add(Embedding(max_words, 300, input_length=max_len))\n", 254 | " model.add(SpatialDropout1D(0.1))\n", 255 | " model.add(LSTM(32, dropout=0.1, recurrent_dropout=0.1,\n", 256 | " return_sequences=True, activation=act_func))\n", 257 | " model.add(LSTM(32, dropout=0.1, activation=act_func, return_sequences=True))\n", 258 | " model.add(LSTM(32, dropout=0.1, activation=act_func))\n", 259 | " model.add(Dense(128, activation=act_func))\n", 260 | " model.add(Dropout(0.1))\n", 261 | " model.add(Dense(256, activation=act_func))\n", 262 | " model.add(Dropout(0.1))\n", 263 | " model.add(Dense(128, activation=act_func))\n", 264 | " model.add(Dropout(0.1))\n", 265 | " model.add(Dense(1, name='out_layer', activation=\"linear\"))\n", 266 | " return model" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": {}, 272 | "source": [ 273 | "The next step is to train the model. I trained and saved my model. Because of the dataset, the training stage take lots of time. In order to reduce the execution time you can load my previous trained model from the GitHub repository." 274 | ] 275 | }, 276 | { 277 | "cell_type": "code", 278 | "execution_count": 6, 279 | "metadata": {}, 280 | "outputs": [ 281 | { 282 | "name": "stdout", 283 | "output_type": "stream", 284 | "text": [ 285 | "Model: \"sequential\"\n", 286 | "_________________________________________________________________\n", 287 | "Layer (type) Output Shape Param # \n", 288 | "=================================================================\n", 289 | "embedding (Embedding) (None, 100, 300) 240000 \n", 290 | "_________________________________________________________________\n", 291 | "spatial_dropout1d (SpatialDr (None, 100, 300) 0 \n", 292 | "_________________________________________________________________\n", 293 | "lstm (LSTM) (None, 100, 32) 42624 \n", 294 | "_________________________________________________________________\n", 295 | "lstm_1 (LSTM) (None, 100, 32) 8320 \n", 296 | "_________________________________________________________________\n", 297 | "lstm_2 (LSTM) (None, 32) 8320 \n", 298 | "_________________________________________________________________\n", 299 | "dense (Dense) (None, 128) 4224 \n", 300 | "_________________________________________________________________\n", 301 | "dropout (Dropout) (None, 128) 0 \n", 302 | "_________________________________________________________________\n", 303 | "dense_1 (Dense) (None, 256) 33024 \n", 304 | "_________________________________________________________________\n", 305 | "dropout_1 (Dropout) (None, 256) 0 \n", 306 | "_________________________________________________________________\n", 307 | "dense_2 (Dense) (None, 128) 32896 \n", 308 | "_________________________________________________________________\n", 309 | "dropout_2 (Dropout) (None, 128) 0 \n", 310 | "_________________________________________________________________\n", 311 | "out_layer (Dense) (None, 1) 129 \n", 312 | "=================================================================\n", 313 | "Total params: 369,537\n", 314 | "Trainable params: 369,537\n", 315 | "Non-trainable params: 0\n", 316 | "_________________________________________________________________\n", 317 | "None\n", 318 | "Epoch 1/10\n", 319 | "7/7 [==============================] - 22s 3s/step - loss: 0.0486 - accuracy: 0.9487 - val_loss: 0.0311 - val_accuracy: 0.9672\n", 320 | "Epoch 2/10\n", 321 | "7/7 [==============================] - 21s 3s/step - loss: 0.0378 - accuracy: 0.9591 - val_loss: 0.0302 - val_accuracy: 0.9672\n", 322 | "Epoch 3/10\n", 323 | "7/7 [==============================] - 21s 3s/step - loss: 0.0364 - accuracy: 0.9604 - val_loss: 0.0362 - val_accuracy: 0.9625\n", 324 | "Epoch 4/10\n", 325 | "7/7 [==============================] - 20s 3s/step - loss: 0.0378 - accuracy: 0.9593 - val_loss: 0.0328 - val_accuracy: 0.9616\n", 326 | "Epoch 5/10\n", 327 | "7/7 [==============================] - 22s 3s/step - loss: 0.0365 - accuracy: 0.9609 - val_loss: 0.0351 - val_accuracy: 0.9606\n", 328 | "Epoch 6/10\n", 329 | "7/7 [==============================] - 21s 3s/step - loss: 0.0369 - accuracy: 0.9601 - val_loss: 0.0369 - val_accuracy: 0.9606\n", 330 | "Epoch 7/10\n", 331 | "7/7 [==============================] - 22s 3s/step - loss: 0.0371 - accuracy: 0.9594 - val_loss: 0.0395 - val_accuracy: 0.9625\n", 332 | "Epoch 8/10\n", 333 | "7/7 [==============================] - 22s 3s/step - loss: 0.0378 - accuracy: 0.9601 - val_loss: 0.0365 - val_accuracy: 0.9588\n", 334 | "Epoch 9/10\n", 335 | "7/7 [==============================] - 22s 3s/step - loss: 0.0358 - accuracy: 0.9618 - val_loss: 0.0440 - val_accuracy: 0.9456\n", 336 | "Epoch 10/10\n", 337 | "7/7 [==============================] - 21s 3s/step - loss: 0.0373 - accuracy: 0.9589 - val_loss: 0.0354 - val_accuracy: 0.9644\n" 338 | ] 339 | } 340 | ], 341 | "source": [ 342 | "model = malware_model()\n", 343 | "print(model.summary())\n", 344 | "model.compile(loss='mse', optimizer=\"rmsprop\",\n", 345 | " metrics=['accuracy'])\n", 346 | "\n", 347 | "filepath = \"lstm-malware-model.hdf5\"\n", 348 | "model.load_weights(filepath)\n", 349 | "\n", 350 | "history = model.fit(X_train, Y_train, batch_size=1000, epochs=10,\n", 351 | " validation_data=(X_test, Y_test), verbose=1)" 352 | ] 353 | }, 354 | { 355 | "cell_type": "markdown", 356 | "metadata": {}, 357 | "source": [ 358 | "## Model Evaluation" 359 | ] 360 | }, 361 | { 362 | "cell_type": "markdown", 363 | "metadata": {}, 364 | "source": [ 365 | "Now, we have finished the training phase of the LSTM model. We can evaluate our model's classification performance using the confusion matrix. According to the confusion matrix, the model’s classification performance quite good." 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": 12, 371 | "metadata": {}, 372 | "outputs": [ 373 | { 374 | "data": { 375 | "image/png": "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\n", 376 | "text/plain": [ 377 | "
" 378 | ] 379 | }, 380 | "metadata": { 381 | "needs_background": "light" 382 | }, 383 | "output_type": "display_data" 384 | } 385 | ], 386 | "source": [ 387 | "y_test_pred = model.predict_classes(X_test)\n", 388 | "cm = confusion_matrix(Y_test, y_test_pred)\n", 389 | "\n", 390 | "plot_confusion_matrix(conf_mat=cm,\n", 391 | " show_absolute=True,\n", 392 | " show_normed=True,\n", 393 | " colorbar=True)\n", 394 | "plt.savefig(\"confusion_matrix.png\")\n", 395 | "plt.show()" 396 | ] 397 | }, 398 | { 399 | "cell_type": "markdown", 400 | "metadata": {}, 401 | "source": [ 402 | "![Confusion matrix](confusion_matrix.png)\n", 403 | "\n", 404 | "Let's continue with the training history of our model." 405 | ] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "execution_count": 14, 410 | "metadata": {}, 411 | "outputs": [ 412 | { 413 | "data": { 414 | "image/png": "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\n", 415 | "text/plain": [ 416 | "
" 417 | ] 418 | }, 419 | "metadata": { 420 | "needs_background": "light" 421 | }, 422 | "output_type": "display_data" 423 | }, 424 | { 425 | "data": { 426 | "image/png": "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\n", 427 | "text/plain": [ 428 | "
" 429 | ] 430 | }, 431 | "metadata": { 432 | "needs_background": "light" 433 | }, 434 | "output_type": "display_data" 435 | } 436 | ], 437 | "source": [ 438 | "plt.plot(history.history['accuracy'])\n", 439 | "plt.plot(history.history['val_accuracy'])\n", 440 | "plt.title('model accuracy')\n", 441 | "plt.ylabel('accuracy')\n", 442 | "plt.xlabel('epoch')\n", 443 | "plt.legend(['train', 'test'], loc='upper left')\n", 444 | "plt.grid()\n", 445 | "plt.savefig(\"accuracy.png\")\n", 446 | "plt.show()\n", 447 | "\n", 448 | "plt.plot(history.history['loss'])\n", 449 | "plt.plot(history.history['val_loss'])\n", 450 | "plt.title('model loss')\n", 451 | "plt.ylabel('loss')\n", 452 | "plt.xlabel('epoch')\n", 453 | "plt.legend(['train', 'test'], loc='upper left')\n", 454 | "plt.grid()\n", 455 | "plt.savefig(\"loss.png\")\n", 456 | "plt.show()" 457 | ] 458 | }, 459 | { 460 | "cell_type": "markdown", 461 | "metadata": {}, 462 | "source": [ 463 | "![Accuracy history](accuracy.png)\n", 464 | "![Loss history](loss.png)" 465 | ] 466 | }, 467 | { 468 | "cell_type": "markdown", 469 | "metadata": {}, 470 | "source": [ 471 | "## Conclusion" 472 | ] 473 | }, 474 | { 475 | "cell_type": "markdown", 476 | "metadata": {}, 477 | "source": [ 478 | "The purpose of this study was to create an LSTM based malware detection model using my previous malware dataset. Although our dataset contains instances that belong to some malware families with unbalanced distribution, we have shown that this problem does not affect classification performance." 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": null, 484 | "metadata": {}, 485 | "outputs": [], 486 | "source": [] 487 | } 488 | ], 489 | "metadata": { 490 | "kernelspec": { 491 | "display_name": "Python 3", 492 | "language": "python", 493 | "name": "python3" 494 | }, 495 | "language_info": { 496 | "codemirror_mode": { 497 | "name": "ipython", 498 | "version": 3 499 | }, 500 | "file_extension": ".py", 501 | "mimetype": "text/x-python", 502 | "name": "python", 503 | "nbconvert_exporter": "python", 504 | "pygments_lexer": "ipython3", 505 | "version": "3.7.6" 506 | } 507 | }, 508 | "nbformat": 4, 509 | "nbformat_minor": 4 510 | } 511 | -------------------------------------------------------------------------------- /fig-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ocatak/lstm_malware_detection/5110304a56a3abc7d4ec551b529b321cc666fccb/fig-1.png -------------------------------------------------------------------------------- /types.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ocatak/lstm_malware_detection/5110304a56a3abc7d4ec551b529b321cc666fccb/types.zip --------------------------------------------------------------------------------