elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Hay alguna funcion para evitar que un archivo se cierre?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Hay alguna funcion para evitar que un archivo se cierre?  (Leído 3,844 veces)
scott_


Desconectado Desconectado

Mensajes: 458


Mientras luches, ya eres un ganador


Ver Perfil
¿Hay alguna funcion para evitar que un archivo se cierre?
« en: 8 Abril 2015, 09:07 am »

Muy buenas hermanos.

Como dice le titulo, ¿hay alguna funciona para que no se pueda finalizar un proceso?
He estado invesigando pero no se si es correcto:

Código:
e.CloseReason = CloseReason.TaskManagerClosing
"o agregar":
Código:
e.CloseReason = CloseReason.TaskManagerClosing OrElse e.CloseReason = CloseReason.WindowsShutDown

Si alguien me explica estaría muy agradecido.
Muchas Gracias por su tiempo y Saludos.


En línea

Si no intentas salvar una vida, jamás salvarás la de nadie más
Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.788



Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #1 en: 8 Abril 2015, 18:16 pm »

Buenas

¿hay alguna funciona para que no se pueda finalizar un proceso?

No, no es posible, por motivos obvios de seguridad un proceso no puede evitar su terminación incondicional, pero al menos puedes controlar el cierre voluntario por parte del usuario.

Aplicaciones cómo por ejemplo el Administrador de tareas (taskmgr) llaman a la función TerminateProcess para matar incondicionalmente un proceso, repito, incondicionalmente:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686714.aspx?f=255&MSPPError=-2147217396

Dicha función no "pregunta" al proceso si puede ser cerrado y no necesita el permiso del proceso para cerrarlo, por algo puedes matar procesos que no estén respondiendo.



He estado invesigando pero no se si es correcto:

Código:
e.CloseReason = CloseReason.TaskManagerClosing

La propiedad e.CloseReason que has mostrado se usa en la plataforma .Net, ¿debemos suponer que estás intentando hacerlo en VB.Net o C#?, especifica que lenguaje utilizas al menos.

CloseReason.TaskManagerClosing es simplemente un valor de una enumeración para determinar el motivo del cierre, nada más:
https://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx?f=255&MSPPError=-2147217396

La ventana recibe el mensaje de windows WM_CLOSE (0x10) para solictar la terminación de la aplicación:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632617%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

Te muestro un ejemplo escrito en Vb.Net de cómo puedes interceptar el mensaje recibido y cancelarlo:

Código
  1.    ''' <summary>
  2.    ''' Specifies A Windows Message Identifier.
  3.    ''' </summary>
  4.    Public Enum WindowsMessages As Integer
  5.  
  6.        WM_CLOSE = &H10
  7.  
  8.    End Enum
  9.  
  10.    ''' <summary>
  11.    ''' Invokes the default window procedure associated with this window to process messages.
  12.    ''' </summary>
  13.    ''' <param name="m">
  14.    ''' A <see cref="T:System.Windows.Forms.Message"/> that is associated with the current Windows message.
  15.    ''' </param>
  16.    Protected Overrides Sub WndProc(ByRef m As Message)
  17.  
  18.        If m.Msg = WindowsMessages.WM_CLOSE Then
  19.           ' Do Nothing
  20.        Else
  21.            MyBase.WndProc(m)
  22.  
  23.        End If
  24.  
  25.    End Sub

Pero eso solo sirve cuando "el usuario cierra la aplicación",
el evento de cierre no se puede cancelar una vez que la terminación incondicional del proceso ha sido enviada,
puedes comprobarlo tu mismo con el código de arriba y también con el siguiente código, verás que el código del interior del bloque de la condicional jamás se llegará a procesar (ni el evento a cancelar, claro está) si matas la aplicación desde el administrador de tareas puesto que la ejecución termina de forma inminente:

Código
  1.    ''' <summary>
  2.    ''' Handles the FormClosing event of the Form1 control.
  3.    ''' </summary>
  4.    ''' <param name="sender">The source of the event.</param>
  5.    ''' <param name="e">The <see cref="FormClosingEventArgs"/> instance containing the event data.</param>
  6.    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
  7.    Handles Me.FormClosing
  8.  
  9.        If e.CloseReason <> CloseReason.UserClosing Then
  10.            e.Cancel = True
  11.            IO.File.Create("C:\Test.txt").Dispose()
  12.        End If
  13.  
  14.    End Sub



