최종보고서 SMT (System Monitoring Tool : 시스템자원모니터링툴 ) 팀명 : Point of C++ 팀장 : 한소라 (11학번) 팀원 : 이재익 (09학번) 한우영 (09학번) 김은지 (11학번) 지도교수 : 양정모교수님 - 1 -

Similar documents
K&R2 Reference Manual 번역본

Microsoft PowerPoint - chap06-2pointer.ppt

슬라이드 1

untitled

PowerPoint 프레젠테이션

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Lab 3. 실습문제 (Single linked list)_해답.hwp

C 언어 프로그래밊 과제 풀이

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

금오공대 컴퓨터공학전공 강의자료

Chapter #01 Subject

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

03장.스택.key

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - ch07 - 포인터 pm0415

1장. 유닉스 시스템 프로그래밍 개요

C프로-3장c03逞풚

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

중간고사

PowerPoint 프레젠테이션

11장 포인터

11장 포인터

6주차.key

BMP 파일 처리

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

OCW_C언어 기초

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

C++-¿Ïº®Çؼ³10Àå

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

본 강의에 들어가기 전

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

vi 사용법

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

chap 5: Trees

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers


5.스택(강의자료).key

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

PowerPoint Presentation

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - chap03-변수와데이터형.pptx

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

슬라이드 1

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

In this tutorial i'll try to cover all of the known methods(or at least, those that I know =p) of injecting dll's into a proce

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap10-함수의활용.pptx

윤성우의 열혈 TCP/IP 소켓 프로그래밍

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

chap7.key

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

PowerPoint Presentation

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

C++ Programming

untitled

PowerPoint 프레젠테이션

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

컴파일러

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - Java7.pptx

untitled

/chroot/lib/ /chroot/etc/

untitled

PowerPoint 프레젠테이션

PowerPoint Presentation

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

API 매뉴얼

PowerPoint 프레젠테이션

설계란 무엇인가?

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

Microsoft PowerPoint - IP11.pptx

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

untitled

쉽게 풀어쓴 C 프로그래밍

chap10.PDF

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont


Microsoft PowerPoint - Chapter_09.pptx

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint - chap-11.pptx

Transcription:

최종보고서 SMT (System Monitoring Tool : 시스템자원모니터링툴 ) 팀명 : Point of C++ 팀장 : 한소라 (11학번) 팀원 : 이재익 (09학번) 한우영 (09학번) 김은지 (11학번) 지도교수 : 양정모교수님 - 1 -

목 차 1. 서론 1-1. 개발배경및목적... 3 1-2. 연구내용... 3 1-3. 개발환경... 3 2. 본론 2-1. 프로그램구성... 4 2-2. MEMORY 값측정함수... 4 2-3. CPU값측정함수... 5 2-4. 프로그램실행화면... 8 3. 결론 3-1. 결론및의견... 14 4. 부록 4-1. 소스코드... 15 4-2. 발표PPT자료... 22 4-3. 참고자료... 33-2 -

1. 서론 1-1 연구배경및목적 우리는현재어떤일이든컴퓨터를통해처리하고있고생활의거의대부분이컴퓨터와연관되어있다고생각합니다. 그런데최근각종악성코드로인해시스템자원을고갈시키는등의방법으로시스템의운영을방해하거나정보자료를훼손하여많은사용자들에게피해를주고있습니다. 따라서본프로젝트를통해시스템자원의과부하등시스템운영상태를실시간으로감시하고, 각종침해를실시간으로통제함으로써피해를최소화하고, 시스템의안정적인운영을도모하려고합니다. 더불어 MEMORY, CPU에관한시스템함수에대한학습을통해실력을쌓고체계적인진행을통해 C프로그램의전반적인학습으로프로그래밍실력의향상을목표에두고임할것입니다. 1-2 연구내용 우리의연구목적은실시간으로과다사용되고있는프로세스를검출하여시스템자원을통제하여시스템운영의피해를최소화하기위한프로그램인시스템모니터링툴 (System Monitoring Tool : SMT) 제작입니다. SMT에서는시스템함수인 GlobalMemoryStatusEx( ) 와 GetCpuUsage( ) 를사용하여시스템모니터링을실행합니다. 컴퓨터가동작하고 SMT를실행시켜시스템자원인 MEMORY, CPU의프로세스별사용량을모니터링하여사용량이 70% 이상으로과다사용이되고있는지를탐지합니다. 사용량이 70% 이상에해당되는프로세스를검출하여자동으로 Suspend하며, 사용자에게메시지박스와알림음을통해경보를하고해당하는프로세스의상세정보를출력합니다. 사용자에게해당프로세스를종료시킬것인지질의를통해사용자의의사를묻고, 계속실행할경우프로세스의 Suspend상태를풀어주고프로세스의과다사용을다시탐지합니다. 1-3 개발환경 - 운영체제 : Windows7 - 프로그래밍언어 : C/C++ - 개발도구 : Microsoft Visual Studio 2008/2010-3 -

