Введение
Актуальность:
Информационные технологии разрослись до огромных масштабов. Компьютеры, телефоны, телевизоры – эти вещи окружают нас, и уже сложно представить наш мир без них. Если нужно кому-то позвонить, посмотреть необходимую информацию в интернете, узнать новости, передать данные, совершить перевод безналичных денег, то мы обращаемся к современным гаджетам. Ключевую роль в создании современных гаджетов играют программисты.
Программирование везде и повсюду, оно позволяет существовать всем современным гаджетам и всему виртуальному миру, где проводит достаточно времени каждый современный человек. Это порождает огромное количество новых программ.
Но в жизни происходит так, что из-за большого количества программ и проектов, некоторые из них забрасываются, другие плохо оптимизированы под требования пользователя, третьи нестабильно работают. Поэтому, логично было продолжить работу над моим предыдущим проектом «Управление оперативной памятью», но под другим углом. Тема моего проекта «Изменение алгоритмов другой программы». Используя конечный продукт проекта, как шаблон для программирования, можно:
Самостоятельно исправить ошибки, недоработки программиста-создателя программы.
Оптимизировать ПО под себя.
Создать патчи, позволяющие стабильно работать программам, которые перестали поддерживать.
Создать свою программу на основе другой.
Цель:
Изучение устройства работы приложений и создание шаблона программы, которая меняет алгоритмы другого приложения.
Задачи проекта:
Изучить научную и справочную литературу, касающуюся темы исследования.
Изучить принцип работы процессора.
Изучить связь процессора и оперативной памяти.
Продолжить углубление знаний по WinApi/C++, работе оперативной памяти и устройству приложений в среде Windows.
Найти способ(ы) изменения алгоритмов приложения для реализации практической части проекта.
Написать и апробировать программу, меняющую алгоритмы приложения «Paint».
Гипотеза:
Если понять принцип работы процессора и устройство работы приложения, то можно писать программы, которые меняют алгоритмы других приложений.
Основная часть
2.1 Введение в основные понятия
Оперативной памятью или оперативным запоминающим устройством (ОЗУ) называют энергозависимую часть системы компьютерной памяти, в которой во время работы компьютера хранится выполняемый машинный код (программы), а также входные, выходные и промежуточные данные, обрабатываемые процессором.
Процессор (от англ. “to process” — “обрабатывать”) — это программа или устройство, предназначенные для обработки данных. Является центральным вычислительным элементом любого компьютера, управляет всеми остальными его элементами. Для работы процессора используется машинный код (платформенно-ориентированный код), машинный язык, который представляет собой систему команд (набор кодов операций) конкретной вычислительной машины, которая интерпретируется непосредственно процессором или микропрограммами этой вычислительной машины. Машинный код можно рассматривать как примитивный язык программирования или как самый низкий уровень представления скомпилированных или ассемблированных компьютерных программ. Именно изменение машинного кода есть изменение алгоритмов приложения. Для удобства, в течение проекта машинный код будет называться байтами. Сигнатура – уникальная последовательность этих байтов. Благодаря сигнатуре можно найти необходимую инструкцию в памяти приложения. Инструкция – представление машинного кода в виде команд языка программирования ассемблера.
Когда компьютер работает, программы время от времени открываются и закрываются. Что происходит в этот момент с оперативной памятью? Когда приложение открывается, оно ищет свободную оперативную память и резервирует необходимое для работы количество оперативной памяти, когда закрывается – освобождает зарезервированную оперативную память. Именно поэтому можно много раз открывать и закрывать приложение, не опасаясь, что оперативная память будет переполнена. Именно поэтому одно и тоже приложение может запускаться в разных местах в оперативной памяти, то есть по разным адресам. Базовый адрес – это адрес начала данных (машинного кода) приложения. С этими знаниями становится возможным изменить алгоритмы другого приложения и написать программу, меняющую алгоритмы приложения «Paint».
2.2 Графический редактор«Paint» и его слабые стороны
Для наглядного примера я решил использовать всем известную программу «Paint»из стандартного набора приложений, предустановленных в ОС Windows. Есть ещё причина, по которой я выбрал именно Paint. Иногда мне было необходимо быстро сделать набросок или схему, но я сталкивался со сложностью, что максимальный размер кисти 50 пкс, из-за чего задача усложнялась и приходилось тратить на простые вещи больше времени, чем планировалось. Поэтому возникла идея изменить выбор размера кисти в «Paint», а дальше эта идея разрослась в изменение выбора размера всех графических инструментов внутри «Paint».
В приложении MSPaint существует два способа изменить размер кисти или фигуры:
Меню выбора толщины (см. Рисунок 1), для удобства этот метод будет называться фиксированным.
Сочетание клавиш “CTRL+” и “CTRL-” (см. Рисунок 2), которые увеличивает или уменьшает на единицу размер кисти или фигуры, для удобства этот метод будет называться свободным.
Рисунок 2
Рисунок 1
Сложность заключается в том, что при использовании фиксированного метода возможные значения {1 пкс., 3 пкс., 5 пкс., 8 пкс.}, следовательно, максимальный размер кисти – 8 пкс., а при свободном методе – 50 пкс. (см. Рисунок 3).
Рисунок 3
Рисунок 4
То есть, максимально возможный размер кисти 50 пкс., что очень неудобно. К примеру, если автор захочет нарисовать рисунок, где используется больший размер кисти (см. Рисунок 4), это будет невозможно.
В этом заключается основная задача моего исследования, а именно, задуманная программа должна отключить ограничения фиксированного и свободного метода, например, значения фиксированного метода{1 пкс., 3 пкс., 5 пкс., 8 пкс.} заменить на {25 пкс., 50 пкс., 100 пкс., 200 пкс.} и убрать ограничения свободного метода, то есть, чтобы при использовании свободного метода размер кисти мог быть в пределах [1 пкс; +∞ пкс).
2.3 Исследование «Paint»
Необходимо выделить этапы исследования:
поиск адресов, которые отвечают за размер кистей и фигур;
поиск инструкций, которые взаимодействуют с ранее описанными адресами;
написание скриптов;
2.3.1 Поиск необходимых адресов
Для поиска адресов и дальнейших манипуляций использовалась утилита «CheatEngine», которая позволяет удобно работать с оперативной памятью.
Благодаря фиксированному методу, можно без сложностей найти необходимые адреса. Принцип поиска: выборка, отсеивание. Допустим размер кисти 8 пкс., это значение вписывается в программу «CheatEngine», которая ищет все переменные со значением 8 пкс. в разрезе выбранной программы. Находится какое-то количество адресов, например, 4 тысячи, после чего размер кисти меняется пользователем, например, на 5 пкс., и это значение снова вписывается в программу «CheatEngine», после чего находится уже не 4 тысячи переменных, а 50 переменных, так как происходит отсеивание, и остаются только те адреса, которые изменили своё значение на 5 пкс. Эти действия повторяются до тех пор, пока не найдётся один единственный, необходимый адрес.
Синтезируя программу «Paint»и утилиту «CheatEngine», адреса, которые в дальнейшем сыграли важную роль в изучении размеров кистей и фигур, были найдены.
«CheatEngine»предлагает удобную функцию “Find out what access this address” (дословносангл. “найти что взаимодействует с данным адресом”).В результате работы этой функции нашлось 2 инструкции (см. Рисунок 5). Их отличия заключаются в частоте вызова (см. Рисунок 5), одна вызывается при рисовании, фиксированном и свободном методе, другая - только при фиксированном и свободном методе. Чем ýже влияние инструкции, тем лучше, так как дальнейшая отладка будет проще. Поэтому стоит остановиться на второй инструкции. Аналогично находятся инструкции для других кистей и фигур.
Рисунок 5
Инструкции для фиксированного метода найдены, но инструкция для свободного метода, отвечающая за ограничение в 50 пкс, до сих пор не определена. Это оказалось проблемой, поскольку эта инструкция находиться неизвестно где, в неочевидном месте. Её удалось найти в результате тщательного исследования кода, с использованием технологии breakpoint и поэтапного прохода по коду.
Таким образом, стало возможно написать скрипты, которые способны изменять фиксированный метод и свободный метод.
2.3.3 Создание скриптов и использование методов
Смысл скриптов будет заключаться в том, чтобы, когда пользователь пользуется фиксированным методом, размер кисти будет не {1 пкс., 3 пкс., 5 пкс., 8 пкс.}, а {25 пкс., 50 пкс., 100 пкс., 200 пкс.}, и чтобы пользователь мог использовать свободный метод без ограничения в 50 пкс.
Как говорилось ранее, одна и та же инструкция вызывается и для фиксированного метода, и для свободного метода. Эти методы нужно отделить друг от друга, если этого не сделать, то во время использования свободного методапрограмма будет работать неправильно. Так происходит из-за того, что значения свободного метода пересекаются со значениями фиксированного метода.
Методы можно отделить друг от друга, сравнивая значения регистров. Так как регистры принимают разные значения для разных методов.
Таким образом, все необходимые скрипты созданы.
Создание программы
Рисунок 6
В создании программы помогла литература из списка. Всего получилось 1100 строк кода. На рисунке (см. Рисунок 6) показана диаграмма классов получившейся программы. На рисунке (см. Рисунок 7) показано окно успешно работающей программы.
Рисунок 7
3. Заключение
Цель моей работы была достигнута: я изучил работу приложений и создал программу, меняющую алгоритмы приложения.
Программа изменяет фиксированный метод и позволяет пользоваться свободным методом без ограничений. Благодаря чему, пользователь может рисовать рисунки любых размеров.
В процессе работы над проектом было изучено множество литературы и интернет-источников. Удалось значительно продвинуться по сравнению с проектом прошлого года «Управление оперативной памятью».
Моя гипотеза подтвердилась: поняв принцип работы процессора и устройство работы приложения, получилось написать программу, которая меняет алгоритмы другого приложения.
Это только первый шаги в теме реверс-инжиниринга, в этом направлении можно развиваться сколько угодно. На фоне нынешней политической ситуации это особо актуально, поскольку зарубежное ПО перестало поддерживаться в России. В России теперь можно на законном уровне заниматься вещами, которые раньше попадали под 273 УК РФ, с зарубежным программным обеспечением.
Список использованных источников и литературы
Интернет-ресурсы:
https://www.youtube.com/c/GamehacklabRu
https://gamehacklab.ru/
Лафоре Р. – «Объектно-ориентированное программирование в C++» – 4-е изд., - Питер, 2018. – 928 с. - ISBN: 978-5-4237-0038-6
Руссинович М., Ионеску А.– «Внутреннее устройство Windows» – 7-е изд., - Питер, 2019. – 944 с. - ISBN: 978-5-4461-1155-8