Anti Bat's en C#

Iniciado por 43H4FH44H45H4CH49H56H45H, 31 Agosto 2008, 22:47 PM

0 Miembros y 2 Visitantes están viendo este tema.

43H4FH44H45H4CH49H56H45H

Anti Bat's Version BETA
SCANNER BAT



MONITOR BAT



Creado en Visual Studio 2008 Team System compatible con cualquier Visual Studio que soporte net framework 3 o superior (ej: express)
Lenguaje c#.net

Bueno aprovechando este domingo antes de irme a echarle las cervezas hice un simple programa para escanear bat's.

Funciones:
- Escanea todos los archivos .bat  de una carpeta solamente o incluyendo los subdirectorios, esto activando o no el checkbox de subdirectorios.
- Escaneo de archivos individuales *.bat
- Eliminación de archivos *.bat que contengan código malicioso de acuerdo al update.txt
- Capacidad de renombrar y mover *.bat a *.bat.txt los cuales son colocados en el escritorio en una carpeta para análisis
- Monitor bat, el cual se encarga de monitorear la creación de bat's en una carpeta o unidad del disco duro (incluye las subcarpetas), si encontrara alguno como sucede cuando se utiliza un joiner o similar, detendrá los procesos cmd para evitar que el *.bat pueda cumplir su función y luego  será copiado a la carpeta de análisis en el escritorio y el origen sera eliminado.
- Creación de log's en "c:\log.txt" para registrar los *.bat eliminados o movidos para análisis.
- Soporta el drag and drop se puede arrastrar al listbox el *.bat que queramos analizar.
- El listbox solo mostrara la ruta de los archivos que contengan código malicioso deacuedo a lo introducido en update.txt
- Capacidad de poder mantenerse actualizado respecto a la aparición de nuevas técnicas .bat mediante el añadido de líneas o combinaciones de comandos o variables maliciosas en el update.txt.

Como funciona?
- Al iniciarse carga del archivo update.txt (que debe estar en el mismo directorio que el ejecutable) todos los strings con los nombres de comandos maliciosos u otros similares que nosotros hayamos introducido en update.txt.
- Al iniciar el escaneo de un directorio solamente o incluyendo sus subdirectorios, lee el contenido de cada bat cargándolo en un string[] para luego comprobar si contiene alguno de los string's definidos en update.txt, si así fuera lo incluye en el listbox1 para ser analizado o eliminado.
- Puede escanear solamente un archivo el cual seguirá el mismo proceso mencionado antes, si queremos podemos arrastrar un archivo .bat a el listbox para analizarlo si no se trata de un .bat el rechazara su escaneo.
- Al ingresar al monitor bat nos preguntara que directorio o unidad deseamos monitorizar en caso de no seleccionar alguna no cargara el formulario del monitor bat.
- En el monitor bat se mostrara un listbox donde nos informara de intentos de creación de archivos bat los cuales serán neutralizados y posteriormente copiados para el  análisis (útil para joiner's como el quick batch compil...).

Dejo el código para su análisis, debo mencionar que no lo revise a fondo por lo cual si hay alguna variable o algo que no encaje favor postear para su corrección.

Este es el modo sencillo de crearlo puesto que se puede reconstruir un bat que tenga ofuscado el code para saber qué es exactamente los que hace dicho .bat.

El update.txt es solo un ejemplo, cada quien que lo use deberá actualizarlo con líneas de bat's o comandos que considere maliciosos.

Para el escaneo de directorios es mejor hacerlo en carpetas definidas y no en una unidad del disco duro, en caso del monitor batch es mejor hacerlo sobre una unidad como la C:\ para un correcto funcionamiento, aunque puede hacerse en un directorio especifico.

En caso de tratarse de un código ofuscado solo basta añadir al update.txt trozos o líneas enteras de variables, comandos, combinaciones o similares de .bat maliciosos para  actualizarlo.

No soy bueno para hacer manuales o códigos comentados, así que las dudas favor postear.  :laugh:

Favor respetar derechos de autor je je!!!!    :¬¬

Enlace de descarga del ejemplo más el update.txt

http://rapidshare.com/files/141631233/Antibat.rar.html

FORM1
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics ;


namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {       
        string[] update;
        string ranalizar = Environment.GetEnvironmentVariable ("USERPROFILE").ToString () + @"\Escritorio\Analizar";
                         
        public Form1()
        {
            InitializeComponent();                       
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (File.Exists(@"update.txt")) update = File.ReadAllLines(@"update.txt");
            else
            {
             MessageBox.Show("No se encuentra update.txt verifique", "Error definiciones de comandos", MessageBoxButtons.OK, MessageBoxIcon.Error);
             Application.ExitThread();
            }                           
                this.toolStrip1.ImageList = this.imageList1;
                this.toolStripButton1.ImageIndex = 0;
                this.toolStripButton2.ImageIndex = 1;
                this.toolStripButton3.ImageIndex = 2;
                this.toolStripButton4.ImageIndex = 3;
                this.toolStripButton5.ImageIndex = 4;           
        }
        // Boton Escanear Carpetas
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            scan();
        }
        // Boton Escanear Archivo
        private void toolStripButton2_Click(object sender, EventArgs e)
        {           
            listBox1.Items.Clear();
            openFileDialog1.Filter = "Archivos Bat's(*.bat)|*.bat";
            openFileDialog1.InitialDirectory = @"C:\";
            openFileDialog1.Title = "Seleccione el archivo bat a escanear";
            openFileDialog1.FileName = "*.bat";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string archivobat = openFileDialog1.FileName;
                scanfile(archivobat);
            }
            else MessageBox.Show("Seleccione un archivo .BAT para escanear", "Error archivo no seleccionado", MessageBoxButtons.OK, MessageBoxIcon.Error );
        }
        // Boton Eliminar
        private void toolStripButton3_Click(object sender, EventArgs e)
        {
            eliminar();
        }
        // Boton Mover
        private void toolStripButton4_Click(object sender, EventArgs e)
        {
            mover();
        }
       
        private void toolStripButton5_Click(object sender, EventArgs e)
        {
            try
            {
                Form2 yo = new Form2();
                yo.ShowDialog();
            }
            catch (Exception er)
            {
                this.Text = er.Message.ToString();
            }
        }
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (listBox1.Items.Count == 0)
            {
                toolStripButton3.Enabled = false;
                toolStripButton4.Enabled = false;
            }
            else
            {
                toolStripButton3.Enabled = true;
                toolStripButton4.Enabled = true;
            }
           
        }       
        private void listBox1_DragDrop(object sender, DragEventArgs e)
        {
            string[] dragfile = (string[])e.Data.GetData(DataFormats.FileDrop);

            foreach (string file in dragfile)
            {
                if (file.ToUpper ().Contains(".BAT"))
                {
                    listBox1.Items.Clear();
                    scanfile(file);
                    toolStripStatusLabel1.Text = "Ultimo archivo escaneado: " + file;
                }
                else MessageBox.Show("Archivo no compatible verifique que sea un .BAT", "Error Archivo no soportado", MessageBoxButtons.OK, MessageBoxIcon.Exclamation );
            }
        }

        private void listBox1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
                e.Effect = DragDropEffects.All;
        }

        private void scan()
        {
            listBox1.Items.Clear();
            folderBrowserDialog1.ShowDialog();
            if (folderBrowserDialog1.SelectedPath.ToString() != "")
            {   
                analizar(folderBrowserDialog1.SelectedPath);
            }
            else
            {
                MessageBox.Show("Carpeta no valida para el analisis", "Error al Abrir la Carpeta", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void analizar(string ruta)
        {
            try
            {
                DirectoryInfo dInfo1 = new DirectoryInfo(ruta);
                if (checkBox1.Checked == true)
                {
                    FileInfo[] bats = dInfo1.GetFiles("*.BAT", SearchOption.AllDirectories);
                    foreach (FileInfo bat in bats)
                    {
                        toolStripStatusLabel1.Text = "Ultimo archivo escaneado: " + bat.FullName.ToString();
                        File.SetAttributes(bat.FullName.ToString(), FileAttributes.Normal);
                        string[] readbat = File.ReadAllLines(bat.FullName.ToString());
                        foreach (string linebat in readbat)
                        {
                            int cont = 0;
                            foreach (string def in update)
                            {
                                if (linebat.ToUpper().Contains(def.ToUpper ()))
                                {
                                    listBox1.Items.Add(bat.FullName.ToString());
                                    cont = 1;
                                    break;
                                }
                            }
                            if (cont == 1) break;
                        }
                    }
                }
                else
                {
                    FileInfo[] bats = dInfo1.GetFiles("*.BAT", SearchOption.TopDirectoryOnly);
                    foreach (FileInfo bat in bats)
                    {
                        toolStripStatusLabel1.Text = "Ultimo archivo escaneando: " + bat.FullName.ToString();
                        File.SetAttributes(bat.FullName.ToString(), FileAttributes.Normal);
                        string[] readbat = File.ReadAllLines(bat.FullName.ToString());
                        foreach (string linebat in readbat)
                        {
                            int cont = 0;
                            foreach (string def in update)
                            {
                                if (linebat.ToUpper().Contains(def.ToUpper ()))
                                {
                                    listBox1.Items.Add(bat.FullName.ToString());
                                    cont = 1;
                                    break;
                                }
                            }
                            if (cont == 1) break;
                        }
                    }

                }



            }
            catch (Exception err)
            {
                this.Text = err.Message.ToString();
            }
            toolStripButton4.Enabled = true;
        }

        private void eliminar()
        {
            try
            {
                for (int i = 0; i < listBox1.Items.Count; i++)
                    {
                        if (File.Exists(listBox1.Items[i].ToString()))
                        {
                            FileStream stream = new FileStream(@"C:\log.txt", FileMode.Append, FileAccess.Write);
                            StreamWriter writer = new StreamWriter(stream);
                            File.Delete(listBox1.Items[i].ToString());
                            listBox1.Items.Insert(i, listBox1.Items[i].ToString() + " Eliminado");
                            listBox1.Items.Remove(listBox1.Items[i + 1]);
                            writer.WriteLine(listBox1.Items[i].ToString() + "  en  " + DateTime.Now.ToString());
                            writer.Close();
                        }
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message.ToString(), "Verifique error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

         
        }
        private void mover()
        {
            try
            {
                if (!Directory.Exists(ranalizar))
                {
                    Directory.CreateDirectory(ranalizar);
                }


                for (int i = 0; i < listBox1.Items.Count; i++)
                {
                    if (File.Exists(listBox1.Items[i].ToString()))
                    {

                        FileStream stream = new FileStream(@"C:\log.txt", FileMode.Append, FileAccess.Write);
                        StreamWriter writer = new StreamWriter(stream);
                        File.Move(listBox1.Items[i].ToString(), ranalizar + @"\" + listBox1.Items[i].ToString().Substring(listBox1.Items[i].ToString().LastIndexOf(@"\"), ((listBox1.Items[i].ToString().Length)) - (listBox1.Items[i].ToString().LastIndexOf(@"\")))+ ".txt");
                        listBox1.Items.Insert(i, listBox1.Items[i].ToString() + " Movido al Escritorio carpeta Analizar");
                        listBox1.Items.Remove(listBox1.Items[i + 1]);
                        writer.WriteLine(listBox1.Items[i].ToString() + "  en  " + DateTime.Now.ToString());
                        writer.Close();
                    }
                }
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message.ToString(), "Verifique eliminacion o existencia de archivos", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void scanfile(string file)
        {           
            toolStripStatusLabel1.Text = "Ultimo archivo escaneado: " + file;
            File.SetAttributes(file, FileAttributes.Normal);
            string[] readbat = File.ReadAllLines(file);
            foreach (string linebat in readbat)
            {
                int cont = 0;
                foreach (string def in update)
                {
                    if (linebat.ToUpper().Contains(def.ToUpper ()))
                    {
                        listBox1.Items.Add(file);
                        cont = 1;
                        break;
                    }
                }
                if (cont == 1) break;
            }
        }     
    }
}


FORM2

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace WindowsFormsApplication4
{
    public partial class Form2 : Form
    {
        string ranalizar = Environment.GetEnvironmentVariable("USERPROFILE").ToString() + @"\Escritorio\Analizar";
        public Form2()
        {
            InitializeComponent();
        }
        private void monitorbatch()
        {
            if (!Directory.Exists(ranalizar)) Directory.CreateDirectory(ranalizar);

            folderBrowserDialog1.ShowDialog();
            if (folderBrowserDialog1.SelectedPath.ToString() == "")
            {
                MessageBox.Show("Carpeta o Unidad no valida para el analisis", "Error al Abrir la Carpeta o Unidad", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
               
            }
            fileSystemWatcher1.Path = folderBrowserDialog1.SelectedPath.ToString();
            label1.Text = "MONITORIZANDO   " + folderBrowserDialog1.SelectedPath.ToString();
            fileSystemWatcher1.Filter = "*.bat";
            try
            {
                fileSystemWatcher1.EnableRaisingEvents = true;
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message.ToString(), "Error en el monitor bat", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }   
        private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
        {
            try
            {
                FileStream stream = new FileStream(@"C:\log.txt", FileMode.Append, FileAccess.Write);
                StreamWriter writer = new StreamWriter(stream);               
                listBox1.Items.Add(e.FullPath.ToString() + " *****INTENTA INTRODUCIRSE EN EL SISTEMA!!!");
                writer.WriteLine(e.FullPath.ToString() + " *****INTENTA INTRODUCIRSE EN EL SISTEMA!!! en " + DateTime.Now.ToString());
                writer.Close();
               
                if (e.Name.ToString().Contains(".bat"))
                {
                    matar_procesos("cmd");
                    File.SetAttributes(e.FullPath.ToString(), FileAttributes.Normal);

                    if (File.Exists(ranalizar + e.FullPath.ToString().Substring(e.FullPath.ToString().LastIndexOf(@"\"), ((e.FullPath.ToString().Length)) - (e.FullPath.ToString().LastIndexOf(@"\"))) + ".txt"))
                    {                       
                        File.Delete(ranalizar + e.FullPath.ToString().Substring(e.FullPath.ToString().LastIndexOf(@"\"), ((e.FullPath.ToString().Length)) - (e.FullPath.ToString().LastIndexOf(@"\"))) + ".txt");
                        File.Copy (e.FullPath.ToString(), ranalizar + e.FullPath.ToString().Substring(e.FullPath.ToString().LastIndexOf(@"\"), ((e.FullPath.ToString().Length)) - (e.FullPath.ToString().LastIndexOf(@"\"))) + ".txt");
                        File.SetAttributes(ranalizar + @"/" + e.FullPath.ToString().Substring(e.FullPath.ToString().LastIndexOf(@"\"), ((e.FullPath.ToString().Length)) - (e.FullPath.ToString().LastIndexOf(@"\"))) + ".txt", FileAttributes.Normal);                       
                    }
                    else
                    {                       
                        File.Copy(e.FullPath.ToString(), ranalizar + @"/" + e.FullPath.ToString().Substring(e.FullPath.ToString().LastIndexOf(@"\"), ((e.FullPath.ToString().Length)) - (e.FullPath.ToString().LastIndexOf(@"\")))+ ".txt");
                        File.SetAttributes(ranalizar + @"/" + e.FullPath.ToString().Substring(e.FullPath.ToString().LastIndexOf(@"\"), ((e.FullPath.ToString().Length)) - (e.FullPath.ToString().LastIndexOf(@"\"))) + ".txt", FileAttributes.Normal);
                    }                 
                    listBox1.Items.Add(e.FullPath.ToString() + " *****FUE NEUTRALIZADO");
                    FileStream stream1 = new FileStream(@"C:\log.txt", FileMode.Append, FileAccess.Write);
                    StreamWriter writer1 = new StreamWriter(stream1);                               
                    writer1.WriteLine(e.FullPath.ToString() + " *****FUE NEUTRALIZADO en " + DateTime.Now.ToString());
                    writer1.Close();
                    if(File.Exists (e.FullPath.ToString()))
                    {
                        File.Delete(e.FullPath.ToString());
                    }
                    matar_procesos("cmd");
                    MessageBox.Show("El archivo responsable fue neutralizado y copiado a escritorio - analisis", "Bloqueado Ataque malicioso", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
            catch (Exception er)
            {
                this.Text = er.Message.ToString();
            }

        }
        private void matar_procesos(string proceso)
        {
            try
            {
                List<Process> procesos = Process.GetProcesses().ToList();
                for (int i = 0; i<4; i++)
                {
                    foreach (Process proc in procesos)
                    {
                        try
                        {
                            string nombproc = proc.ProcessName;
                            if (nombproc == proceso)
                            {
                                proc.Kill();
                            }
                        }
                        catch (Exception ex)
                        {
                            this.Text = ex.Message.ToString();
                        }
                    }
                }
            }
            catch (Exception er)
            {
                this.Text = er.Message.ToString();
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            monitorbatch();
        }

        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            fileSystemWatcher1.EnableRaisingEvents = false;
        }

       
    }
}

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

elmaro

La verdad me parece una aplicacion muy interesante.
Nunca se esta a salvo de los bats.

Saludos.

Meta

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

skapunky

Esta interesante, pero una recomendación:

La parte de arriba de los botones "escanear carpeta.." y esos esta muy bien, pero el fondo del programa ese oscuro con el listbox negro...personalmente no me gusta. Te quedaria wapo wapo si también fuera del color así blanco de la segunda imágen. Un saludo.
Killtrojan Syslog v1.44: ENTRAR

Eazy

Anti Bat's Version BETA by 3h43h3h24hh234h23h4h23h4h23579031h rh13bo4h1vb4ouv123uv123voug12v3u12v3ug12v3uo12v3uv12uv3v312ouv321v xD
[/url]

43H4FH44H45H4CH49H56H45H

Cita de: skapunky en  2 Septiembre 2008, 10:17 AM
Esta interesante, pero una recomendación:

La parte de arriba de los botones "escanear carpeta.." y esos esta muy bien, pero el fondo del programa ese oscuro con el listbox negro...personalmente no me gusta. Te quedaria wapo wapo si también fuera del color así blanco de la segunda imágen. Un saludo.

Cuando haga algunas mejoras en los algoritmos de comparación y busqueda de codigo malicioso probare el cambio de colores (debo mencionar que tengo tendencia a los colores como el negro, azul, etc por ello lo hice de ese modo  ;D).

Cita de: Eazy en  3 Septiembre 2008, 09:57 AM
Anti Bat's Version BETA by 3h43h3h24hh234h23h4h23h4h23579031h rh13bo4h1vb4ouv123uv123voug12v3u12v3ug12v3uo12v3uv12uv3v312ouv321v xD

Al parecer hay personas que todavia no conocen la tabla de conversion hexadecimal  :-\

Gracias a todos por los comentarios  ;D.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

Meta

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

chrominum

O que caracteres como la Y o la R nunca estarán en una cadena Hexadecimal xD