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.
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
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 { 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 { { 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())) { 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())) { 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
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 { 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"); 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; } } }