웹캠을이용한노트북도난경보시스템 (S.I.L.C) 팀명 :It's Real 담당교수님 : 이병천교수님 조장 : 최용현 (07) 조원 : 최철원 (07) 신준섭 (07) 김명진 (08) 2013. 5. 정보보호학과 - 1 -
Ⅰ. 서론 목 차 Ⅰ- 1. 개발목적 Ⅰ- 2. 관련연구 1) OpenCV 라이브러리 2) DVR 시스템 3) Winpcap 소켓프로그램 Ⅱ. 본론 Ⅱ-1. 개발환경 Ⅱ-2. 개발일정 Ⅱ-3. 프로그램구성 1-1) Capture 프로그램 1-2) Send 프로그램 1-3) Receive 프로그램 2) 프로그램실행구성 Ⅲ. 결론 Ⅲ-1. 참고문헌 Ⅲ-2. 발표 PPT 자료 - 2 -
Ⅰ. 서론 Ⅰ-1 개발목적 Notebook(Labtop), TabletPC 등의발전으로이전자장비를휴대하는사람들이많습니다. 앞으로도꾸준한발전이계속돼서많은이용자가계속생길것입니다. 하지만이에반에이휴대용전자장비등은도난에있어서는매우취약한점을가지고있습니다. 그래서저희조는이런일의사후처리와예방에도움을줄수있는도난방지프로그램을개발하기로하였습니다. * 관련뉴스 etnews.com 박현선기사뉴스인용 출처사이트 : http://www.etnews.com/news/computing/security/2677970_1477.html - 3 -
Ⅰ-2 관련연구 1) OpenCV 라이브러리 Open Computer Vision 의약자로오픈소스컴퓨터비전 C 라이브러리이다. 원래는인텔에서개발하였으며, Window, Linux 등의여러플랫폼에서사용할수있다. 실시간이미지프로세싱에중점을둔라이브러리이다. 인텔 CPU에서사용하게되면속도의향상을볼수있는 Intel Performance Primitives(IPP) 를지원한다. 응용분야로는인간과컴퓨터상호작용 (HCI), 물체인식, 안면인식, 모바일로보틱스, 제스처인식등여러방면으로사용된다. 2) DVR 시스템아날로그영상감시장비인 CCTV를대체하는디지털방식의영상감시장비. CCTV에비해화질이뛰어난점외에도컴퓨터의하드디스크를저장매체로사용하기때문에녹화테이프를교체할필요가없고인터넷을통한실시간영상전송및원격지감시기능이있어네트워크로통합화하고있는정부및기관, 기업체들에게가장적절한영상감시시스템으로평가받고있다. DVR은전세계적으로연간 3조5000억원규모에달하는 CCTV 시장을향후 5년내에대체할것으로전망되고있으며장기적으로는 Home Security 등에응용돼개인시장으로도확대될가능성이높아성장잠재력이매우높은분야다. 3) winpcap 소켓프로그램 winpcap이란리눅스 / 유닉스에서이미유명한 Libpcap을윈도우개발환경에맞게포팅 ( 반도체디바이스에플라스틱수지를씌워서패키지하는수법의하나 ) 한것이다. win32 플랫폼에서네트워크패킷캡쳐를위한아키텍쳐이다. 커널레벨에서동작하는저수준의동적라이브러리인패킷필터와유저레벨에서동작하는고수준의시스템종속적인라이브러리를포함한다. 라이브러리라는말을대신하여아키텍쳐라부르는이유는패킷캡쳐는네트워크어댑터와 OS사이에서엄격한규칙이적용하는저수준의매커니즘이다. 특별히이러한네트워크작업은단순한라이브러리로충분하지않다. 처음으로캡쳐시스템은네트워크상에서전송되는저수준의데이터를읽기위해서 OS의시스템프로토콜을스택을우회하는방법이필요하다. 이것은 OS의커널레벨에서네트워크인터페이스드라이버에서직접적으로동작하는부분이요구된다. 이러한부분은시스템에종속이며 winpcap은 NPF라는디바이스드라이버를통해구현되었다. winpcap은윈도우버전별로다른드라이버버전을제공한다. 이드라이버는두가지중요한기능을제공하는데패킷캡쳐와패킷인젝션이다. 또한보다발전된필터시스템과모니터링엔진을제공한다. - 4 -
Ⅱ. 본론 Ⅱ-1. 개발환경 운영체제 : Microsoft Windows 7 32bit, 64bit 개발도구 : Microsoft Visual studio 2010 프로그래밍언어 : C/C++, MFC 라이브러리 : cv ( 기본컴퓨터비전, 영상처리주요알고리즘관련라이브러리 ) highgui ( 영상읽기, 윈도우관련, 카메라 / 동영상제어 ) cvcore ( 영상행렬을포함한다양한데이터구조지원라이브러리 ) Ⅱ-2. 개발일정월별내용조원역할분담및월별계획편성자료수집및각자취약한점연구중간점검및오류수정수정완료및마무리작업 9 월 10 월 11 월 12 월 1 월 2 월 3 월 4 월 5 월 최종보고서작성 Ⅱ-3. 시스템구상도 - 5 -
Ⅱ-3. 프로그램구성도 1-1) Capture 프로그램 #include "stdafx.h" #include "MFCtest.h" #include "MFCtestDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif class CAboutDlg : public CDialogEx public: CAboutDlg(); enum IDD = IDD_ABOUTBOX ; protected: virtual void DoDataExchange(CDataExchange* pdx); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() ; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) void CAboutDlg::DoDataExchange(CDataExchange* pdx) CDialogEx::DoDataExchange(pDX); BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() - 6 -
CMFCtestDlg::CMFCtestDlg(CWnd* pparent /*=NULL*/) : CDialogEx(CMFCtestDlg::IDD, pparent) m_hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pimage = NULL; void CMFCtestDlg::DoDataExchange(CDataExchange* pdx) CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_OPENCV_PIG, m_pic); BEGIN_MESSAGE_MAP(CMFCtestDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_WM_DESTROY() ON_WM_WINDOWPOSCHANGING() END_MESSAGE_MAP() // CMFCtestDlg message handlers BOOL CMFCtestDlg::OnInitDialog() CDialogEx::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* psysmenu = GetSystemMenu(FALSE); if (psysmenu!= NULL) BOOL bnamevalid; CString straboutmenu; bnamevalid = straboutmenu.loadstring(ids_aboutbox); ASSERT(bNameValid); - 7 -
if (!straboutmenu.isempty()) psysmenu->appendmenu(mf_separator); psysmenu->appendmenu(mf_string, IDM_ABOUTBOX, straboutmenu); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // Set big icon // Set small icon // TODO: Add extra initialization here capture = cvcreatecameracapture(1); //1 번캠으로부터캡쳐를실행 m_timer = FALSE; i = 0; CMFCtestDlg::start(); // 스타트정의를실행 AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);// 다이얼로그를백그라운드로실행 return true; // return TRUE unless you set the focus to a control void CMFCtestDlg::OnSysCommand(UINT nid, LPARAM lparam) if ((nid & 0xFFF0) == IDM_ABOUTBOX) CAboutDlg dlgabout; dlgabout.domodal(); else CDialogEx::OnSysCommand(nID, lparam); // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CMFCtestDlg::OnPaint() - 8 -
if (IsIconic()) CPaintDC dc(this); // device context for painting S e n d M e s s a g e ( W M _ I C O N E R A S E B K G N D, reinterpret_cast<wparam>(dc.getsafehdc()), 0); // Center icon in client rectangle int cxicon = GetSystemMetrics(SM_CXICON); int cyicon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.width() - cxicon + 1) / 2; int y = (rect.height() - cyicon + 1) / 2; else // Draw the icon dc.drawicon(x, y, m_hicon); CDialogEx::OnPaint(); HCURSOR CMFCtestDlg::OnQueryDragIcon() return static_cast<hcursor>(m_hicon); void CMFCtestDlg::start() IplImage* image = 0; // 매프레임당영상처리를한다. CvCapture* capture = cvcapturefromcam(1); //1번캠을불러온다. cvnamedwindow( "Camera", 1 ); // 그려줄윈도우이름을정의한다. cvresizewindow( "Camera", 320, 240 ); // 그려줄윈도우사이즈를정의한다. CTime time; // 파일저장위한시간변수 - 9 -
CString filename; // 파일명 를재정의한다. CvFont* font = new CvFont; // OpenCV 영상에그려줄폰트를초기화한다. cvinitfont( font,cv_font_hershey_simplex, 1, 1, 0, 2, 8); // 영상에그릴폰트 ); WSADATA wsadata; CString str; // 이변수에 IP주소가저장된다. HOSTENT *p_host_info; // 로컴컴퓨터의호스트네임을불러온다. IN_ADDR in; char host_name[128]=0, ; if(!wsastartup( DESIRED_WINSOCK_VERSION, &wsadata ) ) if( wsadata.wversion >= MINIMUM_WINSOCK_VERSION ) gethostname(host_name, 128); p_host_info = gethostbyname( host_name ); if( p_host_info!= NULL ) for( int i = 0; p_host_info->h_addr_list[i]; i++ ) memcpy( &in, p_host_info->h_addr_list[i], 4 str = inet_ntoa( in ); WSACleanup(); 정 for(int i=0 ;i<10 ;i++ ) // 이미지를저장할때파일번호를 0 번부터 10 번설 time = CTime::GetCurrentTime(); // 현재시간가져오는함수 다. cvgrabframe( capture ); image = cvretrieveframe( capture ); // 동영상파일을 image 에저장한 - 10 -
한다. cvshowimage( "Camera", image ); // 이미지를 Camera 윈도우에출력 // 영상에폰트를삽입한다. cvputtext( image, str, cvpoint(50, 50), font, cvscalar(0, 0, 255)); // 문자열변수를시간으로만듬 filename.format("%d_%d_%d_%d_%d",time.getmonth(),time.getday(),time.gethour(),time.ge tminute(),time.getsecond()); sprintf(savefile, "%s.jpg", filename); cvsaveimage(savefile, image); // image를파일로저장한다. waitkey(1000); // 1000ms의딜레이를발생시킨다. 즉, 1초에 1장의이미지를저장하게된다. cvreleasecapture( &capture ); cvdestroywindow( "Camera" ); //Camera윈도우를종료한다. void CMFCtestDlg::OnTimer(UINT_PTR nidevent) // TODO: Add your message handler code here and/or call default if(nidevent == 1000) m_pimage = cvqueryframe(capture); CDC* pdc; CRect rect; pdc = m_pic.getdc(); m_pic.getclientrect(&rect); m_cimage.copyof(m_pimage); m_cimage.drawtohdc(pdc->m_hdc, rect); ReleaseDC(pDC); CDialogEx::OnTimer(nIDEvent); - 11 -
void CMFCtestDlg::OnDestroy() CDialogEx::OnDestroy(); // TODO: Add your message handler code here KillTimer(1000); void CMFCtestDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) CDialogEx::OnWindowPosChanging(lpwndpos); // TODO: 여기에메시지처리기코드를추가합니다. //#if!defined(_debug) // 다이얼로그박스를보이지않게설정한다. lpwndpos->flags &= ~SWP_SHOWWINDOW; //#endif // Not _DEBUG - 12 -
1-2) Send 프로그램 #include<stdio.h> #include<stdlib.h> #definehave_remote #include"pcap.h" #include"remote-ext.h" #defineimagesize256// 이미지파일레코드사이즈 #definepktsize272// 송수신패킷사이즈 u_charpkt_data[pktsize+1], buff[imagesize]; u_charmac[]=0xe8, 0x03, 0x9A, 0xB9, 0xD8, 0xB5,// 서버측MAC 주소 0x00, 0x90, 0xF5, 0xD8, 0x5F, 0x98,// 클라이언트MAC 주소 'Z', 'Q', 'Z', 'Q' ;// 패킷확인문자열 void main() pcap_if_t*alldevs;// pcap 장치정보변수구조체 pcap_if_t*d;// pcap 장치인터페이스구조체 pcap_t*adhandle;// 장치설정값구조체 u_charc; charerrbuf[pcap_errbuf_size]; inti, inum, no_interface=0, rec=0, size; charread_fname[100]; FILE*fpr; //size_tsize; if(pcap_findalldevs_ex(pcap_src_if_string, NULL, &alldevs, errbuf) == -1) // pcap_open() 으로열수있는장치list 생성함수 // 검사할장치위치, null, 장치정보변수, 에러메세지저장변수 fprintf(stderr,"error in pcap_findalldevs: %s\n", errbuf); goto error; printf("\n>> 네트워크인터페이스카드 \n"); for(d=alldevs; d; d=d->next)// 생성된장치list 출력 printf("\n %d) %s",++no_interface, d->name); - 13 -
if(d->description) printf("\n (%s)\n",d->description); else printf("(no description available)\n"); if(no_interface==0) printf("\n>> 인터페이스가확인되지않습니다! WinPcap 설치여부를점검하세요!\n"); goto error; printf("\7\7\n.. 해당인터페이스번호를선택하세요 (1-%d)? ",no_interface); scanf("%d",&inum); if(inum < 1 inum > no_interface) printf("\n>> 인터페이스번호를잘못입력하였습니다.\n"); pcap_freealldevs(alldevs); // 동적할당한공간을해제 goto error; // 네트워크어댑터open for(d=alldevs, i=0; i<inum-1; d=d->next, i++); if( (adhandle = pcap_open(d->name, 100, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf)) == NULL)// 장치이름, 캡쳐가능한크기, 모드, timeout, 원격장치권한, 에러버퍼크기 fprintf(stderr,"\n>> adapter open 오류! %s가winpcap에서지원되지않습니다!\n",d->name); pcap_freealldevs(alldevs); goto error; printf("\nlistening on %s\n",d->description); pcap_freealldevs(alldevs); // 동적할당한공간을해제 // 서버 MAC 주소세팅 for (i=0; i<16; i++) pkt_data[i]=mac[i]; printf("\n>> 서버측 MAC 주소 : "); for (i=0; i<6; i++) printf(" %2x", pkt_data[i]); printf("\n>> 클라이언트 MAC 주소 : "); for (i=6; i<12; i++) printf(" %2x", pkt_data[i]); - 14 -
printf("\n"); again: printf("\7\7\n.. 서버와클라이언트MAC 주소가일치합니까 ( 예 = 1, 아니오 = 2 )? "); scanf("%d", &i); if (i<1 i>2) goto again; if (i==2) printf("\n>> MAC 주소를수정하세요.\n"); goto error; // 읽을파일지정 printf("\7\7\n\n.. 서버로전송할파일명을입력하시오 : ");// 파일경로및파일명입력 scanf("%s", read_fname); if((fpr=fopen(read_fname, "rb"))==null) printf("\n.. 파일을열수없습니다.\n"); goto error; printf("\7\7\n\n>> 파일 (%s) 을읽어서버로전송합니다.\n", read_fname); // 패킷구성및송신 while(1) size=fread(buff, sizeof(char), IMAGESIZE, fpr);// 이미지파일읽기 for (i=0; i<size; i++) pkt_data[i+16]=buff[i];// MAC 주소뒤에이미지수록 ++rec; pkt_data[size+16]=0;// 패킷번호, 종료문자삽입 // 패킷전송 if (pcap_sendpacket(adhandle, pkt_data, size+16)!= 0) fprintf(stderr,"\nerror sending the packet: %s\n", pcap_geterr(adhandle)); goto error; if (size!=imagesize) printf("\n>> 마지막패킷번호 : %4d, 패킷크기 : %3d바이트\n", ++rec, size+16); for(i=0;i<size+16; i++) c = pkt_data[i]; if((' ' > c) ('~' < c)) c = '.' printf("%c",c); printf("\n\n>> 파일전송이완료되었습니다.\n"); fclose(fpr); - 15 -
goto end; end: printf("\7\7\7\7\7\n\n>> 작업이정상적으로종료되었습니다.\n\n"); exit(0); error:// 패킷전송오류발생 printf("\7\7\n\n>> 작업이비정상적으로종료되었습니다 \n\n"); exit(-1); - 16 -
1-3) Receive 파일 #include<stdio.h> #include<stdlib.h> #definehave_remote #include"pcap.h" #include"remote-ext.h" #defineimagesize256// 이미지파일레코드사이즈 #definepktsize272// 송수신패킷사이즈 charwrite_fname[100]; charfname[100], buff[imagesize]; FILE*fpw; u_charmac[16]=0xe8, 0x03, 0x9A, 0xB9, 0xD8, 0xB5,// 서버측MAC 주소 0x00, 0x90, 0xF5, 0xD8, 0x5F, 0x98,// 클라이언트MAC 주소 'Z', 'Q', 'Z', 'Q';// 패킷확인문자열 u_charc; intrec=0; // 패킷처리기 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) structtm *ltime; chartimestr[16]; time_ttemp = header->ts.tv_sec; inti, pkt_length; pkt_length=header->len;// 캡쳐한패킷길이 ltime=localtime(&temp);// 패킷을캡쳐한시간 strftime(timestr, sizeof(timestr),"%h:%m:%s",ltime); for (i=0; i<16; i++)// MAC 주소및패킷확인문자열확인 if (pkt_data[i]!=mac[i]) goto skip; ++rec; for (i=0; i<pkt_length; i++) buff[i]=pkt_data[i+16]; buff[pkt_length-16]=0;// 버퍼종료문자삽입 - 17 -
fwrite(buff, sizeof(char), pkt_length-16, fpw); if (pkt_length!= PKTSIZE) printf("\n>> 마지막패킷번호 : %4d, 패킷크기 : %3d바이트\n", ++rec, pkt_length); for(i=0; i<pkt_length; i++) c = pkt_data[i]; if((' ' > c) ('~' < c)) c = '.' printf("%c",c); printf("\7\7\n\n>> 파일수신을완료했습니다 \n\n"); printf("\n>> 수신한파일은 %s입니다.\n", fname); again: printf("\7\7\n\n.. 이미지파일내용을확인하시겠습니까 ( 예 = 1 )?"); scanf("%d", &i); if (i!=1) goto again; fclose(fpw); system("cls"); system("dir"); printf("\7\7\n>> 수신한파일은 %s입니다.\n\n", fname); system("mspaint.exe"); exit(0); skip:; void main() pcap_if_t*alldevs;// pcap 장치정보변수구조체 pcap_if_t*d;// pcap 장치인터페이스구조체 pcap_t*adhandle;// 장치설정값구조체 char errbuf[pcap_errbuf_size]; int i, inum, no_interface=0; // 패킷을읽어쓰기할파일지정및오픈 printf("\7\7>> 시스템을기동합니다.\n\n"); // 인터페이스카드점검및지정 - 18 -
if(pcap_findalldevs_ex(pcap_src_if_string, NULL, &alldevs, errbuf) == -1) // pcap_open() 으로열수있는장치list 생성함수 // 검사할장치위치, null, 장치정보변수, 에러메세지저장변수 printf("\n>> Error in pcap_findalldevs: %s\n",errbuf); exit(-1); printf("\n>> 네트워크인터페이스카드 \n"); for(d=alldevs; d; d=d->next)// 생성된장치list 출력 printf("\n %d) %s",++no_interface, d->name); if(d->description) printf("\n (%s)\n",d->description); else printf("(no description available)\n"); if(no_interface==0) printf("\n>> 인터페이스가확인되지않습니다! WinPcap 설치여부를점검하세요!\n"); exit(-1); printf("\7\7\n.. 해당인터페이스번호를선택하세요 (1-%d)? ",no_interface); scanf("%d",&inum); if(inum < 1 inum > no_interface) printf("\n>> 인터페이스번호오류가발생했습니다.\n"); pcap_freealldevs(alldevs); // 동적할당한공간을free exit(-1); for(d=alldevs, i=0; i<inum-1; d=d->next,i++); if( (adhandle = pcap_open(d->name,65536,pcap_openflag_promiscuous,1000,null,errbuf)) == NULL)// 장치이름, 캡쳐가능한크기, 모드, timeout, 원격장치권한, 에러버퍼크기 printf("\n>> adapter open 오류! %s가winpcap에서지원되지않습니다!\n",d->name); pcap_freealldevs(alldevs); exit(-1); printf("\nlistening on %s\n",d->description); pcap_freealldevs(alldevs);// 동적할당한공간을해제 - 19 -
printf("\7\7\n\n.. 수신한이미지를저장할파일명을입력하시오 : ");// 파일경로및파일명입력 scanf("%s", write_fname); if((fpw=fopen(write_fname, "wb"))==null) printf("\n.. 파일을열수없습니다.\n"); exit(-1); // 비정상적인종료 for (i=0; i<strlen(write_fname); i++) fname[i]=write_fname[i]; printf("\n>> 지정한파일명은 %s 입니다.\n\n", fname); printf("\7\7\n>> 클라이언트에서전송하는신호를수신대기중입니다.\n"); // 패킷캡쳐시작 if((fpw=fopen(write_fname, "wb"))==null) printf("\n.. 파일을열수없습니다.\n"); exit(-1); // 비정상적인종료 pcap_loop(adhandle, 0, packet_handler, NULL);// 패킷처리기호출 exit(0); - 20 -
기간 내용 조별주간활동보고서 진행내용 1 주차조원전체팀원각자아이디어및주제생각해보고검토 2 주차조원전체각자공부과목정하여계획서작성 약 2 개월 최용현 최철원 리눅스서버, C++(openCV Library), 웹프로그래밍공부 11 주차 약 1 개월 최용현신준섭최철원김명진 웹캠실행을위한 opencv 환경설정및자료수집 리눅스서버 (FTP, web hard) 구축및검토 16주차 17 ~ 19 주차 20 ~ 23 주차 24 ~ 27 주차 28 ~ 31 주차 32 ~ 35 주차 36 ~ 40 주차 최철원김명진최용현최철원최용현신준섭최철원김명진최용현최철원최용현최철원김명진신준섭 서버구축및 php프로그래밍을이용한웹페이지완성미비한점을수정 ( 웹페이지폐쇄 & web hard 구축 ) OpenCV 프로그램개발완료 web hard 서버최종구축완료파일전송프로그래밍 (winpcap) 자료조사웹캠실행및파일전송최종검토최종보고서작성및완성 - 21 -
Ⅲ. 결론 프로그램의원래의목적은프로그램실행후백그라운드상태에서자동적으로클라이언트가서버로파일을전송하여사용자가 Webhard나 FTP 서버등을이용하여사용자인증후사용자가보낸이미지파일을언제든지전송을받을수있도록하는것이목표이었지만개발을하면서여러난관에부족하여 Capture 프로그램및 Send&Receive 프로그램만완성. 지금현재는 Capture 프로그램을실행하여 Send&Receive 프로그램을수동적으로실행하여이미지파일을보낼수만있도록구현이되어있습니다. 본래의목적에도달하지않았지만조원들이서로열심히한계획한프로그램을제작하여여러모로색다른경험을할수있었고앞으로이프로그램의문제점을보안하는것으로노력을해보겠습니다. Ⅲ-1. 참고문헌컴퓨터비전커뮤니티카페 OpenCVKorea http://cafe.naver.com/opencv OpenCV 2 computer vision application programming cookbook (OpenCV 2를활용한컴퓨터비전프로그래밍 ) - 로버트나가니에 WinPcap 홉페이지 http://www.winpcap.org/ - 22 -
Ⅲ-2. 발표 PPT 자료 - 23 -
- 24 -
- 25 -
- 26 -
- 27 -
- 28 -
- 29 -
- 30 -
- 31 -
- 32 -
- 33 -