Расширяем функционал «блокнота»

В этой статье мы исследуем аналог одной очень известной программы для Windows под названием «Блокнот» и напишем DLL расширяющее его возможности. Аналог называется NFOPad.

Исходные коды не прилагаются

Эта программа может обрабатывать текстовые файлы и производить поиск, замену текста то есть по функционалу ничуть не уступает всемирно известному «Блокноту». Сейчас мы научим его обрабатывать зашифрованные файлы. Плагинов на это чудо технологического прогресса тоже нету и поэтому нам понадобится: знание Ассемблера, отладчик, мозги и компилятор способный смолотить код в DLL.

В этой статье мы научим его создавать зашифрованные файлы и сначала нам нужно найти место где происходит запись в файл при сохранении.

Открываем NFOPad в отладчике(лично я использую Cheat Engine) и переходим в функцию WriteFile

Вот мы и в теле функции WriteFile. Теперь нам нужно найти откуда будет вызвана эта функция при сохранении файла и для этого ставим брекпоинт на команду ret

Теперь напечатаем в блокноте какую нибудь ерунду и сохраняем

После того как мы приказали блокноту сохранить текст сработал брекпоинт и после нажатия F8 мы отправляемся на адрес возврата

То что выделено красным это вызов функции WriteFile который сохраняет введенный текст в текстовый файл.

Вот дальнейший план действий. Мы сотворим DLL библиотеку в которой будет функция с идентичными аргументами как у WriteFile и при загрузке она будет подменять адрес вызова функции которая выделена красным на свой.

Открываем Visual Studio и создаем проект DLL. Первым делом напишем функцию которая будет вызываться вместо WriteFile и назовем ее CrackWriteFile. Она будет шифровать переданный текст а затем вызывать WriteFile и передавать ему свои аргументы.

Теперь напишем функцию которая будет подменять адрес

В точке входа еще нужно прописать вызов этой функции.Думаю все понятно и приступаем к тестированию. Инжектим скомпилированную DLL в процесс блокнота и вводим в редактор примерно следующий текст

Теперь в сохраненном файле мы видим не прекрасное стихотворение а вот это

Это на самом деле и есть то стихотворение, но зашифрованное нашим алгоритмом. Теперь мы научим его еще и считывать зашифрованные файлы. Для этого также ставим брекпоинт, но уже на функцию ReadFile и при открытии любого файла этот бряк сработает. Потом по уже отработанному сценарию переходим на адрес возврата и узнаем откуда была вызвана функция.

Теперь в наш проект добавляем функцию CrackReadFile которая будет вызываться когда блокнот будет открывать файл.

Теперь изменяем функцию OnInject

Теперь если после инжекта DLL в процесс зашифрованный файл отображается нормально то все сделано правильно. В этой статье мы расширили функционал аналога блокнота. Конечно при желании можно было значительно доработать наше расширение например сделать так, чтобы при инжекте в интерфейсе программы появлялся чекбокс и только если он установлен программа шифрует файлы или можно было улучшить алгоритм шифрования, но эта не суть поскольку целью статьи было рассказать, что при помощи реверс-инжиниринга можно расширять возможности программ. Как будет время я и дальше буду продолжать писать подобные статьи а поскольку сейчас лето то его у меня полным полно.

Надеюсь моя статья была вам интересна.

ссылка на оригинал статьи http://habrahabr.ru/post/261541/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *