Хочу зашифровать DLL (неважно, зачем), так вот — как потом юзать такую DLL, т.е.
— я открываю DLL-файл
— гружу его в память
— расшифровываю и получаю в памяти исходную DLL
— с этим все ок, но(!)
Как теперь мне получить ее handle (от лежащей в памяти, не на диске), чтобы вызывать ее функции?
Т.е. без LoadLibrary?
Здравствуйте, PolA, Вы писали:
PA>- гружу его в память PA>- расшифровываю и получаю в памяти исходную DLL PA>- с этим все ок, но(!)
Рас с этим всё ок, то всё остальное вы должны и так знать.
А вообще, LoadLibrary регистрирует DLL в csrss (что бы DllMain вызывался при создании новых потов и т.п.).
Для поиска функций в таблице экспорта почитайте о PE формате.
D>Рас с этим всё ок, то всё остальное вы должны и так знать.
Хм, не знаю, поэтому и спрашиваю.
Я получаю в итоге в памяти 200кБ-ный массив (т.е. расшифрованную DLL),
как теперь дать системе понять, что это DLL?
Мне достаточно получить ее Handle, а дальше через GetProcAddress я вызову, что нужно,
проблема с хэндлом...
PA>Я получаю в итоге в памяти 200кБ-ный массив (т.е. расшифрованную DLL), PA>как теперь дать системе понять, что это DLL?
Это далеко не DLL. Кто отрезовит импорты? Кто обработает релоки? Кто, в конце концов, развернет секции PE-файла по тем смещениям, по которым они должны располагаться?
Дисковый образ PE-файла не эквивалентен образу развернутого PE-файла в памяти.
Варианта 2-а:
пишите свой загрузчик (есть примеры, можно нагуглить).
Минусы: трудоемко и может не заработать после очередного обновления ОС
берите open-source упаковщик (UPX, например) и заменяйте в нем функцию упаковки на функцию шифрования.
Минусы: DLL останется DLL'кой (заголовок и т.п.), но содержимое будет скрыто
PA>>- гружу его в память PA>>- расшифровываю и получаю в памяти исходную DLL PA>>- с этим все ок, но(!) D>Рас с этим всё ок, то всё остальное вы должны и так знать. D>А вообще, LoadLibrary регистрирует DLL в csrss (что бы DllMain вызывался при создании новых потов и т.п.).
В CSR он ее не регистрирует и к вызову DllMain'а CSR отношение не имеет, максимум — если у длл есть манифест — через CSR он создаст activation context этого манифеста (csr/basesrv содержит в себе менеджер всех этих манифестов).
А для DllMain'а — LoadLibrary добавляет длл в PEB LDR list. Это мона и ручками сделать, если очень надо.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, acDev, Вы писали:
D>Здравствуйте, PolA, Вы писали:
PA>>- гружу его в память PA>>- расшифровываю и получаю в памяти исходную DLL PA>>- с этим все ок, но(!)
D>Рас с этим всё ок, то всё остальное вы должны и так знать. D>А вообще, LoadLibrary регистрирует DLL в csrss (что бы DllMain вызывался при создании новых потов и т.п.). D>Для поиска функций в таблице экспорта почитайте о PE формате.