[Python] APKMalwareDetect

Iniciado por overxfl0w13, Noviembre 01, 2015, 06:16:29 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 01, 2015, 06:16:29 AM Ultima modificación: Noviembre 01, 2015, 09:36:15 AM por overxfl0w13
Buenas a todos, hacia ya tiempo que no me pasaba por ningún foro  :D.

Después de unas cuantas horas invertidas en la creación de un detector de malware para aplicaciones Android (APK), veo que ya hay algo más o menos estable y me he decidido a hacer un post para publicar y comentar el sistema.

Como ya he dicho se trata de un detector de malware para .apk empleando en este caso algoritmos de aprendizaje automático. 

Para ver visualmente un proceso similar No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Este es un problema de clasificación en 2 clases (Malware,NoMalware)  por lo que se tienen muestras de entrenamiento para Malware (que se colocarán en Samples/RAW/Train/Malware) y muestras de entrenamiento para NoMalware (Samples/RAW/Train/NoMalware) además de las muestras para test (las que se quiere comprobar si son malware o no, en Samples/RAW/Test/), todo en .apk .

De forma sencilla, de cada apk del conjunto de datos de entrenamiento y del conjunto de datos de test se extraen características en un espacio
, las características que se extraen de cada aplicación son:

Código: php

BOOT_COMPLETED
ACTION_SENDTO
ACTION_SEND
ACTION_SEND_MULTIPLE
ACTION_GET_CONTENT
ACTION_IMAGE_CAPTURE
ACTION_VIDEO_CAPTURE
ACTION_VIEW
ACTION_INSERT
ACTION_OPEN_DOCUMENT
ACTION_CREATE_DOCUMENT
ACTION_VIEW
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
ACTION_CREATE_NOTE
SEARCH_ACTION
ACTION_WEB_SEARCH
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS

READ_CALENDAR
WRITE_CALENDAR
CAMERA
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
RECORD_AUDIO
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
BODY_SENSORS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
SEND_MMS
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE


*chmod*
*/system/app*
*/system/bin/*
*remount*
*pm install*
*chown*
*mount*

Ldalvik/system/DexClassLoader
Ljava/security/spec/KeySpec

Landroid/telephony/TelephonyManager/ and getDeviceId
Landroid/telephony/TelephonyManager/ and getCellLocation
Landroid/telephony/TelephonyManager/ and getSimSerialNumber
Landroid/telephony/TelephonyManager/ and getSubscriberId
Landroid/telephony/TelephonyManager/ and getCallState
Landroid/telephony/TelephoneManager/ and getSimOperator*
Landroid/telephony/TelephoneManager/ and getLine1Number
Landroid/telephony/TelephonyManager/ and getNetworkOperator*
Landroid/telephony/gsm/SmsManager and sendTextMessage

Landroid/content/pm/PackageManager and getInstalledPackages

Landroid/app/ActivityManager and getMemoryInfo
Landroid/app/ActivityManager and getRunningServices
Landroid/app/ActivityManager and restartPackage
Landroid/app/ActivityManager and getRunningAppProcesses


Landroid/content/BroadcastReceiver and abortBroadcast

Landroid/content/Context and getApplicationInfo
Landroid/content/Context and startService
Landroid/content/Context and getFilesDir

Landroid/content/ContentResolver and insert
Landroid/content/ContentResolver and query
Landroid/content/ContentResolver and delete


Landroid/os/Handler and sendMessage
Landroid/os/Handler and obtainMessage

Landroid/os/Process and myPid
Landroid/os/Process and killProcess

Ljava/io/File and delete
Ljava/io/File and exists
Ljava/io/File and listFiles


Landroid/net/ConnectivityManager/getNetworkInfo

Landroid/net/NetworkInfo/ and getState
Landroid/net/NetworkInfo/ and isConnected

Landroid/net/WifiManager/ and getWifiState
Landroid/net/WifiManager/ and setWifiEnabled

Ljava/Runtime and getRuntime and exec
Ljava/lang/System and loadLibrary
Ljava/lang/reflect
Ljava/util/zipZipInputStream
Ljavax/crypto/
}


El sistema permite 2 enfoques, resolver el problema usando métodos no supervisados (clustering con K-medias) y usando métodos supervisados (kernel perceptron, K nearest neighbours, clasificador multinomial y perceptron, estos 2 últimos no se han integrado aun), en función de un método u otro se genera un vector de características diferente (e.g. si es supervisado se requiere la etiqueta de clase), que tendrá una forma semejante a esto .

En cualquier método se pasará antes por 2 puntos clave, entrenar el sistema con las muestras de entrenamiento y finalmente comprobar la clasificación de los apk de los que se quiere saber si son malware o no. Cuantos más datos de entrenamiento se empleen mejor funcionará el sistema (alcanzará un límite en función del algoritmo elegido) sin embargo será más costoso entrenarlo. Este proceso de entrenamiento, en principio, se debe realizar una única vez con todo el conjunto de muestras disponibles sin embargo dado que no se da entrenado ni tamcoco (de momento) la posibilidad de almacenar el "estado" del entrenamiento (e.g. los vectores de pesos en perceptron) se tendrá que entrenar el sistema cada vez que se quiera reconocer una muestra, esto se solucionará en versiones siguientes.

Para ejecutarlo solo teneis que llamar al script No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y él se encarga de realizar todos los procesos que os he comentado tomando los valores por defecto que se indican en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que son:

Código: python
PATH_RAW_TRAIN_MALWARE_SAMPLES    = "./Samples/RAW/Train/Malware/"
PATH_RAW_TRAIN_NO_MALWARE_SAMPLES = "./Samples/RAW/Train/NoMalware/"
PATH_RAW_TEST_SAMPLES      = "./Samples/RAW/Test/"

MANIFEST                          = "AndroidManifest.xml"
BACKSMALI                         = "classes.dex"
CLASSIFIERS                       = {0:KMeans,1:KernelPerceptron,2:K_nearest_neighbour}
CLASSIFIER                        = 1
VERBOSE                           = True


Os dejo un link de descarga (es mi carpeta tal cual pero con unos 150MB menos en apks,no la iba a subir entera) y el enlace al git (no está actualizado, recomiendo el otro link):

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Comentar también que lleva únicamente un .apk para entrenamiento y test (el mismo además, por lo que siempre acertará), si lo usáis recordad ponerle más muestras en las carpetas que dije anteriormente. Visualización de extracción de caracteristicas, entrenamiento y clasificación:



Y eso es todo, si queréis colaborar solo enviadme un pv2 y vemos que se puede ir haciendo, saludos :D

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta! Welcome back!
Que bueno verte nuevamente por casa!
Muchisimas gracias por el aporte! es muy util!

Saludos!
ANTRAX