googletest 환경 구축

 

 

안녕하세요. moltak입니다. 오늘은 TDD를 사용하기 위한 Google C++ Testing Frameworks를 설치해보고 예제를 돌려보겠습니다.

 

 

C++ Unit Test Framework는 굉장히 많습니다. JAVA는 JUnit과 Hamcrest라는 Framework 많이 사용하더군요. 하지만 C++은 언뜻 봐도 굉장히 많습니다. 저는 C++의 모든 Test Framework를 사용해본 것은 아닙니다. 그렇다고 Google Framework가 아주 좋다는 것도 아닙니다. 다만 사용하기 쉽고 굉장히 직관적이었습니다. (다른 Framework도 그런지는 모르겠네요. )

 

 

잔소리는 여기까지 하고 일단 사용해보도록 하겠습니다.

 

 

구글 Framework 또한 다른 라이브러리와 마찬가지로 아래 순서를 따르게 됩니다. 하나 하나 보도록 하죠.

1. Downloads

2. 설치

3. Visual Studio 설정

4. 사용하기

 

 

1. Downloads : : http://code.google.com/p/googletest/ 에 들어가서 상단에 Downloads 탭을 선택한 후 윈도우 버전 다운로드.

Figure 1 google test downloads

 

 

2. 설치 : 자신이 원하는 폴더에 압축해제. 그 후 gtest\msvc 폴더에 가서 gtest.sln 파일을 더블 클릭.

만약 버전이 안 맞아서 솔루션 파일을 변경해야 할 경우 .vcproj(프로젝트 파일)의 읽기 전용 속성을 해제하세요.

그 후 해당 솔루션을 컴파일 합니다.

 

 

3. VS 설정

VS2005~2008 : 도구->옵션->프로젝트 및 솔루션->VC++ 디렉터리

VS2010 : 프로젝트 옵션에서 설정해야 합니다.

포함 파일과 라이브러리 파일 경로 설정.

  • 포함파일에 \include 경로 설정
  • 라이브러리 파일에 \msvc\gtest\debug 경로 설정

Figure 2 Visual Studio Setting

 

 

위 그림처럼 하시면 됩니다.

 

Google Testing Framework는 런타임 라이브러리가 다중 스레드 디버그(/MTd) 이기 때문에 우리의 프로젝트 설정도 위 처럼 바꿔 줘야 합니다.

 

프로젝트 설정 -> 구성 속성 -> C++ -> 코드 생성 -> 런타임 라이브러리 -> 다중 스레드 디버그(/MTd)

Figure 3 런타임 라이브러리 변경

 

 

그 후 라이브러리 링크

 

이렇게 하시면 기본적인 설정 방법은 끝이 났습니다. 다른 라이브러리와 사용법이 같기 때문에 쉽게 하셨을 것 같네요.

 

 

4. 사용

이제 진짜로 사용해보도록 하죠.

 

문법은 위 그림과 같습니다. (http://soupim.tistory.com/48 참조)

사용 하실 때는 아래 소스처럼 하시면 쉽게 사용이 가능하십니다.

 

 

Figure 4 사용 예제 소스

 

 

저는 Test Fixtures를 사용해서 테스트를 수행하곤 하는데요. 이 방법이 Java나 다른 책에서 설명하는 TDD기법과 아주 유사합니다.

 

Figure 5 Test Fixtures 사용 예제

 

 

여러분들도 위 방법을 사용해서 테스트를 수행해보세요. 그리고 테스트 이름은 한글로 하는 것이 좋다고 하더라고요. (채수원 : 고품질 쾌속개발을 위한 TDD 실천법과 도구(한빛미디어))

위 책을 보고 있는데요. 상당히 좋습니다.

 

Figure 6 실행 화면

 

 

5. 정리

이렇게 해서 Google Testing Framework 설치와 사용법이 설명이 끝났습니다. 많이 사용해 보시고 저한테도 알려주셨으면 감사하겠습니다. ^^

그리고 Google Test UI도 있는데요. 아래 경로로 찾아 들어가시면 됩니다.

Figure 7 Google Test UI

 

 

위 손가락 위치에 가시면 다운 받으실 수 있습니다. 상당히 보기 편하더라고요. 다른 Unit Test 툴처럼. 하지만 저만 그런지는 모르겠으나. 굉장히 느립니다. 5초 이상 걸리는 것 같습니다. 다른 분들도 한번씩 사용해 보세요. 더 보기 좋답니다. ^^

 

 

이만 마치도록 하겠습니다.

 

Bloger : moltak.net

이것보다 더 좋은 ListCtrl 사용법은 없을 듯 싶네요!!

1. 리스트컨트롤 추가 

2. 멤버변수 추가 
m_list 

3. 체크박스 레이아웃 
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES ); 

4. 초기화 
m_list.DeleteAllItems(); 

