Загрузка DLL из памяти
От: CEMb  
Дата: 27.01.10 11:48
Оценка:
Привет всем, опять поднимем тему сабжа

Есть ли отлаженные способы загрузки, чтоб и импорт был нормальный и под разными операционками работало?
Поиском посмотрел — есть несколько вариантов, но потом находились баги, и всё как-то затихало, непонятно, было пофиксано или было брошено?


Меня сёдня ещё такая идея посетила: ведь LoadLibraryExW (а именно она зовётся в конце концов, что бы мы ни звали, смотрел сейчас под дебагом) должна же обратиться к файлу, открыть его и зачитать? Хорошо бы в этот момент ей подсунуть свои данные Проблема в том, что ReadFile не перехватить, он в одном модуле с LoadLibraryExW
Re: Загрузка DLL из памяти
От: ononim  
Дата: 27.01.10 12:02
Оценка:
CEM>Есть ли отлаженные способы загрузки, чтоб и импорт был нормальный и под разными операционками работало?
CEM>Поиском посмотрел — есть несколько вариантов, но потом находились баги, и всё как-то затихало, непонятно, было пофиксано или было брошено?

CEM>Меня сёдня ещё такая идея посетила: ведь LoadLibraryExW (а именно она зовётся в конце концов, что бы мы ни звали, смотрел сейчас под дебагом) должна же обратиться к файлу, открыть его и зачитать? Хорошо бы в этот момент ей подсунуть свои данные Проблема в том, что ReadFile не перехватить, он в одном модуле с LoadLibraryExW

LoadLibraryExW (вернее ntdll!LdrLoadDll) вызывает NtCreateSection с флагом SECTION_IMAGE который собственно парсит имадж и раскладывает его по памяти, далее LdrLoadDll настраивает импорты/экспорты etc.
Так что если захукаете NtCreateSection, предыдущий NtOpenFile и до кучи NtQuerySection и NtAreMappedFilesTheSame и может еще NtQueryVirtualMemory, сами распарсите PE заголовок, как это делает ядро, то настройку импортов/экспортов/PEB ldr листов винда и правда сделает за вас.
Как много веселых ребят, и все делают велосипед...
Re[2]: Загрузка DLL из памяти
От: CEMb  
Дата: 27.01.10 14:10
Оценка:
Здравствуйте, ononim, Вы писали:

[…]

так я не понял, нормальный способ загрузки есть или нету?
Re[3]: Загрузка DLL из памяти
От: ononim  
Дата: 27.01.10 14:27
Оценка:
CEM>Здравствуйте, ononim, Вы писали:
CEM>[…]
CEM>так я не понял, нормальный способ загрузки есть или нету?
я лишь написал теорию реализации самого нормального (с вашей т.з.) способа
есть он или нет.. могу лишь сказать что эта теория прекрасно работает в моем проекте, код выкладывать не стану ибо он проприетарный)
Как много веселых ребят, и все делают велосипед...
Re[3]: Загрузка DLL из памяти
От: TarasCo  
Дата: 27.01.10 14:28
Оценка:
CEM>так я не понял, нормальный способ загрузки есть или нету?

нормальных — нет. Для загрузки исполняемого файла обязательно нужен файл на диске. На нем создается секция ( читай: файл отображается на память ). Из этого следует один неприятный момент: если система решит засвопить часть кода ( допустим, он давно не выполнялся ), она не будет использовать своп-файл, а подкачает потом код опять прямо из этого файла ( кстати, это одна из причин, почему нельзя удалять файлы запущеннных приложений ) и всякие патчи и другие глупости утеряются. Вот от этого и надо плясать. По хорошему, надо создавать файл на диске, копировать в него код и запускать с диска. А если по плохому — напиши подробнее, чего хочешь
Да пребудет с тобою сила
Re: Загрузка DLL из памяти
От: Сергей Савостин Украина  
Дата: 27.01.10 14:39
Оценка:
Можно попробовать соорудить что-то типа RAM disk, но это все равно, что на обычный диск писать. Я так понимаю Вам нужно скрыть сам факт появления dll?
Re: Загрузка DLL из памяти
От: gear nuke  
Дата: 27.01.10 15:55
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Поиском посмотрел — есть несколько вариантов, но потом находились баги, и всё как-то затихало, непонятно, было пофиксано или было брошено?


