command line modifizieren



  • Hi,

    es gibt ja die Funktion GetCommandLine um die Commandline des Prozesses auszulesen. Ich muss die Commandline nun aber modifizieren, SetCommandLine gibts leider nicht, gibt es einen WinAPI weg um dies zu tun oder muss man da mit undokumentiertem kram rumpantschen?!



  • ich meine ich kann natürlich sowas machen, aber das ist wohl kaum sehr zu empfehlen?!

    CHAR szNewCmdLine[] = "O:\\Path\\To\\Application\\MyApp.exe";
    
    	strcpy(GetCommandLine(), szNewCmdLine);
    

  • Mod

    Dann erklär doch mal bitte aus welchem Grund Du das möchtest!
    Mir fällt keiner ein.



  • Hi,

    Ich habe eine Funktion wie execv aus POSIX gemacht um das prozess image auszutauschen, es funktioniert auch gut nur würde ich gerne auch die kommandozeilen parameter über execv mitangeben können...



  • Ich habe jetzt versucht im PEB die Commandline zu ändern, aber GetCommandLine() liefert immer noch die alte Kommandozeile, also muss es sich die noch von woanders holen oder zwischenspeichern. Hast du vielleicht noch einen Tip, Martin?

    peb.c

    #include "peb.h"
    
    NTFUNC NtDllCall( LPCSTR lpFunc ) {
    	return (NTFUNC)GetProcAddress(LoadLibrary("NTDLL"),
    		lpFunc);
    }
    
    BOOL SetCommandLine( LPTSTR lpCmdLine ) {
    	PROCESS_BASIC_INFORMATION pbi;
    
    	NtDllCall("NtQueryInformationProcess")(GetCurrentProcess(),
    		ProcessBasicInformation, &pbi, sizeof(pbi), 0);
    
    	/* test */
    	pbi.PebBaseAddress->ProcessParameters->CommandLine.Buffer = NULL;
    	pbi.PebBaseAddress->ProcessParameters->CommandLine.Length = 0;
    
    	NtDllCall("NtSetInformationProcess")(GetCurrentProcess(),
    		ProcessBasicInformation, &pbi, sizeof(pbi));
    	return TRUE;
    }
    
    int main(int argc, char *argv[]) {
    	SetCommandLine("O:\\TEST.EXE");
    
    	printf("%s\n", GetCommandLine());
    	return 0;
    }
    

    peb.h

    #ifndef _PEB_H_
    #define _PEB_H_
    
    #include <Windows.h>
    #include <stdio.h>
    
    typedef LPVOID (WINAPI *NTFUNC)();
    
    #define ProcessBasicInformation	0x00
    
    typedef struct _UNICODE_STRING {
    	USHORT	Length;
    	USHORT	MaximumLength;
    	PWSTR	Buffer;
    } UNICODE_STRING, *PUNICODE_STRING;
    
    typedef struct _PEB_LDR_DATA {
    	BYTE		Reserved1[8];
    	PVOID		Reserved2[3];
    	LIST_ENTRY	InMemoryOrderModuleList;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
    
    typedef struct _RTL_USER_PROCESS_PARAMETERS {
    	BYTE			Reserved1[16];
    	PVOID			Reserved2[10];
    	UNICODE_STRING	ImagePathName;
    	UNICODE_STRING	CommandLine;
    } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
    
    typedef struct _PEB {
    	BYTE Reserved1[2];
    	BYTE BeingDebugged;
    	BYTE Reserved2[1];
    	PVOID Reserved3[2];
    	PPEB_LDR_DATA Ldr;
    	PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
    	BYTE Reserved4[104];
    	PVOID Reserved5[52];
    /*	PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;*/
    	PVOID PostProcessInitRoutine;
    
    	BYTE Reserved6[128];
    	PVOID Reserved7[1];
    	ULONG SessionId;
    } PEB, *PPEB;
    
    typedef struct _PROCESS_BASIC_INFORMATION {
    	PVOID	Reserved1;
    	PPEB	PebBaseAddress;
    	PVOID	Reserved2[2];
    	PULONG	UniqueProcessId;
    	PVOID	Reserved3;
    } PROCESS_BASIC_INFORMATION;
    
    #endif /* _PEB_H_ */
    

  • Mod

    Ich verstehe nicht, was dies innerhalb ein und des selben Prozesses soll? Was hat das mit execv zu tun?
    Zudem findest Du _execv in der CRT von VS!

    Für fremde prozesse gibst Du die Infos eben mit, die Du brauchst.


Anmelden zum Antworten