0xy писал(а):. Если DLL задекларирована в модуле формы:
a) выгрузит ли ее VB (VBA) при закрытии этой формы?
б) если да, то существует ли событие для формы, возникающее уже после выгрузки DLL?
2. Насколько корректно такое "ручное решение"
Declare sub UserSub Lib "UserDLL"()
'-----------------------------------------
Dim hDLL&
hDLL=LodrLibrary "UserDLL"
Call UserSub
While FreeLibrary(hDLL)
Wend
При обращении к выгруженой DLL, VB тупо падает (что вполне естественно).
Но можно ли быть увереным в отсутствии других проблем?
Хакер писал(а):Вообще, зачем надо удалять библиотеку?
Но правильнее было бы GetModuleHandle -> LoadLibrary1) LoadLibrary
0xy писал(а):Предполагается проделать следующее:
1) сохранить dll в TEMP;
jangle писал(а):0xy писал(а):Предполагается проделать следующее:
1) сохранить dll в TEMP;
Уже на этом этапе твоя программа развалится, когда запустят 2 экземпляра приложения. Второй экземпляр попытается сохранить DLL которую использует первый экземпляр и обломается. Или первый экземпляр вызовет функцию из DLL думая, что она сохранена в TEMP а ее данный момент ее перезаписывает второй экземпляр...
jangle писал(а):Я в таких случаях прошиваю DLL внутрь экзешника и вызываю ее из памяти, без сохранения на диск. Т.е. делаю динамическую библиотку - статической. Но такие трюки тебе еще не по-плечу.
0xy писал(а):Уже на этом этапе твоя программа развалится, когда запустят 2 экземпляра приложения. Второй экземпляр попытается сохранить DLL которую использует первый экземпляр и обломается. Или первый экземпляр вызовет функцию из DLL думая, что она сохранена в TEMP а ее данный момент ее перезаписывает второй экземпляр...Все верно, но не актуально (либа сохраняется не тупо в темп, а в TEMP\RND, да и запускать второй экземпляр не предвидится.)
Касательно реализации--вижу одну сложность--с заполнением импорта dll. Любопытно, как ты решил этот вопрос? Да и все остальное (релокацию dll и прикручивание ее к exe) ты делаешь вручную, или процесс автоматизирован?
! db &HE2,&HF5,&H3F,&HAF,&HAC,&HAF,&HAF,&HAF,&HAB,&HAF,&HAF,&HAF,&H50,&H50
PS
Походу вопрос: можно ли через Declare вызвать функцию из своего собственного экпорта (exe)?
Хакер писал(а):jangle, хватит говорить глупости.
непонятно почему нельзя положить DLL просто рядом с EXE?
00410E76 ^\E2 F5 LOOPD SHORT 00410E6D
00410E78 3F AAS
00410E79 AF SCAS DWORD PTR ES:[EDI]
00410E7A AC LODS BYTE PTR DS:[ESI]
00410E7B AF SCAS DWORD PTR ES:[EDI]
00410E7C AF SCAS DWORD PTR ES:[EDI]
00410E7D AF SCAS DWORD PTR ES:[EDI]
00410E7E AB STOS DWORD PTR ES:[EDI]
00410E7F AF SCAS DWORD PTR ES:[EDI]
00410E80 AF SCAS DWORD PTR ES:[EDI]
00410E81 AF SCAS DWORD PTR ES:[EDI]
00410E82 50 PUSH EAX
00410E83 50 PUSH EAX
0xy писал(а):jangle
Можно, но не удобно.
А что за это бредовый код:
- Код: Выделить всё
00410E76 ^\E2 F5 LOOPD SHORT 00410E6D
00410E78 3F AAS
00410E79 AF SCAS DWORD PTR ES:[EDI]
00410E7A AC LODS BYTE PTR DS:[ESI]
00410E7B AF SCAS DWORD PTR ES:[EDI]
00410E7C AF SCAS DWORD PTR ES:[EDI]
00410E7D AF SCAS DWORD PTR ES:[EDI]
00410E7E AB STOS DWORD PTR ES:[EDI]
00410E7F AF SCAS DWORD PTR ES:[EDI]
00410E80 AF SCAS DWORD PTR ES:[EDI]
00410E81 AF SCAS DWORD PTR ES:[EDI]
00410E82 50 PUSH EAX
00410E83 50 PUSH EAX
MoleBox, к сожалению, глючит по-черному! Полные версии под 98-й вообще не запускаются, а Lite(или как его там...) пакует вроде нормально, но потом пакованый VB-шный EXE-шник либо не видит вшитой dll, либо падает при ее вызове (через Declare)--зависит от номера версии.
Если есть нормальный MoleBox--поделись ;)
Впрочем, возможно мы друг друга не поняли
Я представляю себе это так:
1) делаем релокацию DLL под нужный нам ImageBase (к примеру, 600000), удаляем релоки и получаем "статическую либу";
2) записываем все секции dll в хвост exe (после его секций) и отражаем этот факт в PE-заголовке;
3) директорию экспорта (EXE) настраиваем на экспорт dll (Хакер, подскажи, так можно ли декларить самого себя?);
4) обеспечиваем выполнение кода EP dll перед EP exe;
5) импорт либы, наверное, заполняем вручную (объединять его с импортом exe, ИХМО, намного геморнее);
While lpImageImportDescriptor.OriginalFirstThunk <> 0
....
lpDllName = lpImageImportDescriptor.pName + lpImageDosHeader
szDllName = lpDllName
hDll = GetModuleHandle(szDllName)
'подгружаем DLL прописанную в таблице импорта
If hDll = 0 Then hDll = LoadLibrary(szDllName)
...
lpFuncNameRef = lpImageImportDescriptor.OriginalFirstThunk + lpImageDosHeader
'--------------------------------
'настройка адресов функций
lpFuncAddr = lpImageImportDescriptor.FirstThunk + lpImageDosHeader
....
If (lpFuncNameRef And IMAGE_ORDINAL_FLAG) Then
lpFuncAddr = GetProcAddress(hDll, ByVal lpFuncNameRef And &HFFFF)
Else
lpFuncAddr = GetProcAddress(hDll, lpImageImportByName.ImpName)
.........
lpFuncAddr=lpFuncAddr+1
lpFuncNameRef=lpFuncNameRef+1
Wend
6) имеем серьезный геморой с ресурсами либы (если таковые присутствуют) , а также с tls и прочими "наворотами" (хотя "прочие" встречаются редко) как быть с этим?
jangle писал(а):Неудобно только в одном случае, если собираешься использовать чужую DLL без согласия ее автора.
Однако, прошивка ее внутрь EXE не спасет отца демократии от разоблачения. Рано или поздно кто-нибудь
заглянет внутрь экзешника и обман будет раскрыт
jangle писал(а):0xy писал(а):MoleBox, к сожалению, глючит по-черному! Полные версии под 98-й вообще не запускаются, а Lite(или как его там...) пакует вроде нормально, но потом пакованый VB-шный EXE-шник либо не видит вшитой dll, либо падает при ее вызове (через Declare)--зависит от номера версии.
Если есть нормальный MoleBox--поделись
Про последние версии не скажу, но в первой, вместе в VB экзешником и DLL в коробку надо было класть msvbvm.
jangle писал(а):Зачем тебе Win98? Ты же не пишешь софт для отсталых пользователей, даже M$ прекратила ее поддержку.
jangle писал(а):0xy писал(а):Впрочем, возможно мы друг друга не поняли
Статью по ссылке конечно не читал...
jangle писал(а):примерно так Call EntryPoint (lpImageDosHeader, %DLL_PROCESS_ATTACH, 0)
0xy писал(а):jangle
А вот от готовой процедуры заполнения импорта я бы не отказался (хоть на каком-нибудь бейсике)
Хакер писал(а):Автор, а зачем тебе такой изврат с выносом экспортов dll в экспорты exe?
0xy писал(а):это должно позволить вызывать функции dll как "свои": Declare Function DllFnXXX Lib "proga.exe"
А что это?0xy писал(а):Cплайсинг
Так же, как и везде:0xy писал(а):Походу, кто-нибудь знает, как в Win 9x сделать надежный ЛОКАЛЬНЫЙ хук Api?
Получение контроля над кодом путем его перенаправления на свой обработчик.А что это?
Это совсем не то, о чем говорит Oxy. Он имел ввиду не установку оконных хуков, а локальный сплайсинг в 9х.Так же, как и везде:
SetWindowsHookEx
Twister писал(а):А вообще, в топике с моего последнего визита накопилось неимоверное количество бредятины. Но скажу одно - dll загрузить без сохранения файла на диск можно, при этом абсолютно все будет работать корректно, нужно лишь пораскинуть мозгами чуть в другую сторону, нежели тут пропогандировал Jangle.
Вот именно что нет Зачем изобретать велосипед, когда все уже реализовано системой? Я выше немного неверно выразился - в другую сторону ковырять не надо, надо просто ковырнуть глубже. Скорректировать импорт и релоки дело плёвое, код хоть сейчас могу дать. А вот заставить библиотеку быть библиотекой... Для этого модуль как минимум должен быть зарегистрирован в PEB_LDR_DATA (иначе первый же антивирь/антируткит начнет дико орать на такую dll). Руками я этого не делал, да и не рекомендую. Так же надо не забыть уведомить все другие модули о загрузке новой dll.Новый способ загрузки DLL изобрел?
Twister писал(а):Вот именно что нет Зачем изобретать велосипед, когда все уже реализовано системой? Я выше немного неверно выразился - в другую сторону ковырять не надо, надо просто ковырнуть глубже. Скорректировать импорт и релоки дело плёвое, код хоть сейчас могу дать. А вот заставить библиотеку быть библиотекой... Для этого модуль как минимум должен быть зарегистрирован в PEB_LDR_DATA (иначе первый же антивирь/антируткит начнет дико орать на такую dll). Руками я этого не делал, да и не рекомендую. Так же надо не забыть уведомить все другие модули о загрузке новой dll.Новый способ загрузки DLL изобрел?
Вполне реализуемым решением может быть написание собственной LdrLoadDll(), используя при этом готовые функции из ntdll. Благо в ней используется не так уж много неэкспортируемых/недокументированных функций и переменных. Все что надо, это RtlCreateActivationContext(), RtlActivateActivationContext(), LdrpAttachProcess() и критическая секция Peb->LoaderLock.
Да ладно, я же знаю - ты способный малый. Просто через-чур упрямый иногда.Не для средних умов короче
Twister писал(а):LdrLoadDll() это последняя экспортируемая функция, которая грузит dll. Все остальное - просто обёртки над ней. Самый-самый native-уровень. Загляни в нее идой, вооружись сорцами винды (в wrk её нет), msdn и все станет ясно.
Эм... Пример рабочего кода чего? LdrLoadDll()? Могу, часа через четыре, как до дома доберусь. Впрочем, если нет сорцев винды, можешь поглядеть в ReactOS, они очень похожи (но только похожи !!!). Если же ты про весь метод, то нет, не выложу.Пример рабочего кода сможешь выложить?
Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 63