BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
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          
77915 Visitors up to today!
Today 12 hit, Yesterday 95 hit
'BHO'에 해당되는 글 4건
[폭주기관차, 2008/01/10 00:40, [Programming]/Visual C++ API/MFC]
BHO 예제를 홈페이지에 쓴지 어언 1년이 다되갑니다~

BHO 간단한 예제 만들기 - 1
BHO 간단한 예제 만들기 - 2

제가 작성한 이 글을 보고 저에게 질문을 주신분이 계셔서
저 스스로도 예제글을 보면서 그대로 따라 해봤는데 몇가지 안되는 점이 발견되어
이 곳에서 추가로 설명드리도록 하겠습니다^^

우선 컴파일을 할때 함수 선언에러가 발생할 경우
StdAfx.h파일에 아래의 헤더 파일을 포함해주시면 되겠습니다.

#include <exdisp.h>
#include <exdispid.h>

사용자 삽입 이미지

에러나면 당황말고 이 두 헤더를 삽입하자


그리고 Build 설정에 따라 익스플로워에 적용이 안되는 경우가 있는데
Build방식Win32Debug 혹은 Win32 Release MinSize 중에 하나로 하셔야 합니다.
Unicode 방식은 사실 제가 테스트를 못해봤습니다^^;;;

사용자 삽입 이미지

Win32 Release MinDependency로 하면 적용이 안된다;;;



안정우님께서 보내주신 문의 메일덕분에 오류를 수정하게 되었네요 감사합니다^^
꼭 좋은 프로그램 만드시길 바랍니다^^

추가로 실행 제대로 되는 예제 파일도 링크 해두겠습니다.
이 파일 링크는 무단으로 링크걸지 말아주세요..
돈 내고 쓰는 계정인데 하루 트래픽 제한이 있답니다..^^;;;
그냥 파일을 받으신 다음에 따로 링크해주세요..^^;;;;

Tester.zip

BHO 예제 파일



Trackback Address :: http://kongmks.cafe24.com/trackback/273
lent | 2008/06/15 08:34 | PERMALINK | EDIT/DEL | REPLY
아... 정말 감사합니다. 다른 책에서 bho보고 따라했는데 안되서 몇일을 고뇌하던중 이걸 발견했네요. release minsize로 하면 되는군요 ㅡㅡ;;;
BlogIcon 폭주기관차 | 2008/06/18 15:29 | PERMALINK | EDIT/DEL
도움이 되셨다니 다행이네요^^

좋은 프로그램 많이 만들어주세요~ ㅋㅋ
pcqud | 2009/03/24 09:43 | PERMALINK | EDIT/DEL | REPLY
여기 예제를 다운받아서 실행해보았습니다...근데...컴퓨터를 꼈다 켜도 동작을 계속하는군요....작업관리자에서 이 프로세서도 안보이고 이넘 어떻게 그만 동작하게 하는지 알려 주세요...ㅜㅜ;;
그리고 여기 기본적인 윈도우의 핸들외에 IE에서 보여지고 있는 페이지의 컴포넌트(즉, 입력란, Text박스나 select박스)의 핸들은 못구하는건가요? 구해 낼수 있다면 약간의 코멘트 부탁드립니다...
계속 들어 와 보겠지만...시간이 괞찬으시면 메일로 날려 주셔도 감사 할것 같습니다.
메일주소는 pcqud@hotmail.com입니다. 수고하십시오...좋은 정보 감사합니다.
BlogIcon 폭주기관차 | 2009/04/02 18:12 | PERMALINK | EDIT/DEL
아 해제 하는 방법은 [시작]-[실행] 에서 이렇게 입력하시면 되구요
regsvr32 /u Test.dll
자세한건 'BHO 간단한 예제 만들기 - 2' 란 글 맨 밑에 나와있어요 ㅋ

음 그리고 보여지고 있는 페이지의 텍스트 박스와 셀렉트 박스의 핸들은 아마 못 가져오구요.
재가 스파이로 핸들 얻어볼려고 했는데 안되더라구요. 대신 m_spWebBrowser2->document 이용해서
HTML 파서 해서 텍스트 박스와 셀렉트 박스를 컨트롤 할 수 있는걸로 알고 있어요^^
저도 이거 BHO실행까지만 확인하고 그 이상 진도를 안나가서리
제가 알고 있는건 여기까지네요..^^;;

