Espacio de direcciones
Los procesos tienen una cantidad limitada de espacio de direcciones. Cuando se ejecuta 32 bits, un proceso tiene aproximadamente 2 GB ( <0x7fffffff) of process address space to play with, and 2 GB (> 0x8000000) de cosas en modo kernel. Todas las asignaciones de memoria, la asignación de archivos, DLLs y otras cosas que se cargan se producen en la ventana aplicaciones de 2 GB.
Reajuste
Un archivo DLL especifica dónde desea cargarse. Si intenta cargar un archivo DLL cuya dirección base ya está en uso, la carga falla o DLL se debe rebasar.
Cómo funciona
Tiene dos DLLs ( x.DLL y y.DLL ). Ambos se compilaron en Visual Studio .NET . En Visual Studio, el valor predeterminado "preferida" dirección base (ubicación de la memoria a la que se carga) es 0x10000000.
- Ejecutar MyTestApp.exe .
- LoadLibrary ( x.DLL );
- LoadLibrary ( y.DLL );
El
x.DLL se ha cargado en 0x10000000;
y.DLL intenta cargarse en 0x10000000, pero no puede hacerlo porque
x.DLL ya está utilizando ese espacio de direcciones. Por lo tanto,
y.DLL se rebasa "." El sistema operativo elige una nueva ubicación para cargar la
DLL . Parte del proceso de carga requiere que el sistema operativo aplique "correcciones" para que
y.DLL se ejecute correctamente en una ubicación distinta de 0x10000000.
DLL Se ha optimizado para que se cargue en su "dirección base de"
preferida. La aplicación de "
reparaciones" tiene cierta sobrecarga. Su
DLLs carga es más rápida si configura una "dirección base de" preferida. No debe colisionar con una "preferida" la dirección base de otra
DLL que cargue el proceso. En otras palabras, MACC inyecta en el proceso y si algo más ya está inyectando en él, el proceso se bloquea. Para evitar que se produzca esta situación, el
DLL se rebasa (inyectado en otro proceso).
Nota: El cambio de la
DLL MACC rebasación no significa que no se esté inyectando. Se necesita inyección para
SAU/MP/Execution que control obtenga los argumentos de línea de comandos cuando se inicie un intérprete de script. También es necesaria cuando se ejecuta en modo interactivo.
Si desea omitir explícitamente la inyección en un proceso concreto, puede Agregar una
attr -w regla o eliminar el intérprete de script de la lista de
secuencias de comandos .
Con el reajuste definido, es posible que el cambio de la
DisableDeviceGuardCompat configuración parezca una solución temporal. No lo es. Todo lo que hacemos es repartir otro
DLL (al que se enlaza el
LdrLoadDLL más profundo o el más alto de la pila
kernel32.DLLNTDLL.DLL ).
Si
DeviceGuardCompat está desactivado en el host y
DeviceGuard está activado en el Endpoint, el sistema operativo no permite la inyección. Bloquea la ejecución del archivo binario.
DeviceGuard es una función del sistema operativo (hardware y software) que impide que los dispositivos ejecuten aplicaciones no autorizadas. Permite la ejecución de aplicaciones autorizadas mediante una función denominada
integridad de código configurable.
"DeviceGuardCompat"
no tiene nada que hacer con "Microsoft DeviceGuard".
Nuestro mecanismo de inyección detecta cuando un proceso carga una biblioteca (DLL). Esta detección se consigue conociendo la dirección virtual relativa (RVA) de la función LoadLibrary. Cuando DisableDeviceGuardCompat está activado, la RVA que se está buscando es
LdrLoadDLL , pero en
NTDLL.DLL . Por el contrario, si
DisableDeviceGuardCompat está desactivado (de forma predeterminada), lo
LoadLibraryW buscamos en la
Kernel32.DLL . Una vez que hayamos esa dirección, permitirá que el proceso insertado se comunique con nuestro controlador, cuando se invoquen ciertas funciones.
DisableDeviceGuardCompat no desactiva ni omite el
scinject.DLL que se va a insertar. Cambia la función que se ha enlazado. No hay riesgo asociado con el cambio de la inyección
DLL , ya que aún no se está protegiendo el sistema.