Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Krähne

#21
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 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ß.
#22
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ß.
#23
Cita de: Segurida en 26 Mayo 2011, 10:43 AM
Lo de System e Idle, no se a qué proceso te refieres, si te instalas TuneUp 2011, hay una parte que se llama TuneUp Process Manager, ahí te da el nombre, ruta, nombre de archivo, etc... el unico que encuentro en winlogon.exe, esta en c:\windows\system32 en esto del tuneup se llama "aplicación de inicio de sesion de windows", le das un clic y abajo te pone el resto y si le das dos clics te da más info :) de verdad, que se puede sacar la ruta de todos los rocesos, pero yo no se cómo hacerlo, si no me crees, instalate el tuneup, y lo compruebas por ti mismo.
saludos.

Bueno... luego de pensarlo bien, he terminado por bajarme el TuneUP (Vaya que lo detesto) para nada.

Al abrir el TuneUP y llegar a donde me dices, me encuentro con que el cutre software tampoco logra obtener la ruta de los procesos que te dije, exceptuando winlogon.exe (proceso del cual ya logré obtener su ruta).

Los procesos son llamados así en el administrador de tareas:

System
Proceso inactivo del sistema


Y en el TuneUP tan sólo les cambian el nombre a:

System -> Proceso del sistema
Proceso inactivo del sistema -> El mismo nombre


Estos tienen por ID:

System -> 4
Proceso inactivo del sistema -> 0


Y son procesos con archivos cuya locación no existe, no sé el porqué, a lo mejor son creados por el kernel virtualmente, lo único que sé es que System inicia el Proceso inactivo del sistema (He allí el porqué de sus IDs tan bajos) y en adelante se cargará el resto, luego explorer.exe hace lo demás supongo...

Finalmente he logrado obtener la ruta de todos los procesos, con excepción de esos 2, al igual que el TuneUP, así que... por mi lado no obtendrás más ayuda que ésta, y sinceramente dudo que encuentres otro tipo de ayuda ya que, ni si quiera el "grandioso" TuneUP logra obtener esas rutas.

La manera en que obtuve la ruta de cada proceso, no fue elevando mis privilegios, fue con el uso de APIS, dejándo de lado las clases Process, y demás que tiene la plataforma .NET, sin embargo y en contraposición con lo que acabé de decir, usé la clase Process para obtener cada ID de proceso y su nombre, para así mediante APIS obtener sus directorios.

El código es el siguiente:

Código (vbnet) [Seleccionar]
Imports System.Text 'Importación necesaria para el StringBuilder.
Imports System.Diagnostics 'Importacion obligatoria para obtener los IDs y Nombres de cada proceso.
Imports System.Runtime.InteropServices 'Importación más que obligatoria para poder declarar las APIS a usar.

