· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Загрузка образа вручную (LoadLibrary)

Посл.отвђт Сообщенiе


Дата: Май 5, 2003 13:08:34

Собственно хоется, чтоб кинули в меня тутором или лучше линком на сорцы. Собственно проблема -Нужно "препарировать" image в памяти для запуска оного. Т.е. допустим из ресурсов засунуть непрепарированный образ в память, и там с ним сделать то, что делает LoadLibrary при загрузке. Нечто подобное делают всякие exe-пакеры. Может кто поделиться инфой по теме?


Дата: Май 5, 2003 16:38:36

Нечто подобное делают только два известных мне ехе-пакера: ASProtect и Armadillo
Сложного ничего нэт - виделяешь памяти размером в ImageSize, копируешь туда заголовок и секции по VirtualAddress из заголовков. настраиваешь релоки, потом импорт и вызываешь точку входа - сбсно все.


Дата: Май 5, 2003 17:45:28

а всякие UPX - разве такого не делает?
я понимаю что собсно и все - просто хотелось бы посмотреть чужой код , поменять что не устраивает и у себя заюзать т.к. самому это писать не особо улыбается. Помнится у меня на асме поиск+патчинье импортов занял порядка двух дней.


Дата: Май 5, 2003 18:57:01

> Нечто подобное делают только два известных мне ехе-пакера: ASProtect и Armadillo

это, я так понял, они работают с системными длл-ками для собственных нужд?
поясню, если они (ASProtect и Armadillo) будут грузить таким макаром мои длл-ки и настраивать для меня таблицу импорта, то где гарантия того, что я в программе не вызову LoadLibrary для этой же длл-ки?
С одной стороны, ничего страшного произойти не должно - система подгузит нужную мне длл, и их будет как бы две, а с другой стороны, тут могут быть проблемы с шарингом ресурсов, т.к. фактически получаем два образа, загруженных в одно адресное пространство...
кто что скажет???


Дата: Май 5, 2003 19:33:40

rst
Погоди, тебе что именно нужно?
1. Загрузить образ?
2. Настроить ТБЛ импорта?
Так кстати посмотри справку по LoadLibrary
Правда это только для NT но там есть флаг в параметрах позволяющий ТОЛЬКО загрузить ДЛЛ и ничего больше.
И потом в Win32 есть функции ImageXX
Может это тебе надо?


Дата: Май 5, 2003 20:45:56

ImageHelp функции я смотрел - там такого нет. там можно только полазить по импортам, но это все ( может плохо смотрел ).
мне нужно :
1)разместить _НЕ_ПРЕПАРИРОВАННУЮ_ дллку или exe-шник в адрессном пространстве процесса.
2) сделать после этого все, что делаеть LoadLibrary после отображения :
- настроить релоки.
- настроить импорты
- подгрузить то, что нужно.
3) LoadLibraryEx - я смотрел - максимум что можно сделать - загрузить dllку без препарации - т.е. без настройки релоков и импортов. а мне нужно как раз наоборот - настройка релоков и импортов без загрузки дллки ( её я сам загружу ) .
4) как пример можно рассматривать нечто вроде такого: запуск двух разных exe-файлов внутри одного процесса как разных потоков.


Дата: Май 5, 2003 22:36:49

это, я так понял, они работают с системными длл-ками для собственных нужд?
поясню, если они (ASProtect и Armadillo) будут грузить таким макаром мои длл-ки и настраивать для меня таблицу импорта, то где гарантия того, что я в программе не вызову LoadLibrary для этой же длл-ки?
С одной стороны, ничего страшного произойти не должно - система подгузит нужную мне длл, и их будет как бы две, а с другой стороны, тут могут быть проблемы с шарингом ресурсов, т.к. фактически получаем два образа, загруженных в одно адресное пространство...
кто что скажет???


я скажу по поводу последствий следующее:
1) ресурсы ( те которые LoadResource и UpdateResource )
2) FreeLibrary + WriteFile
3) Статические объекты.
4) Два вызова DllMain.
дальше можно додумать -)
как это решается:
1) Делается хук LoadLibraryEx и там проверяется.
Armadillo или ASProtect может быть так делают, но AFAIK всякие UPX - где кстати по-моему есть работа с таблицей импорта, не сжимают DLLки.. может быть я не прав.


Дата: Май 5, 2003 22:39:05

если они (ASProtect и Armadillo) будут грузить таким макаром мои длл-ки и настраивать для меня таблицу импорта, то где гарантия того, что я в программе не вызову LoadLibrary для этой же длл-ки?

В догонку: можно вообще-то юзать LoadLibrary без проблем для этой затеи:
алгортим:
1) Загрузил нужные dll-ки через LoadLibrary
2) Пофиксил импорты в exe-шнике .
3) Вопрос: где здесь обход системы? - нет его-) Проблем с LoadLibrary потом не будет.


Дата: Май 6, 2003 15:14:03

а нахрена вообще так извращаться с длл-кой?
такой подход дает всего лишь то, что длл будет загружена не в верхнюю память системой, а куда-то в другое место самой программой.
С точки зрения снятия защитного конверта, я думаю, дополнительных проблем это не составит, или я не прав?
Зачем это делает аспротект?


Дата: Май 6, 2003 15:19:30

1) Загрузил нужные dll-ки через LoadLibrary
2) Пофиксил импорты в exe-шнике .
3) Вопрос: где здесь обход системы? - нет его-) Проблем с LoadLibrary потом не будет.


именно так протекторы и работают. а вот зачем грузить длл в пользовательскую память и какие плюсы это дает непонятно.


Дата: Май 6, 2003 20:41:33

именно так протекторы и работают. а вот зачем грузить длл в пользовательскую память и какие плюсы это дает непонятно.
Повторяюсь ещё раз:
а) см пример выше - по поводу 2-х exe в одном процессе.
б) загрузить DLL не из файловой системы, а из ресурсов к примеру.
в) динамическая компоновка программы:
т.е. нужно то-то - взял вытащил из себя кусок кода, приготовил, заюзал, убрал - и все без мусора в ФС.


Дата: Май 7, 2003 16:36:02

Ну блин, или я не понял первый аопрос, или вы не поняли мой второй ответ :)

1) Те длл что изает твоя прога протекторы грузят с помошью обычной LoadLibrary() и настраивают в соответствии импорт. Кхе, на самом деле протекторы делеют фэйковую таблицу импорта в которую кладуд вызовы всех нужных твое проге и протектору длл (просто импортят по одной функции из каждой либы а потом юзают GetModuleHandle когде будут настраивать импорт хосту) - это надо потому штаа в dll LoadLibrary не всегда работает - в DllMain() мелкомягкие запретили вызывать эту функцию, дабы загрузчику не снесло башню, если ты будешь грузить сам себя, ну кароче кто хотел тот понял =)
2) Грузить вручную длл (из ресурсов) описанным мной способом МОЖНО, и ничего не случится если ты потом загрузишь вторую копию с диска - будет у тебя два одинаковых модуля в процесся и ничего более. Проблем только в том что загруженная ручками длл не зарегистрирована в системе и не может использовать функций никаких функций со своим hInstance - GetProcAddress/LoadResource etc. применительно к ней будут просто ругаться. Это похоже никак не лечится. http://www.uinc.ru/scripts/load.cgi?files/dr.golova/TFakeDll.zip
3) UPX не использует такую технику по причение малости своего загрузчика (распаковщика) - его не сложно написать на position-independed асме. Большие протекторы (ASProtect/Armadillo) используют такую технику по нескольким причинам - 1. Добавляется еще один слой защиты - больше патчить кракеру; 2.Прокты крупные, и писать (а тем более отлаживать) их на асме крайне не удобно, а при таком подходе на асме пишется только маленький первичный загрузцик который распакует и запустит эту dll, а вся остальная логика защиты пишется на чем-нить более удобном (c++/delphi/etc) и кладется в эту dll - дешево и сердито.


Дата: Май 8, 2003 00:14:31

"2) Грузить вручную длл (из ресурсов) описанным мной способом МОЖНО, и ничего не случится если ты потом загрузишь вторую копию с диска - будет у тебя два одинаковых модуля в процесся и ничего более. Проблем только в том что загруженная ручками длл не зарегистрирована в системе и не может использовать функций никаких функций со своим hInstance - GetProcAddress/LoadResource etc"
Так ли это? - ИМХО ( по-моему копался в функциях работы с ресурсами ) - там полностью User-Space и никакого обращения к внутренностям системы нет. Да и всякие hInstance - они обычно просто поинтеры. Правда меня в этом плане смущает то, что когда-то давным давно я пытался "обманывать" систему при работе с ресурсами - т.е. в заголовке PE менял адреса секции ресурсов - нихрена не получилось. Все-таки похоже что при считывании образа в память система че-то с ним да делает и последующие изменения образа уже не приводят к желаемым результатам.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061