Si alguien me explica estaría muy agradecido.

Hay dos soluciones viables:

· Mantener dos procesos distintos en ejecución, el segundo proceso podría ser un servicio de windows que monitorizase el estado del primer proceso para detectar el cierre y volver a ejecutar una nueva instancia del proceso después de haber sido cerrado. Obviamente esto no evita que ambos procesos puedan ser matados incondicionalmente.

· Hookear la API TerminateProcess y opcionalmente ExitProcess para interceptar las llamadas a dicha función, y cancelarlas. Aparte de estar controlando adicionalmente el cierre voluntario en tu aplicación.

Te muestro un ejemplo de API hooking escrito en VB.Net, utilizo la librería Deviare (también puedes utilizar Microsoft Detours en C++), el hook se adjunta al proceso activo taskmgr.exe para evitar que éste pueda terminar ningún proceso, interceptando las llamadas que dicho proceso hace a la función TerminateProcess para cancelarlo (en la pre-llamada):

Código
  1. Imports Nektra.Deviare2
  2.  
  3. Public NotInheritable Class Form1
  4.  
  5.    Public WithEvents SpyMgr As NktSpyMgr
  6.    Public Hook As NktHook
  7.  
  8.    ' TerminateProcess API reference:
  9.    ' https://msdn.microsoft.com/es-es/library/windows/desktop/ms686714%28v=vs.85%29.aspx
  10.    ReadOnly libName As String = "kernel32.dll"
  11.    ReadOnly funcName As String = "TerminateProcess"
  12.    ReadOnly hookFlags As eNktHookFlags = eNktHookFlags.flgOnlyPreCall ' Or eNktHookFlags.flgAutoHookChildProcess
  13.  
  14.    ' Processes to attach the hook.
  15.    ReadOnly processesToAttach As IEnumerable(Of Process) =
  16.        Process.GetProcessesByName("taskmgr")
  17.  
  18.    Private Sub Test() Handles MyBase.Load
  19.  
  20.        If Me.processesToAttach.Count = 0 Then
  21.            MsgBox("No se encontró ningún proceso al que adjuntar.")
  22.  
  23.        Else
  24.            Me.SpyMgr = New NktSpyMgr()
  25.            Me.SpyMgr.Initialize()
  26.  
  27.            Me.Hook = SpyMgr.CreateHook(String.Format("{0}!{1}", libName, funcName), hookFlags)
  28.            Me.Hook.Hook(sync:=True)
  29.  
  30.            For Each proc As Process In processesToAttach
  31.                Debug.WriteLine("Attaching to: " & proc.ProcessName)
  32.                Me.Hook.Attach(procOrId:=proc.Id, sync:=True)
  33.            Next proc
  34.  
  35.        End If
  36.  
  37.    End Sub
  38.  
  39.    <MTAThread>
  40.    Private Sub OnTerminateProcess_Called(ByVal hook As NktHook,
  41.                                          ByVal proc As NktProcess,
  42.                                          ByVal callInfo As NktHookCallInfo) Handles SpyMgr.OnFunctionCalled
  43.  
  44.        ' Signature params.
  45.        Dim hProcessParam As NktParam = DirectCast(callInfo.Params(0), NktParam)
  46.        Dim uExitCodeParam As NktParam = DirectCast(callInfo.Params(1), NktParam)
  47.  
  48.        Dim hProcessValue As IntPtr = New IntPtr(CInt(hProcessParam.Value))
  49.        Dim uExitCodeValue As UInteger = CUInt(uExitCodeParam.Value)
  50.  
  51.        Trace.WriteLine(String.Format("hProcess : '{0}'", hProcessValue))
  52.        Trace.WriteLine(String.Format("uExitCode: '{0}'", uExitCodeValue))
  53.  
  54.        If callInfo.IsPreCall Then ' Skip precall. Avoid process termination.
  55.            callInfo.Result.Value = 1
  56.            callInfo.SkipCall()
  57.        End If
  58.  
  59.    End Sub
  60.  
  61. End Class

