Привет, All Покопался на форуме и понятной реализации вопроса по нахождению имени текущего процесса (кернел мод) не нашел. Насколько я понял: вариант 1) Извлечь все необходимое из PEB. Но здесь что-то не получается с ZwQueryInformation (если есть рабочий код, плз поделитесь) вариант 2) Использовать эти структуры - PEPROCESS->SectionObject->Segment->ControlArea->FilePointer->FileName. Buffer Но и здесь есть проблемы, т.к. нужно определять целую кучу структур.
Однозначно 2 вариант, так как не стоит обращаться из ядра к юзермодным структурам без лишней необходимости. Ну а насчет того что много структур надо обьявлять, так лениться тоже не стоит вперед за работу
Я вооружился pdbdump и ntoskrnl.pdb И pdbdump выдаёт фразу вида ERROR =х абыр абыр абыр Откуда взять описания недостающих структур?
biocheshire С качай тутушный, васмовый рулит и некаких заклинаний не требуется, все на уровне начинающего волшебника
В продолжение темы.. Не могу заставить код работать, подскажите плиз где баг Код (Text): UNICODE_STRING GetFullProcessName() { PEPROCESS proc; PSECTION_OBJECT Section; PSEGMENT_OBJECT Segment; PCONTROL_AREA ControlArea; PFILE_OBJECT FileObject; proc = PsGetCurrentProcess(); if(proc->SectionObject) { Section = proc->SectionObject; Segment = Section->Segment; ControlArea = Segment->ControlArea; FileObject = ControlArea->FilePointer; DbgPrint("Section FileName: %S\n",FileObject->FileName.Buffer); } ObDereferenceObject((PVOID)proc); return FileObject->FileName; } Есть драйвер, который перехватывает NtUserGetMessage, уже внутри есть необходимость вызвать эту GetFullProcessName дабы узнать имя процесса, отославшего сообщение. Получаю BSOD. Или быть может есть у кого рабочий пример - как узнать имя текущего процесса из драйвера через ZwQuerySystemInformation ?
Какой-то странный путь: PEPROCESS->SectionObject->Segment->ControlArea->FilePointer->FileName. Buffer Посмотрел несколько раз - не вижу в структуре EPROCESS такого элемента, как SectionObject. Откуда он взялся? Я знаю такой путь: PEPROCESS->Peb->Ldr->InLoadOrderModuleList Кроме этого есть ещё способ: при загрузке драйвер стартует в процессе System. В DriverEntry можно вызвать PsGetCurrentProcess(); и посканировать PERPOCESS процесса System на глубину примерно 1000h в поисках сигнатуры "System". Код (Text): //==================================================================== = int GetImageFileNameOffset(){ char* hProcess; int i; hProcess = (char*)IoGetCurrentProcess(); for (i=0; i<0x1000; i++){ if ( 0 == _strnicmp((hProcess + i), "system", 6) ) return i; } return 0; } Оффсет, по которому сигнатура будет найдена - он будет постоянным для всех процессов. запомни его и далее просто прибавляя к PEPROCESS этот оффсет, получишь адрес имени процесса (это не имя ехе, хотя в большинстве случаев совпадает) Имя не zero-terminated, и ограничено длиной 16 символов.
SectionObject там есть, pdbdump'ом проверял, да и вообще этот способ не сам придумывал, но судя по описанию он должен работать. А по поводу PEB.. Самое странное то, что после PsGetCurrentProcess (вызывается внутри перехваченной функции) поле PEB ни на что не указывает. За способ с оффсетом спасибо, сейчас попробую.
из ... сам найдешь: Код (Text): /* _____________________________________________________________________ . GetProcessNameOffset . . Scan the KPEB looking for the "System" process name - because . DriverEntry is called in that context. This offset becomes a . reference for later. -thanks to sysinternals for this trick ;-) . _____________________________________________________________________ */ void GetProcessNameOffset() { PEPROCESS curproc; int i; curproc = PsGetCurrentProcess(); for( i = 0; i < 3*PAGE_SIZE; i++ ) { if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") )) { gProcessNameOffset = i; } } }
status = ZwQueryInformationProcess( hProcess, ProcessImageFileName, buffer, sizeof( buffer ), &nReturnLength );
В данном случае черезвычайно важна производительность обработчика, и единственный пригодный вариант - это брать имя из EPROCESS. (см. пост EvilsInterrupt).