PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » PurePortable - портабелизация программ


PurePortable - портабелизация программ

Сообщений 31 страница 39 из 39

1

Проект PurePortable был создан для разработки средств для портабелизации программ с использованием прокси-dll.

Портирование программ осуществляется в основном через перехват вызовов WinApi - перехват обращений к реестру позволяет сохранять настройки не в реестре, а в файле рядом с программой, перехват вызовов для определения системных папок позволяет переместить AppData в папку программы и т.п.

Прокси dll, это dll перехватывающая вызовы WinApi от программы и либо изменяющая их поведение либо перенаправляющая вызовы в оригинальную dll без изменения.

Dll различаются способом внедрения:

1. Подмена системной dll в папке с программой. Для использования данного метода необходимо, чтобы программа имела в таблице импорта (прямого, не отложенного!) вызовы данной dll, либо такие вызовы имели другие dll, вызовы которых импортирует программа и находящиеся в одной папке с программой.
Типичный пример это version.dll. Сама version.dll не имеет экспортируемых функций интересных с точки зрения портабелизации, но из неё отлично устанавливаются хуки. Простой пример такой портабелизации - InnoSetup (выкладывал на ru-board).
Другой пример это winmm.dll, а пример портабелизации сам PureBasic. Да, Пурик имеет ключ /portable, но этот ключ надо ещё и не забыть указать, а случайно забыв Пурик тут же ассоциирует себя с файлами pb ломая нужные ассоциации. Кроме того, Пурик в своих prefs хранит абсолютные пути, что мало вяжется с "портабельностью". Dll решает эти проблемы корректирую пути к Tools в tools.prefs, к компиляторам в PureBasic.prefs, по возможности к файлам RecentFiles и некоторые другие пути. Dll я выкладывал на ru-board и в телеграмме.
А ещё winmm используется фреймворком QT. Даже если сама программа не имеет ничего полезного из импорта, если она использует QT то обычно легко портируется.
Таки способом нельзя подменить dll из списка KnownDLLs и в некоторых других случаях.

2. Подмена системной dll путём замены имени dll непосредственно в коде программы (речь о замене не в исходном коде, а непосредственно в exe, например, каким-нибудь hex-редактором).
Пример - портабелизация утилит SysInternals. Там подменяется comdlg32.dll. Выкладывал на ru-board.
Метод не обязательно применять только для dll из списка KnownDLLs, подходит для любых dll. Например, через прокси winmm, переименовании dll и соответствующем изменении имён в exe-файлах, в одной папке на флешке уживаются HWiNFO32 и HWiNFO64 (разной разрядности).
Метод не работает на сжатых файлах (потребуется разжатие), накрытых протектором, проверяющих свою целостность и т.п.
Кроме того, здесь мы становимся на скользкий путь возможного нарушения "авторских прав" и прочей копирайтной хреномудрии. Так что может не всем подойти по "религиозным" мотивам.

3. Добавление своей dll в импорт. Правкой таблицы импорта непосредственно в exe-файле или в одной из используемых им dll можно добавить dll в список. Программа такую dll загрузит, хотя ничего в ней на прямую не использует.
Метод так же, как и предыдущий, не работает на сжатых файлах, накрытых протектором, проверяющих свою целостность и т.п.
Здесь мы так же вмешиваемся непосредственно в код и возможны "копирайтные" ограничения.
Свой алгоритм правки пока не реализован, для внедрения используется утилита setdll из Microsoft (sic!) Detours.

4. Использование внешнего запускателя - создаётся "замороженный" процесс, внедряется dll и процесс размораживается. К сожалению, у меня пока нет рабочих примеров данного метода.
Как пример есть утилита withdll из того же Detours.

В dll используются следующие способы перехвата:

1. Сплайсинг на базе библиотеки MinHook.
2. Перехват IAT.
3. Прямая подмена вызовов. Это вроде даже и не метод, но для полноты должен быть упомянут - при подмене, например, advapi32.dll (метод 2 - правка кода) хуки могут быть вообще не нужны, так как программа напрямую вызывает функции из "подменной" dll.

Ссылки:
Смежная тема тема на ru-board
Википедия - перехват

Правовые моменты.
Сам по себе перехват не является чем-то незаконным и даже используется в самой ОС Windows, например, для обеспечения совместимости приложений с ОС, а слайсинг предусмотрен практически "из коробки".
Тем не менее, в некоторых случаях, например при правке кода для внедрения dll может быт что-нибудь нарушено. Обсуждение в таких "тонких" случаях лучше перенести на ru-board.

Отредактировано Smitis (26.08.2023 20:11:02)

0

31

Smitis написал(а):

