давече игрался с тестовой программой наподобие 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.)
У меня cs при отладке всегда равно 23. Из каких соображений оно ставится не знаю. При запуске процесса eip=base addr+rva entry point base addr для exe обычно равен 400000(а для dll где место есть), а rva entry point указывается в pe заголовке по смещению 28h. т.е. для каждого процесса создается виртуальный "слой" памяти, в котором как-бы располагается копия dll-ек. Вроде как да, хотя сам со всем этим ещё не разобрался.
_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 может повлиять на все процессы в системе.
thanx! теперь вопрос к leo. если переадресуемая копия advapi32 также как и kernel32.dll при изменении в одном процессе сразу меняется во всех, можно врезкой своего кода перехватить вызовы addkey // deletekey скажем чтобы их логировать или спрашивать юзера при изм. hklm/../currentversion/run, отслеживать это дело? и еще [совсем детский question] как повесить прогу резидетном? создать невидимое окно и не-выходить? :] интересно некий blocker сделать против adw/riskware. ессно не в серьезном смысле слова, условно это пойдет как задача для получения навыков при реализации.
_edge > "если ... при изменении в одном процессе сразу меняется во всех" Вот именно, что "если" В 9х эти регионы недоступны для простой записи из ring3, а в NT при записи автоматом создается локальная копия соответствующей страницы памяти и изменения не сказываются на других процессах. Т.е. перехватывать вызовы конечно можно, но не так просто. См. статьи по перехвату API функций на wasm.ru в последних статьях и в разделе "Секреты Win32", в частности статьи 90210 (автор) и Ms Rem Там же найдешь инфу о скрытии процессов