2. 본론 2-1 프로그램구성 < 그림 1 > 시스템개요도 본시스템모니터링툴 (SMT) 은컴퓨터가동작하고 SMT를실행시켜시스템자원인 MEMORY, CPU의프로세스별사용량이 70% 으로과다사용이되고있는지를탐지합니다. 해당되는프로세스를검출하여자동으로 Suspend하며, 사용자에게메시지박스를통해경보를하고프로세스의상세정보를출력합니다. 사용자에게해당프로세스를종료시킬것인지질의를합니다. 계속실행할경우프로세스의 Suspend상태를풀어주고프로세스의과다사용을다시탐지합니다. 2-2 MEMORY 값측정함수 시스템의메모리값을얻어오기위하여 GlobalMemoryStatusEx( ) API를사용하였습니다. API 소개 GlobalMemoryStatusEx API는가상메모리, 페이지파일, 실제메모리 ( 물리메모리 ) 등의정보를얻고자할때사용합니다. 구조체는 MEMORYSTATUSEX가사용됩니다. - 4 -

API 선언 Public Dexlare Sub GlobalMemoryStatusEx Lib "kernel32"(lpbuffer As MEMORYSTATUSEX) 구조체선언 Public Type MEMORYSTATUSEX dwlength As Long 구조체의크기 dwmemoryload As Long 메모리의사용량 ( 백분율 ) ulltotalphys As Currency 실제메모리의총크기 ullavailphys As Currency 실제메모리의남은크기 ulltotalpagefile As Currency 페이지파일의총크기 ullavailpagefile As Currency 페이지파일의남은크기 ulltotalvirtual As Currency 가상메모리의총크기 ullavailvirtual As Currency 가상메모리의남은크기 ullavailextendedvirtual As Currency 확장된가상메모리의남은크기 설명 GlobalMemoryStatusEx( ) API를사용해얻어온값들의단위는메가바이트가아니므로, 단위를맞추기위해 102.4로나누고거기에 1000을곱한다음또다시 1024로나눕니다. 또, 구조체 MEMORYSTATUSEX 에서는각메모리의크기와사용가능한공간만을구할수있는데저두대를응용하여메모리사용량을구합니다. ( 메모리크기 - 사용가능한공간 ) GlobalMemoryStatus( ) API는메모리의크기가 4GB 이상이되면값이이상하게나온다고하여 GlobalMemoryStatusEx( ) API를사용하였습니다. 2-3 CPU 값측정함수 레지스트를통한 HKEY_PERPOMANCE_DATA 키에값을가져오는방법입니다. 실제보이지않는키이기 때문에 regedit 로해서 HKEY_PERFORMANCE_DATA 를조회할수는없습니다. HKEY_PERFORMANCE_DATA 에있는값들을통해서성능에관련된정보를획득할수있었습니다. 정의되는함수 LPBYTE GetPerformanceData(LPTSTR src); - 5 -

