- Алгоритм загрузки PE файлов в Windows
- Что такое PE файл
- Алгоритм загрузки PE файла в Windows
- Физическое копирований секций файла в память
- Логическая обработка скопированного образа программы
- Заключение
- Как запустить программу через командную строку в Windows 10, 7
- Запуск по названию исполняемого файла
- Запуск с указанием полного пути
- Запуск с помощью команды «start»
- IT-блог о веб-технологиях, серверах, протоколах, базах данных, СУБД, SQL, компьютерных сетях, языках программирования и создание сайтов.
- Как настроить и добавить путь к программе в системную переменную Path в Windows 10, Windows 8 и Windows 7
- Что такое переменная Path и зачем она нужна в Windows. Зачем нужно добавлять путь?
- Как добавить путь к программе в системную переменную Path в Windows 10 и Windows 8
- Как настроить переменную Path в Windows 7
- Выводы
Алгоритм загрузки PE файлов в Windows
Привет всем, кто забрел на эту заметку. Мной будет затронута не самая любимая тема: системное программирование. Дело в том, что волей судьбы я с ним столкнулся, в университете, если быть точнее. Пришлось знатно покопаться в самых низких слоях программирования, алгоритм разгрузки pe файлов оттуда. Надеюсь, что кому-нибудь пригодится мой опыт в этом деле, что вряд ли. Но тем не менее, я им поделюсь.
Если вам не интересен краткий экскурс в теорию работы pe загрузчика, то добро пожаловать сразу к реализации загрузчика PE файлов на C. Конечно же на Си, никаких скриптов, абстракций и прочего высокоуровнего кайфа, только хардкор!
Что такое PE файл
PE( Portable Executable ) это основной формат исполняемых файлов для операционных систем семейства Windows NT. Используется для представления исполняемых файлов (.exe), динамических библиотек (.dll) и драйверов (.sys). Является расширением формата исполняемых файлов для DOS, то есть PE файл является корректной программой для системы DOS, но это нам не интересно. Мы будем запускать PE файлы под Windows собственноручно написанным загрузчиком.
Зачем? Для разных целей. Например, мне просто дали такое задание в университете для затравочки и подготовки к изучению методов взлома и защиты программных данных. Кто-то пишет всякие читы, трейнеры для игр(это очень плохо, я их осуждаю). Есть и такие, для кого это просто хобби, как писать на ассемблере. В любом случае, сейчас я вкратце расскажу последовательность действий операционной системы при загрузке pe файла.
Алгоритм загрузки PE файла в Windows
Очень краткое описание алгоритма, достаточное для понимания реализации. Итак, в работе загрузчика можно выделить два основных этапа.
1) физическое копирование секций файла в память;
2) логическая обработка скопированного образа программы.
Понятно, что второй этап возможен только в случае успешного завершения первого. Теперь подробно рассмотрим шаги каждого этапа.
Физическое копирований секций файла в память
Проще простого, файлы копируются в область памяти без учета их назначения. Пара слов о формате PE файла. Первым расположен DOS-заголовок и сразу за ним лежит значение смещения до NT-заголовка. После этих товарищей расположены секции загружаемого файла. Их может быть разное количество в зависимости от типа файла(процесс, библиотека или драйвер). На первом этапе мы пробежимся по каждой секции и загрузим ее содержимое в оперативную память.
Действия первого этапа:
1) считать в память DOS-заголовок и определить смещение до NT-заголовка;
2) считать NT-заголовок;
3) определить из NT-заголовка начальный адрес загрузки (ImageBase) и размер образа исполняемого файла(SizeOfImage). ImageBase это адрес, по которому PE файл хочет загрузиться, но на деле редко ему это удается.
4) попытаться выделить память по указанному адресу(ImageBase) указанного размера (VirtualAlloc). Если по этому адресу выделить память не удается, проверить наличие таблицы релоков(таблицы перемещений). Если релоки присутствуют, выделить память по новому адресу с с учетом смещения. Память выделяется с правами для чтения и записи без учета прав доступа, указанных в таблице секций;
5) проверить корректность заголовков и таблицы секций;
6) скопировать данные секций из файла в память;
Логическая обработка скопированного образа программы
Все скопировано в память, пора пробежаться по образу и выполнить необходимые манипуляции вплоть до вызова точки входа.
Действия второго этапа:
1) настроить таблицу релоков, если был изменен адрес загрузки(подробнее в реализации);
2) обработать таблицу импорта, если она присутствует. Для этого необходимо загрузить все библиотеки, которые еще не были загружены. Они грузятся рекурсивно с первого шага первого этапа, следовательно во время их загрузки могут быть загружены другие библиотеки. Каждая библиотека должна быть загружена только один раз, для этого следует вести список загруженных библиотек;
3) в таблице экспорта библиотеки необходимо найти все импортируемые из нее функции. Должны быть найдены все импортируемые функции всех библиотек, иначе процесс загрузки прерывается с ошибкой. При загрузке библиотеки должна вызываться ее точка входа (AddressOfEntryPoint), которая является адресом функции: BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); Эта функция вызывается при загрузке и перед выгрузкой библиотеки. Во втором параметре передается константа, указывающая причину вызова. В случае библиотеки это DLL_PROCESS_ATTACH . Если она вернула FALSE , значит библиотека загрузилась с ошибкой и следует прерывать процесс загрузки;
4) выставить права доступа в соответствии с указанными в таблице секций(VirtualProtect);
5) передать управление точке входа.
На этом шаги наконец закончились. Если все прошло успешно, наша программа запустится. Естественно система будет ругаться, мы вторгаемся во владения ядра и берем на себя его функции.
Заключение
Почувствовали себя теперь настоящим хозяином операционной системы? Я немножко да. Но это все цветочки, на этот алгоритм я буду опираться во время непосредственной реализации загрузчика pe файлов. Приходите, почитайте, как я это сделал.
Как запустить программу через командную строку в Windows 10, 7
При работе с командной строкой и написании командных файлов часто возникает необходимость в запуске других программ. В данной статье мы рассмотрим несколько способов, как можно запускать программы через командную строку в операционных системах Windows 10 и Windows 7.
Запуск по названию исполняемого файла
Многие программы в командной строке можно запускать просто указав название их исполняемого файла. Например, вы можете ввести в командную строку « notepad » и запустить программу « Блокнот » или ввести « mspaint » и запустить « Paint ».
Это работает благодаря переменной окружения « PATH » в которой записан список папок, где Windows должна искать исполняемые файлы для программ. Список этих папок можно просмотреть, если ввести в командную строку команду « path ».
Если вы хотите запустить программу из другой папки, которая не указана в переменной « PATH », то вы можете временно изменить папку для поиска исполняемых файлов. Для этого нужно ввести команду « path » и через пробел указать путь к нужной папке. Например, мы можем указать путь к папке с программой AkelPad:
И потом запустить эту программу выполнив команду «akelpad»:
Нужно отметить, что команда «path» влияет только на текущий сеанс командной строки, при этом значение переменной « PATH » не меняется.
Запуск с указанием полного пути
Еще один способ запуска программ – это указание полного пути к исполняемому exe-файлу. Для этого достаточно вставить в командную строку полный путь и указанная программа будет запущена.
Например, для запуска программы AkelPad в командную строку нужно вставить следующее:
Обратите внимание, если путь содержит пробелы, то его нужно взять в кавычки, в других случаях кавычки не обязательны.
Запуск с помощью команды «start»
Также для запуска других программ можно использовать команду «s tart ». С ее помощью можно запускать как программы для командной строки, так и приложения с графическим интерфейсом.
Для запуска программ данным способом нужно ввести команду « start » и через пробел указать название программы. Например, для того чтобы запустить текстовый редактор «Блокнот» нужно выполнить следующее:
Как и в предыдущем случае, Windows будет искать исполняемый файл в папках, которые указаны в переменной окружения « PATH ».
Но, команда « start » позволяет и вручную указать путь к папке с программой. Для этого нужно использовать параметр « /D ».
Например, для того чтобы запустить программу « akelpad » из папки « C:\Program Files (x86)\AkelPad » нужно выполнить следующее:
Одной из особенностей команды «s tart » является то, что она позволяет запускать программы с высоким приоритетом.
IT-блог о веб-технологиях, серверах, протоколах, базах данных, СУБД, SQL, компьютерных сетях, языках программирования и создание сайтов.
Как настроить и добавить путь к программе в системную переменную Path в Windows 10, Windows 8 и Windows 7
Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжим разбираться с командами и системными утилитами в операционной системе Windows 10, на этот раз будет разговор о переменной PATH в Windows. Всё дело в том, что системная переменная PATH дает нам возможность расширить список команд командной строки Windows, как это сделать, вы узнаете из этой публикации. Здесь мы с вами поговорим о назначении системной переменной PATH, а также разберемся с вопросом: как добавить путь к исполняемому файлу в системную переменную PATH в операционных системах Windows 10, Windows 8 и Windows 7. Этой публикацией можно пользоваться как простой инструкцией по добавлению значений в переменную PATH для Windows.
Если вам интересна тема компьютерных сетей, то в блоге уже практически закончена первая часть курса по основам компьютерных сетей, можете ознакомиться с ее содержимым. И вот здесь можно получить немного информации о самом курсе.
Что такое переменная Path и зачем она нужна в Windows. Зачем нужно добавлять путь?
PATH – это системная переменная окружения Unix-подобных (например, Linux Mint) операционных систем, а также операционных систем семейства Windows. В переменной PATH нет ничего сложно и хитрого, это обыкновенный список папок и каталогов, в которых лежат исполняемые файлы (программы). Программы, путь к исполняемым файлом которых задан в системной переменной PATH, могут быть исполнены (запущены) непосредственно из командной строки Windows и из любого места вашей файловой системы (в Linux тоже есть командная строка, но ее лучше называть эмулятор терминала).
Давайте лучше посмотрим на примере зачем нужна переменная PATH в операционных системах семейства Windows (как, впрочем, и в других семействах). Смотреть будем на примере сторонней утилиты командной строки Windows tracetcp.exe. Она у меня установлена по следующему пути: c:\Program Files\tracetcp\. Запустим командую строку Windows и попробуем выполнить команду tracetcp.
Пробуем запустить стороннюю утилиту командной строки Windows
Обратите внимание на то, что командная строка не смогла выполнить команду tracetcp, хотя приложение и установлено на мой компьютер, проблема заключается в том, что командная строка не смогла найти исполняемый файл tracetcp.exe. Но где командная строка его искала? Она искала этот файл в текущем каталоге, то есть в данном случае в каталоге: c:\Users\Dell, там этого файла не оказалось, затем командная строка обратилась к переменной PATH, там она не обнаружила пути к исполняемому файлу tracetcp.exe, но обнаружила путь к папке System32, проверила, что в этой папке также нет файла tracetcp.exe и выдала нам предупреждение: «»tracetcp» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.».
Поскольку мы находились в папке, отличной от той, где находится файл tracetcp.exe, а пути в переменной PATH к этому файлу не оказалось, командная строка просто не смогла его найти, чтобы исполнить, давайте всё-таки его запустим, для этого нужно будет перейти в папку c:\Program Files\tracetcp при помощи команды cd (в операционных системах Linux тоже есть команда cd и работает она аналогично), а затем запустить утилиту.
Запуск исполняемого файла в командной строке Windows
Теперь командная строка Windows смогла запустить нашу утилиту, поскольку смогла найти исполняемый файл tracetcp.exe, но каждый раз переходить в папку, где лежит исполняемый файл или каждый раз указывать абсолютный путь к исполняемому файлу — это очень неудобно, будет гораздо лучше, если мы укажем путь к исполняемому файлу в переменной PATH, тогда командная строка будет самостоятельно его находить в любое время и в любом месте.
Исполняемый файл был запущен, поскольку путь до него был добавлен в системную переменную Path
На рисунке выше показано, что командная строка смогла запустить приложение из домашней папки пользователя, но это лишь благодаря тому, что я добавил путь исполняемому файлу в переменную PATH, теперь команда tracetcp будет работать из любой другой папки. Утилита tracetcp довольно простое приложение, представляющее собой один исполняемый файл — tracetcp.exe, можно было бы не прописывать путь в переменную PATH, а просто скопировать этот файл в папку System32, но устанавливать сторонние и непроверенные приложения, не требующие наличия файлов в System32, не самая хорошая и безопасная затея. В Windows лучше потратить немного времени на то, чтобы добавить путь к файлу в переменную PATH, о том как это сделать мы и поговорим ниже, рассмотрев этот процесс для операционных систем Windows 10, Windows 8 и Windows 7.
Как добавить путь к программе в системную переменную Path в Windows 10 и Windows 8
Добавление пути к программе в системную переменную PATH в операционных системах Windows 10 и Windows 8 делается по одному алгоритму, показывать я буду на примере Windows 10, так как восьмерки под рукой нет. Ранее мы уже видели, что небольшая утилита tracetcp запускалась из командной строки Windows только в том случае, если мы переходили в ту папку, в которую она установлена. Но это легко исправить, просто добавив полный путь к исполняемому файлу tracetcp.exe в системную переменную PATH. Давайте это и сделаем. Описывать процесс добавления значения в переменную PATH буду буквально по шагам и с демонстрацией скриншотов окон в Windows 10. Хотя сперва я напишу сам алгоритм, если его не хватит, то обратитесь к скриншотам ниже:
- Открываем поиск и пишем: «Система» или «Панель управления».
- Появится окно, в левом верхнем углу которого есть небольшое меню и пункт «Дополнительные параметры системы».
- Появится окно поменьше, в нижнем правом углу есть кнопка «Переменные среды. ».
- Откроется окно управления переменными средами в Windows 10.
- Нас интересует переменная PATH, которая находится в разделе «Системные переменные», нажимаем на нее два раза.
- Появится окно для редактирования значений переменной PATH, чтобы добавить новое значение воспользуйтесь кнопкой «Создать».
- Подтвердите добавление нового значения в переменную PATH нажатием кнопки «Ок» и закройте все остальные окна.
- Если во время редактирования переменной PATH у вас была запущена командная строка Windows, то закройте ее и откройте заново, чтобы cmd.exe прочитала новое значение переменной PATH.
Открываем поиск Windows и в форму пишем: «Система» или «Панель управления». В результате вы должны увидеть примерно такой результат, как показано на рисунке ниже.
Используем поиск Windows, ищем по ключевому слову Система
После того, как вы нажмете на кнопку «Система», у вас появится окно, в левой части которого есть небольшое меню, самым нижним пунктом этого меню будет «Дополнительные параметры системы».
Чтобы добавить значение в переменную PATH переходим во вкладку Дополнительные параметры системы
После перехода у вас появится окно поменьше, в этом окне нас интересует вкладка «Дополнительно». В правом нижнем углу есть кнопка «Переменные среды. », на нее и нажимаем.
Нажимаем на кнопку Переменные среды
Появится еще одно окно, которое позволяет управлять системными переменными Windows 10. Обратите внимание: в это окно разделено на две части, в верхней части происходит управление переменными среды для текущего пользователя, в нижней части расположены системные переменные.
В разделе Системные перемененные ищем переменную PATH
В данном случае нас будет интересовать переменная Path, которая находится в разделе «Системные переменные», кликаем на нее два раза, у нас появляется окно, которое позволяет удалять, добавлять и редактировать значения системной переменной Path в Windows 10 и Windows 8. Нам осталось выполнить два действия: нажать на кнопку создать, в появившуюся активную форму вписать путь к файлу tracetcp.exe и подтвердить свои действия нажатием клавиши «Ок».
Дбовляем путь к исполняемому файлу в системную переменную PATH в Windows 10
Закройте все остальные окна. Если у вас была открыта командная строка, вы можете убедиться в том, что она не увидела новое значение переменной PATH, попробуйте выполнить tracetcp из корня диска C, ничего не сработает. Когда вы добавляете новый путь в переменную PATH, программе cmd.exe нужно перечитать значения этой переменной, самый простой способ заключается в том, чтобы закрыть и заново открыть командую строку. Теперь команда tracetcp работает из любой папки, аналогично можно поступать и с другими программами командной строки, которые вы устанавливаете в Windows.
Как настроить переменную Path в Windows 7
К сожалению, у меня не осталось скриншотов, на которых можно было бы продемонстрировать добавление пути в системную переменную PATH на Windows 7, поэтому здесь будет только пошаговый алгоритм добавления значения в переменную PATH:
- На вашем рабочем столе есть икнока с названием «Компьютер» или «Мой компьютер», нажмите на нее правой кнопкой мыши.
- Появится контекстное меню, в самом низу которого есть пункт «Свойства», выберете его.
- Перед вам развернется окно, в котором есть пункт меню «Дополнительные параметры системы», его и выбираем.
- В этом окне будет кнопка «Переменные среды», жмем на нее.
- У нас появляется окно управления системными переменными в Windows 7, внизу которого есть список переменных, среди которого нужно найти переменную PATH.
- Если такой переменной нет, то ее нужно создать, воспользовавшись кнопкой создать: у вас появится окно, в котором нужно будет вписать имя новой переменной, в нашем случае это Path.
- Если переменная PATH есть, то ее нужно выделить левой кнопкой мыши и нажать на кнопку изменить: появится небольшое окошко с двумя формами для ввода: верхняя форма содержит имя переменной — это Path. В нижней форме указаны абсолютные пути до исполняемых файлов различных программ, выглядет это примерно так: d:\Program Files\application1\;d:\Program Files\application2\;d:\Program Files\aplication3\; и так далее, чтобы добавить еще одно значение переместитесь в конец строки, убедитесь, что последним символом является «;» (именно этот символ является разделителем), впишите путь к исполняемому файлу (в моем случае он выглядел бы так: с:\Program Files\tracetcp\) и в конце добавьте точку с запятой.
- Подтвердите свои действия нажатием кнопки «Ок» и закройте другие окна.
Как видите, настроить переменную PATH в Windows 7 не так уж и сложно.
Выводы
Вы этой статье мы разобрались с назначение системной переменной PATH и отметили, что в каждой операционной системе оно одинаковое и заключается в том, что переменная PATH является списком каталогов, в котором хранятся исполняемые файлы, если путь к исполняемому файлу есть в переменной PATH, то он может быть исполнен из командной строки операционной системы. Также мы разобрались с тем, как прописать путь к исполняемому файлу в операционных системах Windows 10, 8, 7.