Функция RtlEncodePointer

Тема в разделе "WASM.WIN32", создана пользователем Bill_Prisoner, 25 июн 2005.

  1. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Что делает функция RtlEncodePointer?

    В справочнике Garry Nebbet нет такой функции, в MSDN и подавно.

    По предположению она переводит указатель пользовательского режима в какой-то другой. Но зачем? И в какой другой?
     
  2. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    А в какой она библиотеке? Перерыл system32, ничего не нашел.
     
  3. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    В библиотеке NTDLL.DLL
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Я нашёл эту функцию только в ntdll.dll от XP SP2. Т.к. сама эта система у меня не установлена, пришлось ограничится IDA и гуглом.


    Код (Text):
    1. :7C913917 RtlEncodePointer proc
    2. . . .
    3. :7C91391D           push  0                       ; ReturnLength
    4. :7C91391F           push  4                       ; ProcessInformationLength
    5. :7C913921           lea   eax, [ebp+var_4]
    6. :7C913924           push  eax                     ; pProcessInformation
    7. :7C913925           push  36                      ; PROCESSINFOCLASS
    8. :7C913927           push  -1                      ; NtCurrentProcess()
    9. :7C913929           call  ZwQueryInformationProcess
    10. . . .
    11. :7C913935 RtlEncodePointer endp




    Как видно, вызывается ZwQueryInformationProcess с информационным классом 36. Что это за класс выяснить не удалось. Но, RtlEncodePointer вызывается из RtlAddVectoredExceptionHandler и можно предположить, что это связано с векторной обработкой исключений. В MSDN есть описалово VEH вообще, и AddVectoredExceptionHandler в частности. В дизасме хорошо видно, что RtlAddVectoredExceptionHandler выделяет структуру, вызывает RtlEncodePointer и пихает то что она вернет в эту структуру. Судя по тому, что ProcessInformationLength = 4, RtlEncodePointer возвращает указатель. Наверное, это указатель на цепочку векторных обработчиков, а RtlAddVectoredExceptionHandler добавляет в неё новый.



    Ещё есть RtlDecodePointer, которая вызывается из KiUserExceptionDispatcher. Так что всё это связано с VEH 100%.





    Вот тут:

    http://www.hkitn.com/article.php/2481

    какой-то китаёза (кореец?) что-то нам говорит про RtlDecodePointer. Переводил http://babelfish.altavista.com/

    Английский получился слишком ломанным, поэтому читать я не стал ;)
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    RtlDecodePointer состоит всего лишь из "jmp RtlEncodePointer".
     
  6. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Я натолкнулся на эту функцию когда как раз исследовал VEH изнутри. В VEH-цепочке один из элементов одной 12 байтной записи есть адрес векторного обработчикаи, который как раз закодирован этой функцей. Более подробно о VEH изнутри Вы можете почитать в "От зеленого к красному" Глава 3.



    Four-F и Quantum

    пасибо!
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ Quantum</font><!--color--><font color="gray]: RtlDecodePointer состоит всего лишь из "jmp RtlEncodePointer". ]</font><!--color-->



    Ну, я бегло смотрел - не заметил ;)