5. 칼럼명 설정 
m_list.InsertColumn(0, _T("번호"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(1, _T("제목"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(2, _T("작성자"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(3, _T("코멘트"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(4, _T("파일"), LVCFMT_LEFT, 100, -1); 
//칼럼 추가 인덱스, 칼람명, 정렬방향, 칼럼길이, 서브아이템 갯수 

6. 데이터 추가 
int seq = 0; 
CString seq_string; 
seq_string.Format(_T("%d"),seq); 
CString title=_T("test"); 
CString writer=_T("이대한"); 
CString comment=_T("없음"); 
CString file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 

seq = 1; 
seq_string.Format(_T("%d"),seq); 
title=_T("test2"); 
writer=_T("이대한2"); 
comment=_T("있음"); 
file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 


7. 아이템 선택(1개 이상 선택 및 확인) 
POSITION pos = m_list.GetFirstSelectedItemPosition(); 

if (pos == NULL) 
AfxMessageBox(_T("No items were selected!\n")); 
else 
{ 
while (pos) 
{ 
int nItem = m_list.GetNextSelectedItem(pos); 
CString temp = m_list.GetItemText(nItem,0); 
temp.Format(_T("%s seq가 선택됨"),temp); 
AfxMessageBox(temp); 


// you could do your own processing on nItem here 
} 
} 


8. 체크박스 전체 체크 
int nCount=m_list.GetItemCount(); 
for(int i = 0; i< nCount;i++) 
m_list.SetCheck(i); 

9. 체크박스 전체 해제 
//헤더파일에 
#ifdef ListView_SetCheckState 
#define ListView_SetCheckState(hwndLV,i,fCheck) \ 
ListView_SetItemState(hwndLV,i, \ 
INDEXTOSTATEIMAGEMASK((fCheck)+1),LVIS_STATEIMAGEMASK) 
#endif 

//소스파일에 
CListCtrl* tmp; 
tmp=&m_list; 
int nCount=m_list.GetItemCount(); 
for(int i = 0; i< nCount;i++) 
ListView_SetCheckState(tmp->GetSafeHwnd(),i,FALSE); 

10. 체크 확인(1개 이상) 
int nCount=m_list.GetItemCount(); 
for(int i =0 ; i
{ 
BOOL a = m_list.GetCheck(i); 
if(a==TRUE) 
{ 
CString temp = m_list.GetItemText(i,0); 
temp.Format(_T("%s seq가 선택됨"),temp); 
AfxMessageBox(temp); 
} 
} 



11. 데이터 삽입 
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. 
int seq = 0; 
CString seq_string; 
seq_string.Format(_T("%d"),seq); 
CString title=_T("test"); 
CString writer=_T("이대한"); 
CString comment=_T("없음"); 
CString file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 


12. 데이터 삭제 
POSITION pos = m_list.GetFirstSelectedItemPosition(); 

if (pos == NULL) 
AfxMessageBox(_T("No items were selected!\n")); 
else 
{ 
while (pos) 
{ 
int nItem = m_list.GetNextSelectedItem(pos); 
CString temp = m_list.GetItemText(nItem,0); 
temp.Format(_T("%s seq가 삭제됨"),temp); 
AfxMessageBox(temp); 
m_list.DeleteItem(nItem); 
// you could do your own processing on nItem here 
} 
} 

'NativeCode > mfc' 카테고리의 다른 글

MySQL C++, MFC에서 사용하기  (0) 2010.06.17
CDC 글 쓰기  (0) 2010.03.18
Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18

stl의 find와 sort를 사용하기란 함수 객체를 모르는 상태에서는 조금 어렵습니다.

함수 객체는 말 그대로 "함수이면서 객체" 입니다.

함수이면서 객체인 것은 어떤 것이 있을까요? 아래 코드를 보면 쉽게 알 수 있습니다.

(참조: http://www.hanb.co.kr/network/view.html?bi_id=1626 )

 

 

구조체 안에 함수를 담으면 함수 객체이냐고?? 일단은 그렇게 생각하세요. 그게 쉽습니다.

 

자 이제 그럼 stl::find()와 stl::sort()를 사용해 보도록 하겠습니다. 사용법은 위 함수객체만 안다면 너무나 쉽습니다.

아, 한가지 덧 붙이자면 find는 정수 같은 것은 바로 찾을 수 있지만 "사용자 정의 데이터 타입"은 find를 할 수 없습니다. 그래서 우리는 find_if함수를 사용해야 합니다. find_if 함수는 우리가 만든 데이터도 찾게 해줍니다.

 

소트 수행 전

 

소트 수행 후

 

 

100번 말보다는 한번 보는게 낫겠죠. 한번 보시고 돌려 보세요. 쉽게 아실 수 있을 겁니다.

 

결과입니다. 열공하세요!!


Bloger : moltak.net

'NativeCode > C++ STL' 카테고리의 다른 글

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18
디모그 모드에서 프로그램을 종료하면 메모리 릭이 발생하는 경우가 있다.
그때 vs의 output 창에 아래와 같은 메시지가 나온다.


Detected memory leaks!
Dumping objects ->
{130} normal block at 0x004866F0, 712 bytes long.
 Data: <xA  8bH       ' > 78 41 03 10 38 62 48 00 01 CD CD CD 02 00 27 11 


이 메모리 릭을 어떻게 찾아야 하나 막막했다.
그런데 CRT에는 릭을 감지하는 debug function들이 있다. 이 함수들을 사용하면 메모리 릭이 있는 위치를 찾을 수 있다.

한가지 덧 붙이자면 릭 메시지 안의 {130} 의 의미는 프로그램에서 몇번째로 할당 받은 영역이라는 것이다. 위 메시지는 130번째로 할당받았다는 의미다.

메모리 릭을 추적하기 위해 Crt 함수를 사용하면 된다. Crt 함수를 사용하기 위해서는 다음 순서를 반드시 따라야 한다.

#include <stdlib.h>
#include <crtdbg.h>

_CrtDumpMemoryLeaks(); // 이 함수는 output 창에 메모리 릭 정보를 출력시킨다.
_CrtSetBreakAlloc( 130 ); // 이 함수는 130번째 메모리를 할당하려고 할 때 프로그램을 break 시켜준다.
_crtBreakAlloc = 130; // 이렇게 사용할 수 도 있다.

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
이 문은 프로그램이 종료될 때 자동으로 _CrtDumpMemoryLeaks를 호출한다.


_CrtSetDbgFlag 함수는 다섯개의 Flag 가 있다.
_CRTDBG_ALLOC_MEM_DF : 디폴트로 켜져 있으며, 디버그 버전에서 모든 메모리 할당이 일어날 때마다 추적 가능하도록 특별한 기능을 추가해 준다. 이 플래그가 켜져 있어야 메모리 누수를 안전하게 검사할 수 있다.

_CRTDBG_DELAY_FREE_MEM_DF : delete, free 등으로 삭제되어도 바로 삭제되지 않고, CRT의 메모리 관리소에 남아 있다가 프로그램 종료시에 완전히 삭제된다.

_CRTDBG_CHECK_ALWAYS_DF : 모든 메모리관련 연산에서 _CrtCheckMemory를 호출한다.

_CRTDBG_CHECK_CRT_DF : CRT가 내부적으로 할당한 블록도 메모리를 체크할 때 포함한다. 일반적으로는 CRT가 할당한 블록은 메모리 체크에서 제외된다. 일반적으로 사용하지 않는다.

_CRTDBG_LEAK_CHECK_DF : 프로그램이 완전히 종료되기 직전에 아직 해체되지 않는 메모리가 있는지 검사한다. 프로그램의 종료 포인트가 여러운데 있는 경우에 사용하면 일일이 _CrtDumpMemoryLeaks 메소드를 호출하지 않아도 자동적으로 메모리 누수를 검사할 수 있게 된다.

이중 _CRTDBG_ALLOC_MEM_DF를 제외하고는 모두 디폴트로 꺼져 있다. 그러므로 다음과 같이 메모리 검사 기능을 켜도록 해야한다. 
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
// MFC의 경우는 위의 옵션이 활성화 되어 있다.


Bloger : moltak.net

'Programming > 이것저것' 카테고리의 다른 글

[펌] valgrind 를 이용한 메모리 관리  (0) 2011.03.15
Doxygen - 작성중  (0) 2011.03.08
typeid 2  (1) 2010.05.25
세그먼트 레지스터  (0) 2010.05.01
x86 Register  (0) 2010.04.30

안녕하세요. moltak입니다.

오늘은 디자인 패턴 중 데코레이터 패턴입니다.

 

 

의도:

데코레이터 패턴은 어떤 클래스를 꾸미는 역할을 합니다.

예전에 우리가 만들었던 코드를 "감싸"서 새로운 임무를 부여하는 것이 가능합니다.

"감싸"다는 말은 이 패턴에서 굉장히 중요합니다.

 

 

활용성:

제가 보는 책(head first design patterns)에서는 데코레이션 패턴을 커피 예를 들어서 설명을 했습니다.

커피집에 가면 커피가 굉장히 많은데 그 커피에 대한 클래스를 만들고 모든 재료, 기능들을 넣는 것 보단 커피 클래스 따로 재료 클래스 따로 만들고 있었습니다.

커피 클래스, 재료 클래스를 따로 만들게 되었을 때 서로 유기적으로 잘 묶기만 한다면 한 클래스에 모든 기능을 넣는 것 보단 당연히 구조적으로 좋겠죠?

데코레이션 패턴에서는 유기적으로 묶는 방법으로 "감싸"는 것을 선택했습니다.

 

 

 

 

위 클래스 다이어그램을 보시면 가장 상위에 Coffee 추상 클래스가 보입니다.

그 아래로 그것을 상속받는 Americano, Espresso, Cafelatte같은 클래스가 있습니다.

또, Decorator라는 추상클래스가 있는데 이 클래스는 getDescription이라는 순수가상함수를 갖고 있습니다.

그래서 아래 재료들이 무조건 이 함수를 새로 정의하게 만들었습니다.

 

 

 

 

이 패턴의 시나리오는 위 소스에서 보는 것과 같이 원하는 커피 인스턴스를 생성하고 원하는 재료를 만들어서 서로에게 계속 참조를 시킨다는 것입니다. (감싼다는 의미가 이것입니다.)

 

사용자가 getDescription함수를 호출하거나 cost 함수를 호출하면 제어가 계속 참조하는 곳으로 올라가게 됩니다.

(아래 소스 참조)

 

 

 

이런 식으로 사용자는 예전부터 있던 클래스를 하나도 수정하지 않고 단지 "감싸"서 예전 클래스에 새로운 기능을 부여하는 것이 가능합니다.


 

Bloger : moltak.net

'SE > RF_DP' 카테고리의 다른 글

Design Pattern 도움 사이트  (0) 2011.03.15
네이버 블로그에 고​또​ (kottodat) 라는 분이 UML 클래스 다이어그램의 기초에 대해 잘 설명해 주셨네요. 문법이 틀렸을 수도 있다고 말하셨는데 제가 아는 것과 일치하니 맞는 듯?? (저도 제 멋대로 공부해서 틀릴 수도 -_-;) 
블로깅 하시라고 하셔서 전부 복사 합니다. ㅋㅋ


http://blog.naver.com/kottodat?Redirect=Log&logNo=80104635200


몇몇 분들의 요청으로 간략하게 적어보겠습니다만...

 

제가 UML을 정식으로 배운 것도 아니고 그냥 대충 제멋대로 이해하고 사용하는 것 이기 때문에

 

실제 정석으로 배운 분들이 보기에 여러가지 잘못된 점이 많이 있을겁니다.

 

잘못된 부분이 보이거나 의견이 있으시다면 코멘트로 달아주시면 감사하겠습니다.

 

잘못된 점을 수정하고 좋은 조언을 달게 받아 수정을 하겠습니다.

 

 

아참... 스크롤의 압박이 무지 심합니다.

 

 

일단 StarUML 프로그램 다운로드 링크입니다.

 

http://sourceforge.net/projects/staruml/files/staruml/5.0/

 

 

프로그램을 다운받아서 설치하시면 되겠습니다.

 

비지오로 사용하시는 분들은 비지오로 하셔도 무관합니다.

 

 

 

UML로 클래스 다이어그램을 그리는 목적

 

왜 우리는 클래스 다이어그램을 그려야 하는가.

 

소스코드를 작정해 놓고 그것만 보고서 구조가 어떻게 되어있고 동작이 어떻게 이루어 지는가를

 

알아내기는 무척 어렵습니다.

 

하지만...

 

 

이정도만 보면 대충 어떻게 되는지 알 수 있지 않을까요?

 

 

여튼 직접 코드를 짜지 않고서도 구조를 어느정도 미리 그려보는 용도도있고

 

타인이 코드를 직접 분석하는 것 보다 이렇게 다이어 그램을 통해 어떻게 돌아가는지

 

알 수 있기도 하고 그 외에도 여러가지 이점이 많습니다.

 

 

 

자~ 그럼 이제부터 하나씩 파보도록 하겠습니다.

 

일단 클래스입니다.

 

 

클래스를 만드는 것은 매우 간단합니다.

 

클래스를 선택하고 드래그 하면 끝이니까요.

 

그리고 변수와 함수들을 추가해 줍니다.

 

 

클래스에 마우스 커서를 대고 오른클릭을 하면 메뉴가 뜹니다.

 

변수와 함수를 각각 추가해 줍니다.

 

 

아참

 

생성한 클래스명 변수명 함수명은

 

더블클릭을 하면 아래 그림처럼 에딧창이 나타나면서 변경이 가능합니다.

 

 

 

 

이녀석의 이름을 바꿔주고 구성품 클래스를 하나 만들어 보겠습니다.

 

 

 

 

player는 equip를 가지고 있습니다.

 

하지만 처리를 좀 원할하게 하기 위해서 클래스로 만들었습니다.

 

그리고 player가 소유한 변수중에 equip라고 있는게 보이시죠?

 

 

좀 더 쉽게 예를 들어볼까요?

 

 

 

자동차 바퀴라는 클래스에

 

휠과 타이어라는 변수가 있습니다.

 

하지만 휠과 타이어는 각각 여러가지 속성이 존재하죠

 

제가 차 바퀴에 대해 잘 몰라서 제조회사, 특성 이라고만 적어 놓았지만

 

타이어의 경우 스노 타이어인지 차종이나 크기 등은 어떤거에 맞는 것인지 등등

 

여러가지 속성이 있습니다.

 

그런 모든값을 자동차 바퀴 라는 클래스에 몰아넣는 것은 별로 좋은 생각이 아니라고 봅니다.

 

그래서 따로 클래스를 만들어서 자동차 바퀴라는 클래스에 포함시키는 것이죠

 

 

 

 

뭐 간단하고 친절하게 composition이라고 쓰여저 있는걸 선택해서 둘을 이어주면 됩니다.

 

그 위에 Aggregation이라고 속이 빈 마름모가 보일겁니다.

 

이건 아주 살짝 다릅니다.

 

차이점이 하나 존재하거든요

 

 

바로 그 클래스가 릴리즈되는 시점의 차이 입니다.

 

composition의 경우 소유하는 클래스가 죽을때 소유당하는 클래스가 같이 죽지만

 

aggregaton의 경우에는 소유하는 클래스가 죽을때 소유당하는 녀석들이 같이 죽지 않는다는

 

차이점이 있습니다.

 

 

 

aggregation의 경우에도 클래스가 다른 한 클래스를 보유한다는 것에는 차이가 없습니다.

 

하지만!

 

속이 빈 마름모로 연결을 해 놓을경우 자식(?)보다 부모(?)가 먼저 죽을 수 있습니다.

 

예를 들면 다음과 같습니다.

 

 

 

맵을 띄울때 맵이 가진 요소들이 있을겁니다.

 

예로 나무 가로등 건물 등이 있다고 가정하죠

 

이때 맵은 분명히 오브젝트들을 소유하고 있습니다.

 

하지만 오브젝트를 읽어서 초기화 하고 삭제하는 일은 맵이라는 클래스가 하지 않습니다.

 

맵은 리소스 관리자 클래스에게 오브젝트를 읽어달라고 하고 포인터를 받아서 소유합니다.

 

 

맵이라는 클래스에서 release라는 함수를 불러서 자신을 릴리즈 할 경우에도

 

리소스 관리자에게 오브젝츠들을 릴리즈 해달라고 요청하지 않는 이상 오브젝트들은 살아남습니다.

 

오브젝트들은 자기 소유자가 죽더라도 자신은 죽지 않습니다.

 

 

소스코드로 보면 좀 더 이해가 잘 되실까 해서 간단히 적어보겠습니다.

 

 

 

aggregation의 경우 다른 클래스에게서 리소스를 읽어달라고 요청하고 포인터만 받아서 사용하고

 

자신이 리소스를 릴리즈 하지 않습니다.

 

하지만 composition의 경우 자신이 직접 리소스를 읽어서 사용하고 자신 스스로 해제해 버립니다.

 

 

클래스 자신만 쓰고 버리면 그만인 경우에도

 

리소스 관리자에게 한번 읽었으면 지금 당장은 사용하지 않더라도 나중에 다시 사용할 일이 있으면

 

현재 사용하는 리스트만 초기화 해버리고 메니저에게 일일히 해제하라고 이야기 하지 않는 경우가

 

많이 있습니다.

 

자주 사용하는것은 남기고 크기가 크거나 자주 쓰지 않는건 물론 자주 릴리즈 해야겠지요

 

 

 

이야기가 삼천포로 좀 빠졌지만...;

 

다시 돌아와서

 

 

 

 

이번엔 좀 큰그림을 그려놓고 설명하겠습니다.

 

 

일단 graphics라는 package를 하나 바닥에 깔아놓은 것이 눈에 띄죠

 

저녀석은 namespace입니다.

 

우리가 자주 사용하는 것 중에 namaspace std라는 것을 자주 사용하죠

 

그안에 vector map string 등등 우리가 좋아하고 자주 사용하는 것들이 들어있습니다만

 

저런 이름들은 자주 사용할지도 모르기 때문에 사용하는 것 입니다.

 

제가 위에 그린 예제도 저녀석들은 하나의 라이브러리로 만들어 놓았다고 가정할 경우

 

리소스라는 클래스가 있습니다만 물론 gsResource라던가로 하겠지만

 

혹여 어떤사람이 gsResource라는 클래스를 만들어 버린다던가

 

설마? 하는 문제를 위해서 라는 의미가 일단 가장 큽니다.

 

 

 

 

 

 

 

 

Association 실선으로 이어진 것을 제휴관계라고 하는데요

 

간단하게 말하자면 '두 클래스가 서로의 정보를 이용한다'라는 정도로 이해하시면 됩니다.

 

카메라는 자신의 눈에 해당하는 곳의 바로앞에 오게되면 카메라 위치를 강제적으로 옮기거나

 

못보게 해야하는 곳으로 맞추는 것 등을 방지하던가 맵의 데이터를 많이 사용합니다.

 

 

반대로 맵의 경우 카메라의 절두체에 해당하는 곳 밖의 오브젝트들을 그리지 않아야 하고

 

멀리 있는것이면 폴리곤을 조금 사용하는 대처품으로 교체한다던가 카메라를 강제로 옮기지 않고

 

카메라의 눈 앞에있는 오브젝트를 반투명하게 한다던가 기타 등등등

 

카메라의 위치 정보와 절두체 등의 정보를 많이 사용합니다.

 

서로 상대방이 가진 정보를 사용할 일이 많기 때문에 제휴관계 라고 표시를 해둡니다.

 

 

 

 

 

 

 

 

DirectedAssociation 일방적 제휴관계라고 하네요

 

클라이언트는 graphics라는 녀석중에서 그래픽이라는 facade클래스를 통해 그래픽 데이터를

 

처리합니다.

 

일단 이녀석은 라이브러리로서

#include "gsgraphic.h"

pragma commant( lib, "gsgraphic.lib" )

 

using namespace graphics ;

 

이렇게 해놓고 쓸 녀석인 만큼 그래픽이라는 클래스에서 클라이언트에 대해 뭔가를 특정하기엔

 

무리가 있으며 클라이언트쪽에 뭔가 요청하거나 할 일이 없습니다.

 

클라이언트가 일방적으로 뭔가 넣고 초기화 하라고 시켜서 초기화 하고

 

말 그대로 하라는 일만 소처럼 열심히 하는거죠

 

그래서 일방적 제휴라고 하는 것 같습니다.

 

 

 

 

 

 

위 그림처럼 점선으로 이어놓은 것을 Dependency 의존관계 라고 합니다.

 

지형지물이던 맵이던 이펙트던 스스로 리소스를 파일에서 읽는짓은 하지 못합니다.

 

왜냐구요?

 

만약 저녀석들이 각각 리소스를 파일에서 읽는 작업을 한다고 가정하면....

 

5개 클래스 각각 파일을 읽고 파일의 정보들을 구조체에 담고 분류하는일을 갖고 있어야 할겁니다.

 

5개 클래스에 동일한 코드와 비슷한코드가 똑같이 박혀있는 것부터가 일단 용납이 안되며

 

리소스 재사용이나 쌓아둔 양에따라 적당히 잘 안쓰는건 릴리즈 한다던가 하는 관리를 위해서라도

 

리소스를 관리하는 클래스를 따로 두고 관리해야 하지 않을까 합니다.

 

 

일단 딴 이야기는 이쯤 하고...;

 

클래스의 일부 기능을 타 클래스의 힘을 빌려서 해야할 경우에 의존적이라고 하고

 

저렇게 점선에 화살표로 표기합니다.

 

그 외에 의존하는 클래스의 변화에 영향을 받기도 한다고 기억하고 있습니다만

 

리소스를 읽는 과정 자체가 리소스 클래스가 가지고 있고 리소스 객체의 형태가 변한다면

 

각자 받아온 값을 활용하는 법도 확실히 바뀌는 일이 있을지 모르겠군요

 

 

 

 

다음은 Multiplicity입니다. 수량이라는 게죠

 

맵은 반드시 1개가 존재하고 오브젝트는 0개가 될수도 있고 몇개가 될수도 있습니다.

 

저런식으로 수치를 넣어주는 것 입니다만...

 

쓰기 나름입니다.

 

1 - * 이라고 해도 위 그림과 같은 의미이고

 

1 - 5 라고 하면 반드시 1개와 5개가 맞물린다는 것입니다.

 

10개짜리 분산서버와 유져들간의 커뮤니케이션은 10 - * 일테고 말이죠

 

 

하지만 이것을 꼭 표기해 줄 필요는 없다고 생각합니다.

 

대부분 1:1로 맞물리는 경우이고 꼭 필요하거나 강조하고 싶은 부분에서만 표기를 하고

 

당연하다 싶은 부분은 그냥 생략하는게 좋다고 생각합니다.

 

 

 

 

reflexive 반사?

 

클래스들은 자기 자신이 자기 자신과 영향을 주고받을 수도 있습니다.

 

스크롤의 압박도 심하고 머리도 아픈데 여기서 또 이상한게 나왔네

 

아... 이건 또 뭡니까? 하시는 분들이 계시겠지만 생각보다 간단합니다.

 

 

 

코드 자체는 엉터리지만 그런건 좀 넘어가 주세요...;

 

이녀석은 자기 자신을 일방적으로 제휴합니다.

 

next만 알지 자기 이전에 대해서는 알지를 못합니다.

 

push함수에서는 자기 다음녀석을 생성해서 값을 써 넣는일만 하겠죠

 

저런식으로 자기 스스로에게 영향을 미치는 것을 반사~ 라고 합니다.

 

지금껀 반사 일방적 제휴겠죠 reflexive DirectedAssociation

 

자기 전과 후의 값을 알면 그냥 반사제휴일테고 말이죠 reflexive Association

 

 

 

그 외에 이런것들이 있습니다.

 

 

위 그림은 싱글톤 클래스 입니다.

 

자기 자신에게 연결된 끝이 마름모꼴인 직선을 주시해 주세요

 

싱글톤 클래스도 반사제휴의 대표적인 예 입니다.

 

 

그 외에도 저 그림을 보고 알아야 하는 것이

 

myClass *test ;

 

test = test->getPointer( ) ;

 

위와같이 코드를 짤텐데 말이죠

 

저녀석이 static 정적 맴버를 사용한 정적 함수처럼 작동하고 있고

 

싱글톤 클래스의 포인터를 얻고있다는 의미로 getPointer( ) 와 <<static>>를 표기해 주었습니다.

 

그 다음

 

-m_pThis: myClass *

 

밑줄 underbar은 이 변수가 static 정적 변수라는 것을 의미합니다.

 

-기호는 이 변수가 private변수라는 것을 의미

 

 

맴버 변수의 속성

 

 

 

: myClass *는 m_pThis라는 변수의 변수형이 myClass형 포인터 라는 것을 의미합니다.

 

함수의 경우

 

-init( HWND hWnd, int width, int height ) : bool

속성 함수명 인자 : 반환값

 

위와같은 형식으로 표기가 가능합니다.

 

 

 

음... 거의 끝이 나 가는군요

 

 

 

 

위 그림은 데이터 팩토링에 대해서 나타난 것입니다.

 

일단 맵과 오브젝트를 잇는 선에 1 - 0.*이라고 해서 한개의 맵과 다수의 오브젝트가 있을 수 있고

 

<<Factoring>>라고 표기도 해줬습니다.

 

그리고 지형 지형지물 캐릭터 클래스를 보면 자기 스스로를 의존하고 있는 반사 의존을 표기해

 

준 상태인데요 저것은 자기 자신의 메모리를 할당해서 되돌리는 함수를 의존한다는 뜻 입니다.

 

가능하면 <<메모리를 할당해서 되돌려주는 함수명>>으로 하는 것이 좋을 듯 합니다.

 

 

오브젝트 클래스를 보면

 

오브젝트라는 클래스 이름과 operation1( ) operation2( ) 라는 두개의 함수명이

 

옆으로 살짝 기울어져 있는 것이 보이실겁니다.

 

일단 클래스 이름이 기울어져 있는 것은

 

저것이 추상 클래스로서 인스턴스를 생성하지 않을 것이라는 것을 의미하고

 

함수 두개의 이름이 기울어져 있는 것은 저 함수들이 가상함수라는 것을 의미합니다.

 

저런식으로 가상함수와 추상 클래스를 표기해서 인터페이스를 그리는 방법도 있겠지만

 

저는 자바사용자가 아니고 C++에서는 interface라는 개념도 없어서 인터페이스에 관해서는

 

자세히 모르겠네요 ;ㅅ;

 

 

 

 

제 블로그에 있는 정보들은 모두 수정 및 퍼가는것을 제한하고 있지 않으며

 

오른클릭과 Ctrl + C도 먹으니까 자유롭게 활용하시면 됩니다.

 

그리고 필요하신 것을 요청하시면 가능한 것이라면 도와드리는 주의랍니다.

 

마음껏 가져가세요~

'SE > agile' 카테고리의 다른 글

Observer Pattern  (0) 2010.06.18
① 사용자 요구조건 조사  (0) 2010.03.18
02] XP 개발 주기의 개괄  (0) 2010.03.18
01] XP 정의, 4개 구성  (0) 2010.03.18

출처 : http://blog.naver.com/pointer98/150046033124

포맷문자열

사용해야 인자타입

실제 내부 사용 변환 타입

기본진법

정밀도

%c 

int x

(unsigned char)x 

1바이트 문자

%lc 

wint_t x

wchar_t a[2] = {x} 

2바이트 확장 문자

%d

int x

(int)x 

10 

1 

%hd 

int x

(short)x 

10 

1 

%ld 

long x

(long)x 

10 

1 

%lld 

long long int x

(long long int)x

10

1

%i 

int x

(int)x 

10 

1 

%hi 

int x

(short)x 

10 

1 

%li 

long x

(long)x 

10 

1 

%lli 

long long int x

(long long int)x

10

1

%f 

double x

(double)x 

10 

6

%Lf 

long double x

(long double)x 

10 

6 

%F

double x

(double)x 

10 

6 

%LF

long double x

(long double)x 

10 

6 

%e 

double x

(double)x 

10 

6 

%Le 

long double x

(long double)x 

10 

6 

%E 

double x

(double)x 

10 

6 

%LE 

long double x

(long double)x 

10 

6 

%g 

double x

(double)x

10 

6 

%Lg 

long double x

(long double)x 

10 

6 

%G 

double x

(double)x 

10 

6 

%LG 

long double x

(long double)x 

10 

6 

%s 

char x[]

x[0]... 

1바이트 문자열

%ls 

wchar_t x[]

x[0]... 

2바이트 확장 문자열

%p 

void *x

(void *)x 

 

%u 

int x

(unsigned int)x 

10 

1 

%hu 

int x

(unsigned short)x

10 

1 

%lu 

long x

(unsigned long)x 

10 

1 

%llu 

long long int x

(unsigned long long int)x

10

1

%o 

int x

(unsigned int)x 

8 

1 

%ho 

int x

(unsigned short)x 

8 

1 

%lo 

long x

(unsigned long)x 

8 

1 

%llo

long long int x

(unsigned long long int)x

8 

1 

%x

int x

(unsigned int)x 

16 

1 

%hx 

int x

(unsigned short)x 

16 

1 

%lx 

long x

(unsigned long)x 

16 

1 

%llx 

long long int x

(unsigned long long int)x

16 

1 

%X 

int x

(unsigned int)x 

16 

1 

%hX 

int x

(unsigned short)x 

16 

1 

%lX 

long x

(unsigned long)x 

16 

1 

%llX

long long int x

(unsigned long long int)x

16 

1 

%n 

int * x

 

 

 

%hn 

short * x

 

 

 

%ln 

long * x

 

 

 

%% 

None

'%' 

%문자

 

 

 Escape문자

 

실제 문자

Escape 문자

"

\"

"문자

'

\'

'문자

? 

\? 

?문자

\ 

\\ 

\문자

BEL

\a 

Beep

BS

\b 

Backspace: 뒤로

FF

\f 

Form feed

NL

\n 

New line: 바꿈, buffer 비움

CR

\r 

Carriage return: 라인 처음으로

HT

\t 

수평 tab

VT

\v 

수직 tab

null 

\0 

null문자

code values

\d \dd \ddd

8진수 코드값

code values

\xh \xhh

16진수 코드값

 

 

 

scanf()함수의 포맷 플래그

 

포맷문자열

사용 데이터 변수 타입

호출되는 내부 변환함수

기본진법

%c

char x[]

1바이트 문자

%lc

wchar_t x[]

2바이트 확장 문자

%d

int * x

strtol

10

%hd

short * x

strtol

10

%ld 

long * x

strtol

10 

%lld 

long long int * x

strtol

10

%i 

int * x

strtol

10 

%hi 

short * x

strtol

10 

%li 

long * x

strtol

10 

%lli 

long long int * x

strtol

10 

%f 

float * x

strtod

10 

%lf 

double * x

strtod

10 

%Lf

long double * x

strtod

10 

%F

float * x

strtod

10 

%lF

double * x

strtod

10 

%LF

long double * x

strtod

10 

%e

float * x

strtod

10 

%le

double * x

strtod

10 

%Le

long double * x

strtod

10 

%E

float * x

strtod

10 

%lE

double * x

strtod

10 

%LE

long double * x

strtod

10 

%g 

float * x

strtod

10 

%lg 

double * x

strtod

10 

%Lg

long double * x

strtod

10 

%G

float * x

strtod

10 

%lG

double * x

strtod

10 

%LG

long double * x

strtod

10 

%s 

char x[] 

1바이트 문자열

%ls 

wchar_t x[] 

2바이트 확장 문자열

%u 

unsigned int * x

strtoul

10 

%hu 

unsigned short * x

strtoul

10 

%lu 

unsigned long * x

strtoul

10 

%llu 

unsigned long long int * x

strtoul

10 

%o 

unsigned int * x

strtoul

8 

%ho 

unsigned short * x

strtoul

8 

%lo 

unsigned long * x

strtoul

8 

%llo 

unsigned long long int * x

strtoul

8

%x 

unsigned int * x

strtoul

16 

%hx 

unsigned short * x

strtoul

16 

%lx 

unsigned long * x

strtoul

16 

%llx 

unsigned long long int * x

strtoul

16 

%X

unsigned int * x

strtoul

16 

%hX

unsigned short * x

strtoul

16 

%lX

unsigned long * x

strtoul

16 

%llX 

unsigned long long int * x

strtoul

16 

%p 

void ** x

 

 

%n 

int * x

 

 

%hn 

short * x

 

 

%ln 

long * x

 

 

%[...] 

char x[] 

 

 

%l[...] 

wchar_t x[] 

 

 

%% 

None

 

 

'NativeCode > api' 카테고리의 다른 글

LoadLibrary, GetProcAddress, FreeLibrary, Name Mangling 해결  (0) 2010.11.09
IP, TCP, UDP, ICMP Checksum 계산  (0) 2010.07.05
IpHlpApi MSDN  (0) 2010.07.04
SendARP  (0) 2010.07.03
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09
패킷들은 checksum 필드를 갖고 있습니다. 이 필드를 이용해 이 패킷이 정상인지 아닌지 판단할 수 있습니다.
체크섬 계산은 간단히 할 수 있습니다.

알고리즘을 먼저 소개하겠습니다.


-- Ip Header checksum 계산--
1. ip header를 2바이트씩 자른다.
2. 체크섬 바이트를 0으로 초기화 합니다.
3. 체크섬 바이트에 짤린 바이트를 그대로 계속 더해갑니다. (sum += 각 2바이트)
4. 더해지는 sum은 4바이트여야 합니다. (올림이 생기기 때문에)
5. 다 더한다음 sum(4바이트) 중 윗 부분의 2바이트를 아랫부분의 2바이트에 다시 더합니다.
6. 다시 sum(4바이트) 중 윗 부분의 2바이트를 아랫부분의 2바이트에 다시 더합니다.

이와 같이 하는 이유는 올림이 다시 생기기 때문에 2번을 한다고 합니다.

7. 이제 2바이트가 된 sum을 1의 보수로 바꾸면 됩니다.



TCP, UDP, ICMP는 한가지 과정이 더 추가됩니다. IP Header의 정보가 필요합니다.
IP 헤더의 체크섬 계산법과 마찬가지로 20바이트에 해당하는 tcp 헤더의 값을 모두 더합니다.
데이터가 존재할경우 데이터 부분까지 더해 줍니다. 데이터가 홀수로 끝나는 부분은 주의해서 더해야 합니다.
다음으로 IP Header의 srcip, dstip를 2바이트로 잘라 더해줍니다.
부가적으로 IP Header의 protocol 필드, tcp 헤더의 길이를 더해줍니다.
여기서 tcp 헤더의 길이는 데이터 부분이 존재할경우 데이터 부분까지길이를 말합니다.
이후 IP의 체크섬과 마찬가지로 위 과정에서 발생한 케리값을 더해주는 과정을 거쳐 체크섬 계산이 완성됩니다.





UDP, ICMP의 경우는 TCP 체크섬 계산과 똑같습니다.

Bloger : moltak.net

'NativeCode > api' 카테고리의 다른 글

LoadLibrary, GetProcAddress, FreeLibrary, Name Mangling 해결  (0) 2010.11.09
printf, scanf 함수 포맷 문자열  (0) 2010.07.07
IpHlpApi MSDN  (0) 2010.07.04
SendARP  (0) 2010.07.03
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09
iphlpapi 라이브러리의 msdn 소스 입니다.
굉장히 좋네요. 
NIC 이름과 설명 뿐만 아니라 아이피 NDIS 버젼등등 많은 정보가 나옵니다. 





Bloger: moltak.net

'NativeCode > api' 카테고리의 다른 글

printf, scanf 함수 포맷 문자열  (0) 2010.07.07
IP, TCP, UDP, ICMP Checksum 계산  (0) 2010.07.05
SendARP  (0) 2010.07.03
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09
WSAGetLastError()  (0) 2010.04.06
이놈의 SendARP 사용법을 자꾸 까먹네요.ㅠㅠ
그래서 아예 사용법을 올리기로....
이 함수가 변수가 많이 필요해서 자꾸 헷갈립니다. 다른 분들도 그러시나;;
설마 나만?? ㅋㅋ


SendARP는 한 세그먼트에 있는 다른 시스템의 MAC을 얻을 때 사용합니다.
MAC 주소는 48비트이기 때문에 [unsigned char] 가 6개 필요하겠네요.
그리고 아이피 주소를 [unsigned int] 형으로 바꿔 줄 필요가 있습니다.
아래의 소스에서 MAC 주소를 알아낼 대상은 "192.168.0.2" 인 것을 알 수 있네요.

변수만 잘 보신다면 쉽게 사용하실 수 있을 듯 합니다.


Bloger: moltak.net

'NativeCode > api' 카테고리의 다른 글

IP, TCP, UDP, ICMP Checksum 계산  (0) 2010.07.05
IpHlpApi MSDN  (0) 2010.07.04
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09
WSAGetLastError()  (0) 2010.04.06
Sock 정보들  (0) 2010.04.04

옵져버 패턴입니다.

 

의도:

일대다의 관견성을 갖는 객체들의 경우 한 객체의 상태가 변하면 다른 모든 객체에게 그 사항을 알리고 필요한 수정이 자동으로 이루어지도록 할 수 있어야 한다.

 

 

활용성:

추상화 개념이 두 가지의 측면을 갖고 하나가 다른 하나에 종속적일 때. 이런 종속 관계를 하나의 객체로 분리시켜 이들 각각을 재사용할 수 있다.

한 객체에 가해진 변경으로 다른 객체를 변경해야 할 때 프로그래머들은 얼마나 많은 객체들이 변경되어야 하는지를 몰라도 된다.

객체는 다른 객체에 변화를 통보할 수 있는데, 변화에 관심 있어 하는 객체들이 누구인지에 대한 가정 없이도 이루어져야 할 때.

 

 

보통 GUI 툴킷을 이용해서 프로그램을 작성하면 사용자에게 보여주는 UI와 데이터는 따로 나눠서 관리하게 됩니다. 그런 상황에서 하나의 데이터와 여러 개의 UI가 있을 경우 데이터를 공유시켜야 합니다. 그런 상황에서 옵져버 패턴을 사용하게 되면 굉장히 편합니다. Subject의 상태가 변화됨에 따라 Observer들의 상태가 자동으로 바뀌기 때문입니다.

 

 

 



Subject를 상속받는 ObserverManager의 상태가 변경되면 그 변경사항들이 옵져버들에게 반영됩니다.

 

 

Bloger: moltak.net

'SE > agile' 카테고리의 다른 글

UML: 클래스 다이어그램 기초  (0) 2010.07.08
① 사용자 요구조건 조사  (0) 2010.03.18
02] XP 개발 주기의 개괄  (0) 2010.03.18
01] XP 정의, 4개 구성  (0) 2010.03.18

안녕하세요. 오랜만의 블로깅입니다. 이제 부지런히 해야겠어요.ㅋㅋ

이놈의 게으름… 귀차니즘….

 

오늘의 주제는 MySql을 C++이나 MFC에서 사용하기 입니다.

Visual Studio를 깔면 자동으로 MSSQL이 설치됩니다. 이것을 C++, MFC에서 사용할 수 있죠.

하지만 전 개인적으로 MySql, SQLite같은 것들을 더 좋아합니다. ㅋㅋ

 

설치법은 굉장히 간단하니 한번 시작해 보도록 할게요.

 

http://www.mysql.com/ 에 들어 가시면 Downloads 탭이 있습니다.


 

들어가셔서 Community Server 버전을 다운 받으세요.


 

플랫폼은 Windows 버전으로 다운 받으세요.

 

다운을 다 받은 후 실행하면 설치 옵션이 있는데 그 때 꼭 Custom Setup을 선택하세요.

그 후 C Include Files / Lib Files 를 선택하세요.

 

 

여기까지 하시면 Library 설치는 다 끝났습니다. 이제 사용만 하면 됩니다.

 

VS의 도구->옵션에 들어가셔서 Library 설정하시면 바로 사용가능합니다.

 

 

저는 위 그림처럼 include와 lib를 설정했습니다.

 

 

이제 예제 소스를 보도록 하죠.

MySql Library는 다음과 같은 순서로 진행됩니다.

mysql_init() -> mysql_real_connect() -> mysql_query() -> mysql_store_result() -> mysql_fetch_row() -> mysql_free_result() -> mysql_close()

다른 DB Library와 비슷한 순서로 진행됨을 알 수 있습니다.

 

 

 

위와 같이 하면 잘 됩니다. ^^

모두들 즐프 하세요!!ㅋㅋ

 

 

 

Bloger: moltak.net

'NativeCode > mfc' 카테고리의 다른 글

D-H,appy :: MFC list control 사용  (2) 2010.07.28
CDC 글 쓰기  (0) 2010.03.18
Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18
안녕하세요. moltak입니다. 

오랜만에 자랑할 것이 있어서ㅋㅋ
멤버십에서 4개월간 프로젝트를 진행했었는데요...
멤버십에서 좋은 결과를 받진 못했지만
대회에서는 좋은 결과를 받았네요.

제가 나간 대회는 마이크로소프트에서 주최하는 이매진컵 2010 임베디드 부문이었습니다.
(대구까지 갔어요. 아 더워 대구 =_= ) 
국내 본선까지 나가서 운좋게 2등까지 수상했네요.
1등을 못한게 굉장히 아쉽지만!! 이것도 어딥니까ㅋㅋ

인증샷!!




개인 인증서와 2위라는 상장 하나밖에ㅠㅠ
제 다리위에 놓인 2위... 폴란드를 못가서 밑에 상금은 보이지도 않더군요..ㅠㅠ
폴란드 가자고 팀원끼리 약속했었는데ㅠㅠ

그래도 좋은 성적으로 입상했으니 만족합니다. ㅋㅋ
우리 팀장 또람이, 작업 + 멘토 종오형, 복덩이 경진이 수고했어ㅋㅋ


Bloger: moltak.net

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

Out of the Box  (0) 2011.03.08
공부 테크니션의 여덟 가지 필살기  (2) 2010.10.11
아아아아악  (0) 2010.05.08
CodeEngn Basic 완료  (2) 2010.04.28
아~~~ 블로그 옮기고 있습니다.  (3) 2010.03.18
예전에 typeid 포스팅을 한 적이 있습니다. (http://moltak.net/search/typeid) 참조
열심히 플젝을 하던 중 원하는 결과값이 안나와서 왜 그런가 하고 한시간 가량 삽질 끝에 알아 냈네요.;;

위 포스팅을 보시면 typeid( type ).name()을 통해서 type의 이름을 얻어 오는 것이 있습니다.
.name() 함수가 현재 타입을 알려주는 역할을 하죠.
저는 아래와 같이 사용하고 있었습니다.


다들 아시겠지만 우리가 원하는 결과는?? 젤 아래 결과가 당연히 Sub가 나와야 맞습니다.
하지만 그렇지 않더군요. 결과를 먼저 볼까요?

위와 같이 전부 Super 클래스가 나왔네요?? 왜 그런걸까요? 제가 잘 못했겠죠?? 아직 확실한 이유는 모르지만 결과를 올바르게 바꾸는 방법은 알아 냈습니다.





바로 위 소스와 같이 사용하지 않는 하나의 함수를 집어 넣는 것입니다. C++은 상속을 받았을 때, 가상함수 테이블이 생기게 됩니다. typeid는 클래스의 경우 가상함수 테이블을 보고 type을 결정짓지 않나 생각이 드네요.
정확히 아시는 분은 알려주세요. ㅠㅠ 기다리겠습니다. ㅋㅋ


Bloger: moltak.net


'Programming > 이것저것' 카테고리의 다른 글

Doxygen - 작성중  (0) 2011.03.08
_Crt Debug Functions  (0) 2010.07.23
세그먼트 레지스터  (0) 2010.05.01
x86 Register  (0) 2010.04.30
어셈블리어 점프 명령어  (0) 2010.04.29

혹시나 싶어서 여기 게시판에서 검색하니 나오지 않더군요..

모르시는 분들 계실까봐 적어봅니다...

 

 

보통 잘못된 메모리 영역에 쓰기를 하는 경우(memory corruption) 오류가 즉시 발생하지 않습니다..

이런 오류를 잡기가 참으로 난감한데요..

 

그럴 때 _ASSERT(_CrtCheckMemory()); 를 많이 사용하셨을 겁니다.

 

-------------------------------------------------

_CrtCheckMemory()에 대한 사용법은.. 아실거라고 가정하고..

DCRT를 사용하기 위한 준비 작업만 간단하게 적어봅니다.

 

//stdafx.h 제일 처음에 선언

#define _CRTDBG_MAP_ALLOC   

 

//stdafx.h 제일 마지막에 선언

#include <crtdbg.h>    

// main() 제일 처음에 선언

 _CrtSetDbgFlag(
  _CRTDBG_CHECK_ALWAYS_DF
  |_CRTDBG_LEAK_CHECK_DF
  |_CRTDBG_ALLOC_MEM_DF
  |_CRTDBG_DELAY_FREE_MEM_DF
  );

-------------------------------------------------------

 

그런데 _CrtCheckMemory()를 사용해서 커럽션 발생 유무는 확인 할 수 있어도

어느 부분이 문제인지는 알 수 없습니다.

결국  _ASSERT(_CrtCheckMemory()); 를 의심되는 코드에 넣어가면서 범위를 좁히게 되는데요..

그럼에도 불구하고 문제를 해결하기 난감한 상황이 올 수 있습니다.

 

그럴 때 아래와 같은 코드를 사용하면 효험을 볼 수 있습니다.

 

_ASSERT(_CrtIsMemoryBlock(buffer, size, NULL,NULL,NULL));

 

_CrtIsMemoryBlock()는 지정된 메모리 영역이 올바른 힙 메모리인지 검증합니다.

 

스택 메모리나.. 이런 것은 안 됩니다. 힙만 됩니다.

 

그래서.. IOCP와 같은 비동기로 메모리에 쓰기 요청을 하기 전에 위와 같은 코드로 검증을 하면..

커럽션이 발생할 것인지 미리 알 수 있습니다.

 

상큼하게..

 

 void Transfer::PreRequest(BYTE* buffer, int size)
 {
    _ASSERT(_CrtIsMemoryBlock(buffer, size, NULL,NULL,NULL));

 }

 

위와 같이 전달 받은 포인터로 작업을 하는 함수의 제일 상단에 검증하는 코드를 넣어주면...

뭔가 있어 보입니다... ^^

 

------------------------------------------------------------

퇴근 시간이 조금 남아서 예제 하나 만들어 봤습니다.

진작 만들걸.. 하는 후회가 듭니다... T_T

 

#define _CRTDBG_MAP_ALLOC

 

#include <tchar.h>

#include <memory>

 

#include <crtdbg.h>

 

int _tmain(int argc, _TCHAR* argv[])

{

        _CrtSetDbgFlag(

               _CRTDBG_CHECK_ALWAYS_DF

               |_CRTDBG_LEAK_CHECK_DF

               |_CRTDBG_ALLOC_MEM_DF

               |_CRTDBG_DELAY_FREE_MEM_DF

               );

 

 

        int* p=new int[10];

        const int size=sizeof(int)*10;

 

        //p[9]까지유효하기때문에p[10]에무언가를기록하면

        //Memory Corruption이다커럽션이발생한이후에

        //_CrtCheckMemory()를실행하면false를리턴한다.

        _ASSERT(true==_CrtCheckMemory());

        p[10]=0;

        _ASSERT(false==_CrtCheckMemory());

 

        //할당한후_CrtIsMemoryBlock로영역을체크하면true를리턴

        _ASSERT(true==_CrtIsMemoryBlock((const void *)p, size, NULL, NULL, NULL));

 

        //할당된 메모리의 제일 처음이 아닌 임의의 주소를 검사하면 false 리턴

       //찾아보지는 않았지만 메모리 할당 테이블을 유지하고 있는데..

       //이 테이블에서 p+2로 탐색이 안 되서 그럴거라 추측합니다.

       //아시는 분의 제보 기다립니다.

        _ASSERT(false==_CrtIsMemoryBlock((const void *)p+2, size-2, NULL, NULL, NULL)); 

 

        //pdelete 한후에_CrtIsMemoryBlock로영역을체크하면

        //올바르지않은힙영역이기때문에false가리턴된다.

 

        delete[] p;

        _ASSERT(false==_CrtIsMemoryBlock((const void *)p, size, NULL, NULL, NULL));

 

        return 0;

}

'NativeCode > api' 카테고리의 다른 글

IpHlpApi MSDN  (0) 2010.07.04
SendARP  (0) 2010.07.03
WSAGetLastError()  (0) 2010.04.06
Sock 정보들  (0) 2010.04.04
소켓 옵션  (0) 2010.04.01

NDIS 드라이버 공부 내용 정리합니다.

http://www.htsns.com 를 참조해서 작성 되는 내용이므로 정확한 내용을 원하시는 분은 참고하시길 바랍니다.

 

드라이버를 공부하시려면 꼭 기억해야 될 내용이 있습니다. 일반적인 드라이버를 짤 때 우리는 아래 그림과 같은 문장을 사용합니다.

이 그림이 뭘 의미 하는 걸까요? 바로 콜백함수의 등록입니다. NDIS 드라이버도 마찬가지지만 콜백을 잘 끼워 맞추기만 하면 됩니다.

콜백의 기능, 전체적인 콜백 호출 흐름, 각 콜백 안에서 호출해야 할 API들을 파악했다면 NDIS의 절반 이상을 이해한 것이라고 합니다. (참조: http://xeraph.com/4787739)

 

 

IntermediateDriver의 초기화는 처음 공부하는 저에게는 상당히 어렵더군요. (사실 아직도 이해하는 중입니다.)

이 글에서는 일반적인 드라이버의 DriverEntry와 Intermediate 드라이버의 DriverEntry를 비교하겠습니다. 그래서 어떻게 다른지 개략적으로 설명하고 다음 글에서부터 본격적으로 분석을 해보도록 하겠습니다.

Intermediate 드라이버의 예제는 DDK 폴더 안의 passthru라는 예제가 있습니다. 그 예제를 기반으로 설명하겠습니다.

 

일반적인 드라이버의 경우 IoCreateDevice를 호출해서 드라이버를 생성하게 됩니다. 그 후 심볼릭(Symbolic) 링크를 만들고 MajorFunction(DDK WDM 문서 참조)의 콜백함수를 지정하는 것으로 넘어가게 됩니다.

 

 

하지만 NDIS 드라이버의 경우 많이 다릅니다. 우리가 작성하려고 하는 NDIS Intermediate Driver의 예를 들자면 여러 초기화 과정이 필요하게 됩니다.

passthru의 DriverEntry 함수를 보시면 크게 네 개의 초기화 단계(아래 그림 참조)로 나눌 수 있습니다.

또한, DDK 문서(참고: moltak.net: NDIS Driver 02) Intermediate Driver)에 MiniportXxx, ProtocolXxx함수를 노출시켜야 한다고 설명하고 있습니다.

그래서 NDIS의 초기화 단계는 Miniport, Protocol Driver의 콜백함수를 설정해야 합니다.

 

 

 

1. NdisMInitializeWrapper을 호출하고 NdisWapperHandle에서 리턴된 핸들을 지정한다.

2. 드라이버의 MiniportXxx 함수들을 등록하기 위해서 NdisIMRegisterLayeredMiniport를 호출하고 스텝 1에서 얻어진 핸들을 인자로 보낸다.

NdisMinitializeWrapper 함수를 호출해서 NDIS_HANDLE을 얻어 올 수 있습니다.(NdisWrapperHandle 변수)

그리고 이 변수를 이용해서 우리는 MiniportXxx와 ProtocolXxx를 노출 시켜줄 수 있습니다.

위 소스에서 MChars라는 변수에 여러 가지 콜백함수를 설정하고 있는 것을 볼 수 있습니다.

현재는 이것을 통해서 콜백을 등록하고 가장 아래 있는 NdisIMRegisterLayeredMiniport를 이용 MiniportXxx를 등록한다고만 아시면 됩니다. (자세한 설명은 다음 블로깅을 통해 하도록 하겠습니다.)

 

 

3. 만약 드라이버가 그 자신을 밑의 NDIS 드라이버에게 다음에 바인드 한다면 드라이버의 ProtocolXxx 함수들을 등록하기 위해서 NdisRegisterProtocol을 호출한다.

위 소스도 ProtocolXxx함수를 노출시키기 위해서 하는 것입니다. 각종 콜백함수를 등록하고 아래에 있는 NdisRegisterProtocol을 통해 인터미디엇 드라이버의 ProtocolXxx함수들을 노출시킵니다. 각 콜백함수의 내용은 복잡하고 역할은 아직 잘 모릅니다. (알아야 할게 너무 많네요ㅠㅠ)

 

 

4. 만약 드라이버가 MiniportXxx와 ProtocolXxx함수들 둘 다를 드러낸다면, 드라이버의 미니포트 하위경계와 프로토콜 상위경계에 대해서 NDIS 라이브러리를 형성하기 위해서 NdisIMAssociateMiniport를 호출한다.

우리는 MiniportXxx와 ProtocolXxx함수를 노출하길 원합니다. (노출하기 원하지 않다면 한 개의 핸들만 넣어도 되는 건지는 확실하지 않네요. ㅠㅠ)

NdisIMAssociateMiniport 함수는 NDIS에게 미니포트와 프로토콜을 위한 특정 lower와 upper 인터페이스들이 각각 같은 인터미디엇 드라이버에 속한다는 것을 알립니다.

 

 

여기까지 해서 DriverEntry에 대한 개략적인 설명이 끝났습니다. 원본 소스파일은 ddk\src\network\ndis\passthru\driver\passthru.c 파일을 참조하시기 바랍니다.

다음은 인터미디엇 드라이버의 DriverEntry에서 Miniport를 등록하는 부분을 더욱 세세하게 설명을 하도록 하겠습니다. 내용이 많아서 몇 챕터로 쪼개서 해야겠네요. 아무튼 모두들 즐공! 즐프! 하세요.

 

 

Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 02) Intermediate Driver  (0) 2010.05.06
NDIS Extending The PassThru IM Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18
할게 굉장히 많네요. 학교 플젝, 멤버십 플젝, 다음달 플젝 준비, sig, 드라이버 공부 등등..........
우선 리버싱을 놔야겠네요ㅠㅠ
올해 가기전에 꼭 CodeEngn과 헬바운드 다 풀고 싶어요ㅋ
암튼.... 전 다시 열공하러ㅋㅋㅋㅋ

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

Out of the Box  (0) 2011.03.08
공부 테크니션의 여덟 가지 필살기  (2) 2010.10.11
이매진컵!! 자랑자랑..  (0) 2010.05.29
CodeEngn Basic 완료  (2) 2010.04.28
아~~~ 블로그 옮기고 있습니다.  (3) 2010.03.18

안녕하세요. moltak 입니다.

오늘은 드라이버 개발을 한다면 꼭 알아야 할 VMWare WinDBG 설정 방법을 포스팅 하겠습니다.

 

준비물: VMWare(6.5이상), WinDBG(6.0 이상), 꼭 해내겠다는 마음가짐.

 

세 개의 준비물만 갖추셨다면 완벽합니다.

세팅 순서는 VMWare->WinDBG 순서로 진행하겠습니다.

 

1. VMWare에 WindowsXP를 설치해 주세요. (다들 이미 너무 잘 아시는 내용)

2. 처음 WindowsXP를 VMWare에 설치하시고 가상 머신 세팅에 들어갑니다. (그림 참조)

3. 아래 Add 버튼을 누르셔서 Serial Port를 선택하세요.

4. Output to named pipe를 선택하세요. (그림 참조)

 

 

5. 아래 그림과 같이 세팅합니다. (Named pipe는 굉장히 중요하니 꼭 기억해 두세요.)

6. Yield CPU on poll 체크를 꼭 해주세요.

 

 

7. 아래 그림과 같이 세팅 되었을 겁니다.

 

 

8. 이제 VMWare안에 깔려있는 WindowsXP로 부팅합니다. 시스템 등록 정보-> 고급-> 시작 및 복구로 들어갑니다. 그리고 편집을 클릭합니다.

 

 

9. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" 뒤에 /fastdetect /debug /debugport=COM1 /baudrate=115200를 추가 합니다.

이상으로 VMWare 세팅은 끝났습니다. 이제 WinDBG 설정을 하겠습니다.

 

 

10. WinDBG의 속성 창을 열어주세요.

빨간색 네모 박스 위치에 대상 뒤에 -b -k com:pipe,port=\\.\pipe\WDK,resets=0 를 붙여 넣어 주세요

 

 

자 이제 WinDBG를 열어 보세요. 근데 아래 그림과 같은 오류가 날 수 있습니다.

 

왜냐하면 VMWare에서 우리가 설정해준 Windows가 구동 중이 아닐 때 위와 같은 오류가 납니다.

이 것을 해결 하려면 Windows가 부팅 중일 때 WinDBG를 실행시키시면 해결할 수 있습니다.

 

 

그림처럼 vmware를 실행하자 마자 windbg 실행!! 그러면 됩니다.ㅋㅋㅋ

자 다들 아셨으니 공부합시다. ㅋㅋ 즐공 즐프요!!

 

 

 

Bloger: moltak.net

'scrap' 카테고리의 다른 글

유목문화에서 배우는 벤쳐경영  (0) 2012.03.16
말라리아를 진단하는 스마트폰 이야기  (0) 2012.03.14
방화벽 정책에 관하여  (0) 2010.04.29
방화벽 정책(예)  (0) 2010.04.29
방화벽 정책  (0) 2010.04.29

NDIS 드라이버 공부 내용 정리합니다.

http://www.htsns.com 를 참조해서 작성 되는 내용이므로 정확한 내용을 원하시는 분은 참고하시길 바랍니다.

 

NDIS 드라이버는 Miniport, Intermediate, Protocol 타입의 네트워크 드라이버들을 제공합니다.

3타입의 네트워크 드라이버들이 어떤 역할을 하는지 차근차근 알아보도록 하겠습니다.

 

 

1. Miniport Driver

Miniport Driver(이하 미니포트 드라이버)는 두 가지 역할을 수행합니다.

그림에서 보시는 바와 같이 NIC(Network Interface Card)바로 위에 위치해 있습니다. 미니포트 드라이버는 NIC을 통해 데이터를 보내고 받는 것을 포함해서, NIC을 관리합니다. 또, Intermediate Driver(이하 인터미디엇 드라이버)와 같은 상위 레벨 드라이버들과 통신합니다.

 

미니포트 드라이버는 NDIS 라이브러리를 통해 NIC과 그리고 상위 레벨 드라이버들과 통신합니다. NDIS 라이브러리는 미니포트가 호출하는데 필요한 운영체제의 모든 시스템 함수들을 캡슐화하는 NdisXxx함수들을 익스포트 합니다. 미니포트 드라이버는 상위 레벨 드라이버들이 미니포트 드라이버에 접근하기 위해서 또는, 자기 자신을 위해서 NDIS가 호출하는 엔트리 포인트들(MiniportXxx 함수들)을 익스포트 해야 합니다. 송/수신 연산들(패킷을 보내고 받고 하는 것을 말하는 듯)은 미니포트 드라이버들과 NDIS 상위 레벨 드라이버들간에 상호 작용입니다.

 

- 전송 계층 드라이버가 전송하고자 하는 패킷들을 가지고 있을 때, 전송 계층 드라이버는 NDIS라이브러리에 의해 익스포트 되어지는 NdisXxx 함수를 호출합니다. NDIS는 그러고 나서 미니포트에 의해 익스포트된 적당한 MiniportXxx함수를 호출함으로써 미니포트에게 패킷을 전달합니다. 패킷을 받은 미니포트 드라이버는 적당한 NdisXxx함수들을 호출함으로써 전송을 위해 NIC에게 패킷을 포워드 합니다.

 

- NIC이 패킷을 수신할 때, NDIS 혹은 NIC의 미니포트에 의해 처리될 수 있는 하드웨어 인터럽트를 포스트 할 수 있습니다. NDIS는 적당한 MiniportXxx함수를 호출함으로써 NIC의 미니포트 드라이버에게 알립니다. 미니포트 드라이버는 NIC으로부터 데이터 전송을 설정하고 그리고나서 적당한 NdisXxx 함수를 호출함으로써 바인드된 상위레벨 드라이버들에게 수신된 패킷의 존재를 (Indicate)알립니다.

 

 

2. Intermediate Driver

 

드라이버 계층도에서 보면 인터미디엇 드라이버는 Protocol Driver(이하 프로토콜 드라이버)와 미니포트 드라이버들 사이에 위치합니다. 그래서 "위"의 프로토콜 드라이버와 "아래"의 미니포트 드라이버들과 통신을 수행해야 합니다.

 

- Lower Edge에서 인터미디엇 드라이버는 NDIS가 미니포트 드라이버와 통신하기 위해 호출하는 프로토콜 엔트리 포인트들(ProtocolXxx 함수들)을 노출합니다. 미니포트 드라이버가 인터미디엇 드라이버를 볼 때 인터미디엇 드라이버는 프로토콜 드라이버가 되는 것으로 나타납니다.

 

- Upper Edge에서 인터미디엇 드라이버는 NDIS가 프로토콜 드라이버와 통신하기 위해 호출하는 미니포트 엔트리 포인트들(MiniportXxx 함수들)을 노출합니다. 프로토콜드라이버가 인터미디엇 드라이버를 볼 때 인터미디엇 드라이버는 미니포트 드라이버가 되는 것으로 나타닙니다.

 

- 인터미디엇 드라이버 요약 정리: 인터미디엇 드라이버는 upper edge에서 MiniportXxx 함수들의 subset을 익스포트 합니다. 하지만 실제로 물리 NIC을 관리하지는 않습니다. (NIC의 관리는 Miniport Driver가 합니다.) 그 대신에, 인터미디엇 드라이버 위의 프로토콜들이 바인드 할 수 있는 하나, 혹은 그 이상의 가상 어댑터들을 익스포트 합니다. 그리고 프로토콜 드라이버들은 인터미디엇 드라이버에 의해 익스포트되어지는 가상 어댑터들이 물리 NIC이 되는 것으로 보이게 됩니다.

프로토콜 드라이버가 가상 어댑터(인터미디엇 드라이버가 익스포트 한)에 요구 혹은 패킷들을 보낼 때, 인터미디엇 드라이버는 이런 요청과 패킷을 아래 미니포트 드라이버에 전달하게 됩니다.

 

- 인터미디엇 드라이버는 일반적으로 다음과 같이 사용됩니다.

다른 네트워크의 사이를 변환하기 위해: 예를 들어, Ethernet과 Token Ring 전송 계층들과 ATM 미니포트 사이에 인터미디엇 드라비어의 함수는 Ehternet과 Token Ring 패킷들을 ATM패킷들로 맵하거나 그 반대로 맵합니다.

패킷들을 필터하기: 방화벽 같은 것을 만들 때 사용합니다.

하나 이상의 NIC과 관련해서 패킷 전송의 균형을 맞춘다: 패킷을 분산합니다.(??)

 

 

3. Protocol Driver

드라이버들의 NDIS 계층도에서 가장 위에 있는 프로토콜 드라이버는 TCP/IP혹은 IPX/SPX 스택과 같은 전송 프로토콜 스택을 실행하는 전송 계층 드라이버내에서 가장 낮은 레벨 드라이버로서 사용됩니다. 전송 계층 드라이버는 패킷들을 할당하며 어플리케이션이 보내는 데이터를 패킷에 복사하며, 또 이러한 패킷들을 NDIS 함수들을 호출함으로써 낮은 레벨 드라이버에게 보냅니다. 프로토콜 드라이버는 낮은 레벨 드라이버로부터 들어오는 패킷들을 수신하기 위해 프로토콜 인터페이스를 제공합니다. 전송 계층 드라이버는 수신된 데이터를 요청된 클라이언트 어플리케이션에 전송합니다.

 

Lower Edge에서 프로토콜 드라이버는 인터미디엇 드라이버들과 미니포트 NIC드라이버들에 인터페이스 합니다. 프로토콜 드라이버는 패킷들을 보내기 위해서 NdisXxx함수들을 호출하고, Lower 레벨 드라이버들에 의해 유지된 정보를 읽고 설정하고 운영체제 서비스들을 사용합니다. 프로토콜 드라이버는 NDIS가 수신한 패킷들을 위로 전송하기 위해서 그리고 Lower 드라이버들의 상태를 알기 위해, 혹은 자신의 목적을 위해 호출하는 엔트리 포인트들(ProtocolXxx 함수들)의 집합을 익스포트 합니다.

 

Upper Edge에서 전송 계층 프로토콜 드라이버는 프로토콜 스택에서 상위 레벨 드라이버에 대한 private 인터페이스를 갖게 됩니다.

 

 

4. 정리

위 그림은 이제까지 설명해왔던 내용을 알기 쉽게 나타내 주는 그림입니다. (제 개인적인 생각)

위 그림에서는 Intermediate Driver가 빠져 있습니다. 대신 Wrapper가 포함되어 있죠. 이 것을 보고 여러가지로 생각 할 수 있겠지만 오늘 공부한 내용을 토대로 생각해 본다면 Intermediate Driver는 단순히 Miniport Driver의 Wrapper로 생각할 수 있다는 것입니다. (Miniport <-> Intermediate <-> Protocol 의 관계를 생각해 보세요) Intermediate Driver를 Miniport에 대한 Wrapper로 생각한다면 이해하기가 더 쉽습니다. 어떤 요청이던지 저 방어망을 치고 있는 Wrapper를 뚫지 않고서는 Miniport에게 갈 수가 없습니다. 그리고 Wrapper는 Upper Edge에 대해서는 자신이 Miniport인 것처럼 행세 할 것이며 Lower Edge에 대해서는 Protocol인양 행세 할 것입니다.

다만 NIC과 Miniport Driver와의 관계는 좀 이상하긴 하지만 그거 빼고는 맞는 것 같습니다. (아하하하하하;;)

이 글에서 가장 중요한 것은… 바로 제 프로젝트를 완수 하려면 어떤 드라이버에서 해도 상관 없지만 보통 Intermediate Driver에서 수행한다는 것입니다. (사실 Miniport에서도 할 수 있고 Hook Driver를 만들어서도 할 수 있습니다.)

 

 

 

Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 03) Intermediate Driver 초기화  (0) 2010.05.09
NDIS Extending The PassThru IM Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18
이 자료는 정말 마음에 드네요. (아직 다 보지는 못했지만)


Thomas F. Divine님과 James Antognini님이 작성한 문서입니다.
DDK를 깔면 예제로 깔리는 PassThru를 확장해서 설명해 놓으셨습니다.
처음 Intermediate(IM) Driver를 공부하려고 하면 정말... 어떻게 해야 할지 막막했습니다.
DDK 문서와 이 문서를 갖고 계속 공부를 해 나가야겠습니다.
그럼 모두 즐프하세요.


Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 03) Intermediate Driver 초기화  (0) 2010.05.09
NDIS Driver 02) Intermediate Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18

NDIS 드라이버 공부 내용 정리합니다.

http://www.htsns.com 를 참조해서 작성 되는 내용이므로 정확한 내용을 원하시는 분은 참고하시길 바랍니다.

 

Chapter1 네트워크 드라이버 디자인 가이드에 대한 로드맵

Windows2000(XP, 2003 포함)은 세가지 기본 타입의 커널 모드 네트워크 드라이버들을 제공합니다. 이 세가지 타입에 대해서 정확히는 아니더라도 대략적으로 알고 있어야 차후 드라이버를 작성할 때 선택해서 할 수 있을 것입니다. 그러니 세 개다 살펴 보도록 하겠습니다. 그 전에 먼저 Windows의 Network Layer 부 터 알아보도록 하겠습니다.

 

 

위에 보시는 것이 Windows의 Network Layer입니다.

[참조: http://subsub.windowstest.net/bbs/view.asp?tb=ndis&no=221 ]

 

보통 Network 드라이버를 짤 때 NDIS와 TDI를 사용하게 됩니다. 만약 TDI Filter를 개발한다면 얻을 수 있는 것은 IP, Port, Application Protocol(TCP 이후의 데이터)를 얻을 수 있으며 모니터링, 변조, 차단등을 할 수 있다고 합니다. NDIS Protocol Driver를 개발한다면 Ethernet Header, IP Header, TCP Header, App Protocol까지 모든 Raw Packet의 정보를 얻을 수 있다고 하네요. 하지만 직접적인 변조, 차단을 할 수 없다고 합니다. 그것을 하기 위해서는 NDIS Intermediate 드라이버나 NDIS Hook Driver 혹은 WFP(Windows Filtering Platform) 드라이버를 작성해야 한다고 합니다.

 

 

 

1. Miniport NIC Drivers

미니포트 드라이버는 직접 NIC을 관리하고 상위 레벨 드라이버들에 대한 인터페이스를 제공한다. (NDIS DDK 문서)

 

 

2. Intermediate Drivers

인터미디엇 프로토콜 드라이버는 legacy 전송 드라이버와 같은 상위 레벨 프로토콜 드라이버들과 미니포트 사이에 인터페이스이다. 일반적인 인터미디엇 프로토콜 드라이버를 개발하는 일반적인 이유는 존재하는 legacy 드라이버와 전송 드라이버에 알려지지 않은 새로운 미디어 타입을 위한 NIC을 관리하는 미디포트 사이에 미디어 전환을 행하는 거다.

 

 

3. Protocol Drivers

상위 레벨 프로토콜 드라이버는 TDI 인터페이스를 실행하거나 네트워크 사용자들에 대한 서비스들을 제공하기 위해 상위 edge에 또 하나의 어플리케이션 특정 인터페이스를 행한다. lower edge에 이러한 타입의 드라이버는 다음 lower 드라이버로부터 들어오는 패킷들을 수신하고 패킷들을 프로토콜 인터페이스에 제공한다. 또 하나의 타입의 프로토콜 드라이버는 연결 지향 콜 매니저이다. 콜 매니저는 프로토콜 드라이버인 연결 지향 클라이언트들을 위해 서비스들을 콜 설정하고 tear-down 을 제공한다.

 

 

Windows2000에 의해 제공되는 또 하나 타입의 커널 모드 드라이버는 필터 hook 드라이버이다. 필터 패킷들에 사용되는 필터-hook 드라이버는 운영체제에 의해 제공되는 IP 필터 드라이버의 기능을 확장한다.

작성하려고하는 드라이버 타입의 상관없이 Part 1, Network Drivers Design Guide 의 Chapter 2-3을 읽어야 한다. 이러한 장들은 Windows2000네트워크 아키텍처와 프로그래밍 고려 사항들을 토론한다. 또한 Part5, Chapter 1을 읽어야 한다. 이 장은 네트워크 요소들을 인스톨하기 위해 사용된 네트워크 INF 파일들을 토론한다. 만약 네트워크 드라이버가 예를 들어 바인딩을 제어하기 위해 notify 객체를 요구한다면은, Part 5, Chapter 2를 읽어라.

읽어야 할 추가적인 chapters들을 알기 위해, 다음 그림에서 적당한 드라이버 타입을 클릭하라. 이것은 드라이버 타입의 선택을 재 정의하도록 하고 그 섹션으로 점프할 것이다.

Miniport Drivers

작성할 다음과 같은 타입을 선택한다.

Connectionless Miniport

만약 Ethernet, FDDI, 혹은 Token Ring과 같은 비연결 지향 네트워크 미디어을 위해 NIC을 제어하는 미니포트를 작성한다면은,

Part 2, Chaters 1-7, 9을 읽어라.

WAN Miniport

만약 WAN NIC을 제어하는 미니포트를 작성한다면은,

Part 2, Chapters 1-9를 읽어라.

Connection-Oriented Miniport

만약 ATM 혹은 ISDN과 같은 연결 지향 네트워크 미디어을 위한 NIC을 제어하는 미니포트를 쓴다면은,

Part 2, Chapters 1-7, 9
Part 4, Chapter 1을 읽어라.

Integrated Miniport Call Manager(MCM)

만약 콜 매니저 서비스들을 제공하는 연결 지향 NIC을 제어하는 미니포트를 작성한다면은,

Part 2, Chapters 1-7, 9
Part 3, Chapter 2
Part 4, Chapter 1 를 읽어라.

 

 

Intermediate Drivers

작성할 인터미디엇 타입을 선택한다.

With a Connectionless Lower Edge

만약 lower edge가 비연결지향 미니포트들에 대한 인터페이스를 제공하는 인터미디엇 드라이버를 작성한다면은

Part 3, Chapter 1을 읽어라.

With a Connection-Oriented Lower Edge

만약 lower edge가 연결 지향 미니포트들에 대한 인터페이스를 제공하는 인터미디엇 드라이버를 제공한다면은,

Part 3, Chapter 1
Part 4, Chapter 4를 읽어라.

 

 

Protocol Drivers

작성할 프로토콜 드라이버의 타입을 선택한다.

With a Connectionless Lower Edge

만약 lower edge가 비연결지향에 대한 인터페이스를 제공하는 프로토콜 드라이버를 작성한다면은,

Part 3, Chapters, 2를 읽어라.

With TDI upper edge

TDI upper edge를 가지는 프로토콜를 작성한다면은

Part 3, Chapters, 2, 3, 4, 5를 봐라.

With Winsock support

만약 Winsock 지원을 제공하는 프로토콜을 작성한다면은,

Part 3, Chapters, 2, 3, 4, 5, 6을 봐라.

Connection-Oriented Client or Call Manager

만약 연결 지향 미니포트들에 대한 인터페이스를 제공하는 연결 지향 클라이언트를 작성하거나, 연결 지향 콜 매니저를 작성한다면은

Part 3, Chapter 2
Part 4, Chapter 1을 봐라.

 

 

Filter-hook Drivers

Part 6, Chapter 1을 봐라.

 

 

 

Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 02) Intermediate Driver  (0) 2010.05.06
NDIS Extending The PassThru IM Driver  (0) 2010.05.06
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18
_LIST_ENTRY  (2) 2010.03.18

오늘은 메모리 구조에서 가장 복잡하다고 느끼는 세그먼테이션에 대해서 정리하겠습니다.

x86에서는 segmentation과 paging 기법을 이용하여 [가상 메모리] 를 만들고 프로그램들을 실행시키게 됩니다.

그림 1 Physical Address 변환 과정

 

가상 메모리는 세그먼테이션 과정을 거치고 페이징 과정을 거쳐서 실제 메모리가 나오게됩니다.

이때 세그먼테이션에는 Selector와 Offset이 들어가게 되는데 Selector는 이 챕터의 제목인 세그먼트 레지스터를 말합니다. Offset은 가상주소를 말합니다.

 

그냥 말로 서술하면 보기 힘드니 숫자를 붙여서 설명을 해 드리겠습니다.

 

세그먼테이션 과정

  1. 가상주소를 물리 주소로 바꾸려면 Selector(세그먼트 레지스터)와 Offset(가상주소)이 필요합니다.
  2. Selector는 16bit 이며 Descriptor Table의 Index를 가리킵니다. (그림 참조)
  3. Selector(세그먼트 레지스터)는 Descriptor table의 Segment Descriptor(그림 참조)를 가리킵니다.
  4. Segment Descriptor의 Base 주소와 가상주소를 합쳐서 선형 주소를 만들어 냅니다.

 

세그먼트 디스크립터 안의 내용은 굳이 설명하지 않아도 될 것 같네요. 다만 Base Address 0-15만 알면 될 것 같습니다. Base Address 필드는 실제 세그먼트를 통해 메모리에 접근할 때 더하는 값입니다. 아까 세그먼트 디스크립터의 Base주소와 가상주소를 더해서 32bit 선형 주소를 만든다고 했었죠? 그때 사용 되는 것입니다.

 

이제까지 저는 세그먼트 레지스터가 16bit라고 설명을 했지만 사실 80bit 입니다. 나머지 64bit은 왜 설명 안 했냐? 하신다면 했습니다. 위에서 말한 세그먼트 디스크립터가 바로 세그먼트 레지스터의 안 보이는 나머지 64bit입니다. 왜 80bit으로 만들었는지 잘 모르겠지만 많이 추측 하는 것은 세그먼트 레지스터는 자주 사용하고 자주 사용한다면 속도가 빠른 레지스터에 올리는 것이 더 낫다고 생각됩니다.

 

이젠 세그먼트 레지스터를 직접 보도록 하겠습니다. Ollydbg와 Windbg를 사용하겠습니다.

Ollydbg에서 열면 6개의 세그먼트 레지스터를 볼 수 있습니다. x86은 6개의 세그먼트 레지스터가 있습니다. 그 중 노란색으로 표시된 FS 레지스터를 보겠습니다.

FS는 Selector로 동작되며 INDEX, TI, RPL(그림 참조)필드로 이루어져 있는 것을 알 수 있습니다.

그래서 이진수로 표현하면 0000 0000 00111 0 11 가 나옵니다. 앞에 13비트는 테이블에서의 세그먼트 디스크립터 위치고 그 다음 1 비트는 GDT인지 LDT인지(인터넷 참고)를 나타내며 다음 2비트는 권한(인터넷 참고)을 나타냅니다. 중요한 것은 7번째를 가리키고 있다는 것입니다.

 

위 그림을 보시면 선택되어 있는 부분이 FS레지스터가 가리키는 세그먼트 디스크립터입니다. Ollydbg에 나온 값이랑 똑같네요.

 

 

여기까지 해서 세그먼트 레지스터와 선형 주소를 만드는 것을 보았는데요. 생각보다 어렵다고 느끼실 수도 있습니다. 하지만 조금만 공부하시고 더 자료를 찾아 보시면 정리를 완벽히 하실 수 있을 겁니다.

그럼 모두 즐공 하세요.

 

 

Bloger: moltak.net

'Programming > 이것저것' 카테고리의 다른 글

_Crt Debug Functions  (0) 2010.07.23
typeid 2  (1) 2010.05.25
x86 Register  (0) 2010.04.30
어셈블리어 점프 명령어  (0) 2010.04.29
Symbol  (0) 2010.04.24

IA 32(x86) CPU는 크게 5종류의 레지스터가 있습니다.

범용 레지스터, 인덱스 레지스터, 포인터 레지스터, 부동 소수점 레지스터, 플래그 레지스터가 그것이며 각각 사용용도가 모두 다릅니다.

레지스터들 앞에 붙어있는 E는 Extended의 약자로서 현재 사용되는 x86 architecture는 80386에서 점차 발전해 나갔습니다.

그래서 현재 많이 사용되는 Pentium 이나 Core 2DUO 같은 프로세서들도 80386과 거의 비슷합니다. 물론 엄~~청 나게 발전 되었지만요. 

종류

이름

설명

범용

EAX

곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로 사용된다.

EBX

ESI EDI 결합하여 인덱스에 사용된다.

ECX

반복 명령어 사용시 카운터로 사용된다. ECX 레지스터에 반복할 횟수를 지정해 놓고 반복 작업을 수행한다.

EDX

EAX 같이 쓰이며 부호 확장 명령 등에 쓰인다.

인덱스

ESI

데이터 복사나 조작시 Source Data 주소가 저장된다. ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.

EDI

복사 작업시 Destination 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.

포인터

EIP

다음에 실행해야 명령어가 존재하는 메모리 주소가 저장된다. 현재 명령어를 실행 완료한 후에 EIP 레지스터에 저장되어 있는 주소에 위치한 명령어를 실행하게 된다. 실행 EIP 레지스터는 다음 실행해야 명령어가 존재하는 주소의 값이 저장된다.

EBP

하나의 스택 프레임의 시작 지점 주소가 저장된다. 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP 값은 변하지 않는다. 현재의 스택 프레임이 소멸되면 이전에 사용되던 스택

프레임을 가리키게 된다.

ESP

하나의 스택 프레임의 지점 주소가 저장된다. PUSH, POP 명령어에 따라서 ESP 값이 4byte 변한다.

부동

소수점

ST(0)

부동 소수 연산에 사용되는 레지스터

ST(1)

ST(2)

ST(3)

ST(4)

ST(5)

ST(6)

ST(7)

플래그

Eflag

OF

Overflow: 산술 연산 상위(가장 왼쪽) 비트의 overflow 나타냄

DF

Direction: 스트링(문자) 데이터를 이동시키거나 비교할 왼쪽 또는 오른쪽의 방향 결정

IF

Interrupt: 키보드 입력과 같은 외부 인터럽트가 처리되어야 하는지 또는 무시되어야 하는지를 나타낸다.

TF

Trap: 단일 단계 모드(single-step mode) 프로세서 연산을 허용한다. 디버거 프로그램은 TF 플래그를 설정해서, 사용자가 번에 하나씩 명령어를 실행시키고, 레지스터와 메모리 상에서 영향을 조사할 있게 한다.

SF

Sign: 산술 연산의 결과 값에 대한 부호를 나타낸다. (0=양수, 1=음수)

ZF

Zero: 산술이나 비교 연산의 결과를 나타낸다. (0= 결과 값이 0 아님, 1= 결과 값이 0)

AF

Auxiliary carry: 특수화된 산술에서 사용되며, 산술 연산에서 비트 3에서 비트 4로의 캐리를 포함한다.

PF

Parity: 연산 겨로가 1비트들의 개수를 나타낸다. 개수가 짝수인 경우 짝수 패리티(even parity) 부르며, 홀수인 경우 홀수 패리티(odd parity) 한다.

CF

Carry: 산술 연산 상위 비트의 캐리를 포함한다. 또한 비트 자리이동(shift) 또는 비트 회전(rotate) 연산 가장 마지막의 비트 내용을 포함한다.

  

'Programming > 이것저것' 카테고리의 다른 글

typeid 2  (1) 2010.05.25
세그먼트 레지스터  (0) 2010.05.01
어셈블리어 점프 명령어  (0) 2010.04.29
Symbol  (0) 2010.04.24
IL Code에 심볼 정보가 포함되는 이유  (0) 2010.04.24

(펌: http://cafe.naver.com/dnspro.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8018)

모든 일이 그렇듯 방화벽도 정책을 어떻게 선언하느냐가 중요합니다.

 

많은 방화벽을 보면서  정책에 대한 확립이 얼마나 중요한지 절실히 느꼈답니다.

 

그래서 오늘은 방화벽정책에 대한 이야기를 해보겠습니다.

어쩌면 이 부분은 대 부분의 방화벽 엔지니어들이 알고 있는 부분입니다.

 

그러나 너무나도 지켜지지 않고 있기에 이렇게 작성을 해보렵니다.

 

방화벽 정책

원칙

방화벽 정책은 "작은rule 큰policy"를 기본 원칙으로 합니다.

이 말은 rule 정책이 선언된 후 나머지 정책이 policy  에 의해 필터링 된다는것을 나타냅니다.

 

그리고 rule이 작아야 방화벽의 병목현상을 완화시킬수 있기때문입니다.

(rule이 길어지만 길어질 수록 많은 패턴이 그 rule 을 읽고 filter 되야 하기때문에)

- 이것은 모든 방화벽의 기본 filter 방법이고 원칙입니다.

 

위의 원칙으로 방화벽 정책은 두 가지로 나뉘게 됩니다.

(선 부분이 rule 후 부분이 plicy 라고 판단하시면 이해가 되실 것입니다.)

 

1. 선 DROP 후 ACCEPT

- 방화벽 rule 정책이 DROP 으로 선언되고 나머지 패턴에 대해선 모두  ACCEPT 하는 정책입니다.

이 정책은 DROP할 rule이 작을때 사용하는 정책입니다.

나머지에 대한 부분은 ACCEPT되기 때문에신중하게 사용해야하는 정책입니다.

(실제로 이 정책은 기본적으로 허용되어 있는 상태에서 필요에 따라 rule를 추가하여 막는 방법과 같습니다.

그렇다 보니 기본적인 허용부분이 편리로 이해될 수도 있지만 자칫 공격의 open으로 적용될 수도 있습니다.)

 

요즘 같이 많은 패턴의 공격이 있을 경우에는 적합하지 않는 정책이라 할 수 있습니다.

2. 선 ACCEPT 후 DROP

- 방화벽 rule 정책이 ACCEPT 로 선언되고 나머지 패턴에 대해선 모두 DROP 하는 정책입니다.

이 정책은 ACCEPT할 rule이 작고 대 부분을 DROP 할 때 사용됩니다.

실제 요즘 방화벽은 이 방화벽정책을 거의 이용합니다.( 이용해야하는데 안되는것들이 많아서 이렇게 글을 쓰고 있는거지요.)

 

이 장점은 기본적인 DROP으로 안전으로 다가갈 수가 있습니다.  하지만 그것이 단점이 될 수도 있습니다.

단점으론 rule의 초기화 같은 기술적 문제가 발생했을 경우 모든것이 DROP 될 수있다는 것입니다.

 

 

위의 방화벽정책은 rule의 견고성  이 받여줘야합니다.

 

그럼 rule의 견고성이라는 것은 어떻게 해서 생길 까요.

 

1. rule에 원칙을 입히자

- 가끔 방화벽 rule을 들여다 보면 누더기가 되어있는 곳들이 있습니다.

   (주위의 요청에 의해 라든지...  아무튼 이해는 가지만 방화벽만큼 정책은 꼭 지켜져야 할 부분입니다.)

  policy가 ACCEPT인 방화벽에서 특히나 많이 발생하는데요.

  회사의 방화벽 rule을 직접 확인 해보세요. 혹시 기본적책이 ACCEPT인데 ACCEPT rule을 올려놓은것은 없나요?

  혹은 DROP인데  방화벽 rule에 DROP이 올라가 있지는 않나요.

 

  이 부분은 rule의 의미가 무용지물이여서가 아니라 rule의 길이가 길어져 네트워크의 지연을  야기합니다.

 

2. rule에 책임추적성을 입히자

- 여러분의 방화벽은 rule  하나 하나에 누구의 요청에 의해서 무슨 이유로 된 rule  인지 문서화 되어있나요?

   이 부분은 제가 본 회사 거의 대부분에 문제였습니다.

  

   제가 강의를 하다 들은  일화입니다.

   그분은 외국의 요청에 의해 PIX 장비셋팅을 하러 갔다고 합니다.

   rule셋팅에 일주일이 걸렸다고 하시면서 하시는 말씀이 그 곳에선 rule을 open해 줄때 요청자, 사유, 중요성

   에 대한 문서를 받는다고 합니다.

   우리가 외국 따라 해야한다는것이 아니라 저게 원칙입니다.

   우리의 방화벽에 올라와 있는 어느 rule에 의해서 문제가 발생시 그에 따른 조치에 대해서 구체적으로 선언되어있나요?

  

 

방화벽이라는 도구가 나온지 벌써 10년이 넘었습니다.

방화벽은 이제 기본이 되었습니다.  여러분의 기본은 얼마나 지켜지고 있나요?

(펌: http://blog.naver.com/helpboys?Redirect=Log&logNo=40036667969)

방화벽을 통해 어떤 서비스들이 어떤 방향으로 허용되는지를 명시하는 서면 문서가 있어야 한다. 디폴트는 열린 것인지 닫힌 것인지도 규정한다, 어떤 서비스가 정책에 명시되어 있지 않다면, 이것이 허용된다는 것을 의미하는가 혹은 그렇지 않다는 것을 의미하는가? 이것은 관리자의 서명을 받아야 하며, 그러지 않으면 "모든 사람들이 다루어졌다고 생각했던" 구멍을 통해 보안이 침해될 경우 방화벽 관리자는 매우 곤란한 입장에 처할 것이다. 다음은 인터넷 방화벽을 위한 정책의 예시이다:

인터넷 방화벽 정책 ()

보안 요구사항:

1. 접근 통제

·         사내 네트웍으로부터의 모든 인터넷 접속은 방화벽에 있는 프락시를 통해서 발생해야만 한다.

·         디폴트 구성: 명시되지 않은 모든 서비스들은 금지된다.

·         모든 사용자들은 인터넷 사용자들과 이메일을 교환할 있다.

·         R&D 부서 사용자들은 WWW, ftp real audio 사용할 있다. 다른 사람들은 인가가 필요하다.

2. 보증

·         방화벽과 프락시 시스템들은 민감한 호스트로서 설치되어야 한다. 불필요한 모든 서비스들은 운영체제에서 중지한다. 사용자들은 시스템들에 직접 로그온 없어야 한다.

·         방화벽 정책과 구성은 정확하게 문서화 되어야 한다.

·         방화벽 시스템들에 대해 정기적인 모니터링과 연례 감사를 실시해야 한다.

·         사용잗르과 방화벽 관리자들은 각자의 책임을 인지하고 있어야 하고 이러한 책임들을 있도록 교육을 받아야 한다.

3. 로깅

·         상세 로그를 보존해야 한다 (가능하다면 별개의 서버에).

·         자동적으로 분석되어야 하고, 치명적인 에러는 알람을 발생시켜야 한다.

·         로그는 적어도 1년간 보관해야 한다.

·         의미 있는 로그 엔트리들은 매일 검사해야 한다.

·         방화벽 사용량에 대한 통계를 얻을 있어야 한다.

4. 가용성

·         방화벽은 높은 가용성을 제공해야 하고 그에 관해 필요한 일들을 수행해야 한다 (백업/복원 )

·         변경 관리와 사고 대응을 위한 프로세스가 있어야 한다.

5. 필요한 기능:
나가는 (outgoing) 서비스:

다음 서비스들은 특정한 내부 호스트로부터 (e.g. 프락시를 통해) 인터넷으로 나가는 것이 필요하다:
1. Email, WWW (HTTP), ftp, telnet, SSH
2. DNS (resolve Internet names)
3. News (NNTP)
4. Real Audio

들어오는 (incoming) 서비스:

다음의 인터넷 서비스들은 특별히 보호되는 서브넷 상에 구성된 프락시 호스트들을 통해 안으로 들어오는 것이 허용되어야 한다:
1. Email:
모든 사용자들은 안전한 게이트웨이를 통해 인터넷 이메일을 받을 있어야 한다
.
2. News (NNTP)
3. Secure Logins (
소수의 규정된 사람들에 대해): SecurID + SSH 통해


다른 인터넷 서비스들을 필요로 하는 시스템들은 모두 특별한 외부 (안전하지 않은) 서브넷에 두어야 한다. 이들은 인터넷에 직접 연결되도록 한다. 호스트들로부터 내부 네트웍으로의 접근에 대해서는 인터넷 호스트의 접근에서와 같은 규칙이 적용된다.
인터넷에 제공되는 서비스들:

다음 서비스들은 인터넷에 제공되어야 한다 (보호되는 영역내의 안전한 서버들에 의해):

1. 방화벽/ 프락시 시스템의 DNS resolution.
2. WWW
서버
.
3. Anonymous ftp
서버
.
4.
특별한 프로젝트/ 다른 회사들과의 협력을 위한 사용자 FTP 서버 .
 

[출처] 방화벽 정책|작성자 제천최고

펌(http://cafe.naver.com/nsis.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=24041)

방화벽 정책 수립 시 프로토콜 가이드 내용 입니다.  

방화벽 관련 업무 하시는 분에게 좋을 듯합니다.  수고하셔요.

service 위험도
 level
설 명
BGP 4 인터넷환경이 보안적으로 여러 위험성에 노출되기 이전에 고안되었기에 데이터를 조작하거나 삭제하는 등 네트웍 라우팅에 좋지 않은 영향을 미칠 가능성이 있는 여러 가지 공격 방법에 대처하는 메커니즘을 가지고 있지 않다. SYN packet을 이용하여 SYN FLOODING을 일으길 경우 bgp port(TCP 179)가 DRDoS의 target이 된다.
DHCP-relay 4 세그먼트간의 지점간에 위치하여 다른 DHCP에서 IP를 받을 수 있도록 포워드하는 기능이다. Address assignment가 유출될 경우 man-in-the-middle 공격 등에 노출된다. ( UDP 67)
DNS 4 잘 알려진 포트이므로 공격자의 주요목표가 된다. 불필요한 사용자에게 DNS Zone Transfer를 허용하지 말아야 한다. 해당 도메인의 Zone에 대한 복사본을 얻기 위해 Primary Name Server로부터 Zone 데이터베이스를 끌어오는 작업을 Zone Transfer라 하는데, 이는 Primary Name Server가 다운될 경우 Secondary Name Server가 그 역할을 대신하게 되기 때문에 양쪽 서버간의 정보를 일관성 있게 유지시키기 위해 수행되는 작업이다. 일반적으로 Zone Transfer는 Second Name Server에서만 Zone Transfer를 할 수 있도록 하면 된다. 허가되지 않는 사용자에게 Zone Transfer를 허용할 경우 DNS 서버의 중요한 정보가 유출되게 된다. 즉, 공격자는 전송 받은 Zone 정보를 이용하여 호스트 정보, 네트워크 구성 형태 등의 많은 정보를 파악할 수 있게 된다. 대부분의 공격도구(주로 취약점 스캐너)는 공격하고자 하는 시스템의 IP 리스트를 얻기 위해 Zone Tranfer를 이용한다. 대부분의 사이트에서 DNS 서버를 디폴트로 설치할 경우 임의의 사용자가 Zone Transfer 를 할 수 있도록 설정된다. DNS 코드 취약점을 이용하여 DNS 서버에게 교묘히 조작된 패킷을 보냄으로써 버퍼 오버플로우를 발생시켜  공격자가 원하는 코드를 실행시키거나 루트 쉘을 얻을 수 있다. (TCP, UDP 53)
FINGER 3 로그온한 사용자, operating system에 대한 정보 제공한다. (TCP 79)
FTP 5 읽고 쓰기가 가능하여 시스템의 손상, 파괴가 가능하다. 버퍼 오버플로우를 일으켜 root권한을 획득하거나 DOS 공격하는 등 취약점이 다수 존재한다.(TCP 20,21)
FTP-GET 5 읽기가 가능하여 시스템의 정보 유출이 가능하다. 버퍼 오버플로우를 일으켜 root권한을 획득하거나 DOS 공격하는 등 취약점이 다수 존재한다.
FTP-PUT 5 쓰기가 가능하여 시스템의 손상, 파괴가 가능하다. 버퍼 오버플로우를 일으켜 root권한을 획득하거나 DOS 공격하는 등 취약점이 다수 존재한다.
GOPHER 5 고퍼는 웹 서비스가 개발되기 이전까지는 인터넷의 가장 쉬운 인터페이스로 사용되었다. 고퍼는 정보의 내용을 주제별 또는 종류별로 구분하여 메뉴로 구성함으로써, 인터넷에 익숙하지 않은 사람도 쉽게 정보를 찾아볼 수 있게 만들었다. 고퍼는 인터넷의 다른 기능들, 즉 원격접속(telnet), 파일전송(ftp), 뉴스(news)등의 기능을 고퍼 메뉴 속에서 실행할 수 있고, 고퍼 서버들끼리 서로 연결되어 있어서 여러 개의 고퍼 서버를 이동하면서 자신이 필요로 하는 정보를 쉽게 찾을 수 있다. 고퍼로 FTP session을 맺을 경우, 서버의 ftp directory로 접속을 제한할지라도 bounce attack(제삼의 서버를 이용하여 공격대상의 네트워크를 스캐닝할 수 있는)에 이용될 수 있다. (TCP 70)
H.323 4 그 자체가 정의된 하나의 규약(protocol)이 아니라 각종 규약들(H.224, H.245 등)을 모아놓은 프로토콜 스택이다. H.323은 음성 및 영상 데이터를 TCP/IP,UDP 등의 패킷 교환 방식의 네트워크를 통해 전송하기 위해 채택된 표준으로, 이러한 패킷 방식의 데이터 전송의 예가 VoIP이다. 양방향으로 설정 필요하며, 다수의 포트 허용으로 보안에 취약하다.
HTTP 4 Web Server의 개방성과 CGI/JAVA/PHP등의 content script의 취약점에서 오는 원격 해킹의 가능성이 존재하며, 이런 코드들의 보안성 점검이 필요하다. 정보유출과 루트 권한의 획득이 가능하다. Web server log의 개인 정보가 적절한 인증없이 조회되지 않도록 해야한다. (TCP 80)
HTTPS 4 SSL을 사용하기 때문에 HTTP 프로토콜보다는 보안상 안전하나, content script의 취약점에서 오는 원격 해킹의 가능성이 존재하며, 이런 코드들의 보안성 점검이 필요하다. 정보유출과 루트 권한의 획득이 가능하다. (TCP 443)
ICMP-INFO 4 remote host 가 ICMP_MASKREQ query 에 응답하여 netmask 등의 정보를 보내준다. 공격자는 네트웍이 어떻게 구성되고 라우팅 되는지에 관한 정보를 얻을 수 있다. 위험도는 높지 않다.
ICMP-TIMESTAMP 4 remote host가 ICMP timestamp request에 응답한다. 이것은 공격자가 그 host의 세팅된 시간정보를 알려줌으로 시간에 기초한 인증 protocols를 통과하도록 돕는다. ICMP timestamp requests와 outgoing ICMP timestamp replies를 필터링해야 하며 위험도는 높지 않다.
IKE 3 IPSec을 하는 장비간에 암호화 알고리즘과 인증방식을 서로 설정한다.
IMAP 3 POP3와 유사한 취약성을 가지고 있다. 로그인하지 않은 상태에서 버퍼 오버플로우를 발생시켜 유저네임이나  패스워드를 변경할 수 있으며, 로그인된 상태에서 여러 버퍼 오버플로우 공격을 할 수 있다. (TCP 143)
INTERNET LOCATER SERVICE 5 LDAP, LDAP over SSL/TSL, user locater service를 포함한다.
IRC 4 일련의 규칙과 약속이 관련되어 있는 채팅 시스템으로, 동시에 여러 사용자의 태화를 제공하는 클라이언트/서버 구조의 소프트웨어이다. 어떤 흔적도 남기지 않은 채(영수증없는 금융거래처럼)  파일전송이 이루어질 수 있다. (TCP 6660-9)
L2TP 5 인터넷 표준인 L2TP (RFC 2661)는 인터넷에서 remote access VPN을 구성하는데 널리 사용되는 클라이언트/서버 기반의 Tunneling Protocol이다. Layer 2의 PPP 트래픽에 대한 Encapsulation을 통해 두 지점간의 터널을 생성, 관리, 소멸시켜주는 것이 기본 기능이며, 보안은 대부분 PPP에서 제공하는 보안기능에 의존하므로 보다 강한 보안을 위해 IPSEC을 사용해야 한다. Layer 2 Tunneling은 크게 tunnel initiator에 따라 Voluntary Tunneling과 Compulsory Tunneling으로 나눌 수 있다. Voluntary Tunneling은 client-initiated Tunneling으로 클라이언트가 직접 Tunnel 서버(보통의 Remote Access Server(RAS), IETF 용어로는  PPTP/L2TP Network Server(PNS/LNS)로 불림)와 Tunnel을 형성하므로 클라이언트간의 End-to-End Tunnel이 형성되며, 클라이언트에 PPTP/L2TP 프로토콜이 탑재되어 있어야 한다. 반면 Compulsory Tunneling은 ISP-initiated Tunneling으로 인터넷 서비스 제공자(ISP) Remote Access Switch가 클라이언트를 대신해서 터널을 열어 주는 경우로 클라이언트에 Tunneling Protocol이 탑재되어 있지 않은 경우나, ISP에서 VPN 서비스를 제공해 주는 경우에 사용되며, PAC/LAC-PNS/LNS간에 Tunnel이 형성된다. L2TP는 Packet-Oriented Point-to-Point 접속을 제공하는 네트웍만 보장되면, 어떤 전송 프로토콜 상에서도 사용 가능하다 (e.g. IP, Frame Relay PVCs, ATM VCs 등). Multiple- Tunnel을 허용하여 QoS에 따라 서로 다른 Tunnel을 이용할 수 있다. L2TP는 헤더 압축 및 Tunnel-End-Point 인증 (패킷단위의 인증이 아니라, Tunnel End-Point들의 Identity에 대한 인증) 기능을 제공한다. 서로 완전한 신뢰관계에 있는 제한된 host 사이에서만 허용한다.
LDAP 4 TCP/IP 상에서 수행하는 디렉토리 서비스 프로토콜로서,  조직이나, 개체, 그리고 인터넷이나 기업 내의 인트라넷 등 네트웍 상에 있는 파일이나 장치들과 같은 자원 등의 위치를 찾을 수 있게 해준다. LDAP 디렉토리 서비스 모델은 엔트리(entry)에 기반한다. 엔트리는 distinguished name (DN)이라고 불리는 속성(attribute)을 포함하는 속성들의 집합으로 되어 있으며, DN은 유일한 엔트리를 찾기 위해서 이용된다. LDAP은 디렉토리에 대한 질의와 갱신 연산을 정의하고, 디렉토리로부터 엔트리를 추가 또는 삭제하고, 엔트리를 변경하고 엔트리의 이름을 변경하는 연산이 제공된다. LDAP 탐색(search) 연산은 탐색 필터에 명시된 일치 기준에 맞는 엔트리를 찾기 위해 디렉토리의 일부를 찾을 수 있다. LDAP server는 주요정보를 담고 있어, 비인가된 접근은 철저히 차단되어야 한다. (TCP 389)
NETMEETING 4 주로 H.323 을 이용하여 서비스한다.
NFS 5 Port Mapper외에 파일 송수신을 위해 다수의 포트를 가변적으로 허용되어야 하며, 공격자가 NFS client로 작동하는 applets를 씀으로 접근제어를 통과하는 등 심각한 취약점이 다수 존재한다.(TCP, UDP 2049,111)
NNTP 4 유즈넷 뉴스그룹 상에 올려진 글들을 관리하기 위해 컴퓨터들(클라이언트와 서버 모두)에 의해 사용되는 store and forward 프로토콜이다. NNTP는 원래 유즈넷 프로토콜이었던 UUCP (UNIX-to-UNIX Copy Protocol)를 대체한 것이다. NNCP 서버는 수집된 유즈넷 뉴스그룹들의 네트웍을 관리하고, 인터넷 액세스 제공자가 제공하는 서버를 전체의 일부로서 포함시킨다. NNTP 클라이언트는 넷스케이프나, 인터넷 익스플로러, 오페라 또는 다른 웹브라우저의 일부로서 포함될 수 있으며, 뉴스리더라고 불리는 별도의 클라이언트 프로그램을 사용할 수도 있다. 포트가 오픈 유즈넷서버를 찾아내기 위해 사용된다. 대체적으로 정상적 커넥션이 이루어져 위험도는 높지 않다.(TCP 119)
NTP 3 NTP variables를 질의함으로 remote host의 OS descriptor, time settings등의 정보를 얻을 수 있다. NTP peer relationships를 알아냄으로 네트웍 세팅에 대한 정보를 알아낼 수 있다. 위험도는 높지 않다.(UDP 123)
ORACLE-LISTENER 5 Client상에서 DB의 접근이 가능하기 때문에 일반계정으로 접근 후 루트 권한의 획득이 가능할 수 있다. 
OSPF 4 독립적인 네트웍 내에서 라우팅 정보 관리를 위해 광범위하게 사용된다. DRDoS의 target이 된다. 
PC-anywhere 5 원격제어 및 파일전송이 가능하며, 접근이 성공되었을 경우 PC와 같은 세크먼트에 존재하는 모든 네트워크 장비들은 스니핑이 가능하다. (UDP 5632, 22 TCP 5631)
PING 3 remote host의 상태가 dead or alive인지 정보를 준다. 위험도는 적다 .
POP3 3 client가 e-mail서버에 접근하기 위해 사용된다. 로그인하지 않은 상태에서 버퍼 오버플로우를 발생시켜 유저네임이나  패스워드를 변경할 수 있으며, 로그인된 상태에서 여러 버퍼 오버플로우 공격을 할 수 있다. (TCP 110)
PPTP 5 Microsoft 사의 PPTP는 인터넷에서 remote access VPN을 구성하는데 널리 사용되는 클라이언트/서버 기반의 Tunneling Protocol이다. PPP 트래픽을 encapsulation하기 때문에, IP, IPX, NetBEUI, AppleTalk 등의 다양한 상위 로컬 네트웍 프로토콜을 사용할 수 있으며 transit internetwork이 IP 네트웍일 것을 요구한다. End-Point들 사이에 하나의 Tunnel만을 지원하며 사용자 인증(PAP, CHAP, MS-CHAP, EAP)이나 데이터 암호화/압축 (CCP, ECP) 등의 보안 기능은 PPP에서 제공하는 것을 사용한다. 완전한 신뢰관계에 있는 제한된 host 사이에서만 허용한다. (TCP 1723)
REAL MEDIA 3 video straming과 audio service를 제공한다. Client가 server로부터 audio streams을 받을 때는 UDP포트로, control connection은 TCP 7070 포트를 사용한다.
RIP 4 독립적인 네트웍 내에서 라우팅 정보 관리를 위해 광범위하게 사용된다. DRDoS의 target이 된다. 
RLOGIN 5 rlogin은 client와 server 사이의 데이터가 암호화되지 않은 상태로 흐르기 때문에 스니핑이 가능하며 이는 login ID와 PASSWORD도 포함된다. 신뢰관계가 잘못 설정된 경우 패스워드의 입력없이 바로 서버로 접근이 가능하며 심감한 보안취약점으로 인해 신뢰관계를 설정하여 루트 권한으로의 접근이 가능하다.
SMTP(MAIL) 4 향상 최신의 패치한 상태로 서비스를 하여야 하며, 메일 Relay기능을 제한한다. 인터넷에 공개되어 있고, e-mail routing이 복잡하여 보고된 취약점(루트권한의 획득 가능)이 많다.(TCP 25)
SNMP 5 네트워크 장비의 상황을 볼 수 있는 인테페이스를 제공하며 관리 데이타의 분석, 장애관리 등의 기능수행을 위한 데이타베이스를 구축하고 있다. Get : 장비의 상태 및 가동시간등의 관리 정보를 읽어 들인다. 특정 장비의 정보를 읽으려면 메시지의 송신자로서 관리자는 그 장비를 표시하는 작은 프로그램인 에이전트에 조회를 한다. 관리자는 MIB의 트리구조를 이용해 필요한 정보를 찾는 객체를 알아내고 응답을 해석한다. Set : 장비의 MIB을 조작하여 장비를 제어한다. 관리자는 요청을 보내 다시 초기화 시키거나, 프로그램에 따라 스스로를 다시 재구성한다. Trap : 관리자에게 보고하는 Treshold나 Event를 말한다. 장비 에이전트는 경고, 고장통지등 관리자가 미리 설정한 유형의 보고서를 생성한다. SNMP의 Community String은 manager와 agent사이의 메시지를 인증하기 위해 사용되는데, 알기쉬운(Public, Private, 회사이름등…) 이름이나 Brute-force 공격으로 알아낼 수 있는 쉬운 조합으로 만들 경우 Set/Get 명령어등으로 접근할 수 있으며, 현재까지 서비스거부공격, 버퍼오버플로우공격 등 여러 취약점이 있다.(TCP, UDP 161,162)
SSH 5 Telnet보다 강한 인증기능을 가지고 다른 컴퓨터에 로그온 할 수 있으나, SSH host 의 domain을 스캔당할 수 있으며, 일반계정으로의 접근 후 OS상에 존재하는 취약점을 이용하여 루트권한의 획득이 가능하다. (TCP 22)
SYSLOG 3 log를 기록하는 전용 데몬( 항상 떠 있어서, 다른 프로그램의 요청에 응답하는 것)이다.
UDP Flood등의 DoS 공격의 대상이 될 수 있다. (UDP 514)
TALK 3 visual communication을 제공한다. 알려지지 않은 유저에 의해 정보가 유츨될 수 있다. (UDP 517, 518)
TCP-ANY 6 모든 TCP 포트를 허용하므로 Incoming 정책에 사용 불가하다. (임시적으로만 사용, 출발지/목적지등을 제한할 경우에 한하여 사용)
TELNET 5 일반계정으로의 접근 후 OS상에 존재하는 취약점을 이용하여 루트권한의 획득이 가능하다. telnet은 client와 server 사이의 데이터가 암호화되지 않은 상태로 흐르기 때문에 스니핑이 가능하며, 이는 login ID와 PASSWORD도 포함된다. (TCP 23)
TFTP 5 remote user가 login(ID와 패스워드의 인증)없이 파일을 읽고, 쓸 수 있어 위험도가 높다.  펌웨어를 업그레이드등의 경우에 주로 사용된다. TCP wrapper를 사용하며 접근을 제한하며, root directory로 아닌 subdirectory로 접근하게 하여 필요이상의 파일 접근을 피하도록 해야한다. (UDP 69)
TRACEROUTE 4 특정 호스트에 접근하기 위한 path의 정보를 제공한다. (UDP 33400-34000)
UDP-any 6 모든 UDP 포트를 허용하므로 Incoming 정책에 사용 불가하다. (임시적으로만 사용, 출발지/목적지등을 제한할 경우에 한하여 사용)
UUCP 5 시스템들 간에 파일을 복사, 실행될 명령어들을 전송할 수 있다. (UDP 540)
VDO-LIVE 3 video straming service를 제공한다. (UDP 7000-7010)
WAIS 4 특정 데이타베이스 등을 키워드로 고속 검색하여 액세스하는 환경을 제공한다. (TCP 210)
WINFRAME 4 서버에 연결된 컴퓨터 워크스테이션이 윈도우 프로그램과 데이터를 사용할 수 있도록 환경을 제공한다. (TCP 1494)
X-WINDOW 5  리눅스를 비롯해 대부분의 유닉스에 채용되어 있으며, 대상 host의 그래픽 환경 기반 window를 제공한다. TCP 다수의 포트(6000-6063)를 허용한다. (TCP 6000-6063)
BGP 3 인터넷환경이 보안적으로 여러 위험성에 노출되기 이전에 고안되었기에 데이터를 조작하거나 삭제하는 등 네트웍 라우팅에 좋지 않은 영향을 미칠 가능성이 있는 여러 가지 공격 방법에 대처하는 메커니즘을 가지고 있지 않다. SYN packet을 이용하여 SYN FLOODING을 일으길 경우 bgp port(TCP 179)가 DRDoS의 target이 된다.
DHCP-relay 2 세그먼트간의 지점간에 위치하여 다른 DHCP에서 IP를 받을 수 있도록 포워드하는 기능이다. Address assignment가 유출될 경우 man-in-the-middle 공격 등에 노출된다. ( UDP 67)
DNS 2 잘 알려진 포트이므로 공격자의 주요목표가 된다. 불필요한 사용자에게 DNS Zone Transfer를 허용하지 말아야 한다. 해당 도메인의 Zone에 대한 복사본을 얻기 위해 Primary Name Server로부터 Zone 데이터베이스를 끌어오는 작업을 Zone Transfer라 하는데, 이는 Primary Name Server가 다운될 경우 Secondary Name Server가 그 역할을 대신하게 되기 때문에 양쪽 서버간의 정보를 일관성 있게 유지시키기 위해 수행되는 작업이다. 일반적으로 Zone Transfer는 Second Name Server에서만 Zone Transfer를 할 수 있도록 하면 된다. 허가되지 않는 사용자에게 Zone Transfer를 허용할 경우 DNS 서버의 중요한 정보가 유출되게 된다. 즉, 공격자는 전송 받은 Zone 정보를 이용하여 호스트 정보, 네트워크 구성 형태 등의 많은 정보를 파악할 수 있게 된다. 대부분의 공격도구(주로 취약점 스캐너)는 공격하고자 하는 시스템의 IP 리스트를 얻기 위해 Zone Tranfer를 이용한다. 대부분의 사이트에서 DNS 서버를 디폴트로 설치할 경우 임의의 사용자가 Zone Transfer 를 할 수 있도록 설정된다. DNS 코드 취약점을 이용하여 DNS 서버에게 교묘히 조작된 패킷을 보냄으로써 버퍼 오버플로우를 발생시켜  공격자가 원하는 코드를 실행시키거나 루트 쉘을 얻을 수 있다. (TCP, UDP 53)
FINGER 2 로그온한 사용자, operating system에 대한 정보 제공한다. (TCP 79)
FTP 5 읽고 쓰기가 가능하여 시스템의 손상, 파괴가 가능하다. 버퍼 오버플로우를 일으켜 root권한을 획득하거나 DOS 공격하는 등 취약점이 다수 존재한다.(TCP 20,21)
FTP-GET 2 읽기가 가능하여 시스템의 정보 유출이 가능하다. 버퍼 오버플로우를 일으켜 root권한을 획득하거나 DOS 공격하는 등 취약점이 다수 존재한다.
FTP-PUT 5 쓰기가 가능하여 시스템의 손상, 파괴가 가능하다. 버퍼 오버플로우를 일으켜 root권한을 획득하거나 DOS 공격하는 등 취약점이 다수 존재한다.
GOPHER 2 고퍼는 웹 서비스가 개발되기 이전까지는 인터넷의 가장 쉬운 인터페이스로 사용되었다. 고퍼는 정보의 내용을 주제별 또는 종류별로 구분하여 메뉴로 구성함으로써, 인터넷에 익숙하지 않은 사람도 쉽게 정보를 찾아볼 수 있게 만들었다. 고퍼는 인터넷의 다른 기능들, 즉 원격접속(telnet), 파일전송(ftp), 뉴스(news)등의 기능을 고퍼 메뉴 속에서 실행할 수 있고, 고퍼 서버들끼리 서로 연결되어 있어서 여러 개의 고퍼 서버를 이동하면서 자신이 필요로 하는 정보를 쉽게 찾을 수 있다. 고퍼로 FTP session을 맺을 경우, 서버의 ftp directory로 접속을 제한할지라도 bounce attack(제삼의 서버를 이용하여 공격대상의 네트워크를 스캐닝할 수 있는)에 이용될 수 있다. (TCP 70)
H.323 2 그 자체가 정의된 하나의 규약(protocol)이 아니라 각종 규약들(H.224, H.245 등)을 모아놓은 프로토콜 스택이다. H.323은 음성 및 영상 데이터를 TCP/IP,UDP 등의 패킷 교환 방식의 네트워크를 통해 전송하기 위해 채택된 표준으로, 이러한 패킷 방식의 데이터 전송의 예가 VoIP이다. 양방향으로 설정 필요하며, 다수의 포트 허용으로 보안에 취약하다.
HTTP 2 Web Server의 개방성과 CGI/JAVA/PHP등의 content script의 취약점에서 오는 원격 해킹의 가능성이 존재하며, 이런 코드들의 보안성 점검이 필요하다. 정보유출과 루트 권한의 획득이 가능하다. Web server log의 개인 정보가 적절한 인증없이 조회되지 않도록 해야한다. (TCP 80)
HTTPS 2 SSL을 사용하기 때문에 HTTP 프로토콜보다는 보안상 안전하나, content script의 취약점에서 오는 원격 해킹의 가능성이 존재하며, 이런 코드들의 보안성 점검이 필요하다. 정보유출과 루트 권한의 획득이 가능하다. (TCP 443)
ICMP-INFO 2 remote host 가 ICMP_MASKREQ query 에 응답하여 netmask 등의 정보를 보내준다. 공격자는 네트웍이 어떻게 구성되고 라우팅 되는지에 관한 정보를 얻을 수 있다. 위험도는 높지 않다.
ICMP-TIMESTAMP 2 remote host가 ICMP timestamp request에 응답한다. 이것은 공격자가 그 host의 세팅된 시간정보를 알려줌으로 시간에 기초한 인증 protocols를 통과하도록 돕는다. ICMP timestamp requests와 outgoing ICMP timestamp replies를 필터링해야 하며 위험도는 높지 않다.
IKE 2 IPSec을 하는 장비간에 암호화 알고리즘과 인증방식을 서로 설정한다.
IMAP 2 POP3와 유사한 취약성을 가지고 있다. 로그인하지 않은 상태에서 버퍼 오버플로우를 발생시켜 유저네임이나  패스워드를 변경할 수 있으며, 로그인된 상태에서 여러 버퍼 오버플로우 공격을 할 수 있다. (TCP 143)
INTERNET LOCATER SERVICE 2 LDAP, LDAP over SSL/TSL, user locater service를 포함한다.
IRC 2 일련의 규칙과 약속이 관련되어 있는 채팅 시스템으로, 동시에 여러 사용자의 태화를 제공하는 클라이언트/서버 구조의 소프트웨어이다. 어떤 흔적도 남기지 않은 채(영수증없는 금융거래처럼)  파일전송이 이루어질 수 있다. (TCP 6660-9)
L2TP 5 인터넷 표준인 L2TP (RFC 2661)는 인터넷에서 remote access VPN을 구성하는데 널리 사용되는 클라이언트/서버 기반의 Tunneling Protocol이다. Layer 2의 PPP 트래픽에 대한 Encapsulation을 통해 두 지점간의 터널을 생성, 관리, 소멸시켜주는 것이 기본 기능이며, 보안은 대부분 PPP에서 제공하는 보안기능에 의존하므로 보다 강한 보안을 위해 IPSEC을 사용해야 한다. Layer 2 Tunneling은 크게 tunnel initiator에 따라 Voluntary Tunneling과 Compulsory Tunneling으로 나눌 수 있다. Voluntary Tunneling은 client-initiated Tunneling으로 클라이언트가 직접 Tunnel 서버(보통의 Remote Access Server(RAS), IETF 용어로는  PPTP/L2TP Network Server(PNS/LNS)로 불림)와 Tunnel을 형성하므로 클라이언트간의 End-to-End Tunnel이 형성되며, 클라이언트에 PPTP/L2TP 프로토콜이 탑재되어 있어야 한다. 반면 Compulsory Tunneling은 ISP-initiated Tunneling으로 인터넷 서비스 제공자(ISP) Remote Access Switch가 클라이언트를 대신해서 터널을 열어 주는 경우로 클라이언트에 Tunneling Protocol이 탑재되어 있지 않은 경우나, ISP에서 VPN 서비스를 제공해 주는 경우에 사용되며, PAC/LAC-PNS/LNS간에 Tunnel이 형성된다. L2TP는 Packet-Oriented Point-to-Point 접속을 제공하는 네트웍만 보장되면, 어떤 전송 프로토콜 상에서도 사용 가능하다 (e.g. IP, Frame Relay PVCs, ATM VCs 등). Multiple- Tunnel을 허용하여 QoS에 따라 서로 다른 Tunnel을 이용할 수 있다. L2TP는 헤더 압축 및 Tunnel-End-Point 인증 (패킷단위의 인증이 아니라, Tunnel End-Point들의 Identity에 대한 인증) 기능을 제공한다. 서로 완전한 신뢰관계에 있는 제한된 host 사이에서만 허용한다.
LDAP 2 TCP/IP 상에서 수행하는 디렉토리 서비스 프로토콜로서,  조직이나, 개체, 그리고 인터넷이나 기업 내의 인트라넷 등 네트웍 상에 있는 파일이나 장치들과 같은 자원 등의 위치를 찾을 수 있게 해준다. LDAP 디렉토리 서비스 모델은 엔트리(entry)에 기반한다. 엔트리는 distinguished name (DN)이라고 불리는 속성(attribute)을 포함하는 속성들의 집합으로 되어 있으며, DN은 유일한 엔트리를 찾기 위해서 이용된다. LDAP은 디렉토리에 대한 질의와 갱신 연산을 정의하고, 디렉토리로부터 엔트리를 추가 또는 삭제하고, 엔트리를 변경하고 엔트리의 이름을 변경하는 연산이 제공된다. LDAP 탐색(search) 연산은 탐색 필터에 명시된 일치 기준에 맞는 엔트리를 찾기 위해 디렉토리의 일부를 찾을 수 있다. LDAP server는 주요정보를 담고 있어, 비인가된 접근은 철저히 차단되어야 한다. (TCP 389)
NETMEETING 2 주로 H.323 을 이용하여 서비스한다.
NFS 5 Port Mapper외에 파일 송수신을 위해 다수의 포트를 가변적으로 허용되어야 하며, 공격자가 NFS client로 작동하는 applets를 씀으로 접근제어를 통과하는 등 심각한 취약점이 다수 존재한다.(TCP, UDP 2049,111)
NNTP 2 유즈넷 뉴스그룹 상에 올려진 글들을 관리하기 위해 컴퓨터들(클라이언트와 서버 모두)에 의해 사용되는 store and forward 프로토콜이다. NNTP는 원래 유즈넷 프로토콜이었던 UUCP (UNIX-to-UNIX Copy Protocol)를 대체한 것이다. NNCP 서버는 수집된 유즈넷 뉴스그룹들의 네트웍을 관리하고, 인터넷 액세스 제공자가 제공하는 서버를 전체의 일부로서 포함시킨다. NNTP 클라이언트는 넷스케이프나, 인터넷 익스플로러, 오페라 또는 다른 웹브라우저의 일부로서 포함될 수 있으며, 뉴스리더라고 불리는 별도의 클라이언트 프로그램을 사용할 수도 있다. 포트가 오픈 유즈넷서버를 찾아내기 위해 사용된다. 대체적으로 정상적 커넥션이 이루어져 위험도는 높지 않다.(TCP 119)
NTP 2 NTP variables를 질의함으로 remote host의 OS descriptor, time settings등의 정보를 얻을 수 있다. NTP peer relationships를 알아냄으로 네트웍 세팅에 대한 정보를 알아낼 수 있다. 위험도는 높지 않다.(UDP 123)
ORACLE-LISTENER 2 Client상에서 DB의 접근이 가능하기 때문에 일반계정으로 접근 후 루트 권한의 획득이 가능할 수 있다. 
OSPF 2 독립적인 네트웍 내에서 라우팅 정보 관리를 위해 광범위하게 사용된다. DRDoS의 target이 된다. 
PC-anywhere 2 원격제어 및 파일전송이 가능하며, 접근이 성공되었을 경우 PC와 같은 세크먼트에 존재하는 모든 네트워크 장비들은 스니핑이 가능하다. (UDP 5632, 22 TCP 5631)
PING 2 remote host의 상태가 dead or alive인지 정보를 준다. 위험도는 적다 .
POP3 2 client가 e-mail서버에 접근하기 위해 사용된다. 로그인하지 않은 상태에서 버퍼 오버플로우를 발생시켜 유저네임이나  패스워드를 변경할 수 있으며, 로그인된 상태에서 여러 버퍼 오버플로우 공격을 할 수 있다. (TCP 110)
PPTP 5 Microsoft 사의 PPTP는 인터넷에서 remote access VPN을 구성하는데 널리 사용되는 클라이언트/서버 기반의 Tunneling Protocol이다. PPP 트래픽을 encapsulation하기 때문에, IP, IPX, NetBEUI, AppleTalk 등의 다양한 상위 로컬 네트웍 프로토콜을 사용할 수 있으며 transit internetwork이 IP 네트웍일 것을 요구한다. End-Point들 사이에 하나의 Tunnel만을 지원하며 사용자 인증(PAP, CHAP, MS-CHAP, EAP)이나 데이터 암호화/압축 (CCP, ECP) 등의 보안 기능은 PPP에서 제공하는 것을 사용한다. 완전한 신뢰관계에 있는 제한된 host 사이에서만 허용한다. (TCP 1723)
REAL MEDIA 2 video straming과 audio service를 제공한다. Client가 server로부터 audio streams을 받을 때는 UDP포트로, control connection은 TCP 7070 포트를 사용한다.
RIP 2 독립적인 네트웍 내에서 라우팅 정보 관리를 위해 광범위하게 사용된다. DRDoS의 target이 된다. 
RLOGIN 2 rlogin은 client와 server 사이의 데이터가 암호화되지 않은 상태로 흐르기 때문에 스니핑이 가능하며 이는 login ID와 PASSWORD도 포함된다. 신뢰관계가 잘못 설정된 경우 패스워드의 입력없이 바로 서버로 접근이 가능하며 심감한 보안취약점으로 인해 신뢰관계를 설정하여 루트 권한으로의 접근이 가능하다.
SMTP(MAIL) 2 향상 최신의 패치한 상태로 서비스를 하여야 하며, 메일 Relay기능을 제한한다. 인터넷에 공개되어 있고, e-mail routing이 복잡하여 보고된 취약점(루트권한의 획득 가능)이 많다.(TCP 25)
SNMP 2 네트워크 장비의 상황을 볼 수 있는 인테페이스를 제공하며 관리 데이타의 분석, 장애관리 등의 기능수행을 위한 데이타베이스를 구축하고 있다. Get : 장비의 상태 및 가동시간등의 관리 정보를 읽어 들인다. 특정 장비의 정보를 읽으려면 메시지의 송신자로서 관리자는 그 장비를 표시하는 작은 프로그램인 에이전트에 조회를 한다. 관리자는 MIB의 트리구조를 이용해 필요한 정보를 찾는 객체를 알아내고 응답을 해석한다. Set : 장비의 MIB을 조작하여 장비를 제어한다. 관리자는 요청을 보내 다시 초기화 시키거나, 프로그램에 따라 스스로를 다시 재구성한다. Trap : 관리자에게 보고하는 Treshold나 Event를 말한다. 장비 에이전트는 경고, 고장통지등 관리자가 미리 설정한 유형의 보고서를 생성한다. SNMP의 Community String은 manager와 agent사이의 메시지를 인증하기 위해 사용되는데, 알기쉬운(Public, Private, 회사이름등…) 이름이나 Brute-force 공격으로 알아낼 수 있는 쉬운 조합으로 만들 경우 Set/Get 명령어등으로 접근할 수 있으며, 현재까지 서비스거부공격, 버퍼오버플로우공격 등 여러 취약점이 있다.(TCP, UDP 161,162)
SSH 2 Telnet보다 강한 인증기능을 가지고 다른 컴퓨터에 로그온 할 수 있으나, SSH host 의 domain을 스캔당할 수 있으며, 일반계정으로의 접근 후 OS상에 존재하는 취약점을 이용하여 루트권한의 획득이 가능하다. (TCP 22)
SYSLOG 2 log를 기록하는 전용 데몬( 항상 떠 있어서, 다른 프로그램의 요청에 응답하는 것)이다.
UDP Flood등의 DoS 공격의 대상이 될 수 있다. (UDP 514)
TALK 2 visual communication을 제공한다. 알려지지 않은 유저에 의해 정보가 유츨될 수 있다. (UDP 517, 518)
TCP-ANY 6 모든 TCP 포트를 허용하므로 Incoming 정책에 사용 불가하다. (임시적으로만 사용, 출발지/목적지등을 제한할 경우에 한하여 사용)
TELNET 2 일반계정으로의 접근 후 OS상에 존재하는 취약점을 이용하여 루트권한의 획득이 가능하다. telnet은 client와 server 사이의 데이터가 암호화되지 않은 상태로 흐르기 때문에 스니핑이 가능하며, 이는 login ID와 PASSWORD도 포함된다. (TCP 23)
TFTP 5 remote user가 login(ID와 패스워드의 인증)없이 파일을 읽고, 쓸 수 있어 위험도가 높다.  펌웨어를 업그레이드등의 경우에 주로 사용된다. TCP wrapper를 사용하며 접근을 제한하며, root directory로 아닌 subdirectory로 접근하게 하여 필요이상의 파일 접근을 피하도록 해야한다. (UDP 69)
TRACEROUTE 2 특정 호스트에 접근하기 위한 path의 정보를 제공한다. (UDP 33400-34000)
UDP-any 6 모든 UDP 포트를 허용하므로 Incoming 정책에 사용 불가하다. (임시적으로만 사용, 출발지/목적지등을 제한할 경우에 한하여 사용)
UUCP 5 시스템들 간에 파일을 복사, 실행될 명령어들을 전송할 수 있다. (UDP 540)
VDO-LIVE 2 video straming service를 제공한다. (UDP 7000-7010)
WAIS 2 특정 데이타베이스 등을 키워드로 고속 검색하여 액세스하는 환경을 제공한다. (TCP 210)
WINFRAME 2 서버에 연결된 컴퓨터 워크스테이션이 윈도우 프로그램과 데이터를 사용할 수 있도록 환경을 제공한다. (TCP 1494)
X-WINDOW 2  리눅스를 비롯해 대부분의 유닉스에 채용되어 있으며, 대상 host의 그래픽 환경 기반 window를 제공한다. TCP 다수의 포트(6000-6063)를 허용한다. (TCP 6000-6063)

'scrap' 카테고리의 다른 글

방화벽 정책에 관하여  (0) 2010.04.29
방화벽 정책(예)  (0) 2010.04.29
BPS, PPS, 프로토콜 점유율, 프로토콜 포트 점유율, 평균 패킷 사이즈  (0) 2010.04.21
XP 네트워크 명령어  (0) 2010.04.18
IDS  (0) 2010.03.27

참고 : http://blog.naver.com/saint_05

리버싱을 하다보면 조건 점프 명령이 많이 나와서 한번 올려봅니다.

외울 필요는 없구요 그냥 필요할 때 보는 정도로 사용하시면 될 것 같습니다.

어셈명령어

의미

점프 조건

(레지스터상태)

JA

결과가 1보다 클 경우 점프

CF=0 and ZF=0

JAE

결과가 1보다 크거나 같을 경우 점프

CF=0

JB

결과가 1보다 작을 경우 점프

CF=1

JBE

결과가 1보다 작거나 같을 경우 점프

CF=1 or ZF=1

JC

캐리 플래그가 1일 경우 점프

CF=1

JCXZ

CX가 0일 경우 점프

CX=0

JE

결과가 같을 경우 점프

ZF=1

JECXZ

ECX가 0일 경우 점프

ECX=0

JG

결과가 클 경우 점프(signed)

ZF=0 and SF=OF

JGE

결과가 크거나 같을 경우 점프 (signed)

SF=OF

JL

결과가 작을 경우 점프(signed)

SF != OF

JLE

결과가 작거나 같을 경우 점프 (signed)

ZF=1 or SF != OF

JMP

점프

없음

JNA

결과가 작을 경우 점프

CF=1 or ZF=1

JNAE

결과가 작거나 같을 경우 점프

CF=1

JNB

결과가 클 경우 점프

CF=0

JNBE

결과가 크거나 같을 경우 점프

CF=0 and ZF=0

JNC

캐리 플래그가 0일 경우 점프

CF=0

JNE

결과가 클 경우 점프

ZF=0

JNG

결과가 작을 경우 점프(signed)

ZF=1 or SF != OF

JNGE

결과가 작거나 같을 경우 점프(signed)

SF != OF

JNL

결과가 클 경우 점프(signed)

SF=OF

JNLE

결과가 크거나 같을 경우 점프(signed)

ZF=0 and SF=OF

JNO

오버 플로우 하지 않으면 점프(signed)

OF=0

JNP

패리티 플래그가 0일 때 점프

 

PF=0

JNS

결과가 Signed 가 아닐 때 점프(signed)

SF=0

JNZ

결과가 0 이 아닐 때 점프

ZF=0

JO

오버 플로우 일 경우 점프(signed)

OF=1

JP

패리티 플래그가 1일 때 점프

PF=1

JPE

패리티가 같을 때 점프

PF=1

JPO

패리티가 홀수 이면 점프

PF=0

JS

Sign플래그가 1일 때 점프

SF=1

JZ

0이면 점프

ZF=1

좀 더 자세히 알고 싶으시면 http://asmlove.co.kr 에서 확인 해 보시길 바랍니다.

'Programming > 이것저것' 카테고리의 다른 글

세그먼트 레지스터  (0) 2010.05.01
x86 Register  (0) 2010.04.30
Symbol  (0) 2010.04.24
IL Code에 심볼 정보가 포함되는 이유  (0) 2010.04.24
초기화 하지 않은 메모리  (0) 2010.04.16

흐 드디어 다 풀었네요. 기분 좋네요^^
인증샷 날립니다. ㅋㅋ

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

Out of the Box  (0) 2011.03.08
공부 테크니션의 여덟 가지 필살기  (2) 2010.10.11
이매진컵!! 자랑자랑..  (0) 2010.05.29
아아아아악  (0) 2010.05.08
아~~~ 블로그 옮기고 있습니다.  (3) 2010.03.18

Korea 
이 프로그램은 몇 밀리세컨드 후에 종료 되는가 
정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오 

 

저번에 봤던 문제랑 똑 같은 문제입니다. 하지만 MD5로 변형을 하라고 하는 군요.

저번에 키를 얻었던 곳에서 똑같이 키를 얻을 수 있습니다. (물론 키 값은 바뀌었습니다.)

키를 얻었으면 인터넷에서 MD5 generator로 검색해 보세요. (아주 많이 나옵니다.)

 

전 위에서 두 번째 페이지로 갔습니다.

 

사용법은 간단합니다. 거기에 들어가셔서 우리가 얻은 키를 String에 넣고 MD5를 누르시면 바로 위에 hash된 값들이 나오게 되죠.

그것을 대문자로만 바꿔서 인증하면 간단히 됩니다.

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 20  (0) 2010.04.27
CodeEngn 19  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14

대망의 마지막 이네요. 기분 좋네요 마지막 까지 다 풀다니.

마지막 문제도 힘차게 블로깅 시작하겠습니다.


 

Korea 
이 프로그램은 Key파일을 필요로 하는 프로그램이다. 
위 문구가 출력되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가 
Ex) 41424344454647 
(정답이 여러개 있는 문제로 인증시 맞지 않다고 나올 경우 게시판에 비공개로 올려주시면 확인해드리겠습니다) 

 

 

프로그램을 시작하면 아무것도 나오지 않습니다. 메뉴를 눌러봐도 마찬가지더군요

이 실행파일은 aseembly로 짜져 있다는 것을 알 수 있습니다.

 

이 프로그램을 제대로 실행하기 위해선 두가지 과정이 필요합니다.

첫번째 것은 키 파일을 만드는 것인데요. 키 파일이 존재하지 않으면 프로그램은 아무것도 하지 않습니다.

두번째는 메시지가 나오게 살짝 코드를 수정하는 것입니다.

중간쯤에 무조건 점프를 시키는 구간이 있는데 그곳을 없애야 되더군요.

 

 

문자열로 검색하시면 우리가 원하는 문자열을 쉽게 찾을 수 있습니다.

Cracked by: 사이에 우리가 원하는 문자열을 생성 시켜주는 것이 답이죠??

문자열을 생성해 내는 곳은 분명 키 파일에서 키를 읽어오고 난 후라는 것을 짐작해 볼 수 있습니다.

그럼 진짜로 그런지 보죠.

 

전 crackme3.key 파일을 만들어서 숫자를 대충 집어 넣고 프로그램을 실행 시켰습니다.

 

ReadFile()가 실행된 후 메모리에는 우리가 적어놓은 값들이 들어와 있는 것을 볼 수 있습니다.

 

그리고 선택되어 있는 함수가 실행된 후 키 값이 바뀌는 것을 확인 할 수 있군요.

그럼 위 함수만 분석하면 문제는 풀 수 있습니다.

 

이 루틴이 우리가 분석해야 할 루틴입니다.

여길 잘 진행해 보시면 여기서 키를 바꾸고 있다는 것을 알 수 있죠.

분석해 보면.

 

for( BL = 41; BL <= 4F; BL ++ )

{

    Buffer[ I ] = Buffer[ I ] ^ BL;

}

위 함수와 같습니다. 우리가 파일에 적은 값을 가져와서 BL을 하나씩 증가시키면서 XOR연산을 해서 키를 만들고 있더군요.

그럼 저것을 반대로 하는 프로그램을 만들면 되겠네요..

 

위 함수는 많은 부분이 생략 되어 있는데요. 결국은 우리가 분석한 로직을 반대로 바꾼 것입니다.

대신 원하는 키 값을 찾을 때 까지 brute force만 하게 됩니다.

저렇게 하면 키 값을 찾아 낼 수 있는데요. 그것을 파일에 그대로 써 넣는 다는 것은 불가능합니다.

하지만 우리가 레지스터의 값을 변경한다면 원하는 결과를 만들어 낼 수는 있습니다.

 

20번 문제는 19번 보다 좀 덜 해멨기 때문에 쉽더군요. (더 재밌었습니다.)

그럼 모두 열공하세요!

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn Adv01  (0) 2010.04.27
CodeEngn 19  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14

+ Recent posts