Зашить программу в программу
Однако существуют программы, использующие сторонние библиотеки, но при этом состоящие из одного единственного файла. Все утилиты от SysInternals, а также любимый мной LINQPad представляют из себя один файл в котором содержится все, что требуется для работы. Пользоваться такими утилитами одно удовольствие — они сразу готовы к использованию, их удобно передавать и хранить.
В статье рассказывается, как создавать такие автономные программы из одного файла. Разобран пример как со сжатием зашить библиотеку AutoMapper в программу и как ее потом достать и использовать.
Исходный код к статье — скачать
Код программы использует стороннюю библиотеку AutoMapper. Чтобы убедиться в работоспособности библиотеки после ее зашития в ресурсы, в программе вызывается код из семплов к библиотеке. Этот код здесь не приведен, ибо это статья не об AutoMapper. Но сама библиотека интересная и полезная — рекомендую посмотреть, что же она делает в коде.
Если CLR не удалось найти сборку, вызывается событие AppDomain.AssemblyResolve. Событие дает возможность загрузить требуемую сборку вручную. Поэтому для реализации автономной программы, состоящей из одного exe файла, достаточно зашить все зависимые сборки в ресурсы и в обработчике AssemblyResolve подгружать их.
Удобно класть в ресурсы сборки в архивированном виде. Архивация уменьшает размер итоговой программы приблизительно в 2 раза. Скорость запуска увеличивается, но эти доли секунды мало кто заметит. А вот уменьшение размера файла позволит его быстрее качать по сети.
Итак, у нас есть работающий проект, использующий сторонние библиотеки. Хочется, чтобы exe файл проекта был автономен и не требовал наличия зависимых dll в своем каталоге.
Полученную ранее архивированную сборку добавляем в ресурсы проекта через Project Properties-Resources-Files. Студия при добавлении ресурса генерирует код, который позволяет использовать добавленный ресурс через Resources класс.
Регистрируем обработчик AssemblyResolve (до использования классов зависимой библиотеки):
AppDomain .CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve; |
private static Assembly AppDomain_AssemblyResolve( object sender, ResolveEventArgs args ) if ( args.Name.Contains( "AutoMapper" ) ) Console .WriteLine( "Resolving assembly: " , args.Name ); // Загрузка запакованной сборки из ресурсов, ее распаковка и подстановка Для нескольких зависимых библиотек стоит ввести соглашение, согласно которому имя ресурса и искомой сборки совпадают. Тогда можно с помощью отражения автоматически искать требуемую библиотеку в ресурсах. По умолчанию зависимые библиотеки, добавляемые через References, копируются в выходную директорию проекта. Чтобы AssemblyResolve сработал, нужно либо скопировать выходной exe файл в другую директорию, либо запретить копировать зависимые библиотеки в конечную директорию через References-AutoMapper-Properties-Copy Local=false. Включение зависимых сборок в ресурсы самой программы позволяет ей работать автономно. Для запуска требуется один лишь exe файл. Это важно для служебных утилит, сразу готовых к использованию. Фактически такие автономные программы не требуют установки и их удобно передавать по сети или хранить на флешке. Архивирование сборок позволяет уменьшить размер программы и больше таких программ разместить на флешке / быстрее выкачивать из сети. Задача: создать один exe, содержащий в себе интерпретатор питоновский + некоторый набор файлов. Вопрос по большей части интересует каким образом можно зашить файлы с которым придется работать внутрь исполняемой программы? Как сделать исполняемую программу в планировщике невидимой или невсплываемой Как зашить txt файл Дан символьный файл f. Добавить в его конец символы e,n,d (если это необходимо, использовать дополнительный файл g ). [Файлы] Составьте программу, которая создает файл RANDOM2.dat. Vanek2009, А ты, что хочешь то? Знать как работает эта сборка изнутри или просто собрать своё приложение? Вообще если ты собираешься упаковывать программу в какой-то более менее переносимый формат, то уже ни как не подразумевается, что ты к этому коду будешь из вне обращаться. Если у тебя такая ситуация возникла, то скорее всего ты не правильно задал вопрос и не правильно решаешь проблему. Ты, думаешь о том как распространять свою библиотеку? Наверное не правильно выразился, задача стоит в написании архиватора/разархиватора. Это своего рода патчер, который ищет директорию, где установлена игра и заменяем там файлы и закрывает запущенное приложение игры, чтобы заменить полностью. Текущие проблемы: Очень важно дать один .exe, который "сделает как надо все сам", игроку не надо знать, где игра, что заменять, закрывать и т.д. Какие есть предложения? sfx это самораспаковывыщийся архив, которому ненужен установленный winrar и тому подобное. Насколько я понял по гуглежу, то можно создать автораспаковывающийся архив, который будет запускать программу лежащую внутри него. То есть соберёшь в exe свою приложуху, которая будет патчить, рядом с ней ложишь файлы для замены и пакуешь все это в архив. Архив распакуется куда нибудь во врменную папку, запустит твою приложуху, которая уже все пропатчит. Составить программу в Си : дополнительный код Перевод строки в исполняемую функцию Преобразование строки в исполняемую инструкцию. Добавить дополнительный цикл в имеющуюся программу То есть пока придумал такую схему пога соеденяется с серваком через интеренет проверяет наличие какого нить файла если он есть то работает если нет то не работает. Вопрос в том где можно найти бесплатно такой сервак или может есть другой способ ? Простейшая защита программы: где хранить число срабатываний программы? Защита программы от НСД. Защита путем шифрования части программы на флеш-диске или флешке Защита триальной программы через запись в реестре Защита программы которая активируется через определенный термин как тебе такая идея - поднять на бесплатном хостинге простейший сайт, и если программа может получить определенную страницу по интернету - работает, не может - не работает То есть пока придумал такую схему пога соеденяется с серваком через интеренет проверяет наличие какого нить файла если он есть то работает если нет то не работает.
NightmareZ, и какой вариант защиты по твоему нужно использовать что бы никто ничего не взломал? То есть пока придумал такую схему пога соеденяется с серваком через интеренет проверяет наличие какого нить файла если он есть то работает если нет то не работает. Хм. А этой программе действительно для работы требуется соединение с Сетью? Меня бы "прога", которая без всякого видимого повода и потребности лезет в Инет, насторожила бы - троян-с, немедленно "получила бы по рукам" от файервола и была бы снесена в Корзину навечно. Это значит, что достаточно в коде заменить условие перехода на противоложное в том месте, где у тебя проверка на запрос к файлу в интернетах, и заблочить ей выход в сеть, и программа будет работать всегда без твоего ведома. Это займёт две минуты. CheshireCat Это значит, что достаточно в коде заменить условие перехода на противоложное в том месте, где у тебя проверка на запрос к файлу в интернетах, и заблочить ей выход в сеть, и программа будет работать всегда без твоего ведома. Это займёт две минуты. Код проги же у меня закрыт как кто то сможет залезть в мой код и поменять там переменную ? Руками. Открой для себя существование дизассемблеров и отладчиков. Если это легко можешь написать в двух словах какой отладчик и дизасемблер мне нужен и что там мне надо сделать? Если это легко можешь написать в двух словах какой отладчик и дизасемблер мне нужен и что там мне надо сделать? Тебе никакой не нужен. Этими инструментами воспользуются те, кто будет ломать твою программу. И наивно полагать, что на форуме ты вот щас найдёшь хорошее решение для защиты от взлома. NightmareZ, Открываем твою программу, заменяем je на jne (или какие там аналоги в msil?) и пользуемся до посинения. NightmareZ, Суть в том, что есть некоторый пароль, который мы не знаем. В данном случае это "root", но значения это не имеет, ибо на практике пароль не будет константой, а будет как-то вычисляться, и, возможно, весьма нетривиально. Потому трогать пароль не будем. Открываем экзешник в IL DASM, входящем в состав Visual Studio (см. первый скриншот). Сразу бросается в глаза условный переход brtrue.s, его то и будем менять на brfalse.s Делаем дамп, для чего нажимаем в IL DASM комбинацию Ctrl+D (см. третий скриншот). На выходе получим файл с расширением .il Теперь открываем Visual Studio Command Prompt и из него компилируем изменённый исходник. У меня имя файла: "code.il", потому я делаю так: На выходе получаем экзешник. Запускаем его. На запрос программы вводим случайный набор символов или просто нажимаем Enter: программа выводит "Success!", чего и добивались Или то, почему вы не можете издать свою улучшенную версию Counter Strike и уехать жить на Гавайи. О чём речь?Обфуска́ция (от английского obfuscate — делать неочевидным, запутанным, сбивать с толку) в широком смысле - приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. Красивый пример из Википедии кода, прошедшего обфускацию. Далее в программе Зачем это нужно? Как это должно работать? Как это работает? Состояние дел сейчас Зачем это нужно?Как известно, одним из основных методов взлома программного обеспечения является исследование кода, полученного в результате работы дизассемблера на предмет уязвимостей. На основе такого когда нетрудно, например, составить программу генерации ключей активации коммерческого программного обеспечения или, наоборот, внести в исполняемый файл изменение - патч, позволяющий злоумышленникам отключить "нежелательные" модули исходной программы. Всему вышеперечисленному как раз и может противодействовать специальная программа - обфускатор. Так же, алгоритмы обфускации активно используются не только для затруднения анализа кода, но и для уменьшения размера программного кода, что, в свою очередь, активно используется при разработке различных веб-сервисов и баз данных. Как это должно работать?Как понятно из вышесказанного, методы обфускации должны усложнить код, преобразовав его таким образом, чтобы скрыть от третьих лиц логику его работы. В идеале хотелось бы, чтобы программа, прошедшая обфускацию, давала бы не больше информации нежели чёрный ящик, имитирующий поведение исходной программы. Гипотетический алгоритм, реализующий такое преобразование называется "Обфускация чёрного ящика". Декомпиляция зашифрованной таким образом программы дала бы злоумышленникам не больше информации, чем декомпиляция клиента мессенджера, представляющего собой лишь обёртку над апи "настоящего" приложения, что бы полностью решило поставленную в предыдущем блоке проблему. Однако показано [3] , что реализация такого алгоритма для произвольной программы невозможна. Как это работаетБольшинство методов обфускации преобразуют следующие аспектов кода: • Данные: делают элементы кода похожими на то, чем они не являются • Поток кода: выставляют исполняемую логику программы абсурдной или даже недетерминированной • Структура формата: применяют различное форматирование данных, переименование идентификаторов, удаление комментариев кода и т.д. Инструменты обфускации могут работать как с source или байт кодом, так и с бинарным, однако обфускация двоичных файлов сложнее, и должна варьироваться в зависимости от архитектуры системы. При обфускации кода, важно правильно оценить, какие части когда можно эффективно запутать. Следует избегать обфускации кода, критичного относительно производительности. Методы1. Преобразование данныхОдним из наиболее важных элементов обфускации является преобразование данных, используемых программой, в иную форму, оказывающее минимальное виляние на производительность кода, но значительно усложняющее хакерам возможность обратного инжинирнга. По ссылке можно ознакомится с интересными примерами использования двоичной формы записи чисел для усложнения читабельности кода, а так же изменений формы хранения данных и замены значений различными тождественными им выражениями. 2. Обфускация потока управления кодомОбфускация потока управления может быть выполнена путем изменения порядка операторов выполнения программы. Изменение графа управления путем вставки произвольных инструкций перехода и преобразования древовидных условных конструкций в плоские операторы переключения, как показано на следующей диаграмме. 3. Обфускация адресовДанный метод изменяет структура хранения данных, так чтобы усложнить их использование. Например алгоритм, может выбирать случайными адреса данных в памяти, а также относительные расстояния между различными элементами данных. Данный подход примечателен тем, что даже если злоумышленник и сможет "декодировать" данные, используемые приложением на каком-то конкретном устройстве, то на других устройствах он всё равно не сможет воспроизвести свой успех. 4. Регулярное обновление кодаЭтот метод предотвращает атаки, регулярно выпуская обновления обфусцированного программного обеспечения. Своевременные замены частей существующего программного обеспечения новыми обфусцированными экземплярами, могут вынудить злоумышленника отказаться от существующего результата обратного анализа, так как усилия по взлому кода в таком случае могут превысить получаемую от этого ценность. 5. Обфускация инструкций ассемблераПреобразование и изменение ассемблерного когда также может затруднить процесс обратного инжиниринга. Одним из таких методов является использование перекрывающихся инструкций (jump-in-a-middle), в результате чего дизассемблер может произвести неправильный вывод. Ассемблерный код также может быть усилен против проникновения за счёт включения бесполезных управляющих операторов и прочего мусорного кода. 6. Обфускация отладочной информацииОтладочную информацию можно использовать для обратного проектирования программы, поэтому важно блокировать несанкционированный доступ к данным отладки. Инструменты обфускации достигают этого, изменяя номера строк и имена файлов в отладочных данных или полностью удаляя из программы отладочную информацию. ЗаключениеЯ не стал описывать историю развития различных подходов к обфускации, так как на мой взгляд, она неплохо отражена в уже существующей на Хабре статье. Данная статья была написана в 2015 году, и мне не удалось найти в интернете существенного количества статей и иных материалов на тему моего поста, накопившихся за это время. На мой взгляд, в наш век всё большую популярность приобретает разработка всевозможных веб приложений, которые мало нуждаются в обфускации в качестве метода защиты информации. Однако как раз таки сжатие исходного кода программ, при помощи методов обфускации в таких приложениях зачастую оказывается полезным. В заключение, хотел бы добавить, что при использовании методов обфускации не следует пренебрегать и прочими методами защиты вашего кода, ведь обфускация далеко не серебряная пуля в вопросе защиты программ от взлома. Ссылки и источники[3] Barak B., Goldreich O., Impagliazzo R., Rudich S., Sahai A., Vadhan S. and Yang K. «On the (im) possibility of obfuscating programs.» CRYPTO 2001. Перед многими разработчиками программного обеспечения возникает вопрос защиты своего труда. Поиск в сети на эту тему выдает кучу информации, но практических примеров и здравых описаний нет. Поэтому в качестве примера построения защиты расскажу о привязке программы к USB ключу. Для защиты я выбрал USB ключ с HID интерфейсом и с открытым кодом программного модуля защиты. Такой HID-ключ позволяет обойтись без установки драйверов ключа, что очень удобно для конечного пользователя. Также HID интерфейс прекрасно работает в «SafeMode» режимах загрузки операционных систем. Цель защиты— не запускать приложение при отсутствии ключа защиты; Защищаемый объектДля примера создадим самую простую программу: диалоговое окно MFC, воспользовавшись волшебником visual studio. В наше приложение, кроме потока окна, добавим поток, который в основном окне печатает текущее время. Подготовка ключаПрежде чем использовать ключ его необходимо сконфигурировать с помощью утилиты из SDK ключа: ПИН я сменил на: < 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f >. Установка защиты Для внедрения программного модуля защиты в созданный проект нужно подключить 2 файла: «HID_1.cpp» и «HID_1.h». В них находится исходный код класса, который позволяет обращаться к ключу. После успешной компиляции и запуска всё это выглядит так:Теперь все готово для работы с ключомВ коде, где создается само окно приложения, файл «Example_1.cpp», добавляем обращение к ключу: Код потока, следящего за ключом. В итогеПоставленная задача защиты решена. Обращаю Ваше внимание, что это пример, в котором всё упрощено. Строить настоящую защиту на одном флаге, конечно же, не стоит. А хранить ПИН-код доступа как в примере — вообще преступление. А что же происходит на шине USB?Любой USB сниффер покажет какие устройства подключены к шине данных и чем они обмениваются с компьютером. Для меня важным показателем является время ответа ключа на команду. На рисунке «черным» выделена команда к ключу, «синим» — ответ ключа. В среднем время отклика составляет 32 мс (+31… +32 . ). Т.е. за это время ключ обработал команду и вернул ответ. Больших задержек это не вносит. Криптографическая защита протокола обменаHID пакеты на шине USB имеют длину 64 байта. Как сказано в описании ключа первые 32 байта этого пакета технологические, остальные 32 байта – шифрованные алгоритмом RC6, причем для каждой пары пакетов (TX-RX) ключ шифрования выбирается случайно. Этот временный ключ шифруется ключом, созданным на основе ПИН-кода, того самого в 16 байт, о котором написано выше. Читайте также:
|