Процессор
Процессор (англ. CPU - central processing unit, в переводе: центральное процессорное устройство) является средцем компьютера, он представляет из себя микросхему, основанную на кремниевом кристалле. На микропроцессоре исполняется машинный код, приводящий к запрограммированному алгоритму работы всех узлов компьютера. Сам код программы всегда считывается центральным процессором из внешней памяти, в момент запуска - из ПЗУ BIOS, а после - из оперативной памяти.
Архитектура фон Неймана
Практически любой процессор функционирует по единому принципу, изобретенному Джоном фон Нейманом в 1945 году.
Этот принцип заключается в последовательной обработке команд, находящихся в памяти совместно с данными, сам алгоритм таков:
- Процессор выдает на шину адресов число, хранящееся в регистре-указателе команд (ноль в момент старта)
- Считывается байт из памяти, находящийся по данному адресу (данные передаются по шине данных)
- В соотвествие с таблицей команд, знакомой процессору определяется какой команде (оператору) соответствует данный байт.
- Зная, что за команда будет выполняться, процессор считывает из памяти (используя шаги 1 и 2) соотвествующее ей число байт, являющихся данными.
- Команда выполняется процессором.
- В регистре-указателе команд процессор устанавливает адрес следующей команды.
- Цикл повторяется.
Описанный цикл представляет из себя ничто иное, как выполнение одной машинной команды за один проход по циклу. Во время работы компьютера операции происходят непрерывно, машинный код, написанный программистом постоянно выполняется, именно это и называется процессом
Все операции выполняются микросхемой процессора по сигналам, приходящим с тактового генератора. Машинный код не может быть выполнен за один такт, за один такт выполняется в общем случае лишь одно действие: например, установка сигнала на шине адресов, чтение ячейки памяти по текущему адресу и т.д. Таким образом на весь цикл выполнения одной машинной инструкции может уходить порядка 50 тактов генератора, тактовый генератор выдает импульсы на частоте процессора, те самые 2-3 гигагерца, хорошо нам знакомые и являющиеся технической характеристикой процессора.
Внутренняя структура процессора
Для целей крэкерства мы прибегнем к упрощенной структуре процессора и сразу будем использовать аббривиатуры, с которыми мы встречаемся в окне OllyDbg. Надо сказать, что сам отладчик OllyDbg даёт нам возможность на черепашьей скорости выполнять программу, мы можем вручную запускать на выполнение по одной машинной команде, то есть мы контроллируем процесс до точности в один цикл фон Неймана и видим как процессор выполняет любую команду: какие данные он получает перед выполнением команды и что выдаёт в качестве результата.
На рисунке:
- область №2 - машинный код команд, выполняемых процессором последовательно. Как видно, длина команд может быть больше 1 байта (чаще всего до 6 байта, в самых редких случаях до 15 байт), в процессор встроен табличный дизассемблер длин, чтобы процессор, получив первый байт машинной команды, мог определить сколько последующих байт являются данными для этой команды, тем самым определяется длина всей машинной команды и происходит разделение машинного кода на отдельные инструкции.
- область №5 - регистры общего назначения РОН
- область №6 - упомянутый выше регистр-указатель команд EIP
- область №7 - регистр флагов EFL
Что такое шина данных и шина адресов
Для начинающего термин "шина" обычно непонятен, на самом деле шина это просто провода. Шина это тоже самое, что и шлейф, например, тот который соединяет винчестер и материнскую плату - это группа из порядка 40 электрически изолированных друг от друга проводов, объединенных в единую констукцию. Естественно, что к процессору тоже подходит такая группа проводников, называемая шиной.
Когда в статьях говорится, "процессор выставляет на шину адресов значение" или "процессор получает значение с шины данных" это НЕ означает, что в самой шине значения сохраняются, шина лишь создаёт электрический контакт между узлами компьютера, например между процессором и оперативной памятью.