답변 메일로도 보내드렸어요^^
Name
Password
Homepage
Secret
[폭주기관차, 2007/02/04 15:53, [Programming]/Visual C++ API/MFC]
그럼 Class View에 아래와 같이 CTestHelp라는 Class가 생길 것이다.
그 곳을 더블 클릭하면 Class Header가 보이는데 private로 아래의 변수를 추가 하자.
이 변수로 Internet Explorer를 컨트롤 하고, 핸들도 얻어 올 수가 있다.

private:
    CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;
    CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> m_spCPC;
    DWORD m_dwCookie;


사용자 삽입 이미지

기본 변수를 추가 하자.


그리고 아래 두 줄의 코드도 각 각 빨간 상자안에 위치 시켜야 한다.
이것도 안 넣으면 실행 되지 않는다.
(캡쳐 했던 이미지를 분실해서 제가 따로 만들었던 SlipCheck란 Project에서 가져왔음)
CSLIPCHECK => CTestHelp랑 같음

public IObjectWithSiteImpl<CTestHelp>,
COM_INTERFACE_ENTRY(IObjectWithSite)

사용자 삽입 이미지

IObjectWithSiteImpl라는 Instance를 추가하자.


자! 이제 거의 다 끝나 간다.

이제는 ATL Object에 Method 추가하는 법을 배워보자
아래 이미지와 같이 CTestHelp라는 클래스 밑에 Interface TestHelp부분이 있다.
우측 버튼을 눌러 Add Method...를 클릭해보자.
사용자 삽입 이미지

Add Method...클릭!


그리고 일반 함수 추가 하듯이 하면 된다.
우선은 제일 기본이 될 SetSite라는 Method를 만들어보자.
아래 이미지와 같이 Method 이름과 Parameter를 넣고  Ok를 누르자.
사용자 삽입 이미지

메소드랑 파라메타를 넣고 Ok!


그럼 SetSite라는 메소드가 생기고 코드 입력하는 곳에 아래 코드를 붙여넣도록 하자.

STDMETHODIMP CTestHelp::SetSite(IUnknown *pUnkSite)
{
    // TODO: Add your implementation code here
    m_spWebBrowser2 = pUnkSite;

    if( m_spWebBrowser2 == NULL )
        return E_INVALIDARG;

    m_spCPC = m_spWebBrowser2;

    if( m_spCPC == NULL )
        return E_POINTER;

    return Connect();
}


그리고 아래의 함수도 추가 시키자.(메소드가 아니라 함수다.)
HRESULT CTestHelp::Connect()
{
    HRESULT hr;
    CComPtr<IConnectionPoint> spCP;
   
    // Receives the connection point for WebBrowser events
    hr = m_spCPC->FindConnectionPoint(
        DIID_DWebBrowserEvents2,
        &spCP);
   if (FAILED(hr))
        return hr;
   
    // Pass the event handlers to the container
    hr = spCP->Advise(
        reinterpret_cast<IDispatch*>(this),
        &m_dwCookie);
   
    return hr;
}

그리고 종료하는 메소드도 추가하자
STDMETHODIMP CTestHelp::OnQuit()
{
    // TODO: Add your implementation code here
    Disconnect();

    return S_OK;
}


아래의 함수도 추가하자.
HRESULT CTestHelp::Disconnect()
{
    HRESULT hr;
    CComPtr<IConnectionPoint> spCP;
   
    // Receives the connection point for WebBrowser events
    hr = m_spCPC->FindConnectionPoint(
        DIID_DWebBrowserEvents2,
        &spCP);
    if (FAILED(hr))
        return hr;
   
    // Stop getting event notifications
    hr = spCP->Unadvise(m_dwCookie);
    return hr;
}

여기까지 하면 이제 Internet Explorer로 부터 메세지를 받을 수 있게 된다.
어디로 받는냐면 Invoke라는 메소드로 받게 된다.
그렇다 이 메소드도 추가해야한다.

Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)

