![]() |
Lazy_importer C++ (header only) библиотека для сокрытия импорта системных (и не только) DLL и вызовов из них. Введение: Для начала необходимо ответить на вопрос: Зачем скрывать импорты DLL и(или) вызовы из них? Простой ответ: чтобы усложнить жизнь ревёрсеру ваших программ. Более раскрытый ответ: чтобы запутать ревёрсера во время "вскрытия" вашей программы, лишив его информации об используемых системных (и не только) библиотеках, о вызывах из них. Данная информация играет одну из ключевых ролей в ревёрсе программы, примеры её использования различны, начиная от банальных хуков функций внутри сторонних длл, заканчивая использованием дыр в этих же библиотеках (например пустые пространства кода внутри сегментов длл, для последующего встраивания туда шелл-кода). Преимущества:
Использование: Вызов любой из функций осуществляется при помощи скрытого метода LI_FN, он динамичен, принимает аргументы и возвращает значения оригинальной функции. Принцип работы заключается в извлечении оригинальной функции из библиотеки, с последующим встраиванием функции в непосредственный код программы, предварительно подвергнув её hash-morping`у. При традиционном использовании, функция импортируется из определенной библиотеки (указанной в PE-заголовках) и не находится напрямую в исполняемом коде. C++: Код:
// Использование скрытым методом, не отображается в разделе импортов PE-заголовков.Лучше всего это демонстрируется при reverse-engineering`е исполняемого кода. При традиционном способе всё отлично проявляется. 1677095224124.png0Z0SK0 · 22 Фев 2023 в 23:19' data-fancybox="lb-post-1261067" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/190991/" style="cursor: pointer;" title="1677095224124.png"> https://forum.antichat.xyz/attachments/28261067/ При использовании LI_FN, импортированная функция никак не отображается, и при исполнении представляет из себя примерно подобный код Код: Код:
for ( i = *(_QWORD **)(*(_QWORD *)(__readgsqword(0x60u) + 24) + 16i64); ; i = (_QWORD *)*i )LI_FNпомимо обычного использования, позволяет различными способами оптимизировать ваш код и имеет для этого определенные суб-параметры. C++: Код:
// cached параметр вычисляет результат выполнения при первом использовании,Но, если функция не найдена ни в одной из импортированных библиотек, что в этом случае? Параметр in в таком случае так-же не поможет, вам необходимо предварительно загрузить требуемые библиотеки при помощи стандартных способов. Если же не загрузить их, ваш исполняемый код вызовет краш и программа завершится. C++: Код:
// Предварительно загружаем требуемую нам библиотеки скрытым способомПри использовании LI_FN важно помнить о дефайнах/макросах функций. Например OutputDebugString является обёрткой для двух различных функций - OutputDebugStringA и OutputDebugStringW в зависимости от используемой многобайтовой или иной кодировки. При вызове дефайна OutputDebugString напрямую, ваш исполняемый код так-же вызовет краш. В таком случае необходимо вызывать функцию напрямую, избегая различные обёртки. C++: Код:
// crash!!!Не стоит забывать и о APISET-библиотеках, такой является Ole32.DLL. В данном случае необходимо вызывать функции из библиотеки combase.dll. C++: Код:
// crash!!!Предирективы: Lazy_Importer позволяет указать различные дефайны для эффективного и правильного использования своих фунций. C++: Код:
// позволяет импортировать библиотеки вне зависимости от регистра в их названии,Библиотека: https://github.com/JustasMasiulis/lazy_importer Автор этой блестящей библиотеки: JustasMasiulis и сообщество GitHub Цитата:
|
опять небезопасный способ!
да ты надоел |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Возвращающие 0 при неправильном выполнении функции, минуя появление undefined behavior. Цитата:
|
Цитата:
Более подробно как находить все вызовы импортов от LazyImport можно прочитать у меня в статье -> https://yougame.biz/threads/247347/ Хорошим аналогом для этой библиотеки может послужить любой коммерческий протектор, тот же VMProtect или Code Virtualizer с лёгкой вм, которые не будут так открыто палить ваш вызов |
| Время: 12:34 |