PrecompInside

CLS PrecompInside 0.3.1

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

В связи с вышедшей уже достаточное время назад версией precomp 0.43 необходимо было снова придумывать как инжектить свой код в процесс, т.к. все сторонние библиотеки (zlib1.dll и packjpg_dll.dll) автором были слинкованы статически в precomp.exe. В импорте остались только msvcrt.dll и kernel32.dll.
Самый первый и самый простой путь инжекта является патч - правим precomp.exe чтобы он импортировал нашу некую внешнюю dll, а та уже в свою очередь перехватывала все функции вводы-вывода. Но этот метод по мне смотрится как минимум не красиво. Поэтому возникла мысль сэмулировать работу системной библиотеки mscvcrt.dll. Простым киданием своей msvcrt.dll в папку целевого процесса естественно ни к чему не приведет, т.к. эта библиотека неявно находится в списке KnownDLLs, которые грузятся ТОЛЬКО из системной папки. Но есть лазейка, называемая DLL Redirecting, введенная еще с Win2000. Суть заключается в создании папки с именем процесса и добавлением ".local" к концу. В нее складываются все длл, которые необходимо загрузить локально. НА WinXP все работает на ура. Можно даже эмулировать kernel32.dll
Но Win7 показала иные результаты - ни msvcrt.dll, ни kernel32.dll таким образом локально не загружаются. Дальше нашел еще один интересный способ - так называемые сборки библиотек, которые создаются используя файлы манифестов. Этим способом возможно на любой системе для конкретного ехе файла подменить любую библиотеку (кроме корневых системных), положив рядом манифест файл и папку с библиотеками. Все конечно было бы хорошо, если бы при загрузке .exe файла эти корневые системные библиотеки сами не использовали msvcrt.dll
Получается, что кроме функций, необходимых для .exe файла, необходимо эмулировать ВСЕ функции библиотеки msvcrt.dll, что крайне геморно, ибо необходимо учитывать все нюансы ее работы.
Итого имеем: либо некрасивый метод патча precomp.ехе, либо гемор с полной эмуляцией msvcrt.dll. Я выбрал нечто среднее: создаем msvcrt.dll, эмулирующую только часть функции, необходимых для .exe файла и соединяем precomp.exe и msvcrt.dll вместе с помощью утилиты Шелвина - dllmerge. На выходе: один .exe файл с подмененными функциями ввода-вывода.

Инструкция к применению:
  1. В папку "inject" кидаем precomp.exe нужной вам версии;
  2. В той же папке запускаем "inject_msvcrt.bat", ждем завершения. Здесь создаются новый precomp.exe с инжектированной msvcrt.dll и на всякий случай сохраняется оригинальный файл в precomp_orig.exe;
  3. Созданный precomp.exe и будет являться непосредственно анпакером. Кидаем его в папку с cls_precomp.dll, не забывая так же необходимые библиотеки (zlib1.dll и/или packjpg_dll.dll, если они нужны вашей версии прекомпа).
Итак, в папке для распаковки должны быть: unarc.exe (arc.exe, unarc.dll), cls_precomp.dll, созданный в п.3 precomp.exe, ну и zlib1.dll и/или packjpg_dll.dll, если они нужны вашей версии прекомпа.

Примечания:
  • правленый precomp.exe так же можно использовать и для разжатия данных (а можно и оригинальной версией precomp.exe);
  • т.к. msvcrt.dll компилилась на Intel компиляторе (а так же пропатчена для не-Intel процессоров), все эмулируемые функции должны выполняться быстрее, чем в оригинальной msvcrt.dll, соотвественно ожидается небольшой прирост в скорости;
  • проверял на очень ограниченном наборе данных и только на precomp версиях 0.40...0.43
Изменения:
  • Увеличил время ожидания отклика packjpg_dll.dll из основного процесса до 20 сек (в последней версии было 2.5 сек, и этого в некоторых случаях было не достаточно. В более ранних версиях время ответа никак не контролировалось).
  • Like
Реакции: hasandgn3434
Изменения:
  • Задает "текущую папку" для precomp.exe как папку, в которой находится сама cls-precomp.dll (для обычной ситуации с использованием инно и isdone это исправление не играет роли);
    -исправил ошибку при обработке pdf файлов.
  • Добавил контроль над процессом precomp.exe. Раньше если он неожиданно завершался, то распаковка ничего не написав зависала.
Не помню чего с ним делал, так что описания изменений не будет.
Изменения:
  • Переписал код полностью под WinAPI без использования rtl с последующем объединением всех секций dll'ок в одну, что существенно уменьшило размер библиотек. Так же оптимизировал код по эффективности.
  • Добавил менеджер памяти с возможностью указания используемого количества оперативной памяти с дискретностью 8 мб. При достижении указанного лимита остальные данные скидываются в temp файл;
    - исправил баг с нежеланием фильтра распаковывать второй и более архивы с методом типа precomp+lzma.
  • для задания параметров распаковки, рядом с dll можно положить файл cls.ini, в котором задается максимально допустимое количество используемой памяти в мегабайтах (по умолчанию будет использоваться вся доступная память) и расположение temp файла (по умолчанию он будет создаваться рядом с библиотекой).
Пример cls.ini
Код:
[Precomp]
Memory = 128
TempPath = C:\temp\
При отсутствии ini файла или какого либо параметра значения будут браться по умолчанию. При пустом значении TempPath оно будет указывать на папку рядом с dll. Так же в этом ini можно хранить параметры и для других моих CLS фильтров, разделенных соответствующими названиями секций. Поддержка указания этих параметров со стороны isdone будет начиная с версии 0.6e beta.
Изменения:
  • исправил некорректную обработку png
Сверху