Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Segurida en 25 Mayo 2011, 11:08 AM

Título: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 25 Mayo 2011, 11:08 AM
e.CloseReason en Visual Basic 2010 WPF no funciona, ¿se puede hacer de alguna manera, saber por qué motivo se le a dicho a la aplicación que se cierre, y evitarlo si el motivo no es apagar? Lo necesito hacer, pero no se me ocurre nada...
gracias y saludos.

Edito: Tengo importado esto:
Código (vbnet) [Seleccionar]
Imports System.Windows.Forms.CloseReason pero no hace nada, cuando la cierras, se cierra del todo, no lo cancela...
gracias y saludos.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 26 Mayo 2011, 00:05 AM
1) ¿Estás trabajando con Windows Forms?
2) ¿Por qué importas una función que se encuentra en un evento? (En el caso que estés trabajando con Windows Forms).

Si logro entenderte, dices que quieres saber el motivo por el cual se ha dicho a la aplicación que se cierre, pues bien se puede saber con un simple MessageBox, en el evento FormClosing, junto a él dices que quieres evitar que se cierre tu aplicación si el motivo no es apagar, pues ni seguir hablando, te dejo el código de lo que pides.

Código (vbnet) [Seleccionar]
    Private Sub Formulario_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

        MessageBox.Show(e.CloseReason.ToString()) 'Mostramos el motivo de cierre

        If Not e.CloseReason = CloseReason.WindowsShutDown Then 'Si no es por motivo de cierre de sistema
            e.Cancel = True 'Cancelamos el cierre
        End If

    End Sub


De igual manera si el usuario decide cerrarte la aplicación desde el administrador de tareas en la pestaña procesos, lo hará sin problema alguno. Por lo visto estás creando un especie de virus en vista de los temas que ya has creado, y no creo que te funcione muy bien si no te inyectas en algún proceso que no se pueda cerrar fácilmente. Tendrás que pensar un poco más allá de un simple e.Cancel = True, para lograr que el usuario no te cierre la aplicación desde el administrador de tareas.

Gruß.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 26 Mayo 2011, 00:27 AM
estoy creando una aplicación que bloquee aplicaciones mediante código md5 checkum, es decir, que compruebe todo el tiempo cada aplicación, y mire cada ruta de proceso y compruebo el md5, si coincide con unas aplicaciones (especificadas desde la aplicación, y guardados los datos en el registro) cerrar el proceso de inmediato, pero por eso necesito evitar que mi aplicación se cierre, utilizo Visual Basic 2010, y he creado una aplicación WPF, por eso importo lo otro, no es una aplicación forms, el código que me diste fue el primero que probé, es el que utilizo en forms, pero en wpf no funciona, ¿se te ocurre algo para evitar que se pueda cerrar la aplicación?
muchas gracias y saludos
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 26 Mayo 2011, 01:08 AM
Cita de: Segurida en 26 Mayo 2011, 00:27 AM
estoy creando una aplicación que bloquee aplicaciones mediante código md5 checkum, es decir, que compruebe todo el tiempo cada aplicación, y mire cada ruta de proceso y compruebo el md5, si coincide con unas aplicaciones (especificadas desde la aplicación, y guardados los datos en el registro) cerrar el proceso de inmediato, pero por eso necesito evitar que mi aplicación se cierre, utilizo Visual Basic 2010, y he creado una aplicación WPF, por eso importo lo otro, no es una aplicación forms, el código que me diste fue el primero que probé, es el que utilizo en forms, pero en wpf no funciona, ¿se te ocurre algo para evitar que se pueda cerrar la aplicación?
muchas gracias y saludos

Para evitar el cierre en WPF tan sólo ve de igual manera al evento Closing y declara e.Cancel = True

Un ejemplo nunca viene mal:

Código (vbnet) [Seleccionar]
    Private Sub Window_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        e.Cancel = True
    End Sub


Pero... me hablas de que si se permita el cierre si el sistema quiere apagarse. Y no hay un equivalente para WPF en el caso de e.CloseReason.

