Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > DLL в памяти


Автор: Kirgston 3.3.2009, 14:21
Ребята. А как можно проверить "висит" ли в памяти моя длл или нет? И если нет то загрузить её опять? Заранее очень благодарен!

Автор: Akella 3.3.2009, 14:27
Ты загружай, винда сама проверит. Если она загружена вернёт тебе её дискриптор или загрузит и вернёт дискриптор.

Автор: Kirgston 3.3.2009, 14:53
Нет нет нет )))))) я имел другое. В ДРКБ нашел "убивалку" длл из памяти. А я просто не хочу чтобы против моей длл так пошли =)

Автор: cemick 3.3.2009, 15:15
Цитата(Kirgston @  3.3.2009,  14:53 Найти цитируемый пост)
В ДРКБ нашел "убивалку" длл из памяти. А я просто не хочу чтобы против моей длл так пошли =)

 smile опять что то странное задумывается smile 

Автор: Kirgston 3.3.2009, 15:23
о_О почему странное??? Если в ДРКБ есть "как убить" длл , а я хочу чтобы её не убивали =) Длл же привязывается к ехе. Хочется чтобы когда ехе завершалось, то и длл выгружалась, и никак иначе =)

Автор: SneG0K 3.3.2009, 15:32
Даж не знаю как, но первая мысль (так, чтоб наверняка=)), ты убивай ддл-ку сам) и грузи ее снова)

Автор: Akella 3.3.2009, 15:36
Цитата(Kirgston @  3.3.2009,  14:53 Найти цитируемый пост)
А я просто не хочу чтобы против моей длл так пошли =) 

почему?

Добавлено @ 15:39
Я хозяин компа, я хозяин ОСи, я хочу выгрузить твою библиотеку из памяти, а она будет всяческих сопротивляться.... зачем мне такая программа со всем твоими библиотеками. Можно ещё предположить, что ты пытаешься написать вирус.

Автор: Kirgston 3.3.2009, 15:50
Ребята ))))) так смешно просто я задаю много вопросов по безопастности и все думают что я вирусню делаю ))) . Честно скажу вирус каждый из нас написал ))) всегда при изучении программирования 80% людей думают "А вот надо написать вирус" . Я тоже так думал ))))) сказал - написал. Ну протестить то надо было где то! А под рукой только свой компютер... ну чтож... спасибо )))) после формата харда и угробленой фат таблицы всякое желание писать вредоносные программки отпало ))))))
Так что не бойтесь это не вирь и не троян и т.д.


Akella, да согласен. Ну так нажмите в программе на красный крестик! оО зачем убивать длл? )))


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

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

Автор: Yanis 3.3.2009, 15:57
Цитата(Kirgston @  3.3.2009,  16:23 Найти цитируемый пост)
Хочется чтобы когда ехе завершалось, то и длл выгружалась, и никак иначе =) 

Так и будет. Тот код, который ты видел, выгружает длл из памяти твоего (того процесса, который выполняет) длл. Этот код не позволяет выгружать длл из памяти чужого процесса.
Теоретически, наверное, можно внедрить его в чужой экзешник и выгрузить длл из любого процесса, но от этого не застр###шься. Так же как и программно не застр###шься от выдёргивания кабеля питания системного блока. Если кто-то выгрузил твою длл-ку, то твоя программа не обязана работать корректно и тебе за это переживать не надо. А грубо внедряться в работу системы не этично.

Добавлено через 13 минут и 59 секунд
Цитата(Kirgston @  3.3.2009,  16:50 Найти цитируемый пост)
Как это можно сделать?  

Проверять загружена ли длл. GetModuleHandle.

Автор: Yanis 3.3.2009, 16:13
Слово «застр###шься» считается не очень приличным на этом форуме.

Автор: Kirgston 3.3.2009, 16:24
Да я понимаю. Но на минутку представим что я делаю систему банкомата. Теперь представим... каждый человек подходит и снимает деньги... он не думает о безопасности. Приходит человек который хочет ограбить этот банкомат. И тут он выгружает мою длл из системы. Защита падает... он забирает себе деньги... после этого мы будем думать о этичности? )))) так кто же поступит не этично? Я когда грубо "ворвусь" в систему и не дам никому выгрузить длл из неё (пока не закроется главное приложение), или злоумышленник? Который заберет все деньги? 
Просто я хочу только одного =) чтобы посторонние процессы не влияли на мою длл. Читал что ехе файлу можно дать права системы и тогда закрыть его будет то ли не возможно, то ли просто сложно... вот мне бы что то такое для длл. Т.к. ребята. Нынче юзер всегда прав. И даже в тех местах когда у юзера руки из попы или это просто хацкер, то не прав в первую очередь программист которое это допустил. Ведь я думаю лучше скажем в поле для ввода цифр позволить вводить только цифры, чем написать красным цветом "Тут вводить ТОЛЬКО цифры!". Мы же знаем когда нибудь кто то введет букву... и получит еррор... и скажет "эта программа плохая!" . Всё это называется "краш тест" когда программу просто проверяют на устойчивость. Ведь я думаю лучше щас это исправить, чем сидеть и думать "упадет\не упадет" ... Я просто не люблю "hot fix" я стараюсь сделать программу так чтобы она на 99% была без всяких глюков и оплошностей.

Ребята да даже не грубо внедрятся... а просто как то убивать главный процесс когда кто то лезет к длл. Так сделать можно?  smile  

Автор: cemick 3.3.2009, 17:15
молодо-зелено....

HINSTANCE hinstDll = GetModuleHandle("MyLib");
// подразумевается расширение .dll

if (hinstDll == NULL) { 
    hinstDll = LoadLibrary("MyLib");

Только ты всеравно не сможешь уберечь твои dll... Да и вообще не твоя это забота, что кто то убивает dll(всеравно найдется другой способ обойти защитуу, причем менее затратный), а забота админов настройки защиты системы...

Автор: Akella 3.3.2009, 17:27
Цитата(Kirgston @  3.3.2009,  15:50 Найти цитируемый пост)
Akella, да согласен. Ну так нажмите в программе на красный крестик! оО зачем убивать длл? )))

твоя программа подвисла, вместе с dll....

Автор: SneG0K 3.3.2009, 17:31
ты можеш например, не сопротивляться, а при вызове функции из длл проверять, не убита ли она... если убита, знач сказать пользователю, что кто-то или что-то выгрузило длл. и спросить:" А не загрузить ли ее снова?". Желательно еще с галоской запомнить)

Автор: Poseidon 3.3.2009, 17:43
Цитата(Kirgston @  3.3.2009,  15:23 Найти цитируемый пост)
Длл же привязывается к ехе. Хочется чтобы когда ехе завершалось, то и длл выгружалась, и никак иначе =)
Грузи свою dll динамически. Когда отработала - выгружай. И никто тебе ее не выгрузит, т.к. она и так не в памяти, и ты точно будешь знать что получешь нужные данные из dll когда они понадобятся.

Автор: Kirgston 3.3.2009, 18:22
Цитата(cemick @  3.3.2009,  17:15 Найти цитируемый пост)
молодо-зелено....

HINSTANCE hinstDll = GetModuleHandle("MyLib");
// подразумевается расширение .dll

if (hinstDll == NULL) { 
    hinstDll = LoadLibrary("MyLib");

Только ты всеравно не сможешь уберечь твои dll... Да и вообще не твоя это забота, что кто то убивает dll(всеравно найдется другой способ обойти защитуу, причем менее затратный), а забота админов настройки защиты системы...


Да... я ещё новичок... а точнее чайник =) но стараюсь, учусь и т.д. просто для программирования надо не только желание, но и просто - время.

Спасибо большое!!! Да не спорю. Против лома всегда есть второй лом. Жизнь такая =) . Просто я не могу сказать конкретно для чего это. Но это не для вирусов. А Админом является обыкновенный юзер... а местами (тонкий намек) - хацкер.


