Como saber si la aplicación fue ejecutada desde Delphi
Dando seguimiento a este hilo Saber si la aplicación fue ejecutada desde Delphi creo que eso ya no funciona mas con Windows Vista en Adelante.
El problema es que con UpdateProcThreadAttribute lanzan el programa con CreateProcessW en la creencia de que fué lanzado por Windows Info vista en Hay manera de detectar aún esto? |
Nipx4215,
¡Bienvenido al Club Delphi! :D Nelson. |
Nipx4215,
Cita:
Revisa este código: El código anterior en Delphi 7 sobre Windows 7 Professional x32, Obtiene la ruta y nombre del proceso padre de la aplicación lo cual permite determinar desde donde fue ejecutada la misma, como se muestra en la siguiente imagen: Espero sea útil :) Nelson. |
|
|
Gracias por sus respuestas.
Cuando abrimos un programa con doble click el que lo lanza es el explorer.exe y con el código que mencionan se puede checar que no sea lanzado de otra aplicacion, con una simple verificacion del P.I.D. del proceso padre. El problema es que a partir de Windows vista hay unas nuevas apis que permiten indicarle al proceso lanzado cual es tu proceso padre Cita:
Espero haberme explicado, ya que pretendo detectar esto cuando ha sido lanzado mi "programa2" por "programa1" y cuando en realidad por el explorer, algun rastro debe quedar de ello |
Nipx4215,
Cita:
Pregunto : ¿Revisastes el código sugerido en el Msg #3?, en dicho mensaje se muestra desde conde se ha lanzado la aplicación. Espero sea útil :) Nelson. |
Cita:
Si Gracias, desafortunadamente solo funciona en WIndows 32 bits Edito: Perdón, me confundí el que estoy seguro que no va en 64 bits es "TH32CS_SNAPMODULE" , checaré con TH32CS_SNAPPROCESS |
Nipx4215,
Cita:
Cita:
Revisa este código: El código anterior en Delphi 7 sobre Windows 7 Professional x64, Obtiene la ruta y nombre del proceso padre de la aplicación lo cual permite determinar desde donde fue ejecutada la misma, como se muestra en la siguiente imagen: Notas: 1- El código identifica si se esta ejecutando una aplicación de 32 bits en WOW64 para determinar como obtener la ruta y nombre del proceso padre. 2- El código fue probado en Windows 7 Professional x32 y Windows 7 Professional x64, funcionando correctamente según lo esperado. 3- Esta versión es una mejora del código propuesto en el Msg #3. Revisa esta información: Cita:
Nelson. |
Cita:
La bandera EXTENDED_STARTUPINFO_PRESENT fuerza el uso de una estructura como esta:
y con las APIs InitializeProcThreadAttributeList y UpdateProcThreadAttribute Crear la lista de atributos (atributo PROC_THREAD_ATTRIBUTE_PARENT_PROCESS) que permitirá a CreateProcess engañar al sistema. He escrito una pequeña aplicación que permite realizarlo, he contrastado el código de cHackAll y el aportado por nlsgarcia, ninguno encuentra el verdadero padre del proceso hijo. Hasta el momento no he encontrado el antídoto, aclarar que el ProcessExplorer de Sysinternals también es engañado.
Subo un binario compilado para pruebas, he elegido que el padre sea Explorer.exe porque es lo más habitual en procesos de escritorio: ExecuteWithParent Cita:
Saludos. |
Se me olvidaba un detalle importante, el código anterior no funciona si se ejecuta desde el IDE, una vez compilado debe ser ejecutado desde el mismo explorer.
Saludos. |
Gracias a ambos, sigo haciendo pruebas
@escafandra solo que debe ser explorer.exe en lugar de Explorer.exe porque si no falla tambien hay una manera mas fiable de encontrar al explorer real, porque explorer puede haber muchos que no son precisamente explorer, digamos abrir con openprocess el proceso padre de ExecuteWithParent.exe y automáticamente sería el explorer sigo investigando, les cuento si encuentro algo |
Cita:
|
escafandra,
Cita:
En las pruebas realizadas con Delphi 7 sobre Windows 7 Professional x32 con el código del Msg #10, este funciono correctamente desde el IDE y de forma independientemente, con la salvedad de que el ParentProcess en este caso debe ser explorer.exe en lugar de Explorer.exe Saludos, Nelson. |
Nipx4215,
Cita:
Cita:
Cita:
Pregunto : ¿Has considerado hacer un hash a explorer.exe y verificar el mismo en tu proceso? :confused: Revisa este código: El código anterior en Delphi 2010 sobre Windows 7 Professional x32, Permite calcular un Hash MD5 y SHA1 a un archivo seleccionado, como se muestra en la siguiente imagen: Nota: La idea en este caso particular, es calcular el hash de explorer.exe y guardarlo dentro de la aplicación para que esta pueda verificar si efectivamente corresponde al hash del proceso padre actual. Revisa esta información: Espero sea útil :) Nelson. |
Cita:
Cita:
Cita:
Lo ideal sería encontrar el verdadero padre. Saludos. |
Nipx4215,
Cita:
Cita:
Pregunto: 1- ¿Que versión de Delphi y Windows (x32/x64) vas a utilizar para el problema en cuestión?. 2- ¿Puedes describir que tipo de aplicación utilizara este tipo de verificación y por que es necesaria?. Espero sea útil :) Nelson. |
Hola
1.-Sería delphi 7, win7 x64 2.-Es solo evitar que sea lanzado con un programa diferente al explorer, hasta ahorita al programa no han podido desempacarlo, y la única manera que lo pueden atacar es en memoria. Por eso se quiere evitar esto. |
Nipx4215,
Cita:
Pregunto: 1- ¿Que significa que no han podido desempacarlo? :confused: 2- ¿Podrías explicar cual es la función de esta aplicación?. Espero sea útil :) Nelson. |
Añado otra pregunta: ¿Deseas evitar que lo lancen con un depurador (debugger)?
Saludos. |
Hola
Desempacar es lo contrario a empacar un programa con un packer como aspack.com En este caso no es depurar porque CreateProcess no ha sido lanzado con DEBUG_ONLY_THIS_PROCESS o DEBUG_PROCESS, pudiendo evitarlo con checkRemoteDebuggerPresent o IsDebuggerPresent. La técnica acá es abrir con OpenProcess y rematar con WriteProcessMemory. |
Nipx4215,
Cita:
Pregunto: 1- ¿Podrías explicar cual es la función de tu aplicación y por que requiere verificar quien es el proceso padre? :confused: 2- ¿Has considerado hacer un hash a explorer.exe y verificar el mismo en tu proceso? (Msg #15) Nelson. |
1.- El problema del hash del explorer es que el engaño de UpdateProcThreadAttribute va a hacer que explorer aparezca siempre como el verdadero padre...
2.- Si el empacador permite desempacar, ya tienen un problema. 3.- El ataque con las API de lectura y escritura sobre procesos remotos siempre va a ser posible aunque el proceso nazca como "empacado" pues al final siempre está en memoria. Dificulta algo, pero no impide nada aún ejecutándolo desde el explorer. 4.- Existen técnicas para que no se detecten los debuggers: Windows Anti-Debug Reference Saludos. |
@nlsgarcia
Para que solo sea lanzado por el explorer, evitando sea lanzado por otra aplicación y modificarlo en memoria con WriteProcessMemory @ escafandra 1.-Es correcto, mientras no se detecte el proceso padre real es inútil cualquier chequeo como MD5 pues es engañado por el UpdateProcThreadAttribute y el proceso padre siempre será el explorer. 2.-No se puede desempacar, por eso es que lo hacen en memoria 3.-@escafandra si lo lanzan por el explorer no podrán modificarlo ni en memoria, no veo la forma. Si es lanzado por un programa diferente tengo programado que no arranque siquiera. 4. Gracias aunque son técnicas antidebugged, y como comentaba en el post 8 no aplica acá, no sería detectado Por lo que he estado buscando, no hay solución conocida, como mencionaba anteriormente, la única solución viable sería buscar que atributo no es heredado y rascarle por ahí Cita:
Gracias a ambos, saludos. |
Nipx4215,
Cita:
Cita:
Cita:
Te comento: 1- En los Msg #17, #19 y #22 te he consultado sobre cual es la función o naturaleza de tu aplicación y solo te has limitado a contestar : Para que solo sea lanzado por el explorer, la pregunta sigue sin ser respondida :confused: 2- Independientemente que el programa detecte el Parent Process y este empaquetado con UPX, ASPack o similares, una vez en memoria será susceptible a ser modificado por otro proceso. 3- Hasta donde entiendo la técnica en cuestión (UpdateProcThreadAttribute) es valida en Windows Vista y posteriores, por lo tanto no parece factible verificar realmente quien es el Parent Process dado que es una función propia del SO, sin embargo : Norton Internet Security no permite que el programa sea eliminado de memoria, por lo cual asumo que tampoco modificado, ¿Como lo hace? :confused: 4- La idea del Hash (Msg #15) es descartar cualquier modificación ilegal a explorer, sería un complemento a la solución final, dado que si explorer es alterado por cualquier medio, el verificar si explorer es el Parent Process no ofrecera ninguna seguridad adicional. Espero sea útil :) Nelson. |
Cita:
Cita:
Cita:
Cita:
De todas formas, no veo claro que si encuentras el verdadero padre, puedas evitar la lectura/escritura en el espacio de memoria de tu proceso. Los sistemas que tratan de evitarlo usan Hooks a esas APIs, máquinas virtuales e incluso código en ring0. Saludos. |
@nlsgarcia Gracias, es un punto de venta, no veo como esto tenga que ver con el tema
@escafandra] Gracias, creo que me entendiste desde el principio, lástima que no haya forma al menos conocida por nosotros jeje Saludos |
Nipx4215,
Cita:
Te comento: 1- Como se ha comentado durante el hilo este tipo de verificación no es posible en Windows Vista, 7, 8 y 8.1 (No al menos documentada por Microsoft), quizás sea posible en Windows 10, pero hasta el momento no hay conocimiento de ello. 2- Ciertamente este tipo de verificación no aplica para puntos de venta, quizás puedas evaluar formas más estándar de seguridad para este tipo de aplicación. 3- Te sugiero revisar los comentarios de los Msg #25 y #26, quizás puedan aclarar un poco el tema. Espero sea útil :) Nelson. |
La franja horaria es GMT +2. Ahora son las 09:39:56. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi