익스플로어의 입력박스 후킹

-- VC++ 2012. 10. 9. 18:50
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

비슷한 기능을 필자도 구현해야할 일이 있었는데, 시간 관계상 구현하지 않고 지나간 적이 있다. 아래의 글쓴이가 비슷한 기능에 대해 고민해주신 것 같아 정리해 둔다. (원문에서 글을 약간 수정하였으며, 수정으로 정확한 의미가 틀려질 수도 있으니 원문도 확인 바랍니다)


BHO로 익스플로러에 있는 Input Box 후킹하기 위해 익스플로러 로딩완료 시 OnDocumentcompete 함수 호출되는 것까지 완료되었습니다. 이제 IHTMLDocument2 인터페이스를 사용하여 웹 상의 InputBox  Value 후킹하는 것이 남았습니다.

LONG celem;
IHTMLDocument2* pDoc = NULL;
IHTMLElementCollection* pElemColl = NULL;

IDispatch* pDocDisp = this->GetHtmlDocument();
pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);

m_pDoc = pDoc;
pDoc->get_all(&pElemColl);
pElemColl->get_length(&celem);

for(int i = 0; i < celem; i++)
{
    VARIANT varIndex;
    varIndex.vt = VT_UINT;
    varIndex.lVal = i; 
    
    VARIANT var2;
    VariantInit( &var2 ); 
    IDispatch* pDisp; 

    HRESULT hr = pElemColl->item( varIndex, var2, &pDisp );

    if ( hr == S_OK )
    {
        IHTMLElement* pElem;
        hr = pDisp->QueryInterface(IID_IHTMLElement,(void **)&pElem);

        if ( hr == S_OK )
        {
            BSTR bstrId = 0;
            hr = pElem->get_id(&bstrId); 
            CString strId(bstrId); 

            if(strId.Find("B1",0) != -1)
            { 
                IHTMLButtonElement* pButtonElem = NULL;
                hr = pDisp->QueryInterface(IID_IHTMLButtonElement, (void **)&pButtonElem); 
                ConnectButton1(pButtonElem); 
            }        
        }

        pDisp->Release();
    }
}

원래 소스는 ActiveX에서 Html Element Hooking 하기


아래 소스는 IE인터페이스를 이용하여, Loading이  완료된 HTML페이지의 Document문서를 얻어온 뒤, 문서에 있는 HTML태그를 구분하여 bstrId 에 저장합니다. 이제 필요한 태그만 추출해서 DB에 넣는 부분이 남았습니다.

CComQIPtr spHTMLDoc = spDispDoc;

void CHelloWordBHO::RemoveImages(IHTMLDocument2* pDocument)
{
    HRESULT hr;
    long cDoc = 0;
   
    CComPtr spDoc;
    pDocument->get_all(&spDoc);
    spDoc->get_length(&cDoc);

    for(int i=0; i        VARIANT varIndex;
        varIndex.vt = VT_UINT;
        varIndex.lVal = i;
        VARIANT var2;
        VariantInit(&var2);
        IDispatch * pDisp;
        hr = spDoc->item(varIndex, var2, &pDisp);

        if(hr==S_OK)
        {
            CComPtr spElem;
            hr =pDisp->QueryInterface(IID_IHTMLElement, (void**)&spElem);

            if(hr==S_OK)
            {
                BSTR bstrId = 0;
                hr = spElem->get_tagName(&bstrId);
                SysFreeString(bstrId);
            }
        }
    }
}

출처 : http://ezlang.egloos.com/1113655

'-- VC++' 카테고리의 다른 글

동기화객체 비교  (0) 2011.08.26
Thread 동기화 객체 및 IPC의 선택  (0) 2011.08.26
OutputDebugString  (0) 2010.08.06
VC++ 코드 실행 시간 측정 방법 정리  (0) 2009.11.19
APC(Asynchronous procedure call)에 대하여  (0) 2009.10.29
posted by 어린왕자악꿍