2010-10-21 49 views
7

Me gustaría borrar la línea de comando de mi proceso desde adentro. Por ejemplo, al ver mi proceso en el Administrador de tareas/Explorador de procesos, la entrada de línea de comando estaría vacía.¿Cómo borrar una línea de comando de proceso?

Me gustaría hacer esto en el proceso en ejecución en lugar de reiniciar el proceso si es posible.

+0

¿Estás intentando hacer MALWARE? Lástima que ya hay algunas respuestas plausibles. –

+0

No, pero es una solución multiproceso que me gustaría que sea lo más segura posible. Uno lanza otro con una clave secreta pasada a través de la línea de comando, solo estoy tratando de eliminarlo una vez que ha sido procesado por la rutina de inicio. –

+0

@Alf: ¿Qué es el malware-y sobre la modificación de la línea de comandos del proceso? Es algo que un programa puede hacer ya que es su propia memoria. Lea http://blogs.msdn.com/b/oldnewthing/archive/2009/02/23/9440784.aspx, por ejemplo. – Joey

Respuesta

1

Usted puede tratar de llamar a la función API GetCommandLine y después colocar el primer byte a 0. Es decir:

LPTSTR cmdline = GetCommandLine(); 
*cmdline = '\0'; 

Sinceramente, no sé si eso va a trabajar o lo que los posibles ramificaciones son, pero Puede valer la pena.

+3

He verificado esto. No es trabajo – Oleg

10

supongo que tiene que modificar la parte de la RTL_USER_PROCESS_PARAMETERSPEB de su proceso (ver http://en.wikipedia.org/wiki/Process_Environment_Block por ejemplo y http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html). Puede intentar usar NtQueryInformationProcess para obtener PEB. Luego puede modificar ProcessParameters.CommandLine. Espero que funcione.

ACTUALIZADO: He verificado mi sugerencia. Funciona. El siguiente programa de prueba de demostrar esto:

#include <Windows.h> 
#include <Winternl.h> // for PROCESS_BASIC_INFORMATION and ProcessBasicInformation 
#include <stdio.h> 
#include <tchar.h> 

typedef NTSTATUS (NTAPI *PFN_NT_QUERY_INFORMATION_PROCESS) (
    IN HANDLE ProcessHandle, 
    IN PROCESSINFOCLASS ProcessInformationClass, 
    OUT PVOID ProcessInformation, 
    IN ULONG ProcessInformationLength, 
    OUT PULONG ReturnLength OPTIONAL); 

int main() 
{ 
    HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
            FALSE, GetCurrentProcessId()); 
    PROCESS_BASIC_INFORMATION pbi; 
    ULONG ReturnLength; 
    PFN_NT_QUERY_INFORMATION_PROCESS pfnNtQueryInformationProcess = 
     (PFN_NT_QUERY_INFORMATION_PROCESS) GetProcAddress (
      GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationProcess"); 
    NTSTATUS status = pfnNtQueryInformationProcess (
     hProcess, ProcessBasicInformation, 
     (PVOID)&pbi, sizeof(pbi), &ReturnLength); 
    // remove full information about my command line 
    pbi.PebBaseAddress->ProcessParameters->CommandLine.Length = 0; 

    getchar(); // wait till we can verify the results 
    return 0; 
} 

Si empezamos el programa con algunos parámetros veremos

alt text

en lugar de los siguientes visto antes

alt text

+0

@Joe: actualicé mi respuesta para que sea más fácil de usar 'NtQueryInformationProcess'. – Oleg

+0

Oleg, finalmente fue capaz de probar esto (Win7-64), y parece funcionar completamente cuando se ejecuta como administrador, pero cuando se ejecuta con permisos de usuario estándar, TaskManager aún puede mostrar la línea de comando. Curiosamente, Process Explorer no muestra la línea de comando pasada en ninguno de los escenarios de permisos. –

+0

@Joe: ¿Está seguro de que ** reinició ** el proceso de TaskManager? – Oleg

2

Based en su comentario anterior, es posible que desee considerar pasar la clave secreta a través de una variable de entorno. Si configura la clave en el entorno de proceso principal, será heredado por el proceso hijo y no será visible para los extraños tan fácilmente como la línea de comando.

+1

Podrías verlos en el explorador de procesos. Podría establecerlo en un valor ficticio después de leerlo, supongo – Anders

Cuestiones relacionadas