[Source] IsMutexRunning... sencilla función para evitar multiples instancias!!

Iniciado por Mad Antrax, 19 Mayo 2007, 17:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Mad Antrax

Aqui vuelve el pesao de MadAntrax con otro de sus códigos...

Esta vez sirve para controlar que nuestra aplicación no sea ejecutada 2 veces en un mismo equipo. Algunos pensareis que eso ya se puede hacer con

Código (vb) [Seleccionar]
If App.PrevInstance = True Then End

pero eso no es cierto... si nuestra aplicación se copia en System32 como: programa1.exe y programa2.exe... el usuario podrá ejecutar el programa1.exe y el programa2.exe simultáneamente! Eso puede suponer un problema en el caso de estar programando un troyano o un keylogger (donde lo importante es solo tener una instancia de nuestro malware a la vez).

Si no recuerdo mal, el troyano Bifrost usa esta función para controlar que solo un server.exe esté ejecutándose a la vez en un mismo sistema, y si la memoria no me falla este Mutex se puede personalizar en el EditServer. Bien, como creo yo una función similar en VB, así de simple:

Module1.bas
Código (vb) [Seleccionar]

'Estas sin las API's necesarias para crear y controlar el Mutex
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Variable Global que almacena el Handle de nuestro Mutex
Private hMutex As Long

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' IsMutexRunning Parametros:
'   MutexStr = String
'       Cadena de texto única que usaremos para controlar nuestro Mutex
'
'   Valor de retorno = Boolean
'       Devuelve TRUE si existe el Mutex
'       Devuleve FALSE si no encuentra el Mutex
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Public Function IsMutexRunning(ByVal MutexStr As String) As Boolean
    hMutex = CreateMutex(0&, 0&, MutexStr)              'Creamos nuestro Mutex único
    If hMutex = 0 Then                                  'Si el Handle es 0 es que algo no va bien :S
        MsgBox "Ha ocurrido un error al intentar crear el Mutex. Es imposible controlar las instancias de este proceso", vbCritical + vbOKOnly, "CreateMutex Error"
        IsMutexRunning = False
    Else
        If WaitForSingleObject(hMutex, 0&) = &H0 Then   'Comprobamos si ya existe ese Handle
            IsMutexRunning = False                      'Si no existe, devolvemos FALSE
        Else
            MsgBox "Solo se permite una instancia simultanea de este proceso", vbOKOnly, "CreateMutex"
            CloseHandle hMutex                          'Si existe, cerramos el nuevo Handle
            IsMutexRunning = True                       'Y devolvemos TRUE
        End If
    End If
End Function


y el el Form1.frm...
Código (vb) [Seleccionar]
Private Sub Form_Load()
    'Evitar usar un Mutex superior a 256 carácteres
    'Recomiendo usar un Mutex poco común, asi evitamos problemas...
    If IsMutexRunning("MadAntrax_Mutex[73@]") = True Then End
End Sub


Así de simple!! os dejo un proyecto de ejemplo 100% funcional, la descarga esta habilitada solo a usuarios registrados!!

Saludos!! ;D
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

~~

CitarAqui vuelve el pesao de MadAntrax con otro de sus códigos...

Ya te digo...  :¬¬ :¬¬

Es broma  ;D muy weno este codigo, y todas tus aportaciones, gracias ;)