Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых)

 eXeL@B —› Программирование —› ZwQuerySystemInformation, x64, системные структуры
Посл.ответ Сообщение

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 26 апреля 2017 20:32
· Личное сообщение · #1

Что-то я не могу нормальные статьи найти по вытаскиванию информации через ZwQuerySystemInformation в x64, в винде 7 и выше. Как корректно перечислить все потоки x64 процесса? Наставьте на верный путь, pls

Вроде актуальная x64 структура с общей инфой выглядет как:
Code:
  1. typedef struct _SYSTEM_PROCESS_INFORMATION_x64
  2. {
  3.     ULONG NextEntryOffset;
  4.     ULONG NumberOfThreads;
  5.     LARGE_INTEGER SpareLi1;
  6.     LARGE_INTEGER SpareLi2;
  7.     LARGE_INTEGER SpareLi3;
  8.     LARGE_INTEGER CreateTime;
  9.     LARGE_INTEGER UserTime;
  10.     LARGE_INTEGER KernelTime;
  11.     UNICODE_STRING ImageName;
  12.     KPRIORITY BasePriority;
  13.     HANDLE UniqueProcessId;
  14.     HANDLE InheritedFromUniqueProcessId;
  15.     ULONG HandleCount;
  16.     ULONG SessionId;
  17.     ULONG_PTR PageDirectoryBase;
  18.     SIZE_T PeakVirtualSize;
  19.     SIZE_T VirtualSize;
  20.     ULONG PageFaultCount;
  21.     SIZE_T PeakWorkingSetSize;
  22.     SIZE_T WorkingSetSize;
  23.     SIZE_T QuotaPeakPagedPoolUsage;
  24.     SIZE_T QuotaPagedPoolUsage;
  25.     SIZE_T QuotaPeakNonPagedPoolUsage;
  26.     SIZE_T QuotaNonPagedPoolUsage;
  27.     SIZE_T PagefileUsage;
  28.     SIZE_T PeakPagefileUsage;
  29.     SIZE_T PrivatePageCount;
  30.     LARGE_INTEGER ReadOperationCount;
  31.     LARGE_INTEGER WriteOperationCount;
  32.     LARGE_INTEGER OtherOperationCount;
  33.     LARGE_INTEGER ReadTransferCount;
  34.     LARGE_INTEGER WriteTransferCount;
  35.     LARGE_INTEGER OtherTransferCount;
  36. }
  37. SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;

Но там, однако, отсуствует ссылка на:
Code:
  1. typedef struct _SYSTEM_THREAD_INFORMATION
  2. {
  3.     LARGE_INTEGER KernelTime;
  4.     LARGE_INTEGER UserTime;
  5.     LARGE_INTEGER CreateTime;
  6.     ULONG WaitTime;
  7.     PVOID StartAddress;
  8.     CLIENT_ID ClientId;
  9.     KPRIORITY Priority;
  10.     LONG BasePriority;
  11.     ULONG ContextSwitches;
  12.     ULONG ThreadState;
  13.     ULONG WaitReason;
  14. }
  15. SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;

Как корректно (через TEB?!) запарсить инфу о потоках??!



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 26 апреля 2017 20:45 · Поправил: Alchemistry
· Личное сообщение · #2

И как ты это делал раньше?

ZwQuerySystemInformation(5)
SYSTEM_PROCESSES_INFORMATION ->Threads массив SYSTEM_THREAD_INFORMATION

https://github.com/processhacker2/processhacker2/blob/014cb05eb342e99c57f01f69695d602c5a090de7/phnt/include/ntexapi.h#L1543

| Сообщение посчитали полезным: ELF_7719116

Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 26 апреля 2017 22:07 · Поправил: deniskore
· Личное сообщение · #3

Быстро набросал для вас пример.
Code:
  1. #include <stdio.h>
  2. #include <Windows.h>
  3.  
  4. typedef LONG KPRIORITY;
  5. typedef LONG KWAIT_REASON;
  6.  
  7. typedef struct _VM_COUNTERS {
  8.          SIZE_T PeakVirtualSize;
  9.          SIZE_T VirtualSize;
  10.          ULONG PageFaultCount;
  11.          // Padding here in 64-bit
  12.          SIZE_T PeakWorkingSetSize;
  13.          SIZE_T WorkingSetSize;
  14.          SIZE_T QuotaPeakPagedPoolUsage;
  15.          SIZE_T QuotaPagedPoolUsage;
  16.          SIZE_T QuotaPeakNonPagedPoolUsage;
  17.          SIZE_T QuotaNonPagedPoolUsage;
  18.          SIZE_T PagefileUsage;
  19.          SIZE_T PeakPagefileUsage;
  20. } VM_COUNTERS;
  21.  
  22. typedef enum _SYSTEM_INFORMATION_CLASS {
  23.          SystemProcessInformation = 5,  // This is the number that we need.
  24. } SYSTEM_INFORMATION_CLASS;
  25.  
  26. typedef struct {
  27.          HANDLE UniqueProcess; // Actually process ID
  28.          HANDLE UniqueThread; // Actually thread ID
  29. } CLIENT_ID;
  30.  
  31.  
  32.  
  33. struct SYSTEM_THREAD_INFORMATION {
  34.          ULONGLONG KernelTime;
  35.          ULONGLONG UserTime;
  36.          ULONGLONG CreateTime;
  37.          ULONG WaitTime;
  38.          // Padding here in 64-bit
  39.          PVOID StartAddress;
  40.          CLIENT_ID ClientId;
  41.          KPRIORITY Priority;
  42.          LONG BasePriority;
  43.          ULONG ContextSwitchCount;
  44.          ULONG State;
  45.          KWAIT_REASON WaitReason;
  46. };
  47. typedef struct _UNICODE_STRING {
  48.          USHORT Length;
  49.          USHORT MaximumLength;
  50.          PWSTR  Buffer;
  51. } UNICODE_STRING;
  52.  
  53. struct SYSTEM_PROCESS_INFORMATION {
  54.          ULONG NextEntryOffset;
  55.          ULONG NumberOfThreads;
  56.          ULONGLONG WorkingSetPrivateSize;
  57.          ULONG HardFaultCount;
  58.          ULONG Reserved1;
  59.          ULONGLONG CycleTime;
  60.          ULONGLONG CreateTime;
  61.          ULONGLONG UserTime;
  62.          ULONGLONG KernelTime;
  63.          UNICODE_STRING ImageName;
  64.          KPRIORITY BasePriority;
  65.          HANDLE ProcessId;
  66.          HANDLE ParentProcessId;
  67.          ULONG HandleCount;
  68.          ULONG Reserved2[2];
  69.          // Padding here in 64-bit
  70.          VM_COUNTERS VirtualMemoryCounters;
  71.          size_t Reserved3;
  72.          IO_COUNTERS IoCounters;
  73.          SYSTEM_THREAD_INFORMATION Threads[1];
  74. };
  75.  
  76.  
  77. #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
  78.  
  79. #define STATUS_SUCCESS              ((NTSTATUS)0x00000000L)
  80. #define STATUS_BUFFER_TOO_SMALL     ((NTSTATUS)0xC0000023L)
  81. #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
  82. #define STATUS_UNSUCCESSFUL         ((NTSTATUS)0xC0000001L)
  83.  
  84. int main()
  85. {
  86.          typedef NTSTATUS(WINAPI * NTQUERYSYSTEMINFORMATION)(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation,ULONG SystemInformationLength, PULONG ReturnLength);
  87.  
  88.          UINT bufSize = 1024 * 1024;
  89.          ULONG outDataSize = 0;
  90.          NTSTATUS status = STATUS_UNSUCCESSFUL;
  91.          SYSTEM_PROCESS_INFORMATION *ptr = (SYSTEM_PROCESS_INFORMATION*)VirtualAlloc(NULL, bufSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  92.          if (ptr != nullptr)
  93.          {
  94.                  NTQUERYSYSTEMINFORMATION pNtQuerySystemInformation = reinterpret_cast<NTQUERYSYSTEMINFORMATION>(::GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtQuerySystemInformation"));
  95.                  status = pNtQuerySystemInformation(SystemProcessInformation, ptr, (ULONG)bufSize, &outDataSize);
  96.          }
  97.          //-- нужна проверка на STATUS_INFO_LENGTH_MISMATCH  и STATUS_BUFFER_TOO_SMALL (необходимо увеличивать буфер при необходимости)
  98.          if (!NT_SUCCESS(status))
  99.          {
  100.                  return 0;
  101.          }
  102.          else
  103.          {
  104.                  while (ptr->NextEntryOffset) {
  105.                         wprintf(L"%s\n %d\n",ptr->ImageName.Buffer, ptr->Threads[0].ContextSwitchCount);
  106.                         ptr = (SYSTEM_PROCESS_INFORMATION*)((PCHAR)ptr + ptr->NextEntryOffset);
  107.                  }
  108.          }
  109. }


| Сообщение посчитали полезным: ELF_7719116


Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 26 апреля 2017 22:33
· Личное сообщение · #4

ELF_7719116 пишет:
Что-то я не могу нормальные статьи найти по вытаскиванию информации через ZwQuerySystemInformation в x64, в винде 7 и выше.


Как я понял информацию нужно доставать в Ring0? Если так, то смотри в сторону PsLookupThreadByThreadId/PsLookupProcessByProcessId

-----
http://ntinfo.biz




Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 26 апреля 2017 22:36 · Поправил: deniskore
· Личное сообщение · #5

hors пишет:
Как я понял информацию нужно доставать в Ring0? Если так, то смотри в сторону PsLookupThreadByThreadId/PsLookupProcessByProcessId


судя по последнему предложению все же из юзермода, ждем автора.

ELF_7719116 пишет:
Как корректно (через TEB?!) запарсить инфу о потоках??!





Ранг: 338.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 апреля 2017 03:48 · Поправил: difexacaw
· Личное сообщение · #6

Этот инфокласс получить сложнее, чем тупо вызвать сервис с буфером. Размер структур меняется, нужно вычислить размер тех двух структур(простая математика). Лучше это не использовать по возможности.

-----
vx




Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 27 апреля 2017 08:03
· Личное сообщение · #7

difexacaw пишет:
Этот инфокласс получить сложнее, чем тупо вызвать сервис с буфером. Размер структур меняется, нужно вычислить размер тех двух структур(простая математика). Лучше это не использовать по возможности.

Проверил свой пример на последней Windows 10 15063 х64 и на Windows XP SP3 х86, работает верно. Автор разберется думаю.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 27 апреля 2017 08:56
· Личное сообщение · #8

А чем автору не нравится перечисление через toolhelp функой Process32First/Process32Next или EnumProcesses? Раньше я тоже пользовался ZwQuerySystemInformation, ну просто больше кодить надо. Зачем это, если нет в этом необходимости?

Добавлено спустя 3 минуты
Это надо действительно либо в ring0, либо в тех случаях, когда надо обойтись одной ntdll.

-----
IZ.RU




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 27 апреля 2017 20:19
· Личное сообщение · #9

Ребят, всем спасибо! Прочёл - вкурил. Its work.
hors
ring 3
DenCoder пишет:
перечисление через toolhelp функой Process32First/Process32Next или EnumProcesses

ZwQuerySystemInformation на ring3 ... это непередаваемые ощущения




Ранг: 338.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 апреля 2017 20:46 · Поправил: difexacaw
· Личное сообщение · #10

ELF_7719116

Невероятные костыли, да. Рабочие в паре версий ос
Проблемы со смещениями полей возникли есчо лет 10 назад. Даже тогда этот инфокласс уже стал не юзабельным

-----
vx





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 апреля 2017 23:24
· Личное сообщение · #11

Эх, реверсим денуво, реверсим, а потоки перечислить не можем. Обидно.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: difexacaw


Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 28 апреля 2017 22:35 · Поправил: ajax
· Личное сообщение · #12

DenCoder пишет:
Это надо действительно либо в ring0, либо в тех случаях, когда надо обойтись одной ntdll

на 2000 катить точно не будет. ибо, в импорте кернел32 должен быть
ELF_7719116 пишет:
ZwQuerySystemInformation на ring3 ... это непередаваемые ощущения

уже года 2-3 отказался от всяких Zw. DenCoder не вариант предложил? все чудесно енумилось обычно

Добавлено спустя 3 минуты
deniskore
пример хороший, но, терзает мнение, что ведет к костылям. виста, 2000/3/8/12/16 - хз

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 29 апреля 2017 00:26
· Личное сообщение · #13

Через Zw более универсальный способ в юзермоде скрывать процесс. На васме подглядел такой способ ещё когда у меня интернет был через GPRS, 3G не было у нас - в 2006-2007 году )

-----
IZ.RU





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 29 апреля 2017 00:34
· Личное сообщение · #14

DenCoder
скрывать и тп - отдельная тема. у ELF вроде другое. на счет универсальности - гм. удачи

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 29 апреля 2017 00:43
· Личное сообщение · #15

ajax пишет:
на счет универсальности - гм. удачи

да ну просто делал так ещё 8 лет назад - стандартные тулзы - ProcessHacker, ProcessExplorer процесс не видели )

-----
IZ.RU





Ранг: 338.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 02 мая 2017 05:03
· Личное сообщение · #16

Я тут в хидере комент глянул, наверно он не с проста написан:

Code:
  1. IoCounters               IO_COUNTERS <> ; Windows 2000 only! (VER_PRODUCTBUILD >= 2195).


-----
vx



 eXeL@B —› Программирование —› ZwQuerySystemInformation, x64, системные структуры
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати