Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
5 / 5 / 1
Регистрация: 27.11.2009
Сообщений: 232

Перехват функции IE

29.01.2015, 01:37. Показов 1596. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи!

Возникла необходимость корректировать url перед загрузкой. Страница загружается в окне некоторого приложения, (ну я так понимаю в этом окне - эт тоже самое, что и страница в браузере).

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

Итак... Я пишу dll , в которой мне нужно перехватить метод Navigate2 или может быть событие BeforeNavigate. Хочу изменить url и ввернуть выполнение процессу. Через таблицы импорта мне не надо. Мне нужно как-то вклиниться в начало какой-нибудь ф-ии, перед загрузкой страницы ...

Перечитала кучу всего в инете, и чет я короч запуталась вконец вообще как же мне это сделать

Написала приложение для отладки, в котором запускается в win окне - браузер (прикрепила исходники). И по статье (http://habrahabr.ru/company/infopulse/blog/140456/) пробовала делать перехват, вроде все ясно там написано про code injection, но у меня не получается ...

Вопрос номер один - я вообще то делаю? или все эт для меня не подходит??

Можно ли мне использовать code injection?
может я просто не ту библиотеку тут вот загружаю?? (в примере сейчас стоит перехват CreateFile)
C++
1
HMODULE hKernel32 = GetModuleHandle(L"kernel32.dll");
я просто смотрела, что вроде как вот тут должна быть ф-ия Navigate - Shdocvw.dll

Еще я скачала программку Api Monitor, чтоб посмотреть, чего ж там вызывается...
Ооох, там столько всегоо повыскакивало, фиг разберись, что ж мне нужно
Вроде как вот эти библиотеки используются wininet.dll и urlmon.dll

Помогите разобраться, направьте на путь истинный... Чего ж мне делать-то ?

Еще читала что-то такое: получить дескриптор окна, потом интерфейс и адрес функции...Звучит вроде ничего так, но и с этим я запуталась

Можно мне попунктикам план действий и метод, каким нужно перехватывать

Вот как-то таак, очень очень надеюсь на вашу помощь

TestCodeInjection.rar
Win32Project123.rar
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.01.2015, 01:37
Ответы с готовыми решениями:

перехват функции
всем доброй ночи, подскажите как можно перехватить функцию в чужой библиотеке? вполне возможно что там есть обфускация, но тем неменее....

Перехват функции
Приветствую всех. Есть хорошая статья по перехвату API функции. http://habrahabr.ru/post/90377/ Но есть проблема. Как мне...

Перехват функции strcmp
Добрый день, подскажите, пожалуйста, как перехватить функцию strcmp? В каком модуле она находиться? Как получить адрес этой функции?

7
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.01.2015, 11:41
Стандартный (и документированный) способ решения этой задачи таков:

1. Написать Browser Helper Object (BHO) - расширение для Internet Explorer.
2. Перехватить в нем функцию OnBeforeNavigate(2), в ней самому
вызвать Navigate(2) на нужный URL.

Если вы умеете писать COM-серверы и понимаете устройство IE
(табы, protected mode и т.п.), то задача не сложная.
0
5 / 5 / 1
Регистрация: 27.11.2009
Сообщений: 232
29.01.2015, 13:59  [ТС]
Ком-серверы не писала.

Пробую все-таки как-то добраться до адреса функции...
Делаю вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
int _tmain(int argc, _TCHAR* argv[])
{
IWebBrowser2 *pWebBrowser2 = NULL;
 
HWND hIe;
hIe = FindWindow(_T("IEFrame"), NULL);
 
pWebBrowser2 = _OnGetDocInterface(hIe);
}
 
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
    TCHAR   buf[100];
 
    ::GetClassName( hwnd, (LPTSTR)&buf, 100 );
    if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
    {
        *(HWND*)lParam = hwnd;
        return FALSE;
    }
    else
        return TRUE;
};
 
