Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: 4dr14n31t0r en 19 Febrero 2017, 19:42 pm



Título: ¿Como puedo detectar si mi programa fue ejecutado desde terminal?
Publicado por: 4dr14n31t0r en 19 Febrero 2017, 19:42 pm
O mejor dicho, ¿Es posible?


Título: Re: ¿Como puedo detectar si mi programa fue ejecutado desde terminal?
Publicado por: Eleкtro en 22 Febrero 2017, 05:06 am
O mejor dicho, ¿Es posible?

Suponiendo que estemos refiriéndonos a un executable de Windows con interfáz gráfica, entonces cada vez que inicias dicho executable desde el proceso CMD, la instancia de consola de la CMD se adjunta al proceso iniciado desde esa CMD (EDITO: por supuesto no es que la ventana de la CMD se adhiera a la GUI, eso no ocurre :xD), y esto nos permite comprobar facilmente si nuestra aplicación fue iniciada o no desde la consola. ¿Cómo?, pues intentando adjuntarle una consola a nuestro proceso haciendo uso de la función Win32 AttachConsole y comprobando el valor de retorno de dicha función. Recuerda liberar la consola adjuntada para la evaluación, con la función FreeConsole.

  • AttachConsole function | MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681952%28v=vs.85%29.aspx)
  • FreeConsole function | MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683150(v=vs.85).aspx)

Esta es la forma en que se puede detectar si una aplicación de .NET fue iniciada desde la consola o no. Y para ser honestos desconozco si este procedimiento automático de adjunción de consola actua de la misma manera para todos los executables con interfáz gráfica o solamente para los ensamblados .NET con interfáz gráfica. Será cuestión de que lo compruebes por ti mismo.



Te dejo aquí un código de ejemplo para .NET:

Código
  1. Imports System.Security
  2.  
  3. Public NotInheritable Class NativeMethods
  4.  
  5.    <SuppressUnmanagedCodeSecurity>
  6.    <DllImport("Kernel32.dll", SetLastError:=True)>
  7.    Public Shared Function AttachConsole(ByVal pid As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
  8.    End Function
  9.  
  10.    <SuppressUnmanagedCodeSecurity>
  11.    <DllImport("Kernel32.dll", SetLastError:=True)>
  12.    Public Shared Function FreeConsole() As <MarshalAs(UnmanagedType.Bool)> Boolean
  13.    End Function
  14.  
  15. End Class
  16.  
  17. Public NotInheritable Class AppUtil
  18.  
  19.    Public Shared ReadOnly Property IsAppExecutedFromConsole() As Boolean
  20.        <DebuggerStepThrough>
  21.        Get
  22.            Dim result As Boolean = NativeMethods.AttachConsole(-1)
  23.            If (result) Then
  24.                NativeMethods.FreeConsole()
  25.            End If
  26.            Return result
  27.        End Get
  28.    End Property
  29.  
  30. End Class
  31.  
  32. Public NotInheritable Class Form1 : Inherits Form
  33.  
  34.    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
  35.        MsgBox(AppUtil.IsAppExecutedFromConsole)
  36.    End Sub
  37.  
  38. End Class

¡Saludos!