Это не баги, а недоработки с PEB.Ldr. Для некоторых случаев это не нужно, и хватает полурабочих вариантов
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Загрузка DLL из памяти
От: Unhandled_Exception Россия  
Дата: 27.01.10 16:20
Оценка: :)
Здравствуйте, CEMb, Вы писали:

CEM>Есть ли отлаженные способы загрузки, чтоб и импорт был нормальный и под разными операционками работало?


есть, погугли на тему boxedapp sdk.
Re[4]: Загрузка DLL из памяти
От: CEMb  
Дата: 27.01.10 16:52
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>[…] По хорошему, надо создавать файл на диске, копировать в него код и запускать с диска. А если по плохому — напиши подробнее, чего хочешь


Ну, мы так и хотели сначала — грузить файл в темп из ресурсов, и потом его грузить как библиотеку. Но подумалось: а прикольно было бы сразу в память! К тому же я давно уже краем глаза видел тот пост про три функции Mem...
Re[2]: Загрузка DLL из памяти
От: CEMb  
Дата: 27.01.10 16:54
Оценка:
Здравствуйте, Сергей Савостин, Вы писали:

СС>Можно попробовать соорудить что-то типа RAM disk, но это все равно, что на обычный диск писать. Я так понимаю Вам нужно скрыть сам факт появления dll?


Не, нужна dll-ка с ресурсами, которая сама подцепляется в проекте как ресурс. Т.е. для удобства разработки — эту dll-ку можно делать в отдельном проекте отдельными людями по написанной методологии.
А так же мы бы решили ещё ряд проблем, связанных с большими блоками ресурсов, которые надо грузить время от времени поочерёдно.
Re[3]: Загрузка DLL из памяти
От: Unhandled_Exception Россия  
Дата: 27.01.10 19:57
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Не, нужна dll-ка с ресурсами, которая сама подцепляется в проекте как ресурс. Т.е. для удобства разработки — эту dll-ку можно делать в отдельном проекте отдельными людями по написанной методологии.

CEM>А так же мы бы решили ещё ряд проблем, связанных с большими блоками ресурсов, которые надо грузить время от времени поочерёдно.

так в этой dll-ке нету кода, только ресурсы? тогда по идее все легко решается.

в общем, если надо решение для частного случая, то почти всегда можно это (решение) получить
Re[3]: Загрузка DLL из памяти
От: LuciferSaratov Россия  
Дата: 27.01.10 20:10
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Сергей Савостин, Вы писали:


СС>>Можно попробовать соорудить что-то типа RAM disk, но это все равно, что на обычный диск писать. Я так понимаю Вам нужно скрыть сам факт появления dll?


CEM>Не, нужна dll-ка с ресурсами, которая сама подцепляется в проекте как ресурс. Т.е. для удобства разработки — эту dll-ку можно делать в отдельном проекте отдельными людями по написанной методологии.


Есть такая штука — статически линкуемые библиотеки. Не сгодится случайно?
Re[4]: Загрузка DLL из памяти
От: CEMb  
Дата: 28.01.10 03:01
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

CEM>>Не, нужна dll-ка с ресурсами, которая сама подцепляется в проекте как ресурс. Т.е. для удобства разработки — эту dll-ку можно делать в отдельном проекте отдельными людями по написанной методологии.

CEM>>А так же мы бы решили ещё ряд проблем, связанных с большими блоками ресурсов, которые надо грузить время от времени поочерёдно.

U_E>так в этой dll-ке нету кода, только ресурсы? тогда по идее все легко решается.


