Требуется определить путь к EXEшнику. Делал так: Код (Text): PROCESS_BASIC_INFORMATION ProcInfo; ULONG Size,i,cbRet; PPEB pPeb; PPROCESS_PARAMETERS pProcParam; NTSTATUS status; if ( ZwQueryInformationProcess (NtCurrentProcess(), ProcessBasicInformation, &ProcInfo, sizeof(PROCESS_BASIC_INFORMATION), &Size) == STATUS_SUCCESS) { pPeb = ProcInfo.PebBaseAddress; if(pPeb != 0) { DbgPrint("%08X %08X",pPeb,(char *)pPeb + 16);//7FFDF000 7FFDF010 if(MmIsAddressValid((ULONG *)pPeb + 16)) { pProcParam = (PPROCESS_PARAMETERS)(*((ULONG *)pPeb + 16)); DbgPrint("%08X",pProcParam);//77FC42D8 for(i=0;i<90;i++) DbgPrint("%s",(PULONG)pProcParam+i);//Выводит мусор if(MmIsAddressValid(pProcParam->ImagePathName.Buffer)) DbgPrint("Name: %S",pProcParam->ImagePathName.Buffer); //FALSE } } } Наверное что то со структурами напутал. Где ошибка?
Получи офсет на процесс System. PsGetCurrentProcess() + offset - и будет у тебя указатель на имя процесса.
HANDLE hProcess; PROCESS_BASIC_INFORMATION pbi; PEB Peb; PROCESS_PARAMETERS ProcParam; DWORD dwDummy; DWORD dwSize; LPVOID lpAddress; hProcess = NtOpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,dwId); if (!hProcess) return; if (!NT_SUCCESS(NtQueryInformationProcess( hProcess, ProcessBasicInformation, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL))) { CloseHandle (hProcess); return; } if (!NT_SUCCESS(NtReadVirtualMemory( hProcess, pbi.PebBaseAddress, &Peb, sizeof(PEB), &dwDummy))) { CloseHandle (hProcess); return; } if (!NT_SUCCESS(NtReadVirtualMemory( hProcess, Peb.ProcessParameters, &ProcParam, sizeof(PROCESS_PARAMETERS), &dwDummy))) { CloseHandle (hProcess); return; } lpAddress = ProcParam.CommandLine.Buffer; dwSize = ProcParam.CommandLine.Length; if (dwBufLen<dwSize) return; if (!NT_SUCCESS(NtReadVirtualMemory( hProcess, lpAddress, wBuf, dwSize, &dwDummy))) { CloseHandle (hProcess); return; } CloseHandle (hProcess);
Я в гугле тоже похожее находил. Описание структуры "PEB" везде разное. Вот ссылка на мекософт: http://msdn.microsoft.com/library/en-us/dllproc/base/ntqueryinformatio nprocess.asp BSOD уже надоело лицезреть. И хотелось бы обойтись без OPenProcess и ReadVirtualMemory, слишком громоздко и медленно.
помойму фурычит на основе инфо от four-f UNICODE_STRING GetFullProcessName(HANDLE PID) { PEPROCESS proc; PSECTION Section; PSEGMENT Segment; PCONTROL_AREA ControlArea; PFILE_OBJECT FileObject; PsLookupProcessByProcessId(PID,&proc); if(proc->SectionObject) { Section = proc->SectionObject; Segment = Section->Segment; ControlArea = Segment->ControlArea; FileObject = ControlArea->FilePointer; // DbgPrint("Section FileName: %S\n",FileObject->FileName.Buffer); } return FileObject->FileName; ObDereferenceObject((PVOID)proc); }