утилитой setdll

А где найти эту утилиту? В гугле не нашёл.

P.S. Ты молодец. Сделал порташки из тех что у меня были на сим линках. Супер.

Отредактировано RU (29.06.2024 19:19:24)

0

32

RU
Это из микросовтовского detours
вот скомпилированные https://disk.yandex.ru/d/1qW7BIaF9m3xGg

0

33

Smitis
Привет. Портанул одну программу, которая хранит данные в своей папке. При этом в реестр пишется много всякого хлама, который абсолютно бесполезен и ни на что не влияет. Есть ли команда, которая полностью блокирует обращение к реестру. Иногда полезно.

P.S.
И ещё хотелось бы по подробней об AdvApi32-1.dll (AdvApi32-2.dll)

Отредактировано RU (13.07.2024 14:51:01)

0

34

Более-менее определился с названиями.
PurePortableSimple (сокращённо PureSimple) - настройки через ini-файлы (на самом деле можно использовать и расширение prefs )). Dll общие для всех программ.
PurePortableExpert (сокращённо PureExpert) - берётся PureBasic (начиная с версии 5.40, но лучше не более 6.04), берётся шаблон, вносятся изменения и компилируется под конкретную программу или группу программ.
PureSimple сделан точно также, как PureExpert, только различные настройки, которые удалось формализовать не компилируются статически, а берутся из ini-файла.
Поэтому PureExpert более мощный способ, так как можно реализовывать различные отсутствующие в PureSimple возможности.
Некоторые вещи в PureSimple сделаны удобнее, например, подмена серийного номера диска или даты.
Но в целом идёт параллельный обмен фичами - то, что удаётся формализовать попадает в PireSimple и наоборот, хорошие фичи попадают из PureSimple в PureExpert в виде настраиваемых констант и инклюдов.

0

35

RU написал(а):

При этом в реестр пишется много всякого хлама, который абсолютно бесполезен и ни на что не влияет. Есть ли команда, которая полностью блокирует обращение к реестру. Иногда полезно.

В PureSimple специальных возможностей нет. Только перехватывать разделы и ставить в начале виртуальных символ "?" - такие разделы не будут сохранены в pport-файл. Это не будет работать с модулем Registry2. Ещё можно очистить pport-файл и присвоить ему атрибут "только для чтения".
В PureExpert можно просто удалить в DetachProcess вызов WriteCfg. И настроить настроить CheckKey для перехвата всего.
Однако, надо смотреть, что за "хлам" в реестре. Вполне возможно это просто мусорит сама система.

0

36

RU написал(а):

И ещё хотелось бы по подробней об AdvApi32-1.dll (AdvApi32-2.dll)

В PurePortable есть два модуля для работы с реестром - Registry1 и Registry2.
Registry1 - родной для PurePortable способ хранить реестр в pport-файле (с этого всё и начиналось, однако).
Registry2 - для реестра используется куст реестра в отдельном файле, куда перенаправляются обращения к реестру.

advapi32-1 и advapi32-2 скомпилированы, соответственно, с модулями Registry1 и Registry2.
Сами эти dll предназначены для замены advapi32.dll в импорте программы, когда другие способы внедрения не работают.
Advapi32.dll в таблице импорта это 8+1+3=12 символов в кодировке ansi плюс нулевой символ-терминатор строки.
Так как advapi32 автоматически не подхватится, advapi32-1/advapi32-2 надо переименовать, чтобы имя было не более этих самых 12 символов. Лучше всего по той же схеме 8.3. Например, advapi32.drv или тот же pureport.dll подойдёт.
Далее обычным hex-редактором заменяем последовательность advapi32.dll в ansi на новое имя. Обычно такая последовательность всего одна. Для Дельфи обычно минимум две.
Программа не должна быть упакована или накрыта протектором.

П.С.
Потом опишу способы внедрения подробнее.

0

37

С помощью advapi32-1 удалось заставить прогу писать в свою папку. Спасибо, универсально. Так же хотел отметить внедрение dll в net приложения по вашей подсказке, некоторые срабатывают. Повторюсь, по моему до Вас такого не делали, ну может исключение JauntePE.

0

38

Привет,Smitis.В одном из примеров у тебя есть строка
[Registry]
.=?|1
Что сие означает?

0

39

RU написал(а):

Что сие означает?

Устаревший синтаксис. Все разделы, начинающиеся с . обрезать слева до символа 1 (т.к. нумерация с 1, по сути, не обрезать) и добавить в начало символ ? (означающий не сохранять).
Не прижилось и было удалено.

0


Вы здесь » PureBasic - форум » OpenSource » PurePortable - портабелизация программ