Public Class Formulario

   <DllImport("kernel32.dll")> _
   Private Shared Function OpenProcess(ByVal dwDesiredAccess As Integer, <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
   End Function 'Declaramos la API OpenProcess para abrir el handle del proceso al que queremos obtener su directorio, le pasamos como primer parámetro el número de acceso correspondiente al procedimiento a realizar, con ésto ya nos evitamos el hecho de "elevar" privilegios.

   <DllImport("psapi.dll")> _
   Public Shared Function GetModuleFileNameEx(ByVal hProcess As IntPtr, ByVal hModule As IntPtr, <Out()> ByVal lpBaseName As StringBuilder, <[In]()> <MarshalAs(UnmanagedType.U4)> ByVal nSize As Integer) As UInteger
   End Function 'Declaramos la API GetModuleFileNameEx para obtener el directorio del módulo que se le pase como parámetro, pero... como no pasarémos ningún parámetro al momento de elegir un módulo, el elegirá el primer módulo del proceso, justo lo que necesitamos.

   <DllImport("kernel32.dll", SetLastError:=True)> _
   Public Shared Function CloseHandle(ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
   End Function 'Finalmente se declara la API CloseHandle para cerrar el handle abierto por OpenProcess.

   Private Sub ObtenerDatos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
       ObtenerDatosProcesos() 'Realizamos el proceso para la obtención de datos de cada proceso.
   End Sub

   Public Sub ObtenerDatosProcesos() 'Creamos la función que no devuelve datos para agregar la información al ListView.
       Dim DirectorioActual As New StringBuilder(1024) 'Declaramos el StringBuilder de tamaño 1024 que nos pide como tercer parámetro GetModuleFileNameEx para guardar allí la ruta del proceso.
       Dim Procesos As Process() = Process.GetProcesses() 'Enlistamos los procesos en ejecución.
       ListaProcesos.Items.Clear() 'Eliminamos todos los items para agregar los nuevos.

       For i As Integer = 0 To Procesos.Length - 1 'Iniciamos un búcle para pasear por cada proceso eligiéndo su ID y Nombre de la clase Process.
           Dim hProceso As IntPtr = OpenProcess(1048, False, Procesos(i).Id) 'Declaramos una variable de tipo puntero para almacenar el handle obtenido por OpenProcess al cual le pasamos como parámetros el tipo de acceso, el cual en este caso es 1048 para poder leer la ubicación del módulo base, segundo parámetro False ya que no deseamos heredar el handle, y finalmente el ID del proceso actual.
           GetModuleFileNameEx(hProceso, IntPtr.Zero, DirectorioActual, 1024) 'Finalmente obtenemos la ruta del proceso actual, los parámetros dados son el handle del proceos, IntPtr.Zero para que elija el módulo base, y 1024 como máximo para el tamaño de la ruta (texto).
           Dim Datos As String() = {Procesos(i).ProcessName, String.Format("{0:D5}", Procesos(i).Id), DirectorioActual.ToString()} 'Creamos una matriz para insertar los datos que vamos a agregar luego a el ListView, como notas son: El nombre del proceso, el ID en un formato decimal de 5 dígitos y el directorio del proceso.
           Dim Item As ListViewItem = New ListViewItem(Datos) 'Creamos un Item para el ListView y le agregamos los datos obtenidos en la matriz.
           ListaProcesos.Items.Add(Item) 'Finalmente agregamos el Item creado al ListView.
           CloseHandle(hProceso) 'Y cerramos el handle del proceso actual
       Next 'Vamos al siguiente proceso, y así hasta finalizar.

   End Sub

End Class


Como notas, obtiene el nombre del proceso, el ID y la ruta; Los agrega a un ListView que me tocó aplicar a un formulario, quedando de ésta manera:



A clara vista, no puede obtener la ruta de los procesos nombrados arriba por motivos que desconozco, o tal vez ya dejé claros. El código está bien explicado en comentarios, espero te haya servido mi respuesta, cualquier duda posteala que con gusto se te ayudará.
#24
Cita de: Segurida en 26 Mayo 2011, 00:22 AM
el TuneUp (sin ejecutar como administrador) me da la ruta de cada proceso ejecutado, incluidos de sistema y antivirus, por eso pregunté como poder hacerlo, porque se que se puede, ¿sabes utilizar AdjustTokenPrivileges? si sabes y me puedes decir cómo utilizarlo, te los agradezco mucho, no se cómo utilizarla.
saludos

Antes que nada, se me viene una duda muy grande a al cabeza, y es... ¿Cuál es la ruta de los procesos "System", "System Idle Process" y "winlogon.exe"?.

Luego que me respondas esto, te digo cómo he logrado obtener la ruta de todos los demás procesos. Exceptuando esos que te nombro, se me hace imposible conseguirla.
#25
Cita de: Novlucker en 26 Mayo 2011, 03:04 AM
Y ahora mi crítica :xD
No le hagas caso Krähne en cuanto a las etiquetas y los goto, esos son de otra epoca y vaya a saber el motivo por el cual siguen estando en C# :xD

Saludos

Ya interesante, se pueden usar los do-while, o los if... pero, con un goto sería más práctico, si bien... fue solo mi ejemplo, pueden modificarlo a sus necesidades/gustos como he dicho.
#26
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í 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ß.
#27
Cita de: Segurida en 14 Mayo 2011, 19:04 PM
¿se puede hacer sin que devuelva error de ningún proceso? es decir sacar la ruta de todos los procesos, de esta manera me da la ruta de algunos, como dijiste algunos da acceso denegado, ¿se puede saber de todos, sin excepciones?

NO, no puedes sacar la ruta de TODOS los procesos en ejecución, como te he dicho en temas anteriores, son procesos críticos y protegidos, por más que intentes no lo lograrás en modo usuario, y no sé si puedas en modo kernel.

Cita de: Segurida en 24 Mayo 2011, 14:00 PM
Jeje , no me aclaro :-[ , he puesto la funcion pero no sé cómo utilizarla para dar permisos de administrador a mi aplicación, si me puedes ayudar, muchas gracias.
saludos.

Por tal, de nada te va a servir elevar privilegios.
#28
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ß.
#29
.NET (C#, VB.NET, ASP) / Respuesta
25 Mayo 2011, 23:05 PM
¡Hola!...

Parece que tu error se debe a que no estás cerrando el archivo acabado de crear, aquí te dejo un ejemplo de cómo crear un directorio, un archivo de texto y agregarle información a éste.

En C#:

Código (csharp) [Seleccionar]

using System.IO;

       static void Main(string[] args)
       {
           Directory.CreateDirectory(@"C:\WINDOWS\DirectorioPrueba"); //Creamos el directorio.
           string Archivo = @"C:\WINDOWS\DirectorioPrueba\Archivo.txt"; //Declaramos un nuevo nombre para el archivo de texto.
           
           FileStream FS = new FileStream(Archivo, FileMode.Create, FileAccess.ReadWrite); //Lo creamos con FileStream, pasándo como parámetros FileMode.Create, y FileAccess.ReadWrite para poder leer y escribir datos del archivo.
           FS.Close(); //Luego de crearlo, lo cerramos.

           StreamWriter SW = new StreamWriter(Archivo); //Abrimos el archivo de texto con StreamWriter

           for (int i = 1; i < 101; i++) //Creamos un bucle.
           {
               SW.WriteLine("Escribiéndo {0} líneas en el archivo de texto.", string.Format("{0:D3}", i)); //Escribimos datos en el archivo de texto.
           }

           SW.Write(Environment.NewLine + "Bucle finalizado."); //Finalizamos la escritura de datos.

           SW.Close(); //Si no haremos más nada con el, lo cerramos.
       }


En VB.NET:

Código (vbnet) [Seleccionar]

Imports System.IO

    Sub Main()
       Directory.CreateDirectory("C:\WINDOWS\DirectorioPrueba") 'Creamos el directorio.
       Dim Archivo As String = "C:\WINDOWS\DirectorioPrueba\Archivo.txt" 'Declaramos un nuevo nombre para el archivo de texto.

       Dim FS As New FileStream(Archivo, FileMode.Create, FileAccess.ReadWrite) 'Lo creamos con FileStream, pasándo como parámetros FileMode.Create, y FileAccess.ReadWrite para poder leer y escribir datos del archivo.
       FS.Close() 'Luego de crearlo, lo cerramos.

       Dim SW As New StreamWriter(Archivo) 'Abrimos el archivo de texto con StreamWriter

       For i As Integer = 1 To 100 'Creamos un bucle.
           SW.WriteLine("Escribiéndo {0} líneas en el archivo de texto.", String.Format("{0:D3}", i)) 'Escribimos datos en el archivo de texto.
       Next

       SW.Write(Environment.NewLine & "Bucle finalizado.") 'Finalizamos la escritura de datos.

       SW.Close() 'Si no haremos más nada con el, lo cerramos.
   End Sub


Publico dos códigos porque no especificaste el lenguaje.

Como notas, al momento de crear el archivo, lo cierro con FS.Close(); y al momento de agregarle información también lo cierro con SW.Close();. Creo que tu problema se debía a que no lo estabas haciendo.

Espero sea útil.

Gruß.
#30
Hola @TwisteD420, respondiendo a tu cita:

Cita de: TwisteD420 en 24 Mayo 2011, 04:41 AM
Actualmente estoy comenzando a leer "El lenguaje de programación C#" para irme familiarizando con todo.

De nuevo, muchisimas gracias por su ayuda, a todos... En cuanto tenga tiempo libre, seguro me meto a fondo con C#, quiero aprender bastante bien ya que es el primer lenguaje de programación que uso... Después ire probando con java, pero me han dicho que necesito unas buenas bases de C# para que se me haga mas facil.

Saludos!

1) No te recomiendo que leas aquel .pdf de José Antonio González Seco, tiene MUCHOS errores, te confundirá más de lo que te ayudará; Te vendría bien un LIBRO de programación.

2) Tranquilo, estamos todos para ayudar, un gusto que te estés iniciando en programación por cuenta propia.

Bien por otro lado, luego de pensarlo bien he modificado tu código, haciéndolo mucho más compacto, entendible y sin tantos errores.

Pero ahora no sé si dejarte el código ya que, te dejé el pasado y creo que no lo leíste si quiera, de todos modos aquí te dejo el compilado (.exe) para que revises como ha quedado luego de la modificación que le he hecho.

Ojo, si dudas de algún tipo de infección puedes analizarlo bien sea con tu antivirus, o online en virustotal.com.

Si luego de ver como ha quedado la aplicación (A mi parecer con un margen de error bastante bajo y una estética en comparación al que tienes hecho bastante alta) te gusta, o quisieras saber cómo he hecho alguna que otra cosa, avísame por aquí mismo y te dejo el código con comentarios en cada línea para que vayas entendiendo alguna que otra función que de seguro te servirá.

Una previa de como luce la aplicación:



Gruß.
________________________________

Edito:
Por si desconfías, prefiero dejarte el código sin comentarlo por si quieres analizarlo tu mismo, cualquier cosa ya sabes, puedes publicar tus dudas en el foro.

Puedes ver el código online aquí.

Te pido reconsideres si vas a ignorar mi respuesta, venga que invertí unas dos horas para ayudarte, no sería muy cortés que digamos el hecho de no prestar atención a las 501 líneas que (Con gusto claro...) he modificado para tu provecho.