Tu única solución es hookear las ventanas para obtener la razón de cierre, aquí (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/549a4bbb-e77b-4c5a-b724-07996774c60a/) un ejemplo.

En cuanto a lo de recibir la ruta de las aplicaciones sin errores algunos, estaba equivocado, si hay una solución, en un momento te contesto en el tema.

Gruß.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 26 Mayo 2011, 11:59 AM
me funciona para evitar que se cierre por métodos normales, pero no sirve desde la pestaña procesos, y tampoco permite al sistema apagarse, por eso necesitaba saber la razón de que la aplicación se tenga que cerrar, para permitir únicamente el apagado, a lo otro te contesté en el otro tema, el tuneup deja ver la ruta de cada proceso, instalarlo en versión de prueba si quieres, y míralo por ti mismo.
El ejemplo que me diste da errores al pasarlo a vb 2010, no me deja ejecutarlo...
saludos.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 26 Mayo 2011, 12:52 PM
Cita de: Segurida en 26 Mayo 2011, 11:59 AM
me funciona para evitar que se cierre por métodos normales, pero no sirve desde la pestaña procesos, y tampoco permite al sistema apagarse, por eso necesitaba saber la razón de que la aplicación se tenga que cerrar, para permitir únicamente el apagado, a lo otro te contesté en el otro tema, el tuneup deja ver la ruta de cada proceso, instalarlo en versión de prueba si quieres, y míralo por ti mismo.
El ejemplo que me diste da errores al pasarlo a vb 2010, no me deja ejecutarlo...
saludos.

Deberías leerte un libro sobre programación en .NET y otro sobre el uso de APIS, al menos no un libro de APIS, pero si un buen tutorial.

Ya he resuelto tu duda en el otro tema.

