ActiveX регистрация, метод обхода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

ActiveX регистрация, метод обхода

Сообщение GM » 17.10.2005 (Пн) 8:41

Всем известно чтобы использовать ActiveX компонент в своем приложении нужно его предварительно зарегистрировать. Часто это делается с помощью команды regsvr32 <имя.ocx>. Так вот чтобы зарегистрироваться, компоненту нужен доступ к ветке реестру HKLM\Software\Classes или хотя бы HKCU\Software\Classes. У меня бывали случаи, когда доступ к этим веткам был открыт только для чтения, в результате чего компоненту не удается записать нужные ключи, а приложению найти сам компонент с помощью реестра.
Все что мне пришло в голову, это создать небольшую библиотеку, которая бы перехватывала некоторые функции по работе с реестром, и в случае обращении к *\Software\Classes, перенаправила бы их в более доступное место, ну скажем в HKCU\Software\MyProgam\Classes. Как идея, будет ли такой метод работать или есть ли другие способы решить эту проблему?
الفيجوال بيسك الرابح

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 17.10.2005 (Пн) 8:43

а, не проще бросить в локальную папку приложения?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 17.10.2005 (Пн) 8:47

А разве регистрировать компонент не нужно?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: ActiveX регистрация, метод обхода

Сообщение tyomitch » 17.10.2005 (Пн) 9:21

GM писал(а):Так вот чтобы зарегистрироваться, компоненту нужен доступ к ветке реестру HKLM\Software\Classes или хотя бы HKCU\Software\Classes. У меня бывали случаи, когда доступ к этим веткам был открыт только для чтения, в результате чего компоненту не удается записать нужные ключи, а приложению найти сам компонент с помощью реестра.
Все что мне пришло в голову, это создать небольшую библиотеку, которая бы перехватывала некоторые функции по работе с реестром, и в случае обращении к *\Software\Classes, перенаправила бы их в более доступное место, ну скажем в HKCU\Software\MyProgam\Classes. Как идея, будет ли такой метод работать или есть ли другие способы решить эту проблему?

Конечно же, не будет. Как COM узнает, что нужно заглядывать в HKCU\Software\MyProgam?

На самом деле, доступ на запись в HKCU\Software\Classes есть всегда, и именно туда нужно писать. Но VB6 этого не знает, и всегда пытается писать в HKLM\Software\Classes. Вот именно в HKCU\Software\Classes его и нужно перенаправлять.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 17.10.2005 (Пн) 9:29

Регистрация осуществляется с помощью вызова команды DLLRegisterServer. А как мне вручную заставить регестрироваться в HKCU?
الفيجوال بيسك الرابح

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.10.2005 (Пн) 9:58

GM писал(а):А разве регистрировать компонент не нужно?


Если в папке приложения то не нужно. Причем программа вначале ищет компонент в папке приложения, а уже потом по реестру...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.10.2005 (Пн) 10:31

Регистрация осуществляется с помощью вызова команды DLLRegisterServer. А как мне вручную заставить регестрироваться в HKCU?

Прочесать реестр на предмет ключей, созданных твоим контролом и переписать их уда надо.
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 10:33

GM писал(а):Регистрация осуществляется с помощью вызова команды DLLRegisterServer. А как мне вручную заставить регестрироваться в HKCU?

Патчить msvbvm? :roll:
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: ActiveX регистрация, метод обхода

Сообщение Andrey Fedorov » 17.10.2005 (Пн) 11:00

tyomitch писал(а):Но VB6 этого не знает, и всегда пытается писать в HKLM\Software\Classes. Вот именно в HKCU\Software\Classes его и нужно перенаправлять.


А VB6 тут при чем? Регистрация осуществляется с помощью DLLRegisterServer или regsvr32. Их и надо трясти...

Как я понимаю, это о проблеме регистрации компонентов для юзера не имеющего прав собственно на регистрацию, т.е на корпоративных компьютерах где обрезаны права юзеров. Тогда он и просто файлы в System скопировать не сможет, не то что их там зарегистрировать.

Тут или располагать компоненты в каталоге программы или запускать их установку/регистрацию с правами админа данной машины (т.е из самой программы автоматом логиниться с админскими правами)... Первый вариант удобней тем что не надо вообще трясти админов.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 11:28

Andrey Fedorov, DLLRegisterServer это функция той библиотеки, которая регистрируется. Она, судя по всему, вызывает какую-то функцию из msvbvm.
Может просто прописать в эту функцию что-то типа call <своя_процедура> а в ней уже ВРУЧНУЮ регить библиотеку. Сработает?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 11:31

Andrey, regsvr32 - это просто вызов DLLRegisterServer и ничего более.
А DLLRegisterServer - это функция в самом компоненте. Компонент скомпилирован VB6.
Дальше продолжать, или логика понятна? ;-)
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 11:37

ANDLL писал(а):Andrey Fedorov, DLLRegisterServer это функция той библиотеки, которая регистрируется. Она, судя по всему, вызывает какую-то функцию из msvbvm.

А именно VBDllRegisterServer, как легко увидеть.

ANDLL писал(а):Может просто прописать в эту функцию что-то типа call <своя_процедура> а в ней уже ВРУЧНУЮ регить библиотеку. Сработает?

Ты сумеешь самостоятельно прописать все нужные ключи? Я - нет.
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.10.2005 (Пн) 11:53

ANDLL писал(а):Andrey Fedorov, DLLRegisterServer это функция той библиотеки, которая регистрируется. Она, судя по всему, вызывает какую-то функцию из msvbvm.


А нафига ей нужна msvbvm? Откуда такой вывод? Компоненты ведь пишутся не только на VB...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 12:01