U_E>в общем, если надо решение для частного случая, то почти всегда можно это (решение) получить


Не мудри, покажи пальцем
Re[4]: dmitriy_k
От: dmitriy_k  
Дата: 28.01.10 04:15
Оценка:
Здравствуйте, TarasCo, Вы писали:


CEM>>так я не понял, нормальный способ загрузки есть или нету?


TC>нормальных — нет. Для загрузки исполняемого файла обязательно нужен файл на диске. На нем создается секция ( читай: файл отображается на память ). Из этого следует один неприятный момент: если система решит засвопить часть кода ( допустим, он давно не выполнялся ), она не будет использовать своп-файл, а подкачает потом код опять прямо из этого файла ( кстати, это одна из причин, почему нельзя удалять файлы запущеннных приложений ) и всякие патчи и другие глупости утеряются. Вот от этого и надо плясать. По хорошему, надо создавать файл на диске, копировать в него код и запускать с диска. А если по плохому — напиши подробнее, чего хочешь
dmitriy_k
Re[4]: загрузка DLL
От: dmitriy_k  
Дата: 28.01.10 04:20
Оценка:
CEM>>так я не понял, нормальный способ загрузки есть или нету?

TC>нормальных — нет. Для загрузки исполняемого файла обязательно нужен файл на диске. На нем

Нету?

Тогда вопрос -
Каким образом работают ThInstall и ему подобные тулзы?

Каким образом в моей собственной тулзе реализована загрузка dll из зашифрованного архива в ресурсах?(я это не сам делал а на основе http://boxedapp.ru/blog/2008/06/25/using_activex_without_real_registration/ — но если так интересен алгоритм-BoxedApp SDK в том числе в исходниках продается)
dmitriy_k
Re[5]: загрузка DLL
От: CreatorCray  
Дата: 28.01.10 08:29
Оценка:
Здравствуйте, dmitriy_k, Вы писали:

CEM>>>так я не понял, нормальный способ загрузки есть или нету?

TC>>нормальных — нет. Для загрузки исполняемого файла обязательно нужен файл на диске. На нем
_>Нету?
_>Тогда вопрос -
_>Каким образом работают ThInstall и ему подобные тулзы?
Этож очевидно!
Они пользуются "ненормальными" способами
Т.е. осуществляют "закат солнца вручную".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[5]: загрузка DLL
От: TarasCo  
Дата: 28.01.10 08:54
Оценка:
Вы рассказываете тут про пакеры/крипторы. Это все очень хорошо, но все равно для работы пакера надо его для начала на диск записать.
Да пребудет с тобою сила
Re[5]: Загрузка DLL из памяти
От: Unhandled_Exception Россия  
Дата: 28.01.10 09:28
Оценка: 4 (1)
Здравствуйте, CEMb, Вы писали:

U_E>>так в этой dll-ке нету кода, только ресурсы? тогда по идее все легко решается.

U_E>>в общем, если надо решение для частного случая, то почти всегда можно это (решение) получить

CEM>Не мудри, покажи пальцем


если в dll-ке только ресурсы, то разверни ее в памяти (тут где-то на рсдн есть код на дельфи, но его легко перевести на с++, если надо, вот этот код будет работать), а там уже LoadResource и пр. будут (должны) нормально работать, в качестве HMODULE давай базовый адрес.
Re[6]: загрузка DLL
От: dmitriy_k  
Дата: 28.01.10 10:18
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Вы рассказываете тут про пакеры/крипторы. Это все очень хорошо, но все равно для работы пакера надо его для начала на диск записать.


ну так код который эту DLL хочет загрузить, на машине пользователя откуда то взялся?
вот вместе с ним пусть приезжает статически слинкованный и не требующией ничего вообще рантайм BoxedApp SDK
(причем каким способом код у пользователя оказался — думаю абсолютно без разницы для данного вопроса)
dmitriy_k
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.