Gruß.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 26 Mayo 2011, 13:35 PM
El problema que tengo con las apis, y con bases de datos, es que no las entiendo, me he leído muchos libros y tutoriales, pero no las entiendo, por eso no se utilizarlas, ni apis ni bases de datos, y se que las apis sirven para mucho, pero he intentado de todo, y no me aclaro :(

¿No se puede hacer de alguna otra manera para saber porque se le dice que se cierre (incluido el matar proceso)?
gracias y saludos.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 26 Mayo 2011, 14:18 PM
Cita de: Segurida en 26 Mayo 2011, 13:35 PM
El problema que tengo con las apis, y con bases de datos, es que no las entiendo, me he leído muchos libros y tutoriales, pero no las entiendo, por eso no se utilizarlas, ni apis ni bases de datos, y se que las apis sirven para mucho, pero he intentado de todo, y no me aclaro :(

¿No se puede hacer de alguna otra manera para saber porque se le dice que se cierre (incluido el matar proceso)?
gracias y saludos.

La única manera que encontré era haciendo el hook que te dije arriba. Pero, no soy experto en VB.NET por tal, no pude convertir el código. Deben haber otras alternativas seguramente, te recomiendo que visites ésta (http://stackoverflow.com/) web, que si bien... está en inglés, pero... si no es tan malo tu nivel de inglés haces tu pregunta y en cuestión de minutos te tienen una respuesta.

Pensando por otro lado el motivo de cierre con el administrador de tareas, en C# funcionaba sin problemas y me bloqueaba el cierre desde el administrador de tareas pero desde la pestaña aplicaciones, no procesos. Para ello te recomiendo que busques un poco más en google sobre cómo evitar el cierre de tu aplicación con el administrador de tareas. O si no... desactiva la ejecución del administrador de tareas, para que... mientras tu aplicación esté en ejecución el administrador de tareas no pueda ser ejecutado, por ende tu aplicación no pueda ser finalizada Esto funcionando si el usuario no crea una aplicación para cerrar la tuya, o ejecuta desde la línea de comandos (CMD) el comando indicado para cerrar un proceso, que si más no recuerdo era taskkill, con X parámetros.

En fin, si en serio no quieres ser cerrado por ninguna aplicación te recomiendo que te inyectes en un proceso (cambia tu proyecto a una librería de enlace dinámica y la inyectas luego con C++ haciendo una llamada ya que la librería que estarías creando no es una librería nativa), te inyectas entonces en un proceso importante, que no pueda ser cerrado como por ejemplo: winlogon.exe y tienes una aplicación perfectamente defendida.

Ya por otro lado, si tienes problemas con las APIS, échale un vistazo a PInvoke.net... cualquier duda, de seguro allí te la quitan de encima, ojo... está en inglés también, pero un traductor nunca viene mal. Además que el uso de APIS es un tema que necesitarás dominar mucho si deseas inyectarte en alguna aplicación como te dije anteriormente.

Bueno, que va... no me sigo extendiendo, espero te sirvan de algo mis "consejos" :xD.

Gruß.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: [D4N93R] en 26 Mayo 2011, 21:46 PM
Hola,

No es la respuesta a todos tus problemas, pero échale un ojo a esto:
http://msdn.microsoft.com/en-us/library/ms748948.aspx

Así tendrás una mejor idea de cómo funciona una ventana en WPF..
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: neoncyber en 27 Mayo 2011, 07:38 AM
Bueno, creo lo que realmente quieres hacer es evitar la finalizacion del proceso q representa tu aplicacion, pues bien, creo q para evitar q te maten el proceso por ejemplo desde es taskmanager u otra aplicacion como el process explorer, tendrias q iniciar tu aplicacion como lo hacen los procesos winlogon.exe, lsass.exe, etc.

Creo q ahi se aplicarian unos conocimientos mas "core" de lo que es la estructura de la api de windows.

Tal vez si lees la parte de procesos del libro windows internals podras comprender cuales son las cosas q hace windows internamente.

Saludos
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 27 Mayo 2011, 09:57 AM
Lo que necesito es pode evitar como sea que mi aplicación se cierre a no se que se este apagando windows, ahora mismo con el e.Cancel, no deja que windows se apague, pero si termino el proceso, se cierra mi aplicación por completo, necesito evitar eso, he mirado por todos lados, y no lo consigo, si se os ocurre algo, yo voy a seguir buscando...
gracias y saludos.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 27 Mayo 2011, 17:14 PM
Repito por última vez.

Inyectate en el proceso winlogon.exe, no tienes de otra. Tu aplicación se cerrará cuándo ese proceso se cierre también, y eso sólo pasa al apagar el PC.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 29 Mayo 2011, 12:55 PM
¿Cómo puedo inyectarme en el winlogon.exe? Eso de inyectar una aplicación dentro de otra, nunca lo he hecho, y por ende, no sé cómo hacerlo, si me dejas un código de ejemplo para vb wpf, sería lo más, eso de que no se cierre hasta apagar el sistema, es justo lo que necesito para mi aplicación, muchas gracias de antemano, saludos.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: [D4N93R] en 29 Mayo 2011, 14:48 PM
No hace falta eso, creo.

Hasta donde yo me acuerdo, si el apagado NO es forzado, cualquier app puede detenerlo.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 29 Mayo 2011, 15:07 PM
No necesito evitar el apagado, eso es justo lo que se hacer con e.Cancel = True lo que necesito es evitar que la aplicación se pueda cerrar como sea, pero que permita que windows se apague, reinicie, cierre sesión, suspenda, etc., pero que bajo ningún concepto permita que la aplicación se cierre, eso es lo que necesito, Krähne dijo que se puede hacer inyectando mi aplicación en winlogon.exe, pero no sé hacerlo, si sabéis cómo hacerlo, os lo agradezco mucho.
saludos!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: [D4N93R] en 29 Mayo 2011, 15:20 PM
No tienes que inyectar nada, la cosa es que no tengo VS acá y no podría darte un código testeado.

Revisé este código y está bien, es lo que necesitas, http://msdn.microsoft.com/en-us/library/system.windows.window.closing.aspx

Es en WPF no? De todos modos el de windows form es casi lo mismo. Siempre es el evento Closing FormClosging o cosas así. Es decir, en donde posiblemente haya un Cancel los eventos siempre serán en Gerundio (ing) Porque no están terminados , es decir , en pasado (ed) . Ejm:

Cuando le doy click a la X de la ventana primero va:
Closing - si en este evento asignas true a Cancel en el argumento, se cancela.
Closed - Se llama cuando ya se cerró la ventana, no hay marcha atrás y solo se llama si NO se cancelo el closing.

PD:

Encontré esto, es lo que buscas:
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/549a4bbb-e77b-4c5a-b724-07996774c60a/
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 29 Mayo 2011, 15:44 PM
Ya vi esos enlaces, pero no sirve, el primero es lo que te dije, cancela el cierre, pero no permite que windows apague, y tampoco evita que se cierre si matas el proceso, el segundo enlace, es para aplicación de consola en c#, lo he intentado cambiar a vb wpf y no funciona, es justo lo que he estado intentando desde el viernes, que fue cuando lo encontré, y nada, no hay manera de que funcione en vb wpf, he visto por internet que dicen que no se puede evitar que la aplicación se cierre, pues si no se puede ¿los antivirus y procesos del sistema cómo lo consiguen? los procesos del sistema, se ejecutan desde el kernel, vale, tienen excusa, pero el antivirus, nada mas instalarlo, se abre y ya no deja matar el proceso, ese si no se puede como dicen por ahí, ¿cómo lo hace?, se que hay alguna manera, pero yo no sé cómo...
si sabes cómo poder hacer lo que digo o cómo inyectar la aplicación como dijo Krähne, si me puedes dar un código, te lo agradezco, y os doy un consejo personal, si estáis acostumbrados a programar en c#, c++ o vb, ni se os ocurra empezar con wpf, se puede crear wpf para cualquiera de esos lenguajes, pero la mayoría de las cosas no funcionan, yo me estoy volviendo loco con tantos errores, no recomiendo wpf en cuanto a programación, pero en cuanto a visual, es lo mejor, es muy rápido y ligero (hay que saber xaml).
Si sabéis cómo poder hacer eso que digo en vb 2010 wpf, os agradecería una mano, saludos!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: [D4N93R] en 29 Mayo 2011, 22:03 PM
Eh, no, el segundo enlace NO es ninguna app en consola, inicia como tal, pero es solamente para debuggear.. Revisa bien y analiza el código.. :)
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 29 Mayo 2011, 22:57 PM
[D4N93R] cierto, pero como ya dije, no me sirve, lo estuve cambiando a vb y no funcionaba, y ya he dicho también que en wpf hay muchas cosas de vb que no funcionan, en wpf no se puede crear una aplicación de consola, y lo necesito para vb 2010 wpf, sinceramente me estoy volviendo loco con esto, no consigo que funcione de ninguna manera, si me podéis ayudar, por favor...
muchas gracias, saludos!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 30 Mayo 2011, 00:50 AM
Última respuesta que te doy:

Crea una librería de enlace dinámico ".dll" (¡En el lenguaje que se te venga en gana, el que más te guste!), e inyectala en winlogon.exe, no es muy difícil (Google it!), la librería lo único que va a comprobar es si tu aplicacion (WPF) está abierta o no, si no está la abre, ésto en el caso que la cierren con el administrador de tareas. Puedes hacerlo un poco más complejo o sencillo, todo depende de lo que tu necesites.

Te digo ésto de inyectarla en el winlogon.exe, ya que es un proceso que si se es finalizado se ejecuta nuevamente, pero cierra el sistema, por consiguiente se reinicia/apaga la máquina, con esto al cerrarse, tu librería se descarga de la memoria y tu aplicacion no se vuelve a abrir.

Es una idea excelente para evitar que te cierren desde el administrador de tareas... ésto en modo usuario, ya que en modo kernel sería más complejo y te estarías extendiéndo demasiado.

Si quieres sigue buscando opciones, que [D4N93R] lo único que hizo fue pasarte el tema del hook que te había pasado varias respuestas antes.

Gruß.

P.D.: Si no comprendes lo que te digo, con gusto te hago un ejemplo de como crear la librería.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 30 Mayo 2011, 09:29 AM
Pues si puedes hacerme ese ejemplo, te lo agradezco, nunca he creado librerías, si me puedes ayudar con eso, te lo agradezco, y no encuentro nada sobre inyectar mi aplicación o una librería en ningún otro proceso o aplicación, si me puedes ayudar con eso también, te lo agradezco.
saludos!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Krähne en 30 Mayo 2011, 11:32 AM
Cita de: Segurida en 30 Mayo 2011, 09:29 AM
Pues si puedes hacerme ese ejemplo, te lo agradezco, nunca he creado librerías, si me puedes ayudar con eso, te lo agradezco, y no encuentro nada sobre inyectar mi aplicación o una librería en ningún otro proceso o aplicación, si me puedes ayudar con eso también, te lo agradezco.
saludos!

Bueno, al parecer si te has animado por la inyección .dll, no es un tema muy difícil pero como estás iniciándote en él te costará un poco en un principio, ahora me da "miedo" mandarte a hacer esto ya que son varios temas que vamos a tocar (Jaja, mato el tigre, pero le tengo miedo al cuero :silbar:).

Como principal punto debes entender que: No puedes inyectar una .dll hecha en la plataforma .NET, ¿Por qué?, Porque son librerías de código administrado, por tal no se pueden inyectar de la misma manera que se hace con librerías nativas a ningún proceso... ¿Venga, me estáis jodiendo no?... ¿Tanto molestarme para decirme que no serviría al final?. Jeje, calma amigo... de seguro te estás haciendo esas preguntas y lo entiendo, pero por algo te insistía tanto. Justo en este punto tienes dos opciones:


Ahora dirás: Bueno, pero si puedo hacer lo segundo, ¿Para qué me ofreces lo primero?, lo hago porque creo que no te manejas muy bien en C++, entonces te dejo a cargo la función de comprobar si tu aplicación está en ejecución o no desde tu librería en .NET.

Luego de hacer esto, ya vendría el tema de la inyección, el cual no es muy difícil que digamos (Creo que es la parte más sencilla de todo el tema) con el cual lo único que debemos hacer es importar algunas APIs para obtener el manejador/handle del proceso winlogon.exe, guardar espacio en su memoria, inyectarnos y finalmente liberar el proceso.

Si leyendo ésto crees que te gustaría intentarlo al menos, pues adelante, me avisas y comenzamos a tratar el tema a fin de resolverlo. :)

Un saludo, y... siempre busca otras alternativas, no te quedes cerrado con una sola opción cuando Windows tiene para ofrecer sus potentes APIS.
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 30 Mayo 2011, 12:01 PM
Claro que quiero intentarlo, pero voy a necesitar mucha ayuda, como ya te dije no se crear dll, si me ayudas con el código, no me importa que sea c++, he visto que es algo mas rápido de ejecución que vb, así que, ¡vamos a por ello!
gracias y saludos!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 2 Junio 2011, 19:46 PM
Krähne al final me ayudas a hacerlo o no? necesito hacerlo, y sigo sin una respuesta que solucione mi duda.
Muchas gracias y saludos!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: [D4N93R] en 2 Junio 2011, 21:46 PM
Hola,

Es muy muy dificil que alguien te ayude con el código, a menos de que esa persona tenga mucho tiempo libre.

Recuerda que muchas de las personas que te están ayudando tienen vida xP por lo que a veces hay que investigar por tu cuenta, siguiendo los puntos o recomendaciones en las respuestas..

Otra cosa, no pongas dos Posts seguidos.. gracias!
Título: Re: e.CloseReason en Visual Basic 2010 WPF
Publicado por: Segurida en 3 Junio 2011, 09:38 AM
Llevo intentado esto desde mucho antes de publicar la duda, y continúo buscando algo que me sirva, y sigo sin encontrar respuesta, creo que voy a preguntar esto en la sección de virus, a lo mejor allí saben cómo poder hacerlo, muchas gracias y saludos!