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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Interceptar aplicacion en el momento en el que empieza
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Interceptar aplicacion en el momento en el que empieza  (Leído 2,256 veces)
SheKeL_C$


Desconectado Desconectado

Mensajes: 549


_-=[Sh3K3L_C$]=-_


Ver Perfil
Interceptar aplicacion en el momento en el que empieza
« 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


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Interceptar aplicacion en el momento en el que empieza
« Respuesta #1 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
  1. ' Nektra Deviare: "CreateProcess" hook example, By Elektro.
  2.  
  3. Imports Nektra.Deviare2
  4. Imports System.IO
  5.  
  6. Public NotInheritable Class Form1
  7.  
  8.    Public WithEvents SpyMgr As NktSpyMgr
  9.    Public Hook As NktHook
  10.  
  11.    ReadOnly processesToAttach As IEnumerable(Of Process) =
  12.        Process.GetProcessesByName("explorer") '.Concat(Process.GetProcessesByName("cmd"))
  13.  
  14.    ReadOnly processToIntercept As String = "notepad.exe"
  15.    ReadOnly processArgs As String = "C:\File.txt" ' Notepad will try to load that filepath.
  16.  
  17.    ' "CreateProcess" API reference:
  18.    ' http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
  19.    Dim libName As String = "kernel32.dll"
  20.    Dim funcName As String = "CreateProcessW" ' Unicode
  21.  
  22.    Dim hookFlags As eNktHookFlags = eNktHookFlags.flgOnlyPreCall Or
  23.                                     eNktHookFlags.flgAutoHookChildProcess
  24.  
  25.    Private Sub Test() Handles MyBase.Load
  26.  
  27.        Me.SpyMgr = New NktSpyMgr()
  28.        Me.SpyMgr.Initialize()
  29.  
  30.        Me.Hook = SpyMgr.CreateHook(String.Format("{0}!{1}", libName, funcName), hookFlags)
  31.  
  32.        Me.Hook.Hook(sync:=True)
  33.  
  34.        For Each proc As Process In processesToAttach
  35.            Me.Hook.Attach(procOrId:=proc.Id, sync:=True)
  36.        Next proc
  37.  
  38.    End Sub
  39.  
  40.    <MTAThread>
  41.    Private Sub OnCreateProcess_Called(ByVal hook As NktHook,
  42.                                       ByVal proc As NktProcess,
  43.                                       ByVal callInfo As NktHookCallInfo) Handles SpyMgr.OnFunctionCalled
  44.  
  45.        Dim lpApplicationNameParam As NktParam = DirectCast(callInfo.Params(0), NktParam)
  46.        Dim lpCommandLineParam As NktParam = DirectCast(callInfo.Params(1), NktParam)
  47.  
  48.        If Path.GetFileName(lpApplicationNameParam.Value.ToString).Equals(processToIntercept, StringComparison.OrdinalIgnoreCase) Then
  49.  
  50.            lpCommandLineParam.Value = String.Format("""{0}"" ""{1}""", lpApplicationNameParam.Value.ToString, Me.processArgs)
  51.  
  52.        End If
  53.  
  54.    End Sub
  55.  
  56. End Class

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
  1.    Private Sub OnCreateProcess_Called(ByVal hook As NktHook,
  2.                                       ByVal proc As NktProcess,
  3.                                       ByVal callInfo As NktHookCallInfo) Handles SpyMgr.OnFunctionCalled
  4.  
  5.        With callInfo
  6.  
  7.            If .IsPreCall Then ' Skip precall. Avoid process creation.
  8.                .Result.Value = 1
  9.                .SkipCall()
  10.            End If
  11.  
  12.        End With
  13.  
  14.    End Sub

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.


« Última modificación: 17 Marzo 2015, 02:28 am por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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