PD: El primer parámetro de TerminateProcess especifica el handle del proceso que se va a matar, con eso puedes determinar que proceso es, pero lee bien la documentación de MSDN que te he dejado arriba por que me parece que es más complicado que una simple verificación de handles... quizás puedas necesitar la siguiente enumeración para la verificación:

Código
  1.    Public Enum ProcessAccessFlags As UInteger
  2.        All = &H1F0FFF
  3.        Terminate = &H1
  4.        CreateThread = &H2
  5.        VirtualMemoryOperation = &H8
  6.        VirtualMemoryRead = &H10
  7.        VirtualMemoryWrite = &H20
  8.        DuplicateHandle = &H40
  9.        CreateProcess = &H80
  10.        SetQuota = &H100
  11.        SetInformation = &H200
  12.        QueryInformation = &H400
  13.        QueryLimitedInformation = &H1000
  14.        Synchronize = &H100000
  15.    End Enum

Saludos


« Última modificación: 8 Abril 2015, 19:13 pm por Eleкtro » En línea

scott_


Desconectado Desconectado

Mensajes: 458


Mientras luches, ya eres un ganador


Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #2 en: 9 Abril 2015, 08:50 am »

He tratado de desarrollarlo en C#, pero con el informe que me has dado y los ejemplos mostrados en VB, pues he observado que el archivo no se puede cerrar, ni tampoco eliminar sin usar taskmgr. El típico proceso que no se cierra porque se esta ejecutando. Y pues para lo que estoy probando me es mas que suficiente.

Pero me entro otra duda. Sobre El Drag Drop desde .bat del anterior tema.
Código:
copy "%UserProfile%\AppData\Roaming\File.exe" "%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup"

¿Y me gustara saber como lo puedo hacer para ejecutar un Drag Drop al abrir un archivo, el que sea en VB o en (batch).bat?
Es decir que lo copie el mismo archivo en cualquier directorio, cuando se abra.

Gracias por tomarte la molestia de responder.
Te agradezco mucho.
Gracias y Saludos.
« Última modificación: 9 Abril 2015, 08:53 am por owl-eyes » En línea

Si no intentas salvar una vida, jamás salvarás la de nadie más
Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.788



Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #3 en: 9 Abril 2015, 09:48 am »

me gustara saber como lo puedo hacer para ejecutar un Drag Drop al abrir un archivo

¿Puedes intentar ser más específico?, no entendí lo que pretendes decir con "ejecutar un drag drop al abrir un archivo".

¿Te refieres a añadir capacidad Drag&Drop (arrastrar y soltar) de archivos en un Form?...

...En ese caso primero debes activar la propiedad 'AllowDrop' del Form/Control y suscribirte a los eventos 'DragEnter' y 'DragDrop' de dicho Form/Control, el primer evento se dispara al arrastrar y el segundo evento al soltar.

Te muestro un ejemplo con un TextBox:

Código
  1.    ''' <summary>
  2.    ''' Handles the DragEnter event of the Textbox1 control.
  3.    ''' </summary>
  4.    ''' <param name="sender">The source of the event.</param>
  5.    ''' <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
  6.    Private Sub Textbox1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) _
  7.    Handles TextBox1.DragEnter
  8.  
  9.        If e.Data.GetDataPresent(DataFormats.FileDrop) AndAlso
  10.           DirectCast(e.Data.GetData(DataFormats.FileDrop), IEnumerable(Of String)).
  11.                      All(Function(path As String) IO.File.GetAttributes(path).HasFlag(IO.FileAttributes.Archive)) Then
  12.  
  13.            e.Effect = DragDropEffects.All
  14.  
  15.        Else
  16.            e.Effect = DragDropEffects.None
  17.  
  18.        End If
  19.  
  20.    End Sub
  21.  
  22.    ''' <summary>
  23.    ''' Handles the DragDrop event of the Textbox1 control.
  24.    ''' </summary>
  25.    ''' <param name="sender">The source of the event.</param>
  26.    ''' <param name="e">The <see cref="DragEventArgs"/> instance containing the event data.</param>
  27.    Private Sub Textbox1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) _
  28.    Handles TextBox1.DragDrop
  29.  
  30.        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
  31.  
  32.            Dim paths As IEnumerable(Of String) =
  33.               From path As String In DirectCast(e.Data.GetData(DataFormats.FileDrop), IEnumerable(Of String))
  34.               Order By path Ascending
  35.  
  36.            Me.TextBox1.Text = String.Join("; ", paths)
  37.  
  38.        End If
  39.  
  40.    End Sub

Traducción online a C#:
Código
  1. /// <summary>
  2. /// Handles the DragEnter event of the Textbox1 control.
  3. /// </summary>
  4. /// <param name="sender">The source of the event.</param>
  5. /// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
  6. private void Textbox1_DragEnter(object sender, DragEventArgs e)
  7. {
  8. if (e.Data.GetDataPresent(DataFormats.FileDrop) && ((IEnumerable<string>)e.Data.GetData(DataFormats.FileDrop)).All((string path) => IO.File.GetAttributes(path).HasFlag(IO.FileAttributes.Archive))) {
  9.  
  10. e.Effect = DragDropEffects.All;
  11.  
  12. } else {
  13. e.Effect = DragDropEffects.None;
  14. }
  15. }
  16.  
  17. /// <summary>
  18. /// Handles the DragDrop event of the Textbox1 control.
  19. /// </summary>
  20. /// <param name="sender">The source of the event.</param>
  21. /// <param name="e">The <see cref="DragEventArgs"/> instance containing the event data.</param>
  22. private void Textbox1_DragDrop(object sender, DragEventArgs e)
  23. {
  24. if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
  25.  
  26. IEnumerable<string> paths = from path in (IEnumerable<string>)e.Data.GetData(DataFormats.FileDrop) orderby path ascending;
  27. this.TextBox1.Text = string.Join("; ", paths);
  28. }
  29. }
  30.  
  31. //=======================================================
  32. //Service provided by Telerik (www.telerik.com)
  33. //=======================================================

PD: No te rebajes a utilizar Batch pudiendo manejarte en un lenguaje de alto nivel.

Saludos
« Última modificación: 9 Abril 2015, 09:56 am por Eleкtro » En línea

scott_


Desconectado Desconectado

Mensajes: 458


Mientras luches, ya eres un ganador


Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #4 en: 10 Abril 2015, 00:03 am »

Me parece excelente la traducción en C#, pero no es lo que busco exactamente, me refiero a que un ejecutable se abra y se copie en un directorio.
El ejemplo te lo dejo aqui:
http://www.mediafire.com/download/8md4ra7iz6rir3q/File.rar

Voy a tomar en cuenta el script que me dejaste.

Te agradezco por tu tiempo.
Gracias y Saludos.
En línea

Si no intentas salvar una vida, jamás salvarás la de nadie más
Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.788



Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #5 en: 10 Abril 2015, 00:30 am »

me refiero a que un ejecutable se abra y se copie en un directorio.

Código
  1. Imports System.IO
  2.  
  3. Dim destFilePath As String =
  4.    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
  5.                 Path.GetFileName(Application.ExecutablePath))
  6.  
  7. File.Copy(sourceFileName:=Application.ExecutablePath,
  8.          destFileName:=destFilePath)

¿Eso dices?

Saludos
En línea

scott_


Desconectado Desconectado

Mensajes: 458


Mientras luches, ya eres un ganador


Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #6 en: 10 Abril 2015, 01:13 am »

Si ese es el código que busco.

En mi caso en C#:
Código
  1. using System.IO;
  2. string destFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Path.GetFileName(Application.ExecutablePath));
  3. File.Copy(Application.ExecutablePath, destFilePath);

No me queda que agradecerte por tu tiempo invertido.
Muchas Gracias y Saludos.
En línea

Si no intentas salvar una vida, jamás salvarás la de nadie más
Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.788



Ver Perfil
Re: ¿Hay alguna funcion para evitar que un archivo se cierre?
« Respuesta #7 en: 10 Abril 2015, 05:04 am »

de nada hombre

saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines