Hola
Lo primero de todo, nativamente hablando no existe ningún miembro en la API de Windows para bloquear la ejecución de un proceso de forma guiada, y un Antivirus es un producto programado por grupos de varios desarrolladores profesionales, lo que pretendo decir es que el algoritmo de bloqueo se elabora e implementa con el sudor y el esfuerzo de uno mismo, otra cosa es que tal vez pueda existir una API de terceros ya desarrollada para tal propósito (una API gratuita, o de pago), podría ser, pero al menos yo jamás la he visto.
Para impedir la ejecución de un executable tienes que llevar a cabo un api-hook (
si o si) de la función
CreateProcess y adjuntarlo a las instancias del explorer,
y entonces, al interceptar el
precall de dicha función, podrás leer sus parámetros y así detectar la petición de creación del proceso a bloquear, notificar mediante eventos lo que quieras notificar, e ignorar el
precall para no crear el proceso (si hookeas otras funciones, es posible que tambén debas interceptar el
postcall, y modificar el valor correspondiente que debe ser devuelto, depende de como funcione cada función, valga la redundancia).
(luego también están las funciones
ShellExecute y
ShellExecuteEx, pero son unos wrappers de la función
CreateProcess, y también está
WinExec, de la que no estoy seguro si es un wrapper pero creo que no, aunque de todas formas no hay que darle mucha importancia a
WinExec ya que es una función en deshuso que solo existe por motivos de compatibilidad con aplicaciones de 16-Bit)
Tienes al menos tres librerías populares para poner en práctica el api-hooking en .Net,
Nektra Deviare,
EasyHook, y
Detours (C/C++);
Te las he nombrado por orden de preferencia personal y de complejidad, siendo
Microsoft Detours la peor opción tratándose de .Net (para eso mejor desarrollar la app en C++),
EasyHook es gratuita pero muy inestable y con una infinidad de bugs reportados sin corregir, y
Nektra Deviare es una librería de pago
(si uno no sabe encontrar...) mucho más eficiente que
EasyHook y mucho más sencilla de utilizar ...dentro de lo que cabe en esta temática de la ingeniería inversa.
Sinceramente, este tipo de trabajo es de cosecha propia, puesto que hay que invertir bastante tiempo en investigar y documentarse en general sobre el comportamiento y el tipo de valores contenidos en los parámetros de "X" función que desees
hookear, de todas formas, no me cuesta nada compartir este antiguo código que desarrollé y lo guardé, el cual precisamente sirve para prohibir/evitar la ejecución de un proceso (notepad.exe) utilizando la liberría de
Nektra Deviare:
Imports Nektra.Deviare2
Imports System.IO
Public NotInheritable Class Form1
Public WithEvents SpyMgr As NktSpyMgr
Public Hook As NktHook
' CreateProcess API reference:
' http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
ReadOnly libName As String = "kernel32.dll"
ReadOnly funcName As String = "CreateProcessW" ' Unicode
ReadOnly hookFlags As eNktHookFlags = eNktHookFlags.flgOnlyPreCall Or
eNktHookFlags.flgAutoHookChildProcess
' Processes to attach the hook.
ReadOnly processesToAttach As IEnumerable(Of Process) =
Process.GetProcessesByName("explorer") '.Concat(Process.GetProcessesByName("cmd"))
Private Sub Test() Handles MyBase.Load
Me.SpyMgr = New NktSpyMgr()
Me.SpyMgr.Initialize()
Me.Hook = SpyMgr.CreateHook(String.Format("{0}!{1}", libName, funcName), hookFlags)
Me.Hook.Hook(sync:=True)
' It could exist more than one explorer.exe instance so...
For Each proc As Process In processesToAttach
Me.Hook.Attach(procOrId:=proc.Id, sync:=True)
Next proc
End Sub
<MTAThread>
Private Sub OnCreateProcess_Called(ByVal hook As NktHook,
ByVal proc As NktProcess,
ByVal callInfo As NktHookCallInfo) Handles SpyMgr.OnFunctionCalled
' Process that the hook should intercept.
Dim processToIntercept As String = "notepad.exe"
' CreateProcess function params.
Dim lpApplicationNameParam As NktParam = DirectCast(callInfo.Params(0), NktParam)
Dim lpCommandLineParam As NktParam = DirectCast(callInfo.Params(1), NktParam)
If Path.GetFileName(lpApplicationNameParam.Value.ToString).Equals(processToIntercept, StringComparison.OrdinalIgnoreCase) Then
With callInfo
If .IsPreCall Then ' Skip precall to avoid process creation/initialization.
.Result.Value = 1
.SkipCall()
End If
End With
End If
End Sub
End Class
PD: El algoritmo cumple su función dentro de lo esperado, pero yo no soy ningún experto de la ingeniería inversa, quiero decir, que no se si el procedimiento controla todas las posibilidades en las que podría crearse un proceso, así que no lo tomes como un "código perfecto" en absoluto, sino más bien como un "algo por donde empezar".
PD2: En ese código que he mostrado existe una vulnerabilidad que se puede explotar facilmente (salta a la vista), y es que puedes cambiarle el nombre al
notepad.exe por
loquesea.exe para poder ejecutarlo (o al revés, para bloquearlo), esto está justificado, pues es solo un ejemplo demostrativo de técnicas de api-hooking, no de protección antiviral xD, pero si quieres un nivel de seguridad más eficiente, entonces se me ocurre que podrías realizar una comparación byte a byte entre los bytes del proceso seleccionado a bloquear, y los bytes del proceso que intenta ser creado para determinar si se trata del mismo archivo indiferentemente del nombre del archivo, y así decidir si el proceso debe ser creado o no.
Saludos