int GetCounterValue(const int& objid, const int& counterid, const char* instancename, PERF_DATA_BLOCK **datablock, LONGLONG &value); double GetCpuUsage(const char* process); 정의되는함수는총 3 개지만실제사용하는함수는 GetCpuUsage( ) 입니다. 다른함수는통계정보를얻 기위하여사용합니다. GetCpuUsage( ) 함수 GetCpuUsage( ) 함수를통해서 CPU 사용량을얻을수있습니다. GetCounterValue( ) 함수에의해서 HKEY_PERFORMANCE_DATA 키에있는원하는카운터객체 (PERF_COUNTER_BLOCK) 를얻을수있고, 그곳에서원하는값을얻을수있습니다. 이렇게얻은값을통해서 CPU사용율을계산할수있습니다. GetCounterValue( ) 함수 GetCounterValue( ) 함수는 HKEY_PERFORMANCE_DATA치에서원하는카운터객체를찾고거기에서을얻는것입니다. 사용되는인자가많습니다. 첫번째인자는찾는객체 ID이고두번째인자는찾고자하는카운터객체 ID이고세번째인자는찾고자하는인스턴스이름입니다. 네번째인자는성능데이터값 (PERF_DATA_BLOCK) 이저장되고다섯번째인자는카운트블록 (PERF_COUNTER_BLOCK) 의값이저장됩니다. 앞의세개인자는입력인자이고나머지두개인자는출력인자입니다. 반환값은에러가발생시 -1이반환되고성공이면 0이반환됩니다. GetCounterValue( ) 함수구조체 PERF_DATA_BLOCK PERF_OBJECT_TYPE PERF_COUNTER_DEFINITION PERF_INSTANCE_DEFINITION PERF_COUNTER_BLOCK - 6 -

< 그림 2 > 구조체의관계 기본적인객체는 PERF_DATA_BLOCK 에서시작됩니다. 그뒤로여러객체들이따라오는데각객체는 PERF_OBFECT_TYPE를헤더로갖습니다. 그리고각객체에는여러카운터객체가포함됩니다. 그리고각객체에인스턴스개수에따라서여러인스턴스객체가포함되어있습니다. PERF_DATA_BLOCK 에서다음객체 (PERF_OBJECT_TYPE) 를찾으려면 PERF_DATA_BLOCK 의 HeaderLength 만큼이동하면되고여러객체에서다음객체를찾으려면 PERF_OBJECT_TYPE 에서 TotalByteLength 만큼이동하면됩니다. 그리고각객체 (PERF_DATA_BLOCK) 에서카운터정의객체 (PERF_COUNTER_DEFINITION) 을찾으려면 PERF_DATA_BLOCK 에서 PERF+DATA_BLOCK 의 HeaderLength 만큼이동하면됩니다. 카운터객체가여러개가오는데다음카운터객체 (PERF_COUNTER_DEFINITION) 를찾으려면 PERF_COUNTER_DEFINITION 의 ByteLength만큼이동하면됩니다. 그리고다중인스턴스라면첫번째인스턴스객체 (PERF_INSTANCE_DEFINITION) 를찾으려면 PERF_OBJECT_TYPE 에서 PERF_OBJECT_TYPE 의 DefinitionLength 만큼이동하면됩니다. 그리고다음인스턴스객체를찾으려면 PERF_INSTANCE_DEFINITION 에서 PERF_INSTANCE_DEFINIRION 의 ByteLength 만큼이동하면 PERF_INSTANCE_DEFINITION 을얻을수있습니다. 다중객체가아니면간단합니다. 첫번째인스턴스객체 (PERF_INSTANCE_DEFINITION) 위치는앞에서구한 - 7 -

