Título: Interceptar aplicacion en el momento en el que empieza Publicado por: SheKeL_C$ en 16 Marzo 2015, 17:41 pm Me imagino que lo que hace un AV es detectar un archivo cuando esta en el disco duro, pero tambien lo ha de hacer en memoria y tiene que pararlo "antes" de que se ejecute..
Mi idea es bastante parecida sino igual, me gustaria que mi programa este a la espera hasta que un proceso determinado es llamado, una vez detectado poder modificar los argumentos que se le dan, si es que se le da alguno Título: Re: Interceptar aplicacion en el momento en el que empieza Publicado por: Eleкtro en 17 Marzo 2015, 02:00 am me gustaria que mi programa este a la espera hasta que un proceso determinado es llamado, una vez detectado poder modificar los argumentos que se le dan, si es que se le da alguno ¿En que lenguaje de programación lo piensas llevar a cabo?, no somos adivinos... La tarea que pides sería extremadamente fácil de llevar a cabo con los métodos y/o componentes del lenguaje en cuestión si no fuese por que además de interceptar la llamada quieres modificar los argumentos, y eso implica técnicas de hooking, o mejor dicho API Hooking, debes hookear la pre-llamada de la función "CreateProcess" de la librería "Kernel32.dll" de la API de Windows, en la pre-llamada a la función debes traducir/interpretar los parámetros enviados por esta función y modificarlos, donde cómo se explica la documentación oficial de la MSDN, el parámetro 'lpCommandLine' (de tipo String) contiene los argumentos commandline: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx Nota: El primer argumento (o argumento 0) siempre debe ser la ruta del proceso. ( Quizás debas hookear también la función 'ShellExecute' de la librería 'shell32.dll' para controlar la ejecución de un proceso en ciertas circunstancias ) Existen librerías para facilitar el enrutamiento de las funciones de la API de Windows, cómo por ejemplo Microsoft Detours para C/C++, y EasyHook o Nektra Deviare para C#/VB.Net; pero si piensas llevar a cabo la tarea sin ayuda de una librería de terceros entonces te advierto que se convertirá en una tarea horriblemente laboriosa y tediosa, y, por ejemplo en lo referente a la programación .Net requerirás un nivel medio-avanzado de conocimientos sobre el P/Invoking y el hooking, cómo Delegados, Callbacks, Marshalling, e indiferentemente del lenguaje que sea tampoco etsaría demás saber utilizar técnicas de programación asíncrónicas. A continuación te muestro un ejempo que he desarrollado en Vb.Net utilizando la librería Deviare, el siguiente código es un hook que se adjunta a las instancias activas del proceso "explorer.exe" y a sus procesos hijos para interceptar las llamadas a la función "CreateProcess" realizadas desde dichos procesos, si el nombre del proceso es "Notepad.exe" entonces modifico los argumentos del notepad para indicarle que cargue un archivo de texto ("C:\File.txt"). Nota: No es necesario interceptar la post-llamada de la función, pero deberías hacerlo para comprobar si hubo un error evaluando el valor de retorno de la función 'GetLastError' de la librería 'kernel32.dll" (si lo piensas hacer desde .Net entonces debes comprobar el valor de la función GetLastWin32Error de la Class 'Marshal') Nota 2: El código de abajo es solo un ejemplo, el hook no es persistente, es decir, si reinicias el proceso Explorer.exe dejará de funcionar. Código
Y, si lo que quieres es evitar que un proceso invocado mediante la función "CreateProcess" se inicie, entonces debes modificar el valor de retorno (result) de la función y despues saltar la llamada, con Deviare puedes hacerlo así: Código
Nota: Cada función de la API de Windows tiene sus valores de retorno y debes documentarte primero para saber cómo va a afectar al SO el valor de retorno que utilices. Saludos. |