имя запущенного .exe

Тема в разделе "WASM.WIN32", создана пользователем Sickle, 16 янв 2007.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    1)

    IceStudent
    >>запускаем, скажем, ProcExp - и видим там переименованное
    >Это который? ProcessXP? Не показывает он.

    Имелся в виду Process Explorer by Russinovich.
    Показывает. Если соблюдать указанные условия.

    Показывает и штатный таскменеджер, да и мой простейший WinTreeSnap ( http://www.wasm.ru/forum/attachment.php?item=154 ) .

    (А ProcExp был выбран специально в честь EP_X0FF: по-моему, на форуме по ProcExp нет ветки без его участия :) )

    2)

    Ну, а если так -
    в директории, полученной через GetModuleFileName, перебор всех файлов + тест на ... (критерий за вами, файл-то ваш).
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Под NT-based
    Код (Text):
    1. TCHAR tszPath[MAX_PATH];
    2. GetMappedFileName(GetCurrentProcess(), GetModuleHandle(NULL), tszPath, sizeof(tszPath));
    если нужно перевести путь в классический, можно воспользоваться RtlNtPathNameToDosPathName
    под 9x не знаю...
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну, я тоже о нём. Не показывает.

    Прога, выводящая MessageBox. Запускаем. Переименовываем исполняемый файл. Запускаем ProcessXP, смотрим всеми доступными способами имя файла - везде старое (свойства процесса, список его длл, в хэндлах его вообще нет, поиском по всем процессам). То же самое, если переименовывать программно после запуска. О чём я и говорил.

    А толку - файл можно перемещать куда угодно в пределах раздела.

    Nouzui
    Вот, именно это и показывает реальное имя файла.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну да. Собственно, Native API - ответ на большинство вопросов. Не догадался заглянуть раньше:
    Код (Text):
    1.     struct {
    2.         OBJECT_NAME_INFORMATION ObjectNameInfo;
    3.         WCHAR FileName[MAX_PATH];
    4.     } s;
    5.    Status = NtQueryVirtualMemory(hProcess,
    6.                                   lpv,
    7.                                   MemoryMappedFilenameInformation,
    8.                                   &s.ObjectNameInfo,
    9.                                   sizeof(s),
    10.                                   &ReturnLength
    11.                                   );
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Nouzui
    Точно, самое оно.


    IceStudent

    >>Имелся в виду Process Explorer by Russinovich.Показывает. Если соблюдать указанные условия.
    >Ну, я тоже о нём. Не показывает.

    Однако странно вы его обозвали - ProcessXP. Показывает.

    >Прога, выводящая MessageBox. Запускаем. Переименовываем исполняемый файл.

    Стоп, а как именно переименовываете ? (И кстати - на каких виндах ? У меня XP).
    Переименовывать нужно нежно.

    >Запускаем ProcessXP, смотрим всеми доступными способами имя файла - везде старое (свойства процесса, список его длл, в хэндлах его вообще нет, поиском по всем процессам).

    не надо всеми способами, смотрите только способом глазения на дерево процессов в главном окне, вот там - не старое, а новое.

    Еще раз:
    запускаем прогу mb.exe,
    видим MessageBox,
    перетаскиваем файл mb.exe в другую директорию,
    там переименовываем этот файл в 123.4567,
    запускаем ProcExp,
    и - зуб даю - видим в дереве процессов 123.4567.


    >>в директории, полученной через GetModuleFileName, перебор всех файлов
    >А толку - файл можно перемещать куда угодно в пределах раздела.

    Это да.
     
  6. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Код (Text):
    1. static DWORD
    2. InternalGetMappedFileName(BOOLEAN bUnicode,
    3.                           HANDLE hProcess,
    4.                           LPVOID lpv,
    5.                           LPVOID lpName,
    6.                           DWORD nSize)
    7. {
    8.   PMEMORY_SECTION_NAME pmsnName;
    9.   ULONG nBufSize;
    10.   NTSTATUS Status;
    11.  
    12.   if(nSize == 0 || lpName == NULL)
    13.   {
    14.     return 0;
    15.   }
    16.  
    17.   if(nSize > (0xFFFF / sizeof(WCHAR)))
    18.   {
    19.     /* if the user buffer contains more characters than would fit in an
    20.        UNICODE_STRING, limit the buffer size. RATIONALE: we don't limit buffer
    21.        size elsewhere because here superfluous buffer size will mean a larger
    22.        temporary buffer */
    23.     nBufSize = 0xFFFF / sizeof(WCHAR);
    24.   }
    25.   else
    26.   {
    27.     nBufSize = nSize * sizeof(WCHAR);
    28.   }
    29.  
    30.   /* allocate the memory */
    31.   pmsnName = PsaiMalloc(nBufSize + sizeof(MEMORY_SECTION_NAME));
    32.  
    33.   if(pmsnName == NULL)
    34.   {
    35.     SetLastError(ERROR_OUTOFMEMORY);
    36.     return 0;
    37.   }
    38.  
    39.    /* initialize the destination buffer */
    40.    pmsnName->SectionFileName.Length = 0;
    41.    pmsnName->SectionFileName.Length = nBufSize;
    42.  
    43. #if 0
    44.    __try
    45.    {
    46. #endif
    47.    /* query the name */
    48.    Status = NtQueryVirtualMemory(hProcess,
    49.                                  lpv,
    50.                                  MemorySectionName,
    51.                                  pmsnName,
    52.                                  nBufSize,
    53.                                  NULL);
    54.    if(!NT_SUCCESS(Status))
    55.    {
    56.      PsaiFree(pmsnName);
    57.      SetLastErrorByStatus(Status);
    58.      return 0;
    59.    }
    60.  
    61.    if(bUnicode)
    62.    {
    63.      /* destination is an Unicode string: direct copy */
    64.      memcpy((LPWSTR)lpName, pmsnName + 1, pmsnName->SectionFileName.Length);
    65.  
    66.      PsaiFree(pmsnName);
    67.  
    68.      if(pmsnName->SectionFileName.Length < nSize)
    69.      {
    70.        /* null-terminate the string */
    71.        ((LPWSTR)lpName)[pmsnName->SectionFileName.Length] = 0;
    72.        return pmsnName->SectionFileName.Length + 1;
    73.      }
    74.  
    75.      return pmsnName->SectionFileName.Length;
    76.    }
    77.    else
    78.    {
    79.      ANSI_STRING AnsiString;
    80.  
    81.      AnsiString.Length = 0;
    82.      AnsiString.MaximumLength = nSize;
    83.      AnsiString.Buffer = (LPSTR)lpName;
    84.  
    85.      if(AreFileApisANSI())
    86.        RtlUnicodeStringToAnsiString(&AnsiString, &pmsnName->SectionFileName, FALSE);
    87.      else
    88.        RtlUnicodeStringToOemString(&AnsiString, &pmsnName->SectionFileName, FALSE);
    89.  
    90.      PsaiFree(pmsnName);
    91.  
    92.      if(AnsiString.Length < nSize)
    93.      {
    94.        /* null-terminate the string */
    95.        ((LPSTR)lpName)[AnsiString.Length] = 0;
    96.        return AnsiString.Length + 1;
    97.      }
    98.  
    99.      return AnsiString.Length;
    100.    }
    101.  
    102. #if 0
    103.    }
    104.    __finally
    105.    {
    106.      PsaiFree(pmsnName);
    107.    }
    108. #endif
    109. }
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну-ну..
    Код (Text):
    1.     xor ebx,ebx
    2.     invoke GetModuleFileName,ebx,buf,256
    3.     invoke MoveFile,buf,szSystem
    4.     invoke GetModuleFileName,ebx,self,256
    5.     invoke MessageBox,ebx,self,_getpath,MB_ICONINFORMATION
    6.     invoke GetModuleHandle,ebx
    7.     invoke GetMappedFileName,-1,eax,self,256
    8.     invoke MessageBox,ebx,self,_getpath,MB_ICONINFORMATION 
    9.     invoke MoveFile,szSystem,buf
    10. ...
    11. szSystem    db 'test.dll',0
    12. buf     rb 256
    13. self        rb 256
    Не показывает.

    Имя файла у него такое :)
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    >>Переименовывать нужно нежно.

    >Ну-ну..

    >invoke MoveFile,buf,szSystem

    Это-то и грубо.
    Нежно - это, например, смена текста временного Edit-а в Explorer-е (иконка файла).
    Вот тогда ProcExp и покажет новое имя. (Но только раз, - дальнейшие переименования того же файла не воспримет ни этот, ни другие экземпляры ProcExp).

    >>Однако странно вы его обозвали - ProcessXP.
    >Имя файла у него такое :)

    Руссинович в курсе ?
     
  9. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Имею следующий код:
    Код (Text):
    1. if (hModule <> 0) then begin
    2.         hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    3.         if hProcess <> 0 then begin
    4.           Bytes := GetMappedFileName(hProcess, Pointer(hModule), @sbuf, SizeOf(sbuf)-1);
    5.           if Bytes <> 0 then Result := AnsiUpperCase(sbuf);
    6.           CloseHandle(hProcess);
    7.         end;
    8. end;
    Ф-ия GetMappedFileName из PsAPI.
    Интересно, что с PROCESS_VM_READ ф-ия GetMappedFileName возвращает 0.

    Через ToolHelp32 узнаю hModule первого модуля из процесса pid (т.е. базовый адрес главного модуля).
    Как попроще узнать hModule ?

    И как преобразовать путь "\DEVICE\HARDDISCVOLUME5\" в стандартный вид ?
     
  10. pushick

    pushick New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2007
    Сообщения:
    95
    А сходить на MSDN и скопировать готовый пример уже никак нельзя?
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Хм.. Только сейчас заметил - procexp. Нда.
     
  12. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Перенёс на паскаль ф-ию InternalGetMappedFileName (через NtQueryVirtualMemory).
    Для определения hModule использую ZwQueryInformationProcess:
    по адресу (PROCESS_BASIC_INFORMATION.PebBaseAddress + 08) как раз и находится hModule.

    Осталось только преобразовать "\DEVICE\HARDDISCVOLUME5\" в стандартный вид.

    Интересная особенность: иногда GetMappedFileName и NtQueryVirtualMemory возвращают путь в формате 8.3. Не могу понять от чего это зависит.
     
  13. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    По поводу KAV.EXE скажу следующее:
    через OpenProcess прожка моя не может открыть процесс KAV, но если KAV.EXE запустить из под ArtMoney, то ArtMoney определяет пути ко всем модулям процесса KAV.EXE.

    Как нито можно получить hProcess для уже работающего KAV.EXE ?
     
  14. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    уже сто раз обсуждалось - перечисляй открытые хендлы в csrss.exe
    ЗЫ: поиск - рулёZZZ!
     
  15. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Большой спасибо. Нашёл.
    Теперь и пусть к касперу определяется.

    А можно каким то макаром принудительно заставить NtQueryVirtualMemory возвратить путь в формате 8.3 ?