
библиотека для импорта функций из DLL скрытым, недружественным к реверс-инжинирингу способом
Простая и удобная в использовании header-only библиотека, призванная значительно усложнить жизнь реверс-инженеру.
LI_FN(OutputDebugStringA)("hello world");
LI_FN(VirtualProtect).in(LI_MODULE("kernel32.dll").cached());
Вывод IDA при компиляции первой строки
LI_FN(function_pointer) -> lazy_functionLI_FN_DEF(function_type) -> lazy_functionLI_MODULE(module_name) -> lazy_modulesafe означает, что если функция не может успешно выполнить свою задачу, возвращается 0 вместо проявления неопределённого поведения.cached означает, что результат вычисляется только при первом вызове и впоследствии переиспользуется.forwarded означает, что переадресованные экспорты (export forwarding) будут корректно разрешены.lazy_module| функция | safe | cached | |
|---|---|---|---|
| Пытается найти заданный модуль и возвращает его адрес | |||
get<T = void*>() -> T |
:x: | :x: | |
safe<T = void*>() -> T |
:white_check_mark: | :x: | |
cached<T = void*>() -> T |
:x: | :white_check_mark: | |
safe_cached<T = void*>() -> T |
:white_check_mark: | :white_check_mark: | |
| Пытается найти заданный модуль, используя заданный указатель LDR_DATA_TABLE_ENTRY | |||
in<T = void*, Ldr>(Ldr ldr_entry) -> T |
:white_check_mark: | :x: | |
in_cached<T = void*, Ldr>(Ldr ldr_entry) -> T |
:white_check_mark: | :white_check_mark: | |
lazy_function<F>| функция | safe | cached | forwarded |
|---|---|---|---|
| вызывает разрешённый экспорт с заданными аргументами | |||
operator()(...) -> result_of<F, ...> |
:x: | :x: | :x: |
| пытается разрешить экспорт во всех загруженных модулях и возвращает адрес функции | |||
get<T = F>() -> T |
:x: | :x: | :x: |
safe<T = F>() -> T |
:white_check_mark: | :x: | :x: |
cached<T = F>() -> T |
:x: | :white_check_mark: | :x: |
safe_cached<T = F>() -> T |
:white_check_mark: | :white_check_mark: | :x: |
forwarded<T = F>() -> T |
:x: | :x: | :white_check_mark: |
forwarded_safe<T = F>() -> T |
:white_check_mark: | :x: | :white_check_mark: |
forwarded_cached<T = F>() -> T |
:x: | :white_check_mark: | :white_check_mark: |
forwarded_safe_cached<T = F>() -> T |
:white_check_mark: | :white_check_mark: | :white_check_mark: |
| пытается разрешить экспорт в заданном модуле и возвращает адрес функции | |||
in<T = F, A>(A module_address) -> T |
:x: | :x: | :x: |
in_safe<T = F, A>(A module_address) -> T |
:white_check_mark: | :x: | :x: |
in_cached<T = F, A>(A module_address) -> T |
:x: | :white_check_mark: | :x: |
in_safe_cached<T = F, A>(A module_address) -> T |
:white_check_mark: | :white_check_mark: | :x: |
пытается разрешить экспорт в ntdll и возвращает адрес функции |
|||
nt<T = F>() -> T |
:x: | :x: | :x: |
nt_safe<T = F>() -> T |
:white_check_mark: | :x: | :x: |
nt_cached<T = F>() -> T |
:x: | :white_check_mark: | :x: |
nt_safe_cached<T = F>() -> T |
:white_check_mark: | :white_check_mark: | :x: |
#define | эффекты |
|---|---|
LAZY_IMPORTER_NO_FORCEINLINE | отключает принудительное встраивание (force inlining) |
LAZY_IMPORTER_CASE_INSENSITIVE | включает сравнение без учёта регистра. Может потребоваться для разрешения переадресованных экспортов. |
LAZY_IMPORTER_CACHE_OPERATOR_PARENS | использует cached() вместо get() в operator() у lazy_function |
LAZY_IMPORTER_RESOLVE_FORWARDED_EXPORTS | использует forwarded() в get(). ВНИМАНИЕ: не применяется к nt() и in(). |
LAZY_IMPORTER_HARDENED_MODULE_CHECKS | добавляет дополнительные проверки корректности при перечислении модулей. |
LAZY_IMPORTER_NO_CPP_FORWARD | Убирает зависимость от заголовка C++ <utility>. |