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

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

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Там по английски.
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    RamMerLabs, спасибо, а вот как, интересно, вот эта цитата из источника
    "The NtQueryInformationProcess() function does not have an import library, so we must use run-time dynamic linking to access this function in ntdll.dll."

    Она значит: функция NtQueryInformationProcess() не имеет библиотеки импорта, поэтому... короче они там ищут её адрес на ходу, что называется. Так, это ладно, мне другое непонятно. Как функция может иметь или не иметь библиотеку импорта? Это чушь полная...
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    amvoz
    Скорее всего имеется ввиду что это андок, который не имеет либы импорта-переходника.
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Нельзя ли попроще объяснить? То есть я знаю, что у каждого PE-файла есть таблица импорта и при загрузке она правится отладчиком- конкретнее, в неё подставляются адреса API функций которые корректны для данной оси.
    Значит, таблица импорта у PE файла есть.

    А тут в одной строчке три непонятных термина, андок, либа и импорт переходник...
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Линковщик делает связывание с динамическими библиотеками с помощью вспомогательной библиотеки импорта - blablabla.lib. NtQueryInformationProcess отсутсвует в ntdll.lib, соответственно её можно только через GetProcAddress.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Честное слово, не понимаю. Как же можно найти её адрес, если она отсутствует?
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Она есть в таблице экспорта ntdll.dll, но линковщик об этом не знает. Почитайте для чего нужны файлы *.lib
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Если у меня линковщик ругается, что не может что-то найти, я ищу в библиотеках соответствующий файл *.lib и подсоединяю его так: в параметрах компоновщика прописываю:

    Код (Text):
    1. -Wl, E:\Dev-Cpp\lib\libntdll.a
    И ещё ищу пишу нужный хидер подсоединяю его.
    В моей IDE ЕСТЬ libntdll.a, мне необязательно динамически искать адрес (у меня DEV C++)? Я и сам опробую, но я спрашиваю для закрепления.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Так вот без этих .lib далеко не уедешь, там описаны функции из соответствующих библиотек. И данной функции в ntdll.lib нету. В принципе можно сделать свою ntdll.lib и получить профит, а можно загрузить эту функцию посредством GetProcAddress. Эти .lib и называются библиотеками импорта.
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ваша уверенность меня пугает, чё-то я не так делаю
    Код (Text):
    1. #include <stdio.h>
    2. #include <Windows.h>
    3. #include <winternl.h>
    4. int main () {
    5.  PVOID ProcessInformation;
    6.  NtQueryInformationProcess (0, (PROCESSINFOCLASS)NULL, ProcessInformation, 24, 0);
    7.  getchar ();
    8.  return 0;
    9. }
    Компилится, на выходе исполняемый файл a.exe, компилю:
    Код (Text):
    1. g++ main.cpp -Wl, E:\Dev-Cpp\lib\libntdll.a
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    получается либо данная функция у меня есть, либо чё-то я портачу.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Значит в библиотеке импорта Dev-Cpp она есть, повезло. В либах от майкрософта её нет.
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну да, я качнул исходники по ссылке, видно, что чел использовал MSVS. Спасибо!
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ребята, а есть какой-нибудь совет, как получить командную строку процесса, который ПОКА НЕ ЗАПУСТИЛСЯ?

    То есть я написал прогу, которая успешно получает командную строку и пути процессов, которые благополучно висят в системе, например аська, firefox и прочая. Но есть ведь и такие, которые быстро-быстро промелькивают и всё. Например, g++. Я тогда делаю так: я написал программу, которая отслеживала бы появление в системе такого процесса, запускаю её, а потом запускаю сам процесс. За те доли секунды, что он работает, она считывает данные из его адресного пространства и всё.

    Но эти данные неверные, вот в чём дело! То есть адреса, по которым должны располагаться командная строка в первое мгновение жизни процесса ещё неверны и по ним находится чушь либо вообще памяти не выделено с такими адресами! То есть мне необходимо считывать командную строку процесса, когда он более или менее стабилизировался.

    ...Но как это сделать если он просто мелькает и тут же исчезает?
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну или мне тут в голову пришло, может, у OllyDbg есть какая-нибудь возможность отслеживать процессы, а потом при появлении нужного присоединяться к нему?
     
  16. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ну так почему бы не делать хук для CreateProcess. И нет проблем.
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Блин, я не умею. Вообще хуки не умею делать.
     
  18. red_mould

    red_mould New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2010
    Сообщения:
    34
    Ну дык как тут уже писали когда запустился процесс, дерни его PEB. И там есть такая структура как ProcessParameters и вот в ней ты найдешь все что те надо...
    Например (я такое дело проворачивал в ядре) ловишь запуск процесса, залезаешь в нутрь оного, например через APC. Потом при помощи ZwQueryInformationProcess (с ProcessBasicInformation) получаешь заполненную структуру PROCESS_BASIC_INFORMATION. В ней тебя интересует PebBaseAddress->ProcessParameters->CommandLine(это собственно что те надо.). И в принципе усе...
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    red_mould, ты не понял. Я именно всё так и делаю. Но этот способ хорошо при стабильно работающем процессе- ну, как стабильно- ну секунд 10 минимум, не знаю. На моей оси вот командную строку такого процесса:
    Код (Text):
    1. int main {
    2.  return 0;
    3. }
    не отследить. Я уже писал, что моя программа запускается ДО ЭТОГО ПРОЦЕССА и в цикле отслеживает все процессы в системе и как только появляется нужный, сразу делает то, что говорено тобой. Но данные эти неверны- по крайне мере при первом запуске, то есть по тем адреса прописана чушь.
    Если делать так:
    Код (Text):
    1. int main {
    2.  getchar ();
    3.  return 0;
    4. }
    И запустит поиск командной строки 2 раза, то всё будет ОК во второй раз, адресное пространство этого процесса устаканится и в нём будет чё надо.

    ...А вообще, надо, наверное перехватывать CreateProcess, правильно подсказали. Только это для меня внове.