Проблема с определением имени EXEшника

Тема в разделе "WASM.WIN32", создана пользователем HARD, 10 окт 2005.

  1. HARD

    HARD New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    15
    Требуется определить путь к EXEшнику.

    Делал так:


    Код (Text):
    1.  
    2. PROCESS_BASIC_INFORMATION ProcInfo;
    3. ULONG Size,i,cbRet;
    4. PPEB pPeb;
    5. PPROCESS_PARAMETERS pProcParam;
    6. NTSTATUS status;
    7.  
    8. if ( ZwQueryInformationProcess (NtCurrentProcess(), ProcessBasicInformation, &ProcInfo, sizeof(PROCESS_BASIC_INFORMATION), &Size) == STATUS_SUCCESS) {
    9.        
    10.     pPeb = ProcInfo.PebBaseAddress;
    11.     if(pPeb != 0) {
    12.     DbgPrint("%08X %08X",pPeb,(char *)pPeb + 16);//7FFDF000 7FFDF010
    13.     if(MmIsAddressValid((ULONG *)pPeb + 16)) {
    14.         pProcParam = (PPROCESS_PARAMETERS)(*((ULONG *)pPeb + 16));
    15.         DbgPrint("%08X",pProcParam);//77FC42D8
    16.         for(i=0;i<90;i++) DbgPrint("%s",(PULONG)pProcParam+i);//Выводит мусор
    17.         if(MmIsAddressValid(pProcParam->ImagePathName.Buffer)) DbgPrint("Name: %S",pProcParam->ImagePathName.Buffer); //FALSE
    18.     }
    19. }
    20. }
    21.  




    Наверное что то со структурами напутал. Где ошибка?
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    HARD

    ты это под какой операционктой проверял ???
     
  3. HARD

    HARD New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    15
    Windows 2003
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Получи офсет на процесс System.

    PsGetCurrentProcess() + offset - и будет у тебя указатель на имя процесса.
     
  5. HARD

    HARD New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    15


    Это я получу только имя, а как получить полный путь?
     
  6. Anton_K

    Anton_K New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    9
    Адрес:
    Germany
    GetCommandLine
     
  7. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Anton_K





    С драйвера ?)
     
  8. Anton_K

    Anton_K New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    9
    Адрес:
    Germany
    Извиняюсь, ошибся. :)
     
  9. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    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);
     
  10. HARD

    HARD New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    15
    Я в гугле тоже похожее находил.

    Описание структуры "PEB" везде разное. Вот ссылка на мекософт:

    http://msdn.microsoft.com/library/en-us/dllproc/base/ntqueryinformatio nprocess.asp



    BSOD уже надоело лицезреть.



    И хотелось бы обойтись без OPenProcess и ReadVirtualMemory, слишком громоздко и медленно.
     
  11. SPath

    SPath New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2005
    Сообщения:
    13
    помойму фурычит

    на основе инфо от 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);

    }
     
  12. SPath

    SPath New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2005
    Сообщения:
    13
    return чуть ниже надо Ж:)