CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,...) vs ZwQuerySystemInf

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

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Класс SystemProcessesAndThreadsInformation возвращает информацию о потоках и процессах

    Есть нечто похожее но связанное с загруженными модулями?

    SystemModuleInformation судя по всему должно быть именно тем что нужно, но вызов с этим классом возвращает информацию не только о юзермод модулях но и все остальное
    Есть выход как их отсеять? Либо может это не тот класс?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ваще-то оно возвращает тока о модулях ядра инфу если нада сабж то скорее всего нада перечислять процессы, затем лезть в пеб и читать оттуда InLoadOrderModuleList
     
  3. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    судя по всему в структуре только пути и мена загруженных ДЛЛ? или это не так?
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    почитай внимательно имена полей структуры после InInitializationOrderLinks. имена говорят сами за себя :)
     
  5. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    ты об этом?
    это ведь имена Длл или я не прав?
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    дык что тебе нужно ?
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    а как тогда получить полный путь к данному экзе модулю?
    Лан, хватит гадать - напишу код - потом спрошу
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    FullDllName это и есть полный путь. Короче зри, есть процессы у каждого свои загруженные модули, поэтому скороее всего ос не ведёт учёт всех подгружаемых модулей всех процессов. Т.е. она то канечно ведёт но не одним списком. Короче твоя задача получить все модули всех процессов, затем отсеять повторяющиеся и всё. Возможно есть способ другой\попроще\посложнее, но хз если бы он был то наверно его уже кто-то написал
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Код (Text):
    1.     while(SysProcesses->NextEntryDelta != 0)
    2.     {
    3.         SysProcesses = (NT::PSYSTEM_PROCESSES)((unsigned char *)SysProcesses + SysProcesses->NextEntryDelta);
    4.         //Getting the access over process PEB
    5.         CurrentClientID.UniqueProcess = (HANDLE)SysProcesses->ProcessId;
    6.         CurrentClientID.UniqueThread = 0;
    7.         if(NT::ZwOpenProcess(&hProcess, PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, &ObjectAtt, &CurrentClientID)!=STATUS_SUCCESS) continue;
    8.         if(NT::ZwQueryInformationProcess(hProcess, NT::ProcessBasicInformation, &ProcessInfo, sizeof(NT::PROCESS_BASIC_INFORMATION), 0)!=STATUS_SUCCESS) continue;
    9.         //reading PEB
    10.         CurrentProcessPEB = ProcessInfo.PebBaseAddress;
    11.         if(IsBadReadPtr(CurrentProcessPEB, 1))continue;
    12.         if(IsBadReadPtr(CurrentProcessPEB->Ldr, 1))continue;
    13.         pDataTableEntry = (NT::PLDR_DATA_TABLE_ENTRY)CurrentProcessPEB->Ldr->InInitializationOrderModuleList.Flink;
    14.         while(TRUE)
    15.         {      
    16.             pDataTableEntry = (NT::PLDR_DATA_TABLE_ENTRY)pDataTableEntry->InInitializationOrderLinks.Flink;
    17.             //if(IsBadReadPtr(pDataTableEntry->FullDllName.Buffer, 1))break;
    18.         }
    19.         NT::ZwClose(hProcess);
    20.     }
    21.     HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, FreePoint);
    22.     SysProcesses = FreePoint = 0;
    23. }
    пытаюсь получить модули подгруженные в процесс - и не выходит
    т е выходит - но получаю только самые базовые модули типа ntdll.dll kernel32.dll
    а где же остальные?
    если у меня CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,...) выдает где-то 600 уникальых модулей
    то такой маневр - около 25
    что же не так?
    Может это не тот список?
     
  11. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    и еще вопрос - каким образом понять где прерывается этот список?
     
  12. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Ты читаешь в своём процессе. Нужно через ReadProcessMemory(hProcess).
    Почитай хотя бы статьи Ms-Rem'a, там есть примеры как и что делать.
     
  13. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    nester7

    спасибо - я понял в чем принципиально бочу

    я то работаю со свои процессом получается а нужно ведь читать из других
    жесткая ошибка

    ну ничего я учусь
     
  14. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Агга :)

    http://www.wasm.ru/print.php?article=hiddndt
    Ищи функцию GetNameByPid
     
  15. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Та не спасибо но это не та функция что мне нужна
    Как напишу оставлю код мож кому пригодится
     
  16. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Там через PEB имя процесса читается, тебе же нужно пробежаться
    по списку ProcessPEB->Ldr->InInitializationOrderModuleList.

    Эту функцию я привел просто как пример чтения данных через PEB чужого процесса.
     
  17. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Great тут уже что-то наваял, может поможет :)
    http://forum.antichat.ru/showpost.php?p=258891&postcount=8
     
  18. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Это понятно - как видно из кода это я и пытался реализовать
    Кстати походу не важно какой из списков - они ведь одинаковые? просто сформированы по разному
     
  19. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    как оказалось
    ProcessPEB->Ldr->InInitializationOrderModuleList->Flink указывает верно только на 1 адрес
    следующие указатели нужно брать из ...->InLoadOrderModuleList->Flink
    вобщем кому интересно проект на MSVC++ 8 я залил тут
    Код на С++ прохода по этим структурам в R3Invisible модуле проекта(перезалил из-за размера, теперь 60Кб)
    может пригодится кому то
    чтобы потом время зря не тратить лазая по АП процессов и проверяя адреса
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Чтение информации с блока данных загрузчика - очень не надёжный способ получения инфы о модулях.
    Вот некоторые функции в ntdll для определения загруженных модулей:
    Код (Text):
    1. RtlCreateQueryDebugBuffer   proto _Size:ULONG, EventPair:BOOLEAN
    2. comment '
    3. Функция использует удалённые потоки!
    4. RtlCreateQueryDebugBuffer(
    5. IN ULONG Size,      ;Zero -> Default size
    6. IN BOOLEAN EventPair):PVOID ;PDEBUG_BUFFER
    7. Returns a pointer to a DEBUG_BUFFER or a null pointer.
    8. ' comment
    9.  
    10. RtlQueryProcessDebugInformation proto ProcessId:ULONG, DebugInfoClassMask:ULONG, DebugBuffer:PVOID
    11. comment '
    12. RtlQueryProcessDebugInformation(
    13. IN ULONG ProcessId,
    14. IN ULONG DebugInfoClassMask,        ;PDI_MODULES        equ 01h
    15. IN OUT PDEBUG_BUFFER DebugBuffer):NTSTATUS
    16. Returns STATUS_SUCCESS or an error status.
    17. ' comment
    18.  
    19. RtlDestroyQueryDebugBuffer  proto DebugBuffer:PVOID
    20. comment '
    21. RtlDestroyQueryDebugBuffer(
    22. IN PDEBUG_BUFFER DebugBuffer):NTSTATUS
    23. Returns STATUS_SUCCESS.
    24. ' comment
    25.  
    26. DEBUG_BUFFER struct
    27. SectionHandle       HANDLE ?
    28. SectionBase     PVOID ?
    29. RemoteSectionBase   PVOID ?
    30. SectionBaseDelta    ULONG ?
    31. EventPairHandle HANDLE ?
    32. Unknown         ULONG 2 DUP (?)
    33. RemoteThreadHandle  HANDLE ?
    34. InfoClassMask       ULONG ?
    35. SizeOfInfo      ULONG ?
    36. AllocatedSize       ULONG ?
    37. SectionSize     ULONG ?
    38. ModuleInformation   PVOID ?     ;NumberOfNodules:ULONG,<PDEBUG_MODULE_INFORMATION>*NumberOfNodules
    39. BackTraceInformation    PVOID ?
    40. HeapInformation PVOID ?     ;PDEBUG_HEAP_INFORMATION
    41. LockInformation PVOID ?     ;PDEBUG_LOCK_INFORMATION
    42. Reserved            PVOID 8 DUP (?)
    43. DEBUG_BUFFER ends
    44. PDEBUG_BUFFER typedef PTR DEBUG_BUFFER
    45.  
    46. DEBUG_MODULE_INFORMATION struct
    47. Reserved            ULONG 2 DUP (?)
    48. Base                ULONG ?
    49. _Size           ULONG ?
    50. Flags           ULONG ?
    51. Index           USHORT ?
    52. Unknown         USHORT ?
    53. LoadCount           USHORT ?    ;[Для статически загруженных модулей: -1]
    54. ModuleNameOffset    USHORT ?
    55. ImageName           CHAR 256 DUP (?)
    56. DEBUG_MODULE_INFORMATION ends
    57. PDEBUG_MODULE_INFORMATION typedef PTR DEBUG_MODULE_INFORMATION
    58. ;ModuleInformation указывает на NumberOfModules:DWORD, за которым следует структура DEBUG_MODULE_INFORMATION информацией о модулях
    59.  
    60. LdrEnumerateLoadedModules proto Flag:BOOLEAN, Callback:PVOID, Parameter:ULONG   ;Flag=NULL
    61. comment '
    62. ;Перечисляет все модули спроецированные в адресное пространство текущего процесса, вызывая процедуру обратного вызова.
    63. LdrEnumerateLoadedModules(
    64. IN BOOLEAN Flag,
    65. IN POINTER Callback,
    66. IN ULONG Parameter):DWORD
    67.  
    68. Callback proto ModuleInformation:PLDR_DATA_TABLE_ENTRY, Parameter:dword, ByteFlagEnd:PCHAR
    69. Callback(
    70. IN PLDR_DATA_TABLE_ENTRY ModuleInformation,
    71. IN DWORD Parameter,
    72. OUT PCHAR ByteFlagEnd):NTSTATUS
    73. ;Если флаг (BYTE) по адресу ByteFlagEnd установить в 1 то перечисление прекращается
    74. ' comment
    75.  
    76. LdrQueryProcessModuleInformation proto InformationBuffer:PVOID, BufferSize:ULONG, ReturnLength:PULONG
    77. comment '
    78. Получение информации о загруженных модулях.
    79. LdrQueryProcessModuleInformation(
    80. OUT PVOID InformationBuffer,    ;()->NumberOfModules:ULONG, DEBUG_MODULE_INFORMATION <>
    81. IN ULONG BufferSize,
    82. OUT PULONG ReturnLength):NTSTATUS
    83. Return value: STATUS_SUCCESS, STATUS_INFO_LENGTH_MISMATCH'
    Ещё...
    Код (Text):
    1. comment '
    2. Возвращает информацию о модуле.
    3. PsQueryDebugModuleInformation(
    4. IN HANDLE ProcessId OPTIONAL,
    5. IN PSTR ModuleName,
    6. OUT PDEBUG_MODULE_INFORMATION ModuleInformation):NTSTATUS'
    7.  
    8. PsQueryDebugModuleInformation proc uses ebx esi edi ProcessId:HANDLE, ModuleName:PCHAR, ModuleInformation:PDEBUG_MODULE_INFORMATION
    9. Local DebugBuffer:PVOID, DebugInformation:PVOID, ThreadInformation:THREAD_BASIC_INFORMATION
    10.     _setseh_
    11.     xor eax,eax
    12.     .if ProcessId==Eax
    13.     invoke ZwQueryInformationThread, NtCurrentThread, THREAD_BASIC_INFORMATION, addr ThreadInformation, SizeOf THREAD_BASIC_INFORMATION, eax
    14.     test eax,eax
    15.     jnz exit_
    16.     mov edx,ThreadInformation.ClientId.UniqueProcess
    17.     mov ProcessId,edx
    18.     .endif
    19.     invoke RtlCreateQueryDebugBuffer, eax, eax 
    20.     test eax,eax
    21.     mov DebugBuffer,eax
    22.     mov eax,STATUS_INTERNAL_ERROR
    23.     jz exit_
    24.     _subsetseh_
    25.     invoke RtlQueryProcessDebugInformation, ProcessId, PDI_MODULES, DebugBuffer
    26.     test eax,eax
    27.     jnz err_query_ 
    28.     mov esi,DebugBuffer
    29.     assume esi:PDEBUG_BUFFER   
    30.     mov esi,[esi].ModuleInformation
    31.     lodsd
    32.     assume esi:PDEBUG_MODULE_INFORMATION
    33.     mov edi,eax
    34.     test eax,eax
    35.     mov eax,STATUS_INTERNAL_ERROR      
    36.     jz err_query_
    37.     mov ebx,ModuleName
    38. loop_module_:
    39.     movzx edx,[esi].ModuleNameOffset
    40.     lea edx,[edx+[esi].ImageName]
    41.     invoke RtlEqualString, ebx, edx, TRUE
    42.     .if !Eax
    43.     mov edi,ModuleInformation
    44.     mov ecx,SizeOf DEBUG_MODULE_INFORMATION/4
    45.     cld
    46.     rep movsd
    47.     xor eax,eax
    48.     .else  
    49.     add esi,SizeOf DEBUG_MODULE_INFORMATION
    50.     dec edi
    51.     jnz loop_module_
    52.     mov eax,STATUS_DLL_NOT_FOUND
    53.     .endif
    54. err_query_:
    55.     _subendseh_
    56.     push eax
    57.     invoke RtlDestroyQueryDebugBuffer,DebugBuffer
    58.     pop eax
    59. exit_:
    60.     _endseh_
    61.     ret
    62. PsQueryDebugModuleInformation endp
    63.  
    64. PsReadVirtualMemoryProtected proc ProcessHandle:HANDLE, BaseAddress:PVOID, Buffer:PVOID, BufferLength:ULONG, ReturnLength:PULONG
    65. Local Protect:ULONG, ProtectBaseAddress:PVOID, ProtectBufferLength:ULONG
    66.     _setseh_
    67.     invoke ZwReadVirtualMemory, ProcessHandle, BaseAddress, Buffer, BufferLength, ReturnLength
    68.     .if Eax==STATUS_ACCESS_VIOLATION
    69.     mov eax,BaseAddress
    70.     mov ProtectBaseAddress,eax
    71.     mov eax,BufferLength
    72.     mov ProtectBufferLength,eax
    73.     invoke ZwProtectVirtualMemory, ProcessHandle, addr ProtectBaseAddress, addr ProtectBufferLength, PAGE_EXECUTE_READWRITE, addr Protect
    74.     .if !Eax
    75.     invoke ZwReadVirtualMemory, ProcessHandle, BaseAddress, Buffer, BufferLength, ReturnLength 
    76.     push eax
    77.     invoke ZwProtectVirtualMemory, ProcessHandle, addr ProtectBaseAddress, addr ProtectBufferLength, Protect, addr Protect
    78.     pop eax
    79.     .endif
    80.     .endif
    81.     _endseh_
    82.     ret
    83. PsReadVirtualMemoryProtected endp
    84.  
    85. comment '
    86. Перечисляет все модули (и скрытые в Ldr)
    87. EnumerateProcessImages(
    88. IN HANDLE ProcessHandle,
    89. IN PVOID CallBack,
    90. IN ULONG Parameter1,
    91. IN ULONG Parameter2):NTSTATUS
    92.  
    93. CallBack proto stdcall ImageBase:PVOID, ImageSize:ULONG, Parameter1:ULONG, Parameter2:ULONG, ExitFlag:PBOOLEAN
    94. CallBack(
    95. IN ImageBase:PVOID,
    96. IN ULONG Parameter1,
    97. IN ULONG Parameter2,
    98. OUT PBOOLEAN ExitFlag):BOOLEAN
    99. Для выхода из перечисления возврвтить не ноль.'
    100.  
    101. EnumerateProcessImages proc uses ebx esi edi ProcessHandle:HANDLE, CallBack:PVOID, Parameter1:ULONG, Parameter2:ULONG
    102. Local MemoryInfo:MEMORY_BASIC_INFORMATION
    103. Local ReturnLength:ULONG
    104. Local ImageHeaderAddress:PVOID
    105. Local SizeOfImage:ULONG, ExitStatus:NTSTATUS
    106.     _setseh_
    107.     xor eax,eax
    108.     mov MemoryInfo.BaseAddress,UserMemoryBase
    109.     mov ExitStatus,eax
    110. query_region_:
    111.     invoke ZwQueryVirtualMemory, ProcessHandle, MemoryInfo.BaseAddress, MemoryBasicInformation, addr MemoryInfo, SizeOf MEMORY_BASIC_INFORMATION, addr ReturnLength
    112.     test eax,eax
    113.     jnz exit_
    114.     cmp MemoryInfo._Type,MEM_IMAGE
    115.     jnz next_region_
    116.     cmp MemoryInfo.State,MEM_COMMIT
    117.     jnz next_region_
    118.     invoke PsImageNtHeader, ProcessHandle, MemoryInfo.BaseAddress, addr ImageHeaderAddress
    119.     test eax,eax
    120.     jnz next_region_
    121.     lea eax,ReturnLength
    122.     push eax   
    123.     push 4
    124.     lea eax,SizeOfImage
    125.     push eax
    126.     mov eax,ImageHeaderAddress
    127.     assume eax:PIMAGE_NT_HEADERS
    128.     lea eax,[eax].OptionalHeader.SizeOfImage
    129.     push eax
    130.     push ProcessHandle
    131.     Call PsReadVirtualMemoryProtected
    132.     test eax,eax
    133.     jnz next_region_
    134.     cmp SizeOfImage,1024
    135.     jc next_region_
    136.     lea eax,ExitStatus
    137.     push eax
    138.     push Parameter2
    139.     push Parameter1
    140.     push SizeOfImage
    141.     push MemoryInfo.BaseAddress
    142.     Call CallBack
    143.     test eax,eax
    144.     jnz exit_
    145.     cmp ExitStatus,eax
    146.     jnz exit_
    147. next_region_:
    148.     mov eax,MemoryInfo.BaseAddress
    149.     add eax,MemoryInfo.RegionSize
    150.     cmp eax,UserMemoryLimit
    151.     mov MemoryInfo.BaseAddress,eax
    152.     jnz query_region_
    153.     xor eax,eax
    154. exit_:
    155.     _endseh_
    156.     ret
    157. EnumerateProcessImages  endp