STDMETHODIMP CTestHelp::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
    // TODO: Add your implementation code here

    //////////////////////////////////////////////////////////////////////////
    // 변화가 일어난 Explorer의 고유 핸들 얻기
    HWND h_exwnd;
    m_spWebBrowser2->get_HWND( (long *)&h_exwnd );
    /////////////////////////////////////////////////////////////////////////////

    if (!pDispParams)
        return E_INVALIDARG;

    // Document complete
    switch( dispidMember )
    {
    case DISPID_TITLECHANGE:
        BSTR strUrl;
        char *Msg;
        m_spWebBrowser2->get_LocationURL( &strUrl );

        Msg = new char[256];

        BSTRtoCHAR( &Msg, strUrl);
        MessageBox(h_exwnd, Msg, "Test", MB_OK );

        delete Msg;
        break;
    case DISPID_ONQUIT:
        OnQuit();
        break;
    }

    return S_OK;
}

dispidMember 변수로 Explorer의 이벤트가 넘어 오게 된다.
위의 코드를 보면 DISPID_TITLECHANGE라는 이벤트(제목이 바뀌면...) 현재 URL을 가져와서
메세지 박스를 출력하도록 했다.
이벤트 상수 정의는 exdispid.h파일안에 있으므로 이 파일을 보면 어떤 이벤트들이 있는지 파악할 수가 있다.

BSTRtoCHAR함수는 내가 만든 사용자 함수이다. 이 함수는 다른 게시글에 올리도록 하겠다.

그리고 컴파일을 하게 되면
warning MIDL2039 : interface does not conform to [oleautomation] attribute : [ Parameter 'riid' of Procedure 'Invoke' ( Interface 'ITestHelp' ) ]

와 같은 워링이 뜰 것이다.

그럴 경우 아래와 같이 ITestHelp에서 빨간 상자안의 코드는 전부 주석 처리 시키면 된다.
사용자 삽입 이미지

저 코드가 무슨 용도인지 아직도 모르겠음.



이제 컴파일이 되면 Test.dll파일로 생성이 되게 된다.
시작 - 실행에서 CMD를 쳐서 도스 모드로 들어가거나 아니면 바로 입력창에

regsvr32 Test.dll

을 입력하면 레지스트리에 저장이 되었다고 메세지가 뜰 것이다.
그리고 익스플로워를 켜 보고 주소를 이동하다보면 메세지 박스가 뜰 것이다.

해제 하는 방법은 시작 - 실행에서

regsvr32 /u Test.dll

을 입력하면 된다.


예제 파일을 다운받고 싶으시거나 헤더파일 선언등 추가 설명으로 이동(2008. 1. 10 추가)


Trackback Address :: http://kongmks.cafe24.com/trackback/83
Name
Password
Homepage
Secret
[폭주기관차, 2007/02/04 15:07, [Programming]/Visual C++ API/MFC]
본 강좌는 내가 BHO를 만들기 위해 여러번의 실패를 되풀이 하지 않기 위해 작성한다.

우선 BHO를 만들기 위해서 처음 프로젝트를 만들때 ATL COM AppWizard를 선택하여야 한다.
사용자 삽입 이미지

프로젝트 이름은 Test로...



그 다음은 BHO는 DLL형식으로 배포가 이루어지기 때문에 Dynamic Link Libary DLL를 선택하고
Finish를 눌러 프로젝트를 만든다.
사용자 삽입 이미지

DLL로 제작하자!



그 다음 아래 이미지와 같이 Class View에서 프로젝트에 우측 버튼을 눌러 New ATL Object를
선택하도록 한다.
사용자 삽입 이미지

ATL Object를 만들자!



아래와 같은 모습이 나오게 되는데 Simple Object를 선택하고 Next를 누르자.
사용자 삽입 이미지

여러 종류 중 그냥 제일 처음꺼!



그럼 ATL Object의 Class이름을 정하는 부분이 나온다.
Short Name에 적당한 Class를 이름을 입력해보자. Short Name에 이름을 입력하면
나머지 칸은 자동으로 채워지는 것을 볼 수 있을 것이다.
(여기는 TestHelp라고 입력했다.)
사용자 삽입 이미지

Short Name에 입력하면 나머진 자동으로~



그럼 BHO를 위한 아주 간단한 ATL Object가 생성된 것이다.
여기서 BHO를 작동시키기 위해서는 Register에 기록을 해주어야 한다.
(이부분에서 많이 애 먹었었다.)

아래 그림과 같이 Resource Files에 TestHelp.rgs라는 파일을 열어서
아래의 내용을 빨간색 상자처럼 붙여 넣자.

HKLM
{
  SOFTWARE
  {
    Microsoft
    {   
     Windows
     {
       CurrentVersion
       {
         Explorer
         {
           'Browser Helper Objects'
           {
              ForceRemove {        } = s 'TestHelp Helper'
           }
         }
       }
     }
    }
  }
}

사용자 삽입 이미지

이 부분 몰라서 계속 실행이 안됐었다.ㅜㅜ


BHO 간단한 예제 만들기 2로 가기(2008. 1. 10 추가)

Trackback Address :: http://kongmks.cafe24.com/trackback/82
Name
Password
Homepage
Secret
[폭주기관차, 2007/02/02 14:08, [Programming]/Visual C++ API/MFC]
BHO(Browser Helper Object)는 Internet Explorer의 인스턴스에 연결되어 Explorer의 액션(행동)을 제어하고
발생되는 이벤트들을 알아내는 역할을 한다.

악성코드에 의해 Internet Explorer 시작페이지가 변경되지 않는 경우가 있는데
이 악성코드 역시 BHO를 이용하여 사용자가 시작페이지를 변경하여 이벤트가 발생하면
다시 악성코드의 주소로 바뀌도록 하는 경우다.

BHO가 실행되는 원리는 Explorer가 구동될때 특정 레지스트리에 등록에 CLSID에 값을 읽어서
Load하게끔 되어 있는데...

HKLM
{
    SOFTWARE
    {
        Microsoft
        {   
            Windows
            {
                CurrentVersion
                {
                    Explorer
                    {
                        'Browser Helper Objects'
                        {

바로 이 부분이 BHO들이 위치해있다.

(익스플로워를 가지고 장난치는 악성코드는 여기에서 목록을 지우면 작동되지 않는다.)

물론 여기에 등록만 되어 있다고 해서...
등록된 Dll들이 Load되서 이벤트를 감시하고 제어가 되는건 아니다.

일정 규약에 맞게끔 인터페이스가 지원되야 하고 규정된 메써드를 밖으로 노출시켜야 한다.
그 규정된 인터페이스가 IObjectWithSite이고...
Explorer에서 IObjectWithSite인터페이스에 있는 SetSite메써드를 호출하게끔 되어 있다.


HRESULT Cbhotest::SetSite(IUnknown *pUnkSite)
{
    m_spWebBrowser2 = pUnkSite;

    if (m_spWebBrowser2 == NULL)
        return E_INVALIDARG;

    m_spCPC = m_spWebBrowser2;

    if (m_spCPC == NULL)
        return E_POINTER;

    RetrieveBrowserWindow();

    return Connect();
}
 


Connect()함수는 Explorer에서 SetSite는 자동으로 불려져서 호출된다.

그 다음부터는 Invoke함수에서 Explorer 이벤트를 감지/제어가 가능하다.

참고로 ExDisPID.h 파일을 열어보면
Invoke함수에서 사용할 수 있는 이벤트 ID가 정의되어있다.

출처 : 데브피아(정확주소는 잊어버렸습니다.ㅜㅜ)

Trackback Address :: http://kongmks.cafe24.com/trackback/78
smok | 2007/06/21 23:23 | PERMALINK | EDIT/DEL | REPLY
좋은자료네요.. 감사합니다.
BlogIcon 폭주기관차 | 2007/06/22 08:42 | PERMALINK | EDIT/DEL
방문해주셔서 감사하구요^^

도움되셨으면 합니다~^^
Name
Password
Homepage
Secret
*1