값으로가지면되고다음은 PERF_COUNTER_BLOCK 에서 ByteLength 만큼이동하면됩니다. GetPerformanceData( ) 함수 GetPerformanceData( ) 함수는레지스트리에있는 HKEY_PERFORMANCE_DATA 키에서원하는객체값을얻어오는것이다. 이함수는 GetCounterValue( ) 함수에비해서는간단합니다. 입력되는인자는원하는인스턴스객체명을받습니다. 반환되는값은 PERF_DATA_BLOCK 의포인터를반환합니다. 만약에러가발생한다면 NULL값이반환됩니다. 2-4 프로그램실행화면 CPU 및메모리실시간모니터링구현부분소스코드 // CPU 및메모리실시간모니터링소스 BOOL SystemMonitoring( ) { HANDLE hprocesssnap; HANDLE hprocess; PROCESSENTRY32 pe32; MEMORYSTATUSEX statex; statex.dwlength = sizeof ( statex ); GlobalMemoryStatusEx ( &statex ); PROCESS_MEMORY_COUNTERS pmc; DWORD Code = 0; int i=0, j=0, ProcessID, suspend; char * processname; DWORD dwpriorityclass; hprocesssnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //32bit 인 process 의정보를가져옴. if( hprocesssnap == INVALID_HANDLE_VALUE ) { printerror( TEXT("CreateToolhelp32Snapshot (of processes)") ); return( FALSE ); pe32.dwsize = sizeof( PROCESSENTRY32 ); //pe23 사이즈초기화 if(!process32first( hprocesssnap, &pe32 ) ) { - 8 -

printerror( TEXT("Process32First") ); CloseHandle( hprocesssnap ); return( FALSE ); do { hprocess = OpenProcess( PROCESS_QUERY_INFORMATION // 프로세스의 Handle값을얻어옴. PROCESS_VM_READ, FALSE, pe32.th32processid ); dwpriorityclass = GetPriorityClass(hProcess); // 프로세스의우선순위값을반환. processname=pe32.szexefile; strtok(processname,"."); if(0==i%3 i==0) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다.\n"); \n\n\n\n\n\n=============================== =======================\n" ); else if(0==i%2) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다...\n"); \n\n\n\n\n\n=============================== =======================\n" ); else { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다..\n"); \n\n\n\n\n\n=============================== =======================\n" ); int processid=0; CCpuUsage usagea; CCpuUsage usageb; - 9 -

for( j=0;j<2;j++ ) { int SystemWideCpuUsage = usagea.getcpuusage(); // 전체프로세스 CPU 사용량 int ProcessCpuUsageByName = usageb.getcpuusage( processname ); // 프로세스 CPU 사용량 Sleep( 250 ); if( ProcessCpuUsageByName > 70 ) { // 프로세스 CPU 점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L"CPU점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 ); // 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); if( j==1 ) 전체프로세스 CPU 사용량 : %d", SystemWideCpuUsage); if( j==1 ) 프로세스 CPU 사용량 : %d", ProcessCpuUsageByName); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if( suspend == 1 ) { KillProcess(processname,ProcessID); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); - 10 -

if( suspend == 2 ) { DebugActiveProcessStop(ProcessID); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); if( GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)) ) { // 프로세스메모리정보구하는함수 if( (pmc.workingsetsize/div) > ((statex.ullavailphys/div)*0.75) ) { // 메모리점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L" 메모리점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 );// 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); 최대작업메모리의크기 : %*d KB\n", WIDTH, statex.ulltotalphys/div); 프로세스의작업메모리크기 : %d KB\n", pmc.workingsetsize/div); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if (suspend == 1) { KillProcess( processname, ProcessID ); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); - 11 -

if (suspend == 2) { DebugActiveProcessStop( ProcessID ); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); CloseHandle(hProcess); // 프로세스의핸들을반환해주는함수 i++; system("cls"); while( Process32Next( hprocesssnap, &pe32 ) ) // 엔트리프로세스를읽고없을때까지계속읽음 CloseHandle( hprocesssnap ); // 스냅샷의핸들을반환해주는함수 return 0; 위의프로그램소스코드를실행하게되면메인화면이출력되고 0 을제외한다른값을입력시켜모니터링 을시작합니다. < 그림 3 > 프로그램메인화면 - 12 -

< 그림 4 > 프로그램모니터링화면 프로그램이프로세스별 CPU, MEMORY 의사용율을모니터링하면서과다사용을검출합니다. MEMORY, CPU 의프로세스별사용량이 70% 으로과다사용이확인되면알림을주고프로세스를종료를원하면프 로세스를종료시킵니다. < 그림 5 > 프로세스 Suspend 후질의화면 - 13 -

3. 결론 3-1 결론및기대효과 시스템자원모니터링툴을직접프로그램으로구현하는과정에서시스템함수에관한지식을습득하고메모리과부하프로그램을제작하여컴퓨터에직접영향을미치는위험성들을실험을통해프로그램구동원리를공부할수가있었으며원도우프로그래밍의다양한기법, 기술을학습하여좀더폭넓은기술개발역량을배량하였습니다. 프로젝트를진행하면서처음에는과연수업시간에배웠던모든것을활용해서우리가할수있을까라는의문점을갖으면서도계획을세우고끝까지해보려는노력과팀워크가힘을더해어려운것도잘해결할수있었습니다. - 14 -

4. 부록 4-1. 소스코드 //include파일및전처리기정의 #include "stdafx.h" #include <windows.h> #include <winuser.h> #include <tlhelp32.h> #include <tchar.h> #include <stdio.h> #include <string.h> #include <Psapi.h> #include <stdlib.h> #include "CpuUsage.h" #pragma comment( lib, "psapi" ) #define DIV 1024 #define WIDTH 7 // 함수정의 BOOL KillProcess( char* processname, int a ); // 프로세스kill 함수 BOOL SystemMonitoring( ); // 시스템모니터링함수 void printerror( TCHAR* msg ); //Error탐지함수 //main 함수 int main( void ) { int start; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + System Monitoring Tool +\n"); printf(" + Ver. 1.0 +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + [Point of Challenge] +\n"); printf(" + +\n"); printf(" + Han So ra +\n"); printf(" + Han Woo young +\n"); printf(" + Lee Jae ik +\n"); printf(" + Kim Eun ji +\n"); - 15 -

printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\n"); printf(" 계속하시려면아무키나입력하시오.( 종료 =0)"); scanf("%d",&start); if(start==0){system("cls"); printf(" 프로그램을종료합니다.\n"); exit(0); system("cls"); while( 1 ) { SystemMonitoring( ); return 0; // CPU 및메모리실시간모니터링소스 BOOL SystemMonitoring( ) { HANDLE hprocesssnap; HANDLE hprocess; PROCESSENTRY32 pe32; MEMORYSTATUSEX statex; statex.dwlength = sizeof ( statex ); GlobalMemoryStatusEx ( &statex ); PROCESS_MEMORY_COUNTERS pmc; DWORD Code = 0; int i=0, j=0, ProcessID, suspend; char * processname; DWORD dwpriorityclass; hprocesssnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //32bit 인 process 의정보를가져옴. if( hprocesssnap == INVALID_HANDLE_VALUE ) { printerror( TEXT("CreateToolhelp32Snapshot (of processes)") ); return( FALSE ); pe32.dwsize = sizeof( PROCESSENTRY32 ); //pe23 사이즈초기화 - 16 -

if(!process32first( hprocesssnap, &pe32 ) ) { printerror( TEXT("Process32First") ); CloseHandle( hprocesssnap ); return( FALSE ); do { hprocess = OpenProcess( PROCESS_QUERY_INFORMATION // 프로세스의 Handle값을얻어옴. PROCESS_VM_READ, FALSE, pe32.th32processid ); dwpriorityclass = GetPriorityClass(hProcess); // 프로세스의우선순위값을반환. processname=pe32.szexefile; strtok(processname,"."); if(0==i%3 i==0) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다.\n"); \n\n\n\n\n\n=============================== =======================\n" ); else if(0==i%2) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다...\n"); \n\n\n\n\n\n=============================== =======================\n" ); else { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다..\n"); \n\n\n\n\n\n=============================== =======================\n" ); int processid=0; - 17 -

CCpuUsage usagea; CCpuUsage usageb; for( j=0;j<2;j++ ) { int SystemWideCpuUsage = usagea.getcpuusage(); // 전체프로세스 CPU 사용량 int ProcessCpuUsageByName = usageb.getcpuusage( processname ); // 프로세스 CPU 사용량 Sleep( 250 ); if( ProcessCpuUsageByName > 70 ) { // 프로세스 CPU 점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L"CPU점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 ); // 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); if( j==1 ) 전체프로세스 CPU 사용량 : %d", SystemWideCpuUsage); if( j==1 ) 프로세스 CPU 사용량 : %d", ProcessCpuUsageByName); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if( suspend == 1 ) { KillProcess(processname,ProcessID); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); - 18 -

if( suspend == 2 ) { DebugActiveProcessStop(ProcessID); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); if( GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)) ) { // 프로세스메모리정보구하는함수 if( (pmc.workingsetsize/div) > ((statex.ullavailphys/div)*0.75) ) { // 메모리점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L" 메모리점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 );// 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); 최대작업메모리의크기 : %*d KB\n", WIDTH, statex.ulltotalphys/div); 프로세스의작업메모리크기 : %d KB\n", pmc.workingsetsize/div); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if (suspend == 1) { KillProcess( processname, ProcessID ); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); - 19 -

Sleep( 1000 ); if (suspend == 2) { DebugActiveProcessStop( ProcessID ); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); CloseHandle(hProcess); // 프로세스의핸들을반환해주는함수 i++; system("cls"); while( Process32Next( hprocesssnap, &pe32 ) ) // 엔트리프로세스를읽고없을때까지계속읽음 CloseHandle( hprocesssnap ); // 스냅샷의핸들을반환해주는함수 return 0; BOOL KillProcess(char * processname,int ProcessID) { // 프로세스 kill 함수선언 HANDLE hprocesssnap = NULL; DWORD Return = FALSE; PROCESSENTRY32 pe32 = {0; int result; char *exe = ".exe"; strcat(processname,exe); char *Temp = pe32.szexefile; hprocesssnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(hprocesssnap == INVALID_HANDLE_VALUE) return (DWORD)INVALID_HANDLE_VALUE; pe32.dwsize = sizeof(processentry32); if(process32first(hprocesssnap, &pe32)) { DWORD Code = 0; DWORD dwpriorityclass; do { HANDLE hprocess; hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32processid); dwpriorityclass = GetPriorityClass(hProcess); - 20 -

result=strcmp(temp, processname); //kill 할프로세스를찾음 if(result==0) { // 찾으면 kill if(terminateprocess(hprocess, 0)) GetExitCodeProcess(hProcess, &Code); else return GetLastError(); CloseHandle(hProcess); while(process32next(hprocesssnap, &pe32)); Return = TRUE; else Return = FALSE; DebugActiveProcessStop(ProcessID); // 프로세스일시중지해제 CloseHandle(hProcessSnap); return Return; void printerror( TCHAR* msg ) { DWORD enum; TCHAR sysmsg[256]; TCHAR* p; //Error 출력함수선언 enum = GetLastError( ); FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM FORMAT_MESSAGE_IGNORE_INSERTS, NULL, enum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language sysmsg, 256, NULL ); p = sysmsg; while( ( *p > 31 ) ( *p == 9 ) ) ++p; do { *p-- = 0; while( ( p >= sysmsg ) && ( ( *p == '.' ) ( *p < 33 ) ) ); _tprintf( TEXT("\n WARNING: %s failed with error %d (%s)"), msg, enum, sysmsg ); //Error부분출력 - 21 -

4-2. 발표 PPT 자료 - 22 -

- 23 -

- 24 -

- 25 -

- 26 -

- 27 -

- 28 -

- 29 -

- 30 -

- 31 -

- 32 -

4-3. 참고자료 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx (MSDN 코리아 ) http://ospace.tistory.com/195 (JaPa2 - 배우면배울수록더배울것이생긴다 ) http://blog.daum.net/01193780006/9747158 (Daum blog) - 33 -