Получение имени работающей программы, API

Тема в разделе "WASM.BEGINNERS", создана пользователем churik, 22 дек 2008.

  1. churik

    churik New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    19
    Здравствуйте, меня интересует способ/API, который/которая может получить имя работающей программы, те если запущена программа 123.exe, то возвращаемое значение будет "123.exe" или "путь\123.exe", спасибо.
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Поиск, поиск, на!
    GetModuleFileName(0, ....);
     
  3. churik

    churik New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    19
    Ursus, спасибо Вам, хотелось бы узнать:
    -изменяется результат ф-ции, если использовать первый параметр ф-ции, те дескриптор работающей программы.
    -есть ли ф-ция, которая возвращает только имя программы.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это для текущего процесса, для иного можно использовать psapi.GetModuleFileNameEx(). Обе функции берут инфу с лдр, поэтому элементарно изменить чтолибо там и получить имя этими функциями не удастся. Следует использовать psapi.GetProcessImageFileName(), либо сервис NtQueryInformationProcess с 27-м инфоклассом(ProcessImageFileName etc), к которому эта функция и сводится. А для текущего процесса, если загрузчика данные никто не менял, то никакие апи не нужны, просто считать:
    Код (Text):
    1.     assume fs:nothing
    2.     mov eax,fs:[TEB.Peb]
    3.     mov eax,PEB.Ldr[eax]
    4.     mov eax,PEB_LDR_DATA.InLoadOrderModuleList.Flink[eax]
    5.     lea eax,LDR_DATA_TABLE_ENTRY.FullDllName[eax]
    6. ;Eax:PUNICODE_STRING
    Но это имя в юникоде.
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Clerk
    Было тут где-то уже, но что если модуль переименован в рантайме? то не сработает
     
  6. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    asmfan
    Если шандарахнуть по матери кувалдой, то тоже ничего работать не будет. не отходите от темы вопроса, на который уже давно ответили.
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    x0man
    Не офтопим не по теме. Тут не про физические меры воздействия говорят, а про программные.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    а чем GetModuleFileName(0, ....) не устроило-то?

    можно пойти по сложному пути... можно перечислить все процессы в системе и оттуда взять и имя файла, и пид, и ещё дохера всего... смотри ZwQuerySystemInformation из ntdll.dll... :))))))
     
  9. Clerk

    Clerk Забанен

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

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    asmfan
    Убейтесь аб стену. Вы не шарите.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    что например? написать, как пользоваться этой функцией?
    вот так примерно:

    Код (Text):
    1. typedef LONG NTSTATUS;
    2. typedef LONG KPRIORITY;
    3.  
    4. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
    5.  
    6. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
    7. #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
    8.  
    9. #define SystemProcessesAndThreadsInformation 5
    10.  
    11. typedef struct _UNICODE_STRING
    12. {
    13.     USHORT Length;
    14.     USHORT MaximumLength;
    15.     PWSTR Buffer;
    16. } UNICODE_STRING;
    17.  
    18. typedef struct _SYSTEM_PROCESSES
    19. {
    20.     ULONG             NextEntryDelta;
    21.     ULONG             ThreadCount;
    22.     ULONG             Reserved1[6];
    23.     LARGE_INTEGER     CreateTime;
    24.     LARGE_INTEGER     UserTime;
    25.     LARGE_INTEGER     KernelTime;
    26.     UNICODE_STRING    ProcessName;
    27.     KPRIORITY         BasePriority;
    28.     ULONG             ProcessId;
    29.     ULONG             InheritedFromProcessId;
    30.     ULONG             HandleCount;
    31.     ULONG             Reserved2[2];
    32. } SYSTEM_PROCESSES, * PSYSTEM_PROCESSES;
    33.  
    34. typedef NTSTATUS (WINAPI* PZQSI)(UINT, PVOID, ULONG, PULONG);
    35. typedef void* PMYVOID();
    36. PZQSI pZwQuerySystemInformation = NULL;
    37.  
    38. void SysProc()
    39. {
    40.         HMODULE lib = LoadLibrary(L"ntdll.dll"); // получаем ntdll.dll
    41.     pZwQuerySystemInformation = (PZQSI)GetProcAddress(lib, "ZwQuerySystemInformation"); // получаем адрес функ.
    42.     if(pZwQuerySystemInformation == NULL)
    43.     { printf("ERROR IMPORTING PZQSI\n"); return 1; }
    44.    
    45.     UINT sysclass = 5; // Получить список процессов
    46.     PVOID buffer = NULL;
    47.     ULONG buflen = 0x8000; // Начальная длина буффера
    48.     ULONG retlen = 0;
    49.     NTSTATUS ret = 0;
    50.  
    51.     do // Подбираем размер буффера
    52.     {
    53.         buffer = VirtualAlloc(NULL, buflen, MEM_COMMIT, PAGE_READWRITE);
    54.         if(buffer == NULL) { return 1; }
    55.  
    56.         ret = pZwQuerySystemInformation(sysclass, buffer, buflen, &retlen);
    57.         if(ret == STATUS_INFO_LENGTH_MISMATCH)
    58.         {
    59.             VirtualFree(buffer, buflen, MEM_DECOMMIT);
    60.             buflen = buflen * 2;
    61.         }
    62.         else if (ret != STATUS_SUCCESS)
    63.         {
    64.             VirtualFree(buffer, buflen, MEM_DECOMMIT);
    65.             return 1;
    66.         }
    67.     }
    68.     while(ret == STATUS_INFO_LENGTH_MISMATCH);
    69.  
    70.     PSYSTEM_PROCESSES pProcesses = (PSYSTEM_PROCESSES)buffer; // Начинаем обходить буффер
    71.     while(1)
    72.     {
    73.         // делаешь с информацией все, что душе угодно (структуру см. выше)
    74.         // например pProcesses->ProcessId - ПИД, pProcesses->ProcessName.Buffer - Имя процесса       
    75.         if(pProcesses->NextEntryDelta == 0) // Переходим к след. элементу
    76.         { break; }
    77.         else { pProcesses = PSYSTEM_PROCESSES((char*)pProcesses + pProcesses->NextEntryDelta); }
    78.         break;
    79.     }
    80.  
    81.     FreeLibrary(lib);
    82. }
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Rel
    Так там же имена короткие, полное имя ведь не возвращает.
     
  13. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    x0man закончите школу сначала без двоек, мл.чел-к.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    да... имена короткие... так сам же писал про функцию NtQueryInformationProcess(или ZwQueryInformationProcess)... с параметром 27 вернет строку юникодовскую с полным именем исполняемого файла... никак не пойму, что ты от меня то хочешь?)))))

    по теме: если автору нужно узнать имя исполняемого файла одной единственной висящей в памяти программы, вполне хватило бы GetModuleFileNameEx... или я не прав?

    кстати вопрос на засыпку... как получить пользователя, под кем запущен тот или иной процесс? мне чет очень интересно стало... ;)
     
  15. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    по SID фукцией LookupAccountSid
     
  16. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Или :)
    Наверное, asmfan имел в виду http://www.wasm.ru/forum/viewtopic.php?id=18431
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    пасиб!

    ааа... понял... :)
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Rel
    Вначале NtQueryInformationProcess это сервис, потом функция.
    Это смотря что автору за имя нужно. Если чужёго процесса, то функция GetModuleFileNameEx() имеет следующие недостатки:
    > Требует хэндл процесса, с правами доступа на чтение памяти.
    > Используется чтение памяти с ап процесса, в частности с лдр.
    > Требует опционально адрес загрузки модуля.
    Любая инфа для этой функции может быть подменена. Как пример, в аттаче тестовое приложение(давно скомпилено было), попробуй считать с помощью этой функции имя, мне интересно что из этого выйдет :)
    Если уже речь зашла про загруженные модули, то полное имя можно выжать сервисом NtQueryVirtualMemory(MemorySectionName), но нужно знать адрес загрузки модуля, для чего придётся перечислять их все с помощью тогоже сервиса.
     
  19. churik

    churik New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    19
    Извиняюсь, всем спасибо.