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


 


Tema destacado: Página de elhacker.net en Google+ Google+


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General (Moderador: Eleкtro)
| | |-+  ¿Como puedo detectar si mi programa fue ejecutado desde terminal?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Como puedo detectar si mi programa fue ejecutado desde terminal?  (Leído 106 veces)
4dr14n31t0r

Desconectado Desconectado

Mensajes: 84



Ver Perfil
¿Como puedo detectar si mi programa fue ejecutado desde terminal?
« en: 19 Febrero 2017, 19:42 »

O mejor dicho, ¿Es posible?


En línea

Eleкtro
Novato Astral y
Moderador Global
***
Conectado Conectado

Mensajes: 8.624


El sentido común es el menos común de los sentidos


Ver Perfil
Re: ¿Como puedo detectar si mi programa fue ejecutado desde terminal?
« Respuesta #1 en: 22 Febrero 2017, 05:06 »

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.


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!


« Última modificación: 22 Febrero 2017, 07:25 por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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