IWebBrowser2* _OnGetDocInterface(HWND hWnd) 
{
    CoInitialize( NULL );
 
    HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
    if ( hInst != NULL )
    {
        if ( hWnd != NULL )
        {
            HWND hWndChild=NULL;
            ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
            if ( hWndChild )
            {
                CComPtr<IHTMLDocument2> spDoc;
                //CComQIPtr<IWebBrowser2> iwb2;
                LRESULT lRes;
            
                UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
                ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
 
                LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, "ObjectFromLresult" );
 
                if ( pfObjectFromLresult != NULL )
                {
                    HRESULT hr;
                    hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
 
                    if ( SUCCEEDED(hr) )
                    {
                        //BSTR* ff = NULL;
                        //spDoc->get_URL(ff);
 
                        IHTMLDocument2* pIHTMLDocument2 = NULL;
                        //pIHTMLDocument2 = spDoc->IHTMLDocument;
                        //spDoc->
 
                        IHTMLWindow2* pIHTMLWindow2 = NULL;
                        spDoc->get_parentWindow(&pIHTMLWindow2);
 
                        IServiceProvider* pIServiceProvider = NULL;
                        hr = pIHTMLWindow2->QueryInterface(IID_IServiceProvider, (void**)& pIServiceProvider);
 
                        IWebBrowser2* pIWebBrowser2 = NULL;
                        hr = pIServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)& pIWebBrowser2);
 
                        return pIWebBrowser2;
                    }
                }
            } 
        } 
        ::FreeLibrary( hInst );
    } 
    CoUninitialize();
}
при попытке вызвать:
C++
1
spDoc->get_parentWindow(&pIHTMLWindow2);
вылетает с ошибкой
Unhandled exception at 0xFEEEFEEE in GetDescriptorWinIE.exe: 0xC0000005: Access violation executing location 0xFEEEFEEE.

Хотя в spDoc что-то есть, не NULL
В чем может быть проблема? может быть нужно какие -то разрешения установить, чтоб был доступ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.01.2015, 15:10
Для начала возвращайте NULL из OnGetDocInterface в случае ошибки.
0
5 / 5 / 1
Регистрация: 27.11.2009
Сообщений: 232
29.01.2015, 17:26  [ТС]
Ну эт понятно, что нужно NULL возворащать, я пока отлаживаю просто

Исправила в строчке 5 IID_IHTMLDocument -> IID_IHTMLDocument2
вот это
C++
1
hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
на это
C++
1
hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument2, 0, (void**)&spDoc );
не вылетает, и что-то даже получает
буду дальше смотреть
0
5 / 5 / 1
Регистрация: 27.11.2009
Сообщений: 232
03.02.2015, 16:32  [ТС]
Убежденный, я получила интерфейс IWebBrowser2 другого приложения, через него у меня получилось вызвать Navigate2(...) и перейти на др страницу, все ок.
А я могу как-то подписаться на события IWebBrowser2 ?? или как мне от этого интерфейса получить адрес функции??
И еще, что эта за метод такой OnBeforeNavigate(2)? я его в интерфейсе не вижу и в msdn-е тоже нет такого ...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.02.2015, 17:01
Это метод другого интерфейса, который описан здесь:

DWebBrowserEvents2 interface
https://msdn.microsoft.com/en-... 85%29.aspx

Подписаться на соответствующие события можно через механизм,
который называется "connection points":

1. Запросите (через QueryInterface) у IWebBrowser2 интерфейс IConnectionPointContainer.

2. Метод FindConnectionPoint с идентификатором DIID_DWebBrowserEvents2 вернет
вам указатель на IConnectionPoint - это "точка", через которую можно подписаться
на нужные события.

3. Вызываете pConnectionPoint->Advise, передаете туда указатель на свой объект.
Объект этот должен быть наследником IDispatch.

4. Теперь на любые события будет вызываться метод Invoke этого объекта:
первым аргументом придет тип события, напимер для DocumentComplete
это будет DISPID_DOCUMENTCOMPLETE. Аргументы вызова, если нужно,
достаются из массива DispParams (они там в обратном порядке лежат,
если мне не изменяет память).

Вот, как-то так.
Подписываться на события и отписываться от них лучше всего в
соответствующих методах IObjectWithSite (это если у вас BHO).
1
5 / 5 / 1
Регистрация: 27.11.2009
Сообщений: 232
06.02.2015, 17:09  [ТС]
Убежденный,

