Найти командную строку программы с PEB? - PullRequest
1 голос
/ 15 ноября 2010

Мне нужно найти командную строку программы с PEB .

Я использую FS: [0x30], чтобы найти PEB

     int wmain(int argc, WCHAR *argv[])
{

 PVOID pebAddress =( void * ) __readfsdword( 0x30 ); /* get the PEB address */
PVOID rtlUserProcParamsAddress;

ReadProcessMemory(GetCurrentProcess(),(PCHAR)pebAddress+ 0x10,
    &rtlUserProcParamsAddress, /* we'll just read directly into our variable */
    sizeof(PVOID),
    NULL
    );

UNICODE_STRING commandLine;

 ReadProcessMemory(GetCurrentProcess(), (PCHAR)rtlUserProcParamsAddress + 0x40,&commandLine, sizeof(commandLine), NULL);

 WCHAR * commandLineContents;

 commandLineContents = (WCHAR *)malloc(commandLine.Length);

 ReadProcessMemory(GetCurrentProcess(), commandLine.Buffer,commandLineContents, commandLine.Length, NULL);

 printf("%.*S\n", commandLine.Length / 2, commandLineContents);


}

но это не работает. Мне нужно использовать только PEB не GetCommandLine(void);

Ответы [ 2 ]

0 голосов
/ 15 ноября 2010

У меня отлично работает на Windows 7 с VC2010.printf может быть определено как wprintf, который обрабатывает% S как строку ANSI.Это длинный выстрел, так как это также заставит его жаловаться на то, что строка формата не является Unicode.Попробуйте вывести строку, используя MessageBoxW, чтобы убедиться, что вы рассматриваете все как Unicode.

Кстати, вам не нужно использовать ReadProcessMemory при чтении из собственного процесса.

0 голосов
/ 15 ноября 2010

Зачем вам нужно использовать PEB? Вы смотрели на содержание argv вообще?

И что (для меня) страшно выглядит commandLine.Length / 2 в вашем коде ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...