Как получить командную строку СТОРОННЕГО процесса?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 26 фев 2010.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Ну то есть нет ли api- функции, наподобе:

    CommandLIneOtherPocess (HNWD процесса)

    Что-то такое. Спасибо.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Натравить ReadProcessMemory на PEB. а в PEB уже и командная строка есть.
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    *на PEB интересующего процесса
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    amvoz
    HWND это шадова обьекта окна описатель.
    Читайте коммандную строку из переменной BaseAnsiCommandLine или BaseUnicodeCommandLine. Если лень дизасмить GetCommandLine(), то читайте инфу из среды: PEB.ProcessParameters.CommandLine[PROCESS_BASIC_INFORMATION.PebBaseAddress]
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Если углубиться, то:
    NtQueryInformationProcess(ProcessBasicInformation) – получаем базу PEB.
    PEB.ProcessParameters – указатель на структуру RTL_USER_PROCESS_PARAMETERS.
    RTL_USER_PROCESS_PARAMETERS.CommandLine – ...
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    *упс, Clerk опередил.
     
  7. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Насколько я помню база пеба для всех процессов одинакова - можно убрать вызов NtQueryInformationProcess, узнать в своём адрес пеба вручную разобрав двусвязные списки и соответственно прочитать в удалённом процессе по этому же адресу.
     
  8. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Бррр я даже немного перегрелся, думал что надо найти адрес ntdll.dll или kernel32.dll - в нашем случае ещё проще, получаем пеб из теб, теб находится по fs:[0].
    Код (Text):
    1. typedef struct _TEB
    2. {
    3.    NT_TIB Tib;                         /* 00h */
    4.    PVOID EnvironmentPointer;           /* 1Ch */
    5.    DWORD Cid[2];                       /* 20h */
    6.    PVOID ActiveRpcInfo;                /* 28h */
    7.    PVOID ThreadLocalStoragePointer;    /* 2Ch */
    8.    PPEB Peb;                           /* 30h */
    9.    ULONG LastErrorValue;               /* 34h */
    Берём в eax пеб:
    Код (Text):
    1. xor  eax, eax
    2. mov  eax, fs:[eax+30h]
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    d2k9
    Нет, ASLR применяется.
     
  10. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Вообще-то PEB в NT-ях всегда отмаплен по адресу 0x7ffdf000 и занимает всю страницу. Под ним (0x7ffde000, 0x7ffdd000 ...) находятся TEB-ы 0-го, 1-го и т.д. потоков процессы.
     
  11. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    d2k9
    Да ну? Слово "ASLR" ты в предыдущем посте не пропустил?
    Код (Text):
    1. Microsoft Windows [Version 6.1.7600]
    2. Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
    3.  
    4. C:\Users\Mal>cdb \windows\syswow64\notepad.exe
    5.  
    6. Microsoft (R) Windows Debugger Version 6.11.0001.404 AMD64
    7. Copyright (c) Microsoft Corporation. All rights reserved.
    8.  
    9. CommandLine: \windows\syswow64\notepad.exe
    10. Symbol search path is: srv*C:\symbols*http://msdl.microsoft.com/download/symbols
    11. Executable search path is:
    12. ModLoad: 00000000`00650000 00000000`00680000   notepad.exe
    13. ModLoad: 00000000`76dd0000 00000000`76f7b000   ntdll.dll
    14. ModLoad: 00000000`76fb0000 00000000`77130000   ntdll32.dll
    15. ModLoad: 00000000`73750000 00000000`7378f000   C:\Windows\SYSTEM32\wow64.dll
    16. ModLoad: 00000000`736f0000 00000000`7374c000   C:\Windows\SYSTEM32\wow64win.dll
    17. ModLoad: 00000000`736e0000 00000000`736e8000   C:\Windows\SYSTEM32\wow64cpu.dll
    18. (1080.2a8): Break instruction exception - code 80000003 (first chance)
    19. ntdll!LdrpDoDebuggerBreak+0x30:
    20. 00000000`76e81220 cc              int     3
    21. 0:000> ? @$peb
    22. Evaluate expression: 2130571264 = 00000000`7efdf000
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    d2k9
    Три раза запустил на XP:
    Код (Text):
    1. TEB: 0x7FFDE000
    2. PEB: 0x7FFDF000
    3.  
    4. TEB: 0x7FFDF000
    5. PEB: 0x7FFDD000
    6.  
    7. TEB: 0x7FFDF000
    8. PEB: 0x7FFD5000
    см. MiCreatePebOrTeb().
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Спсибо всем, буду разбираться
     
  14. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Clerk
    Да я уже сам понял после попыток на вин7 - а так хотелось чуда :)
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Пишу на C, дабы не создавать новой темы, итак, ищу командную строку чужого процесса, взяв на вооружение рекомендацииSol_Ksacap

    Итак, пишу
    Код (Text):
    1.  RTL_USER_PROCESS_PARAMETERS rupr;
    ... В поле CommandLine этой структуры должен находиться адрес командной строки. Теперь ищем адрес САМОЙ rupr, пишем так:

    Код (Text):
    1.  PEB peb;
    2.  peb.ProcessParameters= &rupr;
    думаю, тут всё понятно, в поле ProcessParameters структуры peb будет находиться адрес структуры rupr, теперь надо найти адрес структуры peb, пишу:

    Код (Text):
    1.  PROCESS_BASIC_INFORMATION PBI;
    2.  PBI.PebBaseAddress= &peb;
    Всё, осталось вызвать функцию которая заполнит все эти структуры, в общем компоную всё, получается так:
    Код (Text):
    1.  HANDLE h= HandleProcessa (ima_processa);
    2.  printf ("имя процесса есть %d\n", h );
    3.  
    4.  RTL_USER_PROCESS_PARAMETERS rupr;
    5.  
    6.  PEB peb;
    7.  peb.ProcessParameters= &rupr;
    8.  
    9.  PROCESS_BASIC_INFORMATION PBI;
    10.  PBI.PebBaseAddress= &peb;
    11.  
    12.  NtQueryInformationProcess (h, (PROCESSINFOCLASS)NULL, &PBI, 0, 0);
    13.  
    14.  printf ("%x\n", rupr.CommandLine);
    15.  getchar ();
    видите, у меня выводится адрес командной строки процесса h (хэндл верный, ибо дамп памяти процесса делается легко). После чего я приаттачиваюсь отладчиком к процессу, командную строку которого ищу, иду по адресу rupr.CommandLine и вижу там чушь. Стоит ли говорить, что
    Код (Text):
    1. ReadProcessMemory (h, (void*)(rupr.CommandLine), cm_stroka, 1024, 0  );
    тоже ничего не даёт, в буфере cm_stroka чушь. Что я делаю не так?
     
  16. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Забыл добавить, HandleProcessa это моя функция, которая делает снимок системы и потом вызывает там OpenProcess, находя нужный хэндл. В общем, всё как положено.
     
  17. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    amvoz
    NtQueryInformationProcess заполняет структуру PROCESS_BASIC_INFORMATION, а в структуре rupr как был бред, так и останется бред.
     
  18. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну если вы не заметили, мне тут посоветовали с помощью NtQueryInformationProcess найти командную строку стороннего процесса. Ладно, PROCESS_BASIC_INFORMATION я заполнил, а дальше как?
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Кстати, надо так, наверное:
    Код (Text):
    1. NtQueryInformationProcess (h, (PROCESSINFOCLASS)NULL, &PBI, sizeof (PBI), 0);
     
  20. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    amvoz
    после NtQueryInformationProcess с PROCESSINFOCLASS=0 в PROCESS_BASIC_INFORMATION будет лишь адрес PEB в АП интересующего процесса, а не сама структура. после получения адреса PEB нужно считать sizeof(PEB) байт (ну или только 4 байта указателя, посчитав смещения) по адресу PBI.PebBaseAddress с помощью ReadProcessMemory, а после уже потрошить PEB аналогичным образом: ProcessParameters.CommandLine.Buffer - и найти здесь искомую строку.
    PS: примеров этих действий в сети - уйма, см: h__p://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx