организация памяти процесса

Тема в разделе "WASM.BEGINNERS", создана пользователем _edge, 21 дек 2005.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    давече игрался с тестовой программой наподобие hello world

    и запихнув ее в отладчик, немного поковырял :]



    вопрос в том, всегда ли cs=0167 и eip=00401000? также,

    как ни странно, углядел что на смещении cs:0 и выше

    располагается копия первого мегабайта озу msdos (прога

    расположена за границей в 4mb). это всегда так? >:\



    еще один момент. изучая exitprocess в td32 углядел во что

    превращается вызов данной ф-ции:



    call 1

    1: jmp [2]



    далее заменив jmp [2] на mov eax,[2] // jmp eax увидел

    что оно лезет куда-то в высокие адреса самой прожки.

    очевидно, что там kernel32. опять же, это всегда так?

    т.е. для каждого процесса создается виртуальный "слой"

    памяти, в котором как-бы располагается копия dll-ек.



    если данные вопросы слишком глупы, пните в нужном напр.

    (линки etc.)
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    У меня cs при отладке всегда равно 23. Из каких соображений оно ставится не знаю.

    При запуске процесса

    eip=base addr+rva entry point

    base addr для exe обычно равен 400000(а для dll где место есть), а rva entry point указывается в pe заголовке по смещению 28h.



    т.е. для каждого процесса создается виртуальный "слой"

    памяти, в котором как-бы располагается копия dll-ек.

    Вроде как да, хотя сам со всем этим ещё не разобрался.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _edge

    Что-ж, придется пнуть "в нужном напр." ;)

    Ты про PE-формат слышал ? См. спецификацию Microsoft Portable Executable and Common Object File Format Specification, статьи Питрека и т.п. (есть на MSDN и тут на сайте в документах)



    Кроме теории можешь посмотреть как все это выглядит в жизни. Забрасываешь куда подальше свой td32 ;) и берешь OllyDbg (если нет, то скачай с этого сайта). Открываешь любой (неупакованный) экзешник и смотришь распределение памяти View\Memory. Тут тебе Оля все по полочкам и разложит. По адресу 400000h будет сидеть PE header. Это и есть заголовок файла и сидит он по стандартному для всех Win32 (кроме первых NT) адресу загрузки образа ImageBase = 400000h. Чтобы посмотреть сам заголовок нужно выделить строку и по правой кнопке мыши вызвать Dump. После PE-заголовка идут секции кода, данных, импорта и т.п. Порядок и количество секций м.б. любым. Как правило первой идет секция кода, но не обязательно, например fasm создает секции в том порядке в котором ты их объявишь. Секции выравнены на границу 4К = 1000h, поэтому если секция кода идет первой, то она начинается с адреса 401000h. Но это не значит, что твой EIP будет равен этому значению, т.к. адрес entry point может не совпадать с началом секции - в начале могут идти какие-нить proc или db\dd.

    Значение селектора CS восе не обязано быть фиксированным, по кр.мере может быть разным для разных версий винды.



    Системные dll отображаются в память процесса по верхним адресам (в 9x с BFF.. и ниже, в NT с 7FF.. и ниже). Это не физические копии, а лишь отображаемые образы, т.е. каждая dll представлена в физ.памяти в единственном экземпляре, но за счет страничной переадресации отображается на одни и теже виртуальные адреса каждого процесса. В NT+ предусмотрено также создание индивидуальной "твердой" копии системной dll процесса, если он пытается ее модифицировать (политика write-copy или copy-on-write), поэтому изменения не отражаются на других процессах. В 9x никаких копий не создается, поэтому модификация скажем kernel32 может повлиять на все процессы в системе.
     
  4. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    thanx! теперь вопрос к leo. если переадресуемая копия

    advapi32 также как и kernel32.dll при изменении в одном

    процессе сразу меняется во всех, можно врезкой своего

    кода перехватить вызовы addkey // deletekey скажем

    чтобы их логировать или спрашивать юзера при изм.

    hklm/../currentversion/run, отслеживать это дело?



    и еще [совсем детский question] как повесить прогу

    резидетном? создать невидимое окно и не-выходить? :]



    интересно некий blocker сделать против adw/riskware.

    ессно не в серьезном смысле слова, условно это пойдет

    как задача для получения навыков при реализации.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _edge

    > "если ... при изменении в одном процессе сразу меняется во всех"

    Вот именно, что "если" ;) В 9х эти регионы недоступны для простой записи из ring3, а в NT при записи автоматом создается локальная копия соответствующей страницы памяти и изменения не сказываются на других процессах. Т.е. перехватывать вызовы конечно можно, но не так просто. См. статьи по перехвату API функций на wasm.ru в последних статьях и в разделе "Секреты Win32", в частности статьи 90210 (автор) и Ms Rem

    Там же найдешь инфу о скрытии процессов