
Полный текст первых минут лекции «Секции оперативной памяти» из видеокурса PracticU – субтитры с временной меткой для каждого абзаца. Так можно прочитать и найти нужные темы ещё до начала обучения.
Добро пожаловать на лекцию про разделы памяти. Мы увидим, как наша память поделена на разные отсеки, на разные секции. Мы увидим, как это происходит в настоящем компьютере в памяти с помощью дебаггера.
Мы увидим, как это происходит внутри экзешника. Это будет очень интересная лекция. Давайте начнем с того, что мы поговорим вообще, какие есть секции, и потом посмотрим на них в настоящем компьютере во время работы.
Я вам подготовил очень интересную лекцию. Мы уже говорили о том, что наша память во время запуска экзешника, во время запуска какого-то приложения, выделяется нам память, которая поделена на страницы.
И эти страницы памяти сгруппированы в секции. У нас есть группировка по секциям. И у каждой секции есть свои права доступа и значения, и смысл.
Например, первая секция – это текст. Но в нем сидит не текст, а команды для исполнения. То есть в эту секцию копируются те команды, которые написал программист, чтобы их запускать.
Например, там просуммируй что-то, подели что-то, отпечатай мне на экране что-то, пошли по сети что-то. Вот сами команды программы сидят вот в этой части, а все, что выше, там сидят данные.
Данные, например, это кусок памяти, в который я могу положить, сколько учеников до сих пор ввели в меня пользователи. То есть, сколько данных я получил, например, какой средний балл на этот момент.
Например, сколько денег оплатил какой-то клиент. То есть, данные сидят во всех этих цветных квадратиках, о которых мы сейчас будем с вами говорить, а код сидит в самом нижнем.
Почему это очень важно? Потому что вы должны понимать, как работает компьютер за кулисами, как системы взламываются и что происходит по-настоящему на нашем железе.
И то, что я вам рассказываю, кстати, одинаково и в Майкрософте, и в Линоксе. Мы с вами говорили о том, что память поделена на страницы, и у каждой страницы есть права доступа, и эти страницы сгруппированы в секции, у которых тоже есть права доступа.
Мы это все увидим на настоящем Windows. Все остальное, вот эти вот все остальные, это данные. Это ячейки с данными. Есть разные виды данных, и именно об этом я с вами буду говорить через несколько минут.
Давайте я вам покажу, что это все существует в настоящем экзешнике. То есть у нас есть стандарт PE, по которому сформирован экзешник в Windows.
И у нас есть программа PE Explorer, очень старая, но работает и бесплатно. И она умеет открывать любой файл экзе, любой. Например, я открою там C-Windows System32 Notepad.
Notepad вот этот вот, встроенный в Windows. И просто вам покажу, как он сделан. Видите, у нас есть 28 дней бесплатно ей попользоваться.
Из-за того, что это стандарт, мы видим, что он умеет все понимать и видит, например, что это предназначено для 32-битного Windows с графическим интерфейсом.
И здесь есть много информации. Меня интересует секшен. Вот эти вот секшены. И мы видим, что и в экзешнике, который еще не запущен, он сам внутри сохранен вот по этим секциям.
А потом, когда я вам покажу, что мы его запустим, Мы увидим, что это все в настоящей памяти. У нас есть вот этот вот текст, в котором сохранены все команды для исполнения.
И мы прямо видим, что у нас есть секция Data, в котором сохранены все переменные. У нас есть секция iData, в котором сохранены обращения к внешним библиотекам.
У нас есть вспомогательные динамические библиотеки DLL, Dynamic Libraries. Это вспомогательные библиотеки, которые умеют там рисовать на экране окно, посылать что-то по сети, сохранять что-то на жесткий диск.
То есть у нас есть вспомогательные библиотеки, чтобы не я сам как программист Notepad начал рисовать окно, а я буду использовать готовую библиотеку, которая вместо меня может нарисовать красивые кнопочки.
Это называется внешние библиотеки, которые я подключаю к моей программе и могу к ним обращаться. но чтобы к ним обратиться и их запустить, им нужен какой-то адрес в памяти.
Я передаю процессору право исполнять вот эту вот, даю ему команду «иди туда и исполняй те команды». То есть я вызываю внешние функции, я вызываю функции этих внешних DLL.
Но чтобы вызвать внешнюю функцию DLL, мне нужно, чтобы она была в памяти, чтобы я сказал процессору «иди вот на такой-то адрес и начинай там исполнять команды».
И вот это вот iData – это как раз мэппинг, это как раз соединение с этими DLL-ками, которые мне нужны. Именно вот в этом отсеке памяти они сидят. Мы это все-все с вами увидим.
Здесь еще есть разные секции, о которых я не так сильно хочу сейчас говорить. В двух словах есть еще, кроме iData, еще есть ресурсы, relocation table. Я вам скажу по правде, есть много видов секций.
И я могу их создавать несколько штук в своей программе, то есть это на мое усмотрение. Например, что сидит в ресурс тейбл? В ресурс тейбл сидят все картинки, все иконочки.
Видите, у нас на интерфейсе есть иконочки, такие наверху там, и красные там точечки, желтые точечки. Все эти рисунки сидят вот в этом секции ресурс тейбл.
Так, давайте вернемся к нашим делам. Мы говорили о том, что внутри секции текст сидят команды. Я вам это прямо покажу в настоящем экзешнике, который работает.
Например, мы возьмем этот ноутпэд и запустим его. Я хочу вам просто сказать, что это все очень важно.
И мы можем зайти, видите, в Immunity дебаггер, написать его в гугле. Это бесплатный дебаггер. Скачать его и посмотреть, что происходит в памяти компьютера.
Вот я его скачал отсюда, он бесплатный. И мы запускаем этот дебаггер и будем следить за программой. делаем файл Open, открываем Notepad, и он его запускает в память и не исполняет ни одну команду.
Он стоит в состоянии паузы. Еще ни одна команда от Notepad не была запущена. Я могу нажать Play. Видите, он бежит, бежит, бежит, запускает.
Я за ним слежу, и в конце у меня запустился Notepad. То есть я могу так следить за любой программой.
Но меня сейчас не интересует, что Notepad делает. Мы сделаем рестарт, и опять возвращаемся в состояние, что он весь в памяти, готов к запуску и ждет, чтобы я ему сказал запусти первую команду.
Здесь есть, например, все команды на языке машинного кода и с переводом на ассемблер, чтобы мне было легче. То есть i8 это call, ведь есть стандарт.
Вот это то, что записано в памяти, а это его перевод. То есть i8 это call, i9 это jump, это команды на языке ассемблера. Но я сейчас перехожу в view memory, хочу посмотреть, что происходит в памяти.
У меня команды не интересуют сейчас. Я вам сделал отдельный фильм. Я смотрю сейчас на Memory Map и вижу, что у меня, вот видите, по этому адресу, вот по адресу 571 тысяча, есть, сидит в этой памяти информация, которая помечена как код, видите.
А в следующем отсеке памяти 594 тысячи сидит дата. А в 596-й сидит iData. iData – это импорт, это связь с другими экзешниками.
с другими DLL-ками. И вот мы прямо здесь видим в Executable Models, во View Executable Models, то есть внешние модули. Видите, какие DLL-ки мой Notepad запускает.
Видите, этот Notepad, маленькая программка, использует столько много разных вспомогательных библиотек. Например, вот этот GDI32, это чтобы нарисовать на экране окно, чтобы программисту Notepad не рисовать самому окно, кнопку Minimize, кнопку Maximize, кнопку закрыть, крестик. Все это встроено в эту DLL-ку,
можно сказать ему, слушай, просто нарисуй. Все эти DLL сидят у меня в памяти, и мы прямо можем к ним обращаться из нашего кода. Вот мы прямо видим, что здесь есть, видите, опять текст, опять код, но в этот раз это уже не код Notepad, это уже код вспомогательной DLL, который называется вот так вот,
comctl32. Есть вот еще DLL, и в ней тоже код, то есть мы можем эти секции кода вызывать их функции с нашего кода Notepad, то есть главная программа их вызывает.
А вот этот вот, который рисует окна GDI32, видите, точка текст. Мы прямо его видим, и если мы обратимся по этому адресу, мы сможем вызвать его функции.
Еще интересно посмотреть, что у нас есть права доступа рядом с каждым таким вот кодом, рядом с каждой секцией. У нас есть права доступа, что можно делать.
Например, можно read и execute, можно запускать и читать, Но нельзя изменять. То есть если будет какая-то ошибка и кто-то что-то захочет изменить, нельзя.
То есть с момента загрузки все. Это только можно читать и запускать. А секция дата, данные, их можно читать, писать. Но если случайно туда попадет код, например, какой-то умник в Notepad вместо текста начнет писать команды, то они никогда не будут запущены.
Потому что программа Notepad сохраняет все данные в памяти, в секции Data, но оттуда никогда не будет ничего запущено, потому что я на уровне процессора говорю, процессор, ты никогда с этой секции не запускай команды.
Ты можешь туда читать, писать, но не исполняя оттуда команды. Даже если ты там видишь какую-то команду, ты ее не исполняешь.
Вот эти вот права доступа, это улучшение 64-битных систем. Во времена 32-битных систем такого не было. И опять, даже внешний DLL может использовать еще DLL-ки.
То есть, понятно, здесь библиотека использует другие библиотеки. И у каждой секции есть права доступа. Я вам хочу только показать то, что я вам рассказываю.
Это происходит в настоящей памяти компьютера, а не просто так какие-то теоретические гипотезы. Понятно, что есть намного больше подробностей здесь.
Например, read-only на imports, потому что, когда я вызываю внешнюю библиотеку, я в его адреса внешней библиотеки могу только читать. Я не могу там ничего не менять, я могу оттуда