Цитата(Akella @  3.3.2009,  17:27 Найти цитируемый пост)
твоя программа подвисла, вместе с dll.... 


Выгрузить ехе с диспетчера задач =) а он сам выгрузит и длл.



Цитата(SneG0K @  3.3.2009,  17:31 Найти цитируемый пост)
ты можеш например, не сопротивляться, а при вызове функции из длл проверять, не убита ли она... если убита, знач сказать пользователю, что кто-то или что-то выгрузило длл. и спросить:" А не загрузить ли ее снова?". Желательно еще с галоской запомнить) 


А у меня просто не стандартная длл ))))) это ещё одно "мини-приложение" 

Цитата(Poseidon @  3.3.2009,  17:43 Найти цитируемый пост)
Грузи свою dll динамически. Когда отработала - выгружай. И никто тебе ее не выгрузит, т.к. она и так не в памяти, и ты точно будешь знать что получешь нужные данные из dll когда они понадобятся.


Динамически... длл.. а это как? Ну в принципе некая динамика там есть... оно не грузится с системой, а загружается вместе с моей программой, хотя моя программа не является для этой длл родительской =) в роли "родителей" выступает ещё одна программа, но к которой у меня доступа нету. При завершении моей программы длл "умирает". Вроде есть динамика... но чую что я опять не про то ))))) 
Если я как всегда не угадал, то дайте пожалуйста статейку про динамику ДЛЛ. Заранее очень благодарен!

Автор: Kirgston 3.3.2009, 19:17
Ребята. Пожалуйста подскажите чайнику )))

Код

var hinstDll:hinstance;
begin
hinstDll = GetModuleHandle('mydll.dll');
// подразумевается расширение .dll

if (hinstDll = nil) then
    hinstDll := LoadLibrary('mydll.dll');
end;


Тут писать имя длл как он назван счас в системе? Или как он скомпилирован? То есть в проекте с правой стороны я вижу имя будущей длл. Но после компиляции я же могу переименовать. Так что писать?  smile 

Автор: SneG0K 3.3.2009, 19:35
Код

if FileExists('mydll.dll') then 


Автор: Riply 3.3.2009, 19:50
Цитата(Kirgston @  3.3.2009,  19:17 Найти цитируемый пост)
Тут писать имя длл как он назван счас в системе? Или как он скомпилирован? То есть в проекте с правой стороны я вижу имя будущей длл. Но после компиляции я же могу переименовать. Так что писать?


Не "вшивать" имя в проект ?

Автор: Kirgston 3.3.2009, 20:29
Цитата(SneG0K @  3.3.2009,  19:35 Найти цитируемый пост)
if FileExists('mydll.dll') then 

Ну это само собой =) проверки и т.д. это я оформлю чуток иначе, как мне лучше ;)
А вы бы не могли подсказать что надо писать под "майдлл.длл" ? Просто скажем при компиляции проекта с правой стороны вы указываете имя файла которое будет "светится" в диспетчере задач. Скажем вы назвали проект project1.exe . После компиляции вы хоть переименуйте файл в "блаблабла.ехе" , но он в диспетчере останется как project1.exe . Всё это я виду к чему... какое название туда писать? Название имени файла? Или то которое я даю во время компиляции? Заранее очень благодарен!


Цитата(Riply @  3.3.2009,  19:50 Найти цитируемый пост)
Не "вшивать" имя в проект ? 

Извините я вас не понял :(

Автор: Riply 3.3.2009, 20:43
Цитата(Kirgston @  3.3.2009,  20:29 Найти цитируемый пост)
Извините я вас не понял :( 


Ну, раз на этапе компиляции имя неизвестно, то брать его откуда-то "из вне",
а не записывать в проект намерво smile 

Автор: Kirgston 3.3.2009, 21:00
Извините вопрос отпал )))))) просто ещё в 2007ом . При компиляции вы давали имя файла и это имя висело в процессах. И никакое другое. А теперь я смотрю что если переименовать файл то и переименовывается процесс =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)