Как получить полный путь к файлу по известной PROCESSENTRY32?

Тема в разделе "WASM.BEGINNERS", создана пользователем medal06, 12 окт 2006.

  1. medal06

    medal06 New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2006
    Сообщения:
    6
    Сабж + работа в User mode.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    http://www.wasm.ru/article.php?article=1021003
     
  3. medal06

    medal06 New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2006
    Сообщения:
    6
    Прочитал дважды.
    - там не полный путь, а только имя.
    А нужен именно путь.
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Там путь, но под Win98 & Win95. Под остальными, это имя исполнимаго ф-ла.
    Там есть еще одна особенность с кучами. Алгоритм для 9х и НТ различный. Если будут вопросы - обращайся.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    есть структура MODULEENTRY32 откуда и берут путь к файлу
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Через PEB.
    Изучай его структуру.
    Можешь получить адрес PEB через NtQueryProcessInformation, и потом читать из АП этого процесса все нужные тебе данные.
     
  7. medal06

    medal06 New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2006
    Сообщения:
    6
    PEB поизучал, вот что получилось. Но на первом ReadProcessMemory ошибка. Подскажите где грабли?
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include    \masm32\include\windows.inc
    6. include    \masm32\include\kernel32.inc
    7. include    \masm32\include\psapi.inc
    8. include    \masm32\include\user32.inc
    9.  
    10.  
    11.  
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\Psapi.lib
    14. includelib \masm32\lib\user32.lib
    15.  
    16. PTOZWQUERYINFORMATIONPROCESS TYPEDEF PROTO :DWORD, : DWORD, : DWORD, : DWORD, : DWORD
    17. PZWQUERYINFORMATIONPROCESS TYPEDEF PTR PTOZWQUERYINFORMATIONPROCESS
    18.  
    19. .data
    20.  
    21.     _PROCESSENTRY32 struct
    22.         dwSize DWORD 0
    23.         cntUsage DWORD 0
    24.         th32ProcessID DWORD 0
    25.         th32DefaultHeapID DWORD 0
    26.         th32ModuleID DWORD 0
    27.         cntThreads DWORD 0
    28.         th32ParentProcessID DWORD 0
    29.         pcPriClassBase DWORD 0
    30.         dwFlags DWORD 0
    31.         szExeFile BYTE 260 dup (?)
    32.     _PROCESSENTRY32 ends
    33.  
    34.     _PROCESS_BASIC_INFORMATION struct
    35.         ExitStatus DWORD 0
    36.         PebBaseAddress DWORD 0
    37.         AffinityMask DWORD 0
    38.         BasePriority DWORD 0
    39.         UniqueProcessId DWORD 0
    40.         InheritedFromUniqueProcessId DWORD 0
    41.     _PROCESS_BASIC_INFORMATION ends
    42.  
    43.     _PEB struct
    44.         InheritedAddressSpace DWORD 0
    45.         ReadImageFileExecOptions DWORD 0
    46.         BeingDebugged DWORD 0
    47.         SpareBool DWORD 0
    48.         Mutant DWORD 0
    49.         ImageBaseAddress DWORD 0
    50.         Ldr DWORD 0
    51.         ProcessParameters DWORD 0
    52.         SubSystemData DWORD 0
    53.         ProcessHeap DWORD 0
    54.         FastPebLock DWORD 0
    55.         AltThunkSListPtr DWORD 0
    56.         IFEOKey DWORD 0
    57.         Spare DWORD 0
    58.     _PEB ends    
    59.    
    60.     _RTL_USER_PROCESS_PARAMETERS struct
    61.         MaximumLength DWORD 0
    62.         sLength DWORD 0
    63.         Flags DWORD 0
    64.         DebugFlags DWORD 0
    65.         ConsoleHandle DWORD 0
    66.         ConsoleFlags DWORD 0
    67.         StandardInput DWORD 0
    68.         StandardOutput DWORD 0
    69.         StandardError DWORD 0
    70.         CurrentDirectory DWORD 0
    71.         DllPath DWORD 0
    72.         ImagePathName DWORD 0
    73.         CommandLine DWORD 0
    74.         Environment DWORD 0
    75.         StartingX DWORD 0
    76.         StartingY DWORD 0
    77.         CountX DWORD 0
    78.         CountY DWORD 0
    79.         CountCharsX DWORD 0
    80.         CountCharsY DWORD 0
    81.         FillAttribute DWORD 0
    82.         WindowFlags DWORD 0
    83.         ShowWindowFlags DWORD 0
    84.         WindowTitle DWORD 0
    85.         DesktopInfo DWORD 0
    86.         ShellInfo DWORD 0
    87.         RuntimeData DWORD 0
    88.     _RTL_USER_PROCESS_PARAMETERS ends
    89.  
    90.     _UNICODE_STRING struct
    91.         sLength WORD 0
    92.         MaximumLength WORD 0
    93.         Buffer DWORD 0
    94.     _UNICODE_STRING ends
    95.  
    96.    
    97.     uProcess _PROCESSENTRY32 <?>
    98.     pbi _PROCESS_BASIC_INFORMATION <?>
    99.     pPeb _PEB <?>
    100.     uStr _UNICODE_STRING <?>
    101.     RtlUserProcParams _RTL_USER_PROCESS_PARAMETERS <?>
    102.     ZwQueryInformationProcess PZWQUERYINFORMATIONPROCESS ?
    103.    
    104.     sTitle     db "Message", 0
    105.     Prog_name   db "111.exe", 0
    106.     hSnapShot  dd 0
    107.     BytesCount dd 0
    108.     hOpenProcess    dd 0
    109.     wszBuffer db 260 dup (?)
    110.     hModule dd ?
    111.     szNtdll db "ntdll",0
    112.     szFuncName db "ZwQueryInformationProcess",0
    113.  
    114.  .code
    115.  
    116. start:
    117.  
    118.     invoke CreateToolhelp32Snapshot, 2h, 0
    119.     mov hSnapShot, eax
    120.     mov uProcess.dwSize, sizeof PROCESSENTRY32
    121.    
    122.  
    123.         invoke Process32First, hSnapShot, addr uProcess
    124.         invoke lstrcmpi, addr uProcess.szExeFile, addr Prog_name
    125.         jz ok
    126. next1:  invoke Process32Next, hSnapShot, addr uProcess
    127.         invoke lstrcmpi, addr uProcess.szExeFile, addr Prog_name
    128.         jnz next1
    129. ok:
    130.         invoke GetModuleHandle,offset szNtdll
    131.         mov hModule,eax
    132.         invoke GetProcAddress,eax,offset szFuncName
    133.         mov ZwQueryInformationProcess,eax
    134.  
    135.         invoke MessageBox, NULL, addr uProcess.szExeFile, addr sTitle, MB_OK
    136.         invoke OpenProcess, PROCESS_QUERY_INFORMATION, FALSE, uProcess.th32ProcessID
    137.         mov hOpenProcess, eax
    138.        
    139.         invoke ZwQueryInformationProcess, hOpenProcess, 0, offset pbi, sizeof _PROCESS_BASIC_INFORMATION, 0
    140.         invoke ReadProcessMemory, hOpenProcess, pbi.PebBaseAddress, offset pPeb, sizeof _PEB, addr BytesCount
    141.         invoke ReadProcessMemory, hOpenProcess, pPeb.ProcessParameters, offset RtlUserProcParams, sizeof _RTL_USER_PROCESS_PARAMETERS, BytesCount
    142.         invoke ReadProcessMemory, hOpenProcess, RtlUserProcParams.ImagePathName, offset uStr, sizeof _UNICODE_STRING, BytesCount
    143.         ;invoke ReadProcessMemory, hOpenProcess, RtlUserProcParams.ImagePathName.Buffer, wszBuffer, RtlUserProcParams.ImagePathName.sLength, BytesCount
    144.  
    145.         ;invoke MessageBox, NULL, addr RtlUserProcParams.ImagePathName, addr sTitle, MB_OK
    146.         invoke CloseHandle, hOpenProcess
    147.        
    148.     invoke CloseHandle, hSnapShot
    149.     invoke ExitProcess, NULL
    150.  
    151. end start
     
  8. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Хендл процесса должен иметь PROCESS_VM_READ права (флаг).
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у тебя _RTL_USER_PROCESS_PARAMETERS не правильно задана.
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1.         invoke lstrcmpi, addr uProcess.szExeFile, addr Prog_name
    2.         jz ok
    3. next1:  invoke Process32Next, hSnapShot, addr uProcess
    4.         invoke lstrcmpi, addr uProcess.szExeFile, addr Prog_name
    5.         jnz next1
    6. ok:
    а это что за бред?
    прежде чем выполнить условный прыжок нужно проверить условие, в зависимости от проверки установятся флаги
     
  11. medal06

    medal06 New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2006
    Сообщения:
    6
    перед ImagePathName не хватает три DWORDа? т.е смещение ImagePathName должно быть +38h?
     
  12. medal06

    medal06 New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2006
    Сообщения:
    6
    Asterix
    В верхней части проги все работает, просто запостил предыдущую версию. А проблема в ReadProcessMemory.
     
  13. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    2medal06
    Открой процесс с флагом указанным в 8-м посту!!!
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. CurrentDirectory DWORD 0
    2. DllPath DWORD 0
    3. ImagePathName DWORD 0
    4. CommandLine DWORD 0
    5. WindowTitle DWORD 0
    6. DesktopInfo DWORD 0
    7. ShellInfo DWORD 0
    8. CurrentDirectores DWORD 0
    Это всё не DWORD'ы.
    CurrentDirectory это UNICODE_STRING и DWORD.
    CurrentDirectores это массив из 32х структур _RTL_DRIVE_LETTER_CURDIR.
    Остальное UNICODE_STRING.
     
  15. medal06

    medal06 New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2006
    Сообщения:
    6
    _Serega_
    n0name
    Большое спасибо, получилось!