웹, HTML

IHTMLdocumnet2의 이벤트를 후킹하고 싶다면

디버그정 2008. 9. 10. 21:05
IHTMLdocumnet2의 이벤트를 후킹하고 싶다면
조회(547)
Internet Explorer | 2007/07/04 (수) 10:36
추천하기 | 스크랩하기(1)
IHTMLdocumnet2의 이벤트를 후킹하고 싶다면 보여주신 코드는 아마도 IWebBrowser을 어드바이싱한 것 같군요.다큐먼트이벤트를 가져오려면 IHTMLDocument와 어드바이싱해야 합니다.

DWORD dwCookieDOC;    // 이벤트 싱크를 해제할 때( Unadvise 사용. )

1. ATL함수를 사용했을 때.

CComPtr< IDispatch > pDisp;

hr = m_pWebBrowser->get_Document( &pDisp );

CComQIPtr< IHTMLDocument2 > pDoc( pDisp );

AtlAdvise( pDoc, this, __uuidof( HTMLDocumentEvents2 ), &dwCookieDOC );



2. COM 기본라이브러리를 사용했을 때.

DWORD dwCookieDOC;

IHTMLDocument2* pDoc = NULL;

IDispatch* pDisp = NULL;

hr = m_pWebBrowser->get_Document( &pDisp );

if( SUCCEEDED( hr ) && pDisp )

{

    pDisp->QueryInterface( IID_IHTMLDocument2, reinterpret_cast< void** >( &pDoc );

    pDisp->Release();
}



IConnectionPointContainer* pCont = NULL;

hr = pDoc->QueryInterface( IID_IConnectionPointContainer, reinterpret_cast< void** >( &pCont ) );

if( SUCCEEDED( hr ) && pCont )
{

    IConnectionPoint* pCP = NULL;

    hr = pCont->FindConnectionPoint( __uuidof( HTMLDocumentEvents2 ), &pCP );

    if( SUCCEEDED( hr ) && pCP )
    {

        pCP->Advise( this, &dwCookieDOC );

        pCP->Release();
    }

    pCont->Release();
}
이제 switch case문에서
case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK:    // ->다큐먼트에서 onclick했을 때.
case부분에 break point 설정해서 클릭할 때 멈추는지 확인 !

tip.txt
윈도우에서 IE 객체가 생성되고 사라지는 이벤트를 걸고 소스를 보는 예제
from codeguru : enumIE.zip
 
로보폼 만들기시에 고려할 내용들..., 자동로그인파트만..
쉘윈도우의 생성과 소멸을 감지할 수 있다. , 쉘윈도우의 리스트를 얻을 수 있다.
쉘윈도우에서 IWebBrowser2인터페이스를 얻을 수 있다. 고로 이벤트를 걸 수 있다. (Advise)
쉘윈도우에서 쉘윈도우를 담고 있는 프로그램의 윈도우 핸들을 얻을 수 있다. , 윈도우로 프로세스아이디를 구할 수 있다.
프로세스 아이디로 프로세스이름을 판단할 수 있다.
프로세스 아이디와 이름으로 해당 프로그램에 메인 쓰레드핸들을 구할 수 있다. 고로 키보드 후킹을 걸 수 있다. ?
이게 된다면 구지 BHO를 만들 이유가 없다.

프로세스이름으로 이벤트를 걸 지 말지를 결정할 수 있다. explorer.exe는 걸면안되기 때문.. 브라우져만 지원하자

BeforeNavigate2에 넘겨져 오는 PostData로는 아이디와 패스워드를 판단하기 쉽지 않다. 그리고 필드에 입력하는 내용과 PostData는 다를 수 있다. 자바스크립트에서 조작되어 넘어오는 경우에는 무용지물이다. 때문에 BeforeNavigate2에서 페이지에 입력되어 있는 정보를 분석하는 방법이 있을 수 있다. 대부분은 잘 되겠지만 특수한 사이트의경우에는 서비밋하기 전에 필드를 지워버리는 수가 있다.

서브밋하기 전에 필드를 지우지만 않는다면 페이지분석하여 폼정보와 필드정보를 가져올 수 있다.
하지만 서브밋을 하기전에 필드를 지우는 폼이 있다. 그런경우에는 키보드후킹으로 계속해서 정보를 저장하고있어야 한다. 그래서 키보드 후킹기술이 필요하다. 구지 후킹하지 않는다면 다른 방법은 없을까? 페이지내에 다이나믹 HTML이벤트를 거는건 아떨까? 이게 성공한다면 BHO도 필요하지 않고, 탭 브라우져도 지원 할 수 있을텐데..

만약 후킹이 성공한다고 하더라도 키보드가 눌려질때 어느 웹페이지에서 눌려졌는지를 판단할 수 알 수 있을까?