Спасибо, сделал как вы писали, все получилось, события приходят, круто!

Теперь стала пытаться изменить url адрес в перехваченном событии DISPID_BEFORENAVIGATE2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
case DISPID_BEFORENAVIGATE2:
          /*vTarget = pDispParams->rgvarg[3].pvarVal;
          VariantInit(vUrl); */
          //vHeaders.vt = VT_BSTR;
          //vHeaders.bstrVal = this->m_bstr;
          //vHeaders = pDispParams->rgvarg[1].pvarVal;
          vUrl = pDispParams->rgvarg[5].pvarVal;
          sUrl = CT2A(varToStr(*vUrl));
          if (checkRegExp(sUrl, regex("(.*)"))) 
          {
 
              CComBSTR StrFrame = L"_self"; 
              CComVariant TargetFrame(StrFrame);
              //*pDispParams->rgvarg[3].pvarVal = TargetFrame;
 
              pSite = GetIWebBrowserInterface(pDispParams);  
             // pSite ->Release();
              //pSite->Stop();
 
              //VariantInit(vUrl); 
              //vUrl->vt = VT_BSTR; //vUrl->pbstrVal
              //vUrl->bstrVal = SysAllocString(_TEXT("http://new_url.ru"));
              //*pDispParams->rgvarg[5].pvarVal = *vUrl;
 
              newValueUrl = SysAllocString(_TEXT("http://new_url.ru"));
              pOldValueUrl = vUrl->pbstrVal;
              *pOldValueUrl = newValueUrl;
 
              //остановка загрузки страницы
              //ptr2bool=pDispParams->rgvarg [0].pbVal ; 
              //*ptr2bool=1;
              //
 
              //pSite->Navigate( bstrURL, pDispParams->rgvarg[4].pvarVal, pDispParams->rgvarg[3].pvarVal, pDispParams->rgvarg[2].pvarVal, pDispParams->rgvarg[1].pvarVal);
            //  pSite->Invoke(dispIdMember, riid, lcid, wFlags,  pDispParams,  pVarResult, pExcepInfo, puArgErr);
 
              ////pSite->Navigate2(vUrl, pDispParams->rgvarg[4].pvarVal, pDispParams->rgvarg[3].pvarVal, pDispParams->rgvarg[2].pvarVal, pDispParams->rgvarg[1].pvarVal);
              //pSite->Navigate2(pDispParams->rgvarg[5].pvarVal, pDispParams->rgvarg[4].pvarVal, pDispParams->rgvarg[3].pvarVal, pDispParams->rgvarg[2].pvarVal, pDispParams->rgvarg[1].pvarVal);
              ////__callback->Bef
              ////__callback->BeforeNavigate2()
          }
          
          break;
Остановить загрузку старого url у меня получилось только вот так
C++
1
2
//ptr2bool=pDispParams->rgvarg [0].pbVal ; 
              //*ptr2bool=1;
Если повторно вызываю тут же Navigate2, то окно открывается в новом окне браузера, а не в приложении.
Может быть нужно как-то параметр HEADERS правильно задать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2015, 17:09
Помогаю со студенческими работами здесь

Перехват API функции
Доброго времени суток всем! Уважаемые форумчене помогите решить задачу, я взял функцию MessageBox и перехватил её. Объясните нубу как...

Перехват функции - GetProcAddress
Здравствуйте. Покажите пожалуйста пример, как перехватит в dll &quot;A&quot; , функцию из dll &quot;Б&quot; В интернете только базовые примеры...

Перехват (хук) функции
Всем привет. Есть exe c кодом: #include &lt;iostream&gt; #include &lt;Windows.h&gt; int sum(int a, int b) { return a + b; } int...

Перехват функции GetVolumeInformationA
Есть программа(нелицензированная) которая запрашивает vid диска. DWORD 0VolumeSerialNumber = 0; ...

перехват функции в другой программе
Здравствуйте,я уже много времени пытаюсь сделать программку,даже как сказать программку,тест. Задача такая: У меня есть программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru