VirtualQueryEx ERROR_ACCESS_DENIED

Тема в разделе "WASM.WIN32", создана пользователем XshStasX, 7 июл 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Код (Text):
    1.         PVOID p = GetModuleHandleA("NTDLL");
    2.         PIMAGE_NT_HEADERS pnt = PIMAGE_NT_HEADERS(PIMAGE_DOS_HEADER(p)->e_lfanew + PCHAR(p));
    3.         DWORD size = pnt->OptionalHeader.SizeOfImage;
    4.         char* buf = (char*)MemAlloc(size);
    5.         MEMORY_BASIC_INFORMATION inf;
    6.         Toolhelp32ReadProcessMemory(pGetProcessId(hProcess),p,buf,size,&size);
    7.        
    8.         buf = (char*) p;
    9.         size = pnt->OptionalHeader.SizeOfImage;
    10.         while ( (PCHAR(buf) - PCHAR(p)) < size  ){
    11.             memset(&inf,0,sizeof(inf));
    12.             VirtualQueryEx(hProcess,buf,&inf,4096);
    13.             buf+=4096;
    14.         };
    Почему не все страницы удаеться получить (возникает ошибка доступа ERROR_ACCESS_DENIED )?
    Хотя все страницы доступны на чтение(смотрел через OllyDbg)

    упс... перенесите в WIN32 ...
     
  2. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    XshStasX
    Причины ERROR_ACCESS_DENIED:
    Код (Text):
    1.     STATUS_THREAD_IS_TERMINATING
    2.     STATUS_PROCESS_IS_TERMINATING
    3.     STATUS_INVALID_LOCK_SEQUENCE
    4.     STATUS_INVALID_VIEW_SIZE
    5.     STATUS_ALREADY_COMMITTED
    6.     STATUS_ACCESS_DENIED
    7.     STATUS_FILE_IS_A_DIRECTORY
    8.     STATUS_CANNOT_DELETE
    9.     STATUS_INVALID_COMPUTER_NAME
    10.     STATUS_FILE_DELETED
    11.     STATUS_FILE_RENAMED
    12.     STATUS_DELETE_PENDING
    13.     STATUS_PORT_CONNECTION_REFUSED
    14.     STATUS_ENCRYPTION_FAILED
    15.     STATUS_ENCRYPTION_FAILED
    16.     STATUS_DECRYPTION_FAILED
    17.     STATUS_NO_RECOVERY_POLICY
    18.     STATUS_NO_EFS
    19.     STATUS_WRONG_EFS
    20.     STATUS_NO_USER_KEYS
    Видимо в вашем случае наиболее вероятно:
    Код (Text):
    1. // MessageId: STATUS_ALREADY_COMMITTED
    2. //
    3. // MessageText:
    4. //
    5. //  {Already Committed}
    6. //  The specified address range is already committed.
    7. //
    8. #define STATUS_ALREADY_COMMITTED         ((NTSTATUS)0xC0000021L)
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Это как то можно побороть из юзер мода, находясь в текущем процессе ?
     
  4. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    XshStasX
    Можно побороть, передав корректные аргументы в апи. Иногда встречается ошибка типа чтения результата апи не по возвращаемому значению, а через статус в TEB. Возможно тут тоже.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    XshStasX
    1) Последний параметр в VirtualQuery(Ex) - это размер структуры inf, поэтому передавая 4096 ты пытаешься "дурачить" винду
    2) VirtualQuery(Ex) возвращает инфу не об одной странице, а о целом регионе\группе страниц с одинаковыми параметрами State, Protect и Type. Поэтому тупо талдыча запросы на каждую 4К страницу, когда винда тебе уже выдала инфу на inf.RegionSize > 4К, ты ее просто "нервируешь" - вот она, бедная, в сердцах и посылает тебя подальше на три слова ERROR_ACCESS_DENIED :lol:
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    leo
    1. передавал и 4095
    2. могла бы и вернуть информацию и о середине региона.