Почему не удается получить полный путь к файлу по хэндлу процесса (FASM) Необходимо получить полные пути к файлам работающих процессов и занести их в ListView Код (Text): ... invoke OpenProcess, STANDARD_RIGHTS_REQUIRED+SYNCHRONIZE+0FFFh, 0, [ProcessEntry.th32ProcessID] mov [HandleOpenProcess], eax invoke CloseHandle, eax invoke GetModuleFileName, [HandleOpenProcess], ExePath, 260 mov [ListViewItem.pszText], ExePath stdcall [SendMessage], [hListViewProcesses], LVM_SETITEM, 0, ListViewItem ... Данный код выводит в ListView путь к моей программе в каждой строке ListView. Если поставить в первую строку вместо [ProcessEntry.th32ProcessID] конкретное число (PID взятый из Process Explorer), то вообще ничего не выводится - OpenProcess в EAX всегда помещает 80h.
GetModuleFileName надо передавать HMODULE. Код (Text): PWSTR GetNameByPID(DWORD PID){ ULONG pInfo[6], dwReaded, pProcParams, pName; USHORT wNameLen; PWSTR ret = NULL; HANDLE hProc = 0; hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, PID); if (!hProc) goto exit; if (NtQueryInformationProcess(hProc, 0, pInfo, 0x18, 0)) goto exit; if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pInfo[1] + 0x10), &pProcParams, 4, &dwReaded)) || (dwReaded != 4)) goto exit; if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pProcParams + 0x38), &wNameLen, 2, &dwReaded)) || (dwReaded != 2)) goto exit; if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pProcParams + 0x3C), &pName, 4, &dwReaded)) || (dwReaded != 4)) goto exit; if (!pName) goto exit; ret = malloc(wNameLen + 2); if (!ret) goto exit; if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pName), ret, wNameLen, &dwReaded)) || (dwReaded != wNameLen)){ free(ret); ret = NULL; } exit: if (hProc) CloseHandle(hProc); return ret; }
А я что передаю в этой строке Код (Text): invoke GetModuleFileName, [HandleOpenProcess], ExePath, 260 Все как написано в помощи hModule [in] Handle to the module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path for the current module. я передаю хэндл полученный OpenProcess, но даже когда я указываю конкретные разные Process ID в OpenProcess, то возвращается все время одно и тоже число. Почему? Попробую переписать ваш код на FASM, надеюсь заработает.
HMODULE - это на самом деле никакой не хендл. Это базовый адрес загрузки МОДУЛЯ. А у тебя есть только hProcess, это ХЕНДЛ ПРОЦЕССА. Вещи совершенно разные. Чтобы узнать имя главного модуля процесса можно пошарить в списке загруженных модулей, который можно прочитать в PEB процесса. Или можно пошаманить с CreateToolhelp32Snapshot. Пример кода (получение HMODULE но имени модуля и PID): Код (Text): DWORD RemoteGetModuleHandle(char *name, DWORD dwPid) { MODULEENTRY32 m = {sizeof(m)}; DWORD dwRet = 0; HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid); if (hSnap == INVALID_HANDLE_VALUE) return NULL; if (!Module32First(hSnap, &m)) return NULL; do { if (!lstrcmpi(m.szModule, name)) { dwRet = m.modBaseAddr; break; } } while (Module32Next(hSnap, &m)); CloseHandle(hSnap); return dwRet; } Пример с PEB: Код (Text): const DWORD FS = 0x3B; DWORD ownerProcessId = 38056; // Open process HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ownerProcessId); if(!hProcess) return printf("Cannot open process\n"); // Find thread HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); THREADENTRY32 te = {sizeof(te)}; Thread32First(hSnapshot, &te); DWORD threadId = 0; do { if(te.th32OwnerProcessID == ownerProcessId) threadId = te.th32ThreadID; } while(Thread32Next(hSnapshot, &te)); if(!threadId) return printf("No threads for specified process id\n"); // Get FS base HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, 0, threadId); if(!hThread) return printf("Cannot open thread\n"); LDT_ENTRY fs_entry; GetThreadSelectorEntry(hThread, FS, &fs_entry); DWORD fs_base = fs_entry.BaseLow | (fs_entry.HighWord.Bytes.BaseMid<<16) | (fs_entry.HighWord.Bytes.BaseHi<<24); // Read modules list TEB teb; DWORD read; if(!ReadProcessMemory(hProcess, (LPCVOID) fs_base, &teb, sizeof(teb), &read)) return printf("Can't read process memory for TEB, %d bytes read\n", read); PEB peb; if(!ReadProcessMemory(hProcess, (LPCVOID) teb.Peb, &peb, sizeof(peb), &read)) return printf("Can't read process memory for PEB, %d bytes read\n", read); PEB_LDR_DATA pld; if(!ReadProcessMemory(hProcess, (LPCVOID) peb.LoaderData, &pld, sizeof(pld), &read)) return printf("Can't read process memory for PEB_LDR_DATA, %d bytes read\n", read); LDR_MODULE entry; if(!ReadProcessMemory(hProcess, (LPCVOID) pld.InInitializationOrderModuleList.Flink, &entry, sizeof(entry), &read)) return printf("Can't read process memory for LDR_MODULE, %d bytes read\n", read); WORD wbuffer[20]; char buffer[1024]; // Walk the list do { // Print the name if(!ReadProcessMemory(hProcess, (LPCVOID) entry.BaseDllName.Buffer, &wbuffer, sizeof(wbuffer), &read)) return printf("Can't read process memory for wbuffer in loop, %d bytes read\n", read); WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, buffer, sizeof(buffer), 0, 0); printf("%s\t[0x%08x]\n", buffer, entry.BaseAddress); // Next if(!ReadProcessMemory(hProcess, (LPCVOID) entry.ModuleList.Flink, &entry, sizeof(entry), &read)) return printf("Can't read process memory for LDR_MODULE in loop, %d bytes read\n", read); } while(entry.ModuleList.Flink != pld.InInitializationOrderModuleList.Flink); CloseHandle(hThread); CloseHandle(hProcess); CloseHandle(hSnapshot);
Вот код из такой программы: Код (Text): GetProcessPath proc dwPID:DWORD, p_szBuff:DWORD, dwBuffSize:DWORD LOCAL hProcess :DWORD LOCAL hModule :DWORD LOCAL cbNeeded :DWORD invoke EnablePrivilege,TRUE invoke OpenProcess,PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,0,dwPID .if eax==0 xor eax,eax ret .endif mov hProcess,eax invoke EnumProcessModules,hProcess,addr hModule,4,addr cbNeeded .if eax==0 xor eax,eax ret .endif invoke GetModuleFileNameEx,hProcess,hModule,p_szBuff,dwBuffSize .if eax == 0 xor eax,eax ret .endif invoke CloseHandle,hProcess invoke EnablePrivilege,FALSE xor eax,eax inc eax Ret GetProcessPath EndP Код рабочий! (Из моей программы с похожим функционалом) P.S. экзэшник в атаче файл не прицепился Ссылка на рапиду: http://rapidshare.com/files/24729880/ProcessList.rar.html
Для Gmax 1) Твой код переделал так: Код (Text): ... invoke OpenProcess,STANDARD_RIGHTS_REQUIRED+SYNCHRONIZE+0FFFh,0,[ProcessEntry.th32ProcessID] mov [hProcess],eax invoke EnumProcessModules,[hProcess],hModule,4,cbNeeded invoke GetModuleFileNameEx,[hProcess], [hModule],ExePath,260 mov [ListViewItem.pszText], ExePath stdcall [SendMessage],[hListViewProcesses],LVM_SETITEM,0, ListViewItem ; ... Программа при запуске пишет "Точка входа в процедуру GetModuleFileNameEx не найдена в библиотеке DLL PSAPI.dll" - если GetModuleFileNameEx заменить на GetModuleFileName, то все по старому в ListView заносится только путь к моей программе. ( Все эти действия я произвожу в отдельном потоке который после заполнения ListView списком процессов закрывается. Может проблема в этом. И еще - OllyDbg при отладке делает два прохода в цикле, а потом выпадает в ntdll и пишет Process terminated, exit code C0000008) 2) Возможно это из-за того, что я не использую EnablePrivilege ( как я понимаю ты устанавливаешь необходимые привилегии своему процессу). Я использую такой код: Код (Text): ... push ebp mov ebp, esp sub esp, 24h push esp push 28h push -1 call [OpenProcessToken] test eax, eax jz @F lea eax, [esp + 8] push eax push PrivName push 0 call [LookupPrivilegeValue] test eax, eax jz @F mov dword [esp + 14h], 1 mov eax, [esp + 8] mov [esp + 18h], eax mov eax, [esp + 0Ch] mov [esp + 1Ch], eax mov dword [esp + 20h], 2 lea eax, [esp + 10h] push eax lea eax, [esp + 18h] push eax push 10h lea eax, [esp + 20h] push eax push 0 mov eax, [esp + 14h] push eax call [AdjustTokenPrivileges] @@: leave ... ( здесь получаю полный путь) ... 3) Твой экзэшник скачал и посмотрел - да вот это я и хочу сделать 4) Возможно посмотреть твои исходники ?
NAGRIS 1) А что у тебя за ось? Библиотека PSAPI.dll есть в наличие? Посмотри есть ли там такая функция. Про олю: на расстоянии определить ошибку не берусь. Привилегии (debug) нужны что бы получить доступ к некоторым системным процессам. 3) 4) Лучше давай я твои посмотрю.
Gmax Windows XP SP2 Библиотека PSAPI.dll есть. Такая функция там есть. В FASM не было psapi.inc переписал сам из MASM Посылаю исходник: http://www.rapidshare.ru/240622
NAGRIS В библиотеке PSAPI.dll есть функция GetModuleFileNameExA (для обычных строк) и функция GetModuleFileNameExW(для юникода), а вот функции GetModuleFileNameEx -- нет. В psapi.inc у тебя надо написать вместо GetModuleFileNameEx, 'GetModuleFileNameEx',\ так GetModuleFileNameEx, 'GetModuleFileNameExA',\ И еще у тебя там есть ошибки с PropertySheet, у меня прога вылетала с ошибкой, пока не закоментил. Если все это поправить и раскоментить вариант с GetModuleFileNameEx то работает. А вообще присмотрись к библиотеке PSAPI.dll там есть хорошие функции для замены CreateToolhelp32Snapshot. В NT лучше использовать PSAPI.dll.