Чтение памяти

Тема в разделе "WASM.WIN32", создана пользователем gilg, 3 ноя 2006.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Как прочитать из другого процесса слово по адресу gs:0x30 ?
     
  2. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    (qs это селектор такой модный, или опечатка?)
    Открываю блокнотом, qs становится gs ?!?! Видимо шрифт кривой :), в браузере. Сорри я не виноват, если что.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Скорее всего опечатка. GS в винде никуда не указывает.
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Вообще из ринг3 вот так, (хотя зачем? что может быть в ЖС):

    GetThreadSelectorEntry(...)
    ReadProcessMemory(......)

    Ессно у дескрипторов процесса и потока должны быть все необходимые права.
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Win64. В GS там то же самое, что в FS в WinNT
    _Serega_
    GetThreadSelectorEntry - спасибо, посмотрю
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Блин!!! Она же NtQueryInformationThread вызывает!!!! Три дня потерял, ковыряя ядро, - ничего не нашел :)))
    _Serega_ спасибо агромадное
     
  7. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Если интересно, то FS указывает на TLB.
    А функцию GetThreadSelectorEntry, обычно используют отладчики для получения соответствующего виртуального адреса TLB, по FS.
     
  8. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Всегда рад помочь, коллеге :), кстати видимо интересными вещами занимаешься... стукни в аську :), мой ид щас будет в привате :)
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Собс-но, оттуда нужно всего-лишь Peb вытащить. Голову три раза уже сломал, как его вытянуть:)
    (Peb32 в смысле, ZwQueryInformationProcess не катит)
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    NtQueryInformationThread под Win64 возвращает STATUS_NOT_IMPLEMENTED :dntknw:
    В мануале на Amd64 написано, что базы FS и GS хранятся в MSR`ах. Могут быть какие-нибудь еще способы вытащить базы этих сегментов?
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А разве адрес PEB'а для разных тредов различается?
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Хороший вопрос. Вероятнее всего, нет, тем более под WOW64. Но хочется написать по-возможности наиболее универсальный код, чтобы обезопаситься от странных апдейтов и сервис-паков
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Запустить там поток, и уже по IPC передать значение?
     
  14. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Тоже вариант, но уж слишком большой оверхед для такой маленькой задачи получается
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Буквально 5 строчек кода для основной програмы, и столько же для потока =)
     
  16. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Я в том смысле, что если каждый раз, когда нужно получить Peb, создавать поток, система работать быстрее не станет :) С кешированием и синхронизацией с созданием/удалением процессов возиться желания тоже нет. Думаю, попробую все ж проверить, меняется ли адрес Peb по версиям...

    ЗЫ: Из ядра, если писать загрузчик с нуля, было бы далеко не 5 строк :)
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Если писать загрузчик с нуля, то тебе по определению будет известен адрес PEB =)
     
  18. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    gilg
    Хочешь сказать что функция GetThreadSelectorEntry под Win64 тоже не работает? А как отладчики? Не могу представить себе функциональность такого отладчика. Не может быть! У меня протестить негде.... Но это полная ерунда, создавать ось в которой невозможно создать полноценный отладчик.
     
  19. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    _Serega_
    Код (Text):
    1. .text:0000000078DA0420 ; BOOL __stdcall GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,LPLDT_ENTRY lpSelectorEntry)
    2. .text:0000000078DA0420                 public GetThreadSelectorEntry
    3. .text:0000000078DA0420 GetThreadSelectorEntry proc near
    4. .text:0000000078DA0420                 sub     rsp, 28h
    5. .text:0000000078DA0424                 mov     ecx, 0C00000BBh
    6. .text:0000000078DA0429                 call    sub_78D6E660                   ; RtlNtStatusToDosError()
    7. .text:0000000078DA042E                 xor     eax, eax
    8. .text:0000000078DA0430                 add     rsp, 28h
    9. .text:0000000078DA0434                 retn
    10. .text:0000000078DA0434 GetThreadSelectorEntry endp
     
  20. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Юзер-модным отладчиком по крайней мере такого больше сделать нельзя. WinDbg в юзер-моде НЕ может прочитать память по адресу вида CS:<valid address>, хотя содержимое сегментных регистров показывает. Т.е. ZwGetContextThread работает, а зарезолвить дескриптор он не может.