Тем, которые пишуться на VB, он необходим.
Ты кажеться так и не врубился в суть функции DllRegisterServer.
Какая библиотека по-твоему ее экспортирует?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.10.2005 (Пн) 12:07

Ты сумеешь самостоятельно прописать все нужные ключи? Я - нет.

Вытащить все ключи уже зарегиситрированной библиотеки не проблема. Скорее геморой, в зависимости от количества классов. На каждый класс нужно три ветки.
1. HKCR\[Название библы].[название класса] - оттуда узнаем CLSID
2. HKCR\CLSID\{...} - оттуда узнаем TypeLib
3. HKCR\TypeLib\{...}
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 12:12

Andrey Fedorov писал(а):
ANDLL писал(а):Andrey Fedorov, DLLRegisterServer это функция той библиотеки, которая регистрируется. Она, судя по всему, вызывает какую-то функцию из msvbvm.


А нафига ей нужна msvbvm? Откуда такой вывод? Компоненты ведь пишутся не только на VB...

То ли ты издеваешься, то ли ты до сих пор не въехал, что DLLRegisterServer у каждого компонента своя.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 12:13

HKCR\CLSID\ - отсюда мы узнаем имя и тип сервера.
А typelib нам вообще не нужен.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 14:10

Antonariy писал(а):
Ты сумеешь самостоятельно прописать все нужные ключи? Я - нет.

Вытащить все ключи уже зарегиситрированной библиотеки не проблема. Скорее геморой, в зависимости от количества классов. На каждый класс нужно три ветки.
1. HKCR\[Название библы].[название класса] - оттуда узнаем CLSID
2. HKCR\CLSID\{...} - оттуда узнаем TypeLib
3. HKCR\TypeLib\{...}

Откуда же возьмутся ключи в HKCR, если прав на запись туда нет?
Если бы эти ключи там уже были, то и не нужно бы было их никуда переносить.
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.10.2005 (Пн) 14:51

Если бы эти ключи там уже были, то и не нужно бы было их никуда переносить.

Имелось ввиду взять эти ключи с компа разработчика, у него-то они должны быть.
Лучший способ понять что-то самому — объяснить это другому.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 17.10.2005 (Пн) 15:54

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

Теряется универсальность, для каждого компонента нужна писать, свой регистровщик
Есть идея, что-то похожое уже постил, сделать что-типа regsvr32, но который бы перехватил вызовы к HKLM и перенаправил в HKCU. Такой вариант будет работать?
Кстати, если не ошибаюсь ВБ не мог знать о существовании HKCU\Software\Classes, ибо тогда его еще не было, или в NT 4 был?
الفيجوال بيسك الرابح

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 17:11

Совершенно не реально.
Твой код вообще не запускается при регистрации. Когда ты собераешься ставить хук на API для работы с реестром?
А в Windows NT еще и возникает вопрос КАК?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 17.10.2005 (Пн) 19:43

Совершенно не реально.
Твой код вообще не запускается при регистрации. Когда ты собераешься ставить хук на API для работы с реестром?
А в Windows NT еще и возникает вопрос КАК?

Подгружаем библиотек с помощью LoadLibrary, дальше вызываем DLLRegisterServer.
Хук ставим в своем процесе, можна сделать через таблицу импорта, а можна и через перезапись функции на что-то типа jmp Hook ret.
Все таки не такой сложный процес, должно работать или нет?
الفيجوال بيسك الرابح

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 20:10

Да, должно...
А как ты определишь адрес ячейки в таблице импорта?
А перезаписать саму функцию невозможно. Ясное дело...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 20:35

ANDLL писал(а):А как ты определишь адрес ячейки в таблице импорта?

Спецификация PE на форуме уже выкладывалась...
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 21:08

Ну так...
Перезаписываем ячейку таблицы импорта и дело в шляпе.
Вполне реально.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 18.10.2005 (Вт) 6:49

А перезаписать саму функцию невозможно. Ясное дело...

Почему? Нельзя ли просто перезаписать ячейку памяти на jmp моя ф-ция и ret, после чего в своей функции возобновить эту ячейку и вызвать настоящую функцию, после ее обработки снова перезаписать функцию.
А вообще-то наверно буду делать через таблицу импорта.
الفيجوال بيسك الرابح

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2005 (Вт) 9:00

Потому что API-функции располагаются в защищенной области памяти.
Там нельзя ничего переписать.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.10.2005 (Вт) 11:45

ANDLL писал(а):Потому что API-функции располагаются в защищенной области памяти.
Там нельзя ничего переписать.

Можно снять защиту с помощью VirtualProtect, и всё-таки перезаписать ;-)
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 18.10.2005 (Вт) 13:04

tyomitch писал(а):
ANDLL писал(а):Потому что API-функции располагаются в защищенной области памяти.
Там нельзя ничего переписать.

Можно снять защиту с помощью VirtualProtect, и всё-таки перезаписать ;-)

И я о том же :wink:
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 18.10.2005 (Вт) 13:59

Пока воспользовался вторым способом, узнал с помощью GetProcAddress адрес функции и переписал память на jmp addressof IHook, ret. А в IHook восстановил переписаную память, и вызвал настоящую функцию, правда с другими параметрами, потом снова заменил кусок памяти на jmp и т.д.
Как не удивительно все отлично работает, пробовал на мессаджбоксе. Даже в IDE работает, правда не долго :)
Вот у меня небольшой вопрос, восстановлять права доступа после каждого изменения в памяти, или это не имеет значения?
[/syntax]
الفيجوال بيسك الرابح

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList