ZwQueryInformationProcess хочет 3Gb памяти

Тема в разделе "WASM.WIN32", создана пользователем kratorman, 26 сен 2009.

  1. kratorman

    kratorman New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    8
    Пытаюсь получить структуру PROCESS_BASIC_INFORMATION.
    Код упростил до нельзя. Помогите понять почему не работает

    Код (Text):
    1. HANDLE hProcess = GetCurrentProcess();
    2. ULONG    mSize = 0x8000;
    3. PVOID    mPtr = HeapAlloc(hHeap, 0, mSize);
    4. ULONG ReturnLength;
    5. NTSTATUS status;
    6.  
    7. status = ZwQueryInformationProcess(hProcess, 0, mPtr, mSize, &ReturnLength);
    Ситуация после выполнения ZwQueryInformationProcess следующая.
    status = STATUS_INFO_LENGTH_MISMATCH.
    ReturnLength = 3435973836
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    CCCCCCCCh ???
     
  3. kratorman

    kratorman New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    8
    ага. Мне кажется такое красивое число не случайно
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну GetCurrentProcess() возвращает -1 (или -2), а не hProccess процесса.
     
  5. kratorman

    kratorman New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    8
    Да нет. Из msdn
    Код (Text):
    1. HANDLE WINAPI GetCurrentProcess(void);
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    оно возвращает -1, сам проверь (всегда, это псевдохэндл такой)
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Это сделали, возможно, чтобы лишний раз не обращаться к ядру за объектом, который и так из текущего процесса полностью доступен, но об этом знает только WinAPI. Native не в курсе.
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    если хочешь hCurrentProcess
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId());
    и будет тебе hProcess
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    max7C4
    Ерунда. Native API прекрасно работают с псевдохэндлами.
    P.S. Где-то ещё тут видел мнение, что WriteProcessMemory нельзя с -1 использовать. Тоже ерунда.
     
  10. kratorman

    kratorman New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    8
    Спасибо. Handle действительно был не верный.
    Я переписал код:
    Код (Text):
    1.     HANDLE hProcess;
    2.     ULONG    mSize = 0x8000;
    3.     PVOID    mPtr = HeapAlloc(hHeap, 0, mSize);
    4.     ULONG ReturnLength;
    5.     NTSTATUS status;
    6.  
    7.     hProcess = OpenProcess(PROCESS_ALL_ACCESS, true, GetCurrentProcessId());
    8.     if (hProcess != NULL){
    9.         status = ZwQueryInformationProcess(hProcess, 0, mPtr, mSize, &ReturnLength);
    10.     }
    хэндл процесса корректный а функция работает так же:
    status = STATUS_INFO_LENGTH_MISMATCH.
    ReturnLength = CCCCCCCCh
     
  11. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    SizeOf(TProcessBasicInformation) = 24
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну PEB можно найти и через fs сегмент
     
  13. kratorman

    kratorman New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    8
    Можете показать как это сделать? Мне нужно получить PEB другого процессы, чтобы вытащить список загруженных модулей
     
  14. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    если не ошибаюсь fs:30h
     
  15. Guest

    Guest Guest

    Публикаций:
    0
    Код (Text):
    1. LPVOID GetProcInfo(IN HANDLE hProcess, IN PROCESSINFOCLASS tInfo)
    2. {
    3.     NTSTATUS ntStatus;
    4.     LPVOID lpData = NULL;
    5.     DWORD dwSize =  sizeof(PROCESS_BASIC_INFORMATION);
    6.  
    7.     do
    8.     {
    9.         lpData = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
    10.         if (lpData == NULL)
    11.         {
    12.             break;
    13.         }
    14.        
    15.         ntStatus = NtQueryInformationProcess(hProcess, tInfo, lpData, dwSize, NULL);
    16.         if (NT_SUCCESS(ntStatus) == TRUE)
    17.         {
    18.             break;
    19.         }
    20.         VirtualFree(lpData, 0, MEM_RELEASE);
    21.         lpData = NULL;
    22.         dwSize <<= 1;
    23.     } while (ntStatus == STATUS_INFO_LENGTH_MISMATCH);
    24.    
    25.     return lpData;
    26. }
    27.  
    28.     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
    29.     if (hProcess != INVALID_HANDLE_VALUE)
    30.     {      
    31.         LPVOID lpRet = GetProcInfo(hProcess, ProcessBasicInformation);
    32.         if (lpRet != NULL)
    33.         {          
    34.             DbgPrintf("PROCESS INFO ADDRESS: 0x%08X", lpRet);
    35.             VirtualFree(lpRet, 0, MEM_RELEASE);
    36.         }
    37.         CloseHandle(hProcess);
    38.     }
    39.     ExitProcess(0);
     
  16. Guest

    Guest Guest

    Публикаций:
    0
    sizeof(PROCESS_BASIC_INFORMATION) == 00000018h - это ключевой момент, если задать 0x1000, то выйдет ошибка.
     
  17. kratorman

    kratorman New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    8
    Большое спасибо. Действительно проблема в этом.