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);
-
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_ */
-
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.