Здравствуйте, меня интересует способ/API, который/которая может получить имя работающей программы, те если запущена программа 123.exe, то возвращаемое значение будет "123.exe" или "путь\123.exe", спасибо.
Ursus, спасибо Вам, хотелось бы узнать: -изменяется результат ф-ции, если использовать первый параметр ф-ции, те дескриптор работающей программы. -есть ли ф-ция, которая возвращает только имя программы.
Это для текущего процесса, для иного можно использовать psapi.GetModuleFileNameEx(). Обе функции берут инфу с лдр, поэтому элементарно изменить чтолибо там и получить имя этими функциями не удастся. Следует использовать psapi.GetProcessImageFileName(), либо сервис NtQueryInformationProcess с 27-м инфоклассом(ProcessImageFileName etc), к которому эта функция и сводится. А для текущего процесса, если загрузчика данные никто не менял, то никакие апи не нужны, просто считать: Код (Text): assume fs:nothing mov eax,fs:[TEB.Peb] mov eax,PEB.Ldr[eax] mov eax,PEB_LDR_DATA.InLoadOrderModuleList.Flink[eax] lea eax,LDR_DATA_TABLE_ENTRY.FullDllName[eax] ;Eax:PUNICODE_STRING Но это имя в юникоде.
asmfan Если шандарахнуть по матери кувалдой, то тоже ничего работать не будет. не отходите от темы вопроса, на который уже давно ответили.
а чем GetModuleFileName(0, ....) не устроило-то? можно пойти по сложному пути... можно перечислить все процессы в системе и оттуда взять и имя файла, и пид, и ещё дохера всего... смотри ZwQuerySystemInformation из ntdll.dll... )))))
что например? написать, как пользоваться этой функцией? вот так примерно: Код (Text): typedef LONG NTSTATUS; typedef LONG KPRIORITY; #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) #define SystemProcessesAndThreadsInformation 5 typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; typedef struct _SYSTEM_PROCESSES { ULONG NextEntryDelta; ULONG ThreadCount; ULONG Reserved1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; KPRIORITY BasePriority; ULONG ProcessId; ULONG InheritedFromProcessId; ULONG HandleCount; ULONG Reserved2[2]; } SYSTEM_PROCESSES, * PSYSTEM_PROCESSES; typedef NTSTATUS (WINAPI* PZQSI)(UINT, PVOID, ULONG, PULONG); typedef void* PMYVOID(); PZQSI pZwQuerySystemInformation = NULL; void SysProc() { HMODULE lib = LoadLibrary(L"ntdll.dll"); // получаем ntdll.dll pZwQuerySystemInformation = (PZQSI)GetProcAddress(lib, "ZwQuerySystemInformation"); // получаем адрес функ. if(pZwQuerySystemInformation == NULL) { printf("ERROR IMPORTING PZQSI\n"); return 1; } UINT sysclass = 5; // Получить список процессов PVOID buffer = NULL; ULONG buflen = 0x8000; // Начальная длина буффера ULONG retlen = 0; NTSTATUS ret = 0; do // Подбираем размер буффера { buffer = VirtualAlloc(NULL, buflen, MEM_COMMIT, PAGE_READWRITE); if(buffer == NULL) { return 1; } ret = pZwQuerySystemInformation(sysclass, buffer, buflen, &retlen); if(ret == STATUS_INFO_LENGTH_MISMATCH) { VirtualFree(buffer, buflen, MEM_DECOMMIT); buflen = buflen * 2; } else if (ret != STATUS_SUCCESS) { VirtualFree(buffer, buflen, MEM_DECOMMIT); return 1; } } while(ret == STATUS_INFO_LENGTH_MISMATCH); PSYSTEM_PROCESSES pProcesses = (PSYSTEM_PROCESSES)buffer; // Начинаем обходить буффер while(1) { // делаешь с информацией все, что душе угодно (структуру см. выше) // например pProcesses->ProcessId - ПИД, pProcesses->ProcessName.Buffer - Имя процесса if(pProcesses->NextEntryDelta == 0) // Переходим к след. элементу { break; } else { pProcesses = PSYSTEM_PROCESSES((char*)pProcesses + pProcesses->NextEntryDelta); } break; } FreeLibrary(lib); }
да... имена короткие... так сам же писал про функцию NtQueryInformationProcess(или ZwQueryInformationProcess)... с параметром 27 вернет строку юникодовскую с полным именем исполняемого файла... никак не пойму, что ты от меня то хочешь?))))) по теме: если автору нужно узнать имя исполняемого файла одной единственной висящей в памяти программы, вполне хватило бы GetModuleFileNameEx... или я не прав? кстати вопрос на засыпку... как получить пользователя, под кем запущен тот или иной процесс? мне чет очень интересно стало...
Rel Вначале NtQueryInformationProcess это сервис, потом функция. Это смотря что автору за имя нужно. Если чужёго процесса, то функция GetModuleFileNameEx() имеет следующие недостатки: > Требует хэндл процесса, с правами доступа на чтение памяти. > Используется чтение памяти с ап процесса, в частности с лдр. > Требует опционально адрес загрузки модуля. Любая инфа для этой функции может быть подменена. Как пример, в аттаче тестовое приложение(давно скомпилено было), попробуй считать с помощью этой функции имя, мне интересно что из этого выйдет Если уже речь зашла про загруженные модули, то полное имя можно выжать сервисом NtQueryVirtualMemory(MemorySectionName), но нужно знать адрес загрузки модуля, для чего придётся перечислять их все с помощью тогоже сервиса.