1. Hello World! 프로그램


#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR *argv[])
{
MessageBox(NULL,
L"Hello World!",
L"www.reversecore.com",
MB_OK);
return 0;
}

// 릴리즈 모드로 빌드하기.

c언어(HelloWorld.cpp) ---- <빌드> -----> 실행파일(HelloWorld.exe)// 기계어 ------ <디버거> ----> 어셈블리어



2. 디버깅 시작
// Immunity Debugger 사용

 Code Window 

Register Window 

Dump Window 

Stack Window 


- 사용법

// Restart (ctrl+F2)

Step Into (F7) : CALL함수를 만나면, 함수 코드 내부로 따라 들어감.

Step Over (F8) : CALL함수를 만나면, 따라 들어가지 않고, 함수 자체를 실행.

Execute till Return (Ctrl+F9) : 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출 목적)

Go to(Ctrl+G) : 원하는 주소로 이동

Comment (;) : comment 추가

Set/Reset Break Point (F2) : BP 설정/해제

Run (F9) : 실행(BP가 걸려있으면 그곳에서 실행이 정지됨)

Show the previous Cursor (-) : 직전 커서 위치를 다시 보여줌.



* EP(Entry Point)

// Windows 실행 파일(EXE, DLL, SYS)의 코드 시작점을 의미.

address Instruction      Disassembled code                           comment


- address : 가상 메모리내의 주소

- instruction : cpu 명령어

- Disassembled code : OP code를 보기 쉽게 어셈블리로 변환한 코드 (OP code란 Operation Code)

- comment : 디버거에서 추가한 주석



* BP(Break Point)

- view -> Breakpoints // BP목록 보기(Alt+B)



3. main() 찾기

- 경험과 노하우를 통한,,

// push , push, call...~

call에는 메인함수의 주소가 들어있다.



- 문자열 검색 방법

// code window 부분에서 우클릭 -> Search for -> All referenced text strings -> 이동하고자 하는 문자열을 더블클릭




// 제대로 간지 확인법> dump window 에 ctrl+G -> push 뒤에 있는 주소 입력 (0040211c)

-> dump window보면 아스키에 helloworld!가 찍혀 있음.




- API 검색

// 우리가 사용한 MessageBox()를 이용해서 찾는 것.

// Search for -> All intermodular calls -> 원하는 것 더블클릭하면 이동



- 문자열 패치1 <원본문자열의 크기와 수정문자열의 크기가 같거나 작은 것>

만약,,, 크다면,,, 이거는 뒤에 있는 함수에 영향을 주기때문에 프로그램 에러가 발생.

// 바꾸고자 하는 문자열을 드래그 후 ctrl+E (문자열 패치)


// 문자열이 바뀐 것을 확인할 수 있다. 하지만 이건 임시적으로 바꾼 것이다.

따라서, Restart를 하면 처음 상태 그대로 문자열이 helloWorld가 나온다.



// 임시적인게 아니라 저장하고싶다??

저장하고자 하는 문자열 드래그 -> 우클릭 -> Copy to executable file



// hex파일에 드래그 된 부분 우클릭 -> save file



- 문자열패치2 <원본문자열보다 수정문자열이 크기가 더 큰 경우>


// 맨 밑에 널패딩으로 가득한 곳을 찾는다. 그 주소 00401810을 dump window에서 ctrl+G로 검색

// 검색해서 쓰고싶은 만큼 드래그 -> ctrl+E -> 문자열 입력.



// 아까 위에있던 원본 문자열 push하는 부분에서 주소값을 널패딩으로 가득했던..

내가 새로 입력한 문자열 주소로 바꾼다. 주소를 바꾸기 위해서는 바꾸고자하는 줄을 더블클릭해준다.


// 바꾸고, 그 부분에 BP를 추가하여 Run한다. 그럼 내가 바꾼 문자열로 실행되는 것을 볼 수 있다.



* 깨알용어정리

- VA(Virtual Address) : 프로세스의 가상 메모리

- OP code (Operation code) : cpu 명령어(바이트 code)

- PE(Portable Executable) : Windows 실행파일(EXE, DLL, SYS 등)




1. RCE

// Reversing Code Engineering(역공학)이라고 하며, 시스템의 구조, 기능, 동작 등을 분석/ 원리 이해 


2. RCE 방법

1) 정적 분석 <파일을 실행 X>

//  파일의 종류, 크기, 헤더정보, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보 등의 다양한 내용을 확인하는 것.


2) 동적 분석 <파일을 실행>

// 디버깅을 통하여 코드 흐름과 메모리 상태보기, 파일/레지스트리/네트워크 행위 분석, 

    디버거를 이용하여 프로그램 내부 구조와 동작 원리 분석.



 * Immunity Debugger //어셈블리어 관찰 


* HxD // HEX(16진수)로 보기  


* vitual studio 2008 // c 및 c++로 코딩 


이 외에도 레지스트리를 관찰하는 Process Moniter

              dll 분석을 위한 BinText 등이 있다. 


http://soen.kr/lecture/win32api/win32lec.htm 참고!


* 파일 생성 및 쓰기 - CreateFile() 속성 값 GENERIC_WRITE --> memcpy() --> WriteFile() 함수 

* 파일 열기 및 읽기 - CreateFile() 속성 값 GENERIC_READ  --> ReadFile() 함수 


 

1. 파일 열기 및 읽기 예제



#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HANDLE hFile;
DWORD dwWritten;
WORD wd=0xFEFF;
TCHAR strWrite[]=L" 이제 꿈나라로 떠납니다ㅎㅎ";
DWORD dwRead;
TCHAR strRead[MAX_PATH]; // 읽어들인 문자열을 저장할 버퍼.
switch(iMessage)
{
case WM_LBUTTONDOWN: // 마우스 왼쪽 클릭 시
hFile=CreateFile(L"FileInOutExx.txt",GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,0,NULL);
// 파일을 생성한다. 그 파일은 디버깅파일이 있는 디렉토리의 만들어지며, 이름은 FileInputExx.txt이다. 이것은 쓰기만 가능하며, 공유는 안 된다.
// 또한 상속은 하지 않으며, 파일이 없다면 만들어서 기록하며 있다면 내용을 덮어씌운다.
memcpy(strWrite, &wd,2);
// 유니코드 인식을 위하여 strWrite에 있는 2byte를 &wd(0xFEFF)에 저장.
WriteFile(hFile, strWrite, (wcslen(strWrite)+1)*sizeof(TCHAR), &dwWritten, NULL);
// 파일의 핸들값을 가지고오며, 두번째에는 입력할 문자열, 그 다음은 입력할 문자열의 크기, 실제로 쓰여진 바이트 수를 리턴하는 DWORD 변수의 포인터,
// 마지막은 비동기식 입출력이므로 NULL을 입력.
CloseHandle(hFile); // 파일 사용이 끝나면, 사용된 핸들을 종료시키기.
return 0;
case WM_RBUTTONDOWN: // 마우스 오른쪽 클릭 시
hdc=GetDC(hWnd);
hFile=CreateFile(L"FileInOutExx.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
// FileInOutExx.txt라는 파일을 읽기모드로 생성하겠다는 의미. 또한, 세 번째 인수가 0이므로 파일은 공유하지 않으며, 이미 생성된 파일을 읽어오는 것이기 때문에 OPEN_EXISTING를 씀.
ReadFile(hFile,strRead,wcslen(strRead),&dwRead,NULL);
// 읽어올 파일의 핸들을 의미하며, 읽어온 데이터를 strRead 버퍼에 저장하고, 쓰려는 바이트 수 , 실제로 입력한 바이트 수 반환, 비동기식 입력 사용 x 하겠다는 의미.
TextOut(hdc,100,100,strRead,wcslen(strRead));
// strRead에 담긴 문자열을 (100,100)에 출력하라는 의미.
// hdc는 첫번째 인자를 의미하는 것이며,, 사실 몰라,,뭔지 잘,,,ㅎ 그리고 마지막 인자는 strRead에 담긴 문자열의 길이를 나타내는 것.
CloseHandle(hFile); // 사용한 핸들 닫아주기.
ReleaseDC(hWnd,hdc);
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}


























// FileInOutEx.exe를 실행. 


// switch()문에 의거하여, 왼쪽 마우스를 클릭하면 FileInOutExx.txt에 미리 지정한 문자열이 입력됨. 




// FileInOutEx.exe를 실행했기 때문에  작업관리자를 보면 FileInOutEx.exe 프로세스가 돌아가는 것을 볼 수 있음. 



// 마우스 우클릭을 하면, FileInOutExx.txt에 있는 문자열이 FileInOutEx.exe화면에 찍히는 것을 볼 수 있음. 




* TextOut( ) 함수 


- 함수 원형

 BOOL TextOut(hdc, nXStart, nYStart, lpszString, cbString)

// 모든 함수의 첫 번째 인자인 hdc를 입력, (nXStart, nYStart)는 문자열이 출력될 좌표이며, 

   lpszString는 출력 문자열을 담고 있는 문자열 포인터, cbString는 출력할 문자열의 크기.

   TextOut 함수는 널종료 문자열을 사용하지 않는다!!!!



ex) Text(hdc, 100, 100, "Beautiful Flower", 16);

//  Beautiful Flower 라는 16자 길이의 문자열을 (100,100)에 출력하며, 

출력에 필요한 기타 정보들은 모두 hdc에서 지정하는 정보를 사용하라는 뜻.





1. 파일 생성 및 쓰기 예제 



#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // 윈도우 메시지를 처리하는 WndProc()함수
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow) // 윈도우 자체를 생성하는 WinMain()함수
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HANDLE hFile; // 핸들파일을 만들어줌.
DWORD dwWritten;
WORD wd=0xFEFF;
TCHAR strWrite[]=L" 문자열을 파일에 씁니다.";
switch(iMessage)
{
case WM_LBUTTONDOWN:
hFile=CreateFile(L"FileInOutExx.txt",GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,0,NULL);
// 파일을 생성한다. 그 파일은 디버깅파일이 있는 디렉토리의 만들어지며, 이름은 FileInputExx.txt이다. 이것은 쓰기만 가능하며, 공유는 안 된다.
// 또한 상속은 하지 않으며, 파일이 없다면 만들어서 기록하며 있다면 내용을 덮어씌운다.
memcpy(strWrite, &wd,2); // 유니코드 인식을 위해 작성할 문자배열의 2byte를 0xFFEF에 넣는다.
WriteFile(hFile, strWrite, (wcslen(strWrite)+1)*sizeof(TCHAR), &dwWritten, NULL);
// 데이터를 읽어와서 쓴다. hFile은 CreateFile() 함수로부터 생성한 파일 핸들 값이 들어가게 되며, 두번째에는 입력할 문자열,
// 세번째에는 입력할 문자열의 크기, 그 다음은 실제로 쓰여진 바이트 수를 리턴하기 위해 DWORD 변수의 포인터가 들어가며, 마지막엔 비동기식 입출력을 NULL로 한 것이다.
CloseHandle(hFile); // 파일 사용이 끝나면 파일 닫기
return 0;
}
return(DefWindowProc(hWnd,iMessage, wParam, lParam));
}





















// 디버깅 후, FileInOutEx.exe 실행 -> 마우스 왼쪽 클릭 


// 그러면 FileInOutExx.txt가 생성된다. 

또한, 그것을 열어보면 아까 코드에 있던 strWrite[]의 내용이 적혀있는 것을 볼 수 있다. 




* memcpy() 함수 

// memory copy라는 의미로, 메모리의 내용을 바이트단위로 다른 곳에 복사해주는 함수. 


- 함수 원형 

memcpy(목적지포인터, 원본포인터, 크기);

void *memcpy(void*_Dst, void const*_Src, size_t_Size);


ex) memcpy(strWrite, &wd, 2);

// 문자열 변수인 strWrite의 처음 2byte를 &wd(0xFEFF)에 입력시키기. 

왜?? 유니코드로 제대로 인식하기 위해.  




'WIN32 API' 카테고리의 다른 글

WIN32 API- 파일 공유  (0) 2018.12.11
WIN32 API- 파일의 입출력 예제2  (0) 2018.12.08
WIN32 API- 파일의 입출력(ReadFile)/(WriteFile)  (0) 2018.12.06
WIN32 API- 파일의 입출력(CreateFile)  (0) 2018.12.06
WIN32 Programming  (0) 2018.12.06

2. ReadFile( )

// 파일로부터 데이터를 읽어오는 함수


BOOL ReadFile (

  HANDLE hFile, // 읽으려는 파일의 핸들

  LPVOID lpBuffer, // 읽어 온 데이터를 저장할 버퍼의 포인터

  DWORD nNumberOfBytesToRead, // 읽으려는 바이트의 수 

  LPDWORD lpNumberOfBytesRead, // 실제로 읽은 바이트 수를 반환 받기 위한 출력용 인수

  LPOVERLAPPED lpOverlapped // 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터 (비동기 사용X -> NULL)

);



#예제1 - 파일의 맨 처음부터 읽기.

- test.txt 파일을 없으면 만들고, 있으면 덮어씌워서라도 열어라.

- 읽기 위해서

- 딴놈이 읽는 것까지는 허용

- 일반 파일 속성

- 함수 사용 예제


DWORD rbytes; // 실제로 읽은 바이트 수를 반환받기 위한 출력용 인수 선언

char buff[100]; // 읽어 온 데이터를 저장할 버퍼의 포인터 선언 

HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, 

                     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

ReadFile(hFile, buff, sizeof(buff), &rbytes, NULL);



# 예제2 - 원하는 위치부터 읽기

- 파일의 첫부분에서 100바이트 뒤부터 읽기

- 함수 사용 예제


DWORD rbytes;  // 실제로 읽은 바이트 수를 반환하기 위한 출력용 인수

char buff[100]; // 읽어 온 데이터를 저장할 버퍼의 포인터 선언 

HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, 

                     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

SetFilePointer(hFile, 100, NULL, FILE_BEGIN);

ReadFile(hFile, buff, sizeof(buff), &rbytes, NULL);




3. WriteFile( )

// 파일에 데이터를 쓰는 함수 


* 함수 원형


BOOL WriteFile(

HANDLE hFile, // 쓰려는 파일의 핸들

LPCVOID lpBuffer, // 데이터를 쓰기 위해 할당된 버퍼의 포인터

DWORD nNumberOfBytesToWrite, // 쓰려는 바이트 수 

LPDWORD lpNumberOfBytesWritten, // 실제로 쓴 바이트 수를 반환 받기 위한 출력용 인수

LPOVERLAPPED lpOverlapped // 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터(비동기 사용X -> NULL)

);


// 파일 포인터가 가리키고 있는 지점부터 데이터를 저장하며, 기록이 끝나면 실제 기록한 바이트 수만큼 파일 포인터를 이동해준다. 





'WIN32 API' 카테고리의 다른 글

WIN32 API- 파일 공유  (0) 2018.12.11
WIN32 API- 파일의 입출력 예제2  (0) 2018.12.08
WIN32 API- 파일의 입출력 예제1  (0) 2018.12.07
WIN32 API- 파일의 입출력(CreateFile)  (0) 2018.12.06
WIN32 Programming  (0) 2018.12.06

1. CreateFile( ) 

// 파일 생성, 열기 


* 함수의 원형


HANDLE CreateFile(

LPCTSTR lpFileName, 

DWORD dwDesiredAccess, 

DWORD dwShareMode, 

LPSECURITY_ATTRIBUTES lpSecurityAttributes,  

DWORD dwCreationDisposition, 

DWORD dwFlagsAndAttributes,  

HANDLE hTemplateFile 

);



1) LPCTSTR lpFileName

// 생성하고자 하는 파일명, 파일의 절대경로를 나타냄. 또, 'COM1'이라 쓰면 COM1포트 개방.


2) DWORD dwDesiredAccess 

// 파일의 접근 권한 지정 (0, GENERIC_READ, GENERIC_WRITE)

  읽고 싶은지 쓰고 싶은지 아니면 둘다인지


3) DWORD dwShareMode

 // 파일의 공유 모드 지정 (FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_DELETE, 0)

    내가 열어서 사용하고 있는데 딴 놈이 접근하면 어떻게 하지? 아무도 열지 못하게 할 수도, 읽기만 허용, 

    쓰기 허용, 삭제 허용  


4) DWORD dwCreationDisposition

// 파일을 생성할 것인지 열 것인지 지정, 만들지 열지 

 CREATE_NEW : 파일을 새로 만든다. 기존에 파일이 있다면 에러를 반환. 

 CREATE_ALWAYS : 항상 파일을 새로 만든다. 기존에 파일이 있다면 덮어쓰기.

 OPEN_EXISTING : 기존 파일을 연다. 만약 열려있는 파일이 없다면 에러를 반환

 OPEN_ALWAYS : 파일을 연다. 열려는 파일이 없는 경우에는 직접 파일을 생성하여 파일을 열기.


5) LPSECURITY_ATTRIBUTES lpSecurityAttributes

// 파일의 보안 속성을 지정하는 구조체 포인터 

    자식한테 상속할까? 상속할 마음 없으면 그냥 NULL하자. 


6) DWORD dwCreationDisposition

// 파일을 생성할 것인지 열 것인지 지정.


 7) DWORD dwFlagsAndAttributes

 //생성할 파일의 속성 또는 기타 객체의 속성을 지정.

  FILE_ATTRUBUTE_ARCHIVE : 쓰기 속성으로 생성.

  FILE_ATTRUBUTE_ENCRYPTED : 파일을 암호화하여 생성.

  FILE_ATTRUBUTE_HIDDEN : 숨김 파일로 생성.

  FILE_ATTRUBUTE_NORMAL : 아무런 속성도 없는 파일을 생성.

  FILE_ATTRUBUTE_NOT_CONTENT_INDEXED : 콘텐츠 인덱싱 서비스에 대해 인덱스되지 않도록 한다.

  FILE_ATTRUBUTE_OFFLINE : 데이터가 오프라인 상태로 즉시 사용 불가.

  FILE_ATTRUBUTE_READONLY : 읽기 전용 속성으로 생성.

  FILE_ATTRUBUTE_SYSTEM : 시스템 파일로 생성.

  FILE_ATTRUBUTE_TEMPORARY : 임시 파일로 생성.


8) HANDLE hTemplateFile 

// 새로 만들 파일의 속성을 제공할 템플릿 파일, 필요없어 쓰지마. 




#예제1

- 파일에 내용을 쓰기 목적으로 열기

- 다른 프로세스가 열어서 읽는 것까지는 허용

- 파일이 없으면 만들어서 열고 있으면 실패

- 함수 사용 예제

HANDLE hFile;

hFile = CreateFile("c:\\test.txt", GNERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,                                                     FILE_ATTRIBUTE_NORMAL, NULL);



#예제2

- 파일이 있으면 열고 없으면 새로 만들어서 열기

- 파일에 내용을 읽기 목적으로 열기

- 함수 사용 예제

HANDLE hFile;

hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, NULL

                         ,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);


# CreateFile 예제3

- 파일이 있으면 열고 없으면 실패

- 함수 사용 예제

HANDLE hFile;

hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_WRITE, NULL

                          , OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);




'WIN32 API' 카테고리의 다른 글

WIN32 API- 파일 공유  (0) 2018.12.11
WIN32 API- 파일의 입출력 예제2  (0) 2018.12.08
WIN32 API- 파일의 입출력 예제1  (0) 2018.12.07
WIN32 API- 파일의 입출력(ReadFile)/(WriteFile)  (0) 2018.12.06
WIN32 Programming  (0) 2018.12.06

1.  Virtual C++ 2005     

- 디버그 모드

// 디버깅하기 위한 컴파일 모드. 실행파일 중간에 디버그 정보를 삽입하여 디버깅 정보를 볼 수 있게 하며, 브레이크 포인트를 걸어서 실행 중간 과정을 확인 할 수 있음. 디버깅 정보가 들어가 실행파일의 크기는 크다.


- 릴리즈 모드

// 배포하기 위한 컴파일 모드. 컴파일 시에는 디버그 정보가 모두 빠지고, 코드 또한 최적화되므로 실행 파일의 크기는 작은 편이다. 



2. WIN 32 Data type


 자료형

 의미 

 BYTE 

 unsigned char형

 WORD 

 unsigned short형

 DWORD

 unsigned long 형

 LONG 

 long형과 같다.

 LPSTR

 char*형과 같다.(포인터)

 BOOL

 정수형이며 TRUE 혹은 FALSE 값을 갖는다. 



3. 인수와 매개변수 

- 매개변수

// 함수 내부에서 사용되는 변수. 즉, 불리워진 함수 내부에서 사용하는 변수.


- 인수

// 함수 밖에서 함수를 호출할 때 사용되는 변수. 즉, 함수를 부르는 쪽에서 사용하는 변수 


int multiple (int a, int b)

{

int nret;

nret=a*b;

return nret;

}


void main()

{

int k,m,n;

k=multiple(m,n);

}


// a,b는 매개변수, m,n은 인수. 



4. Vitual C++ 2005 시작 // win xp에서 실행. 

Win 32 -> Win 32 프로젝트 


Windows 응용프로그램, 빈 프로젝트 체크 후 마침.


소스파일 추가 -> 새 항목 -> 코드 -> c++파일(.cpp) 



5. 함수의 기본 구조 // 반드시 있어야 할 함수!! 


(1) WinMain() 함수 // 프로그램의 윈도우 자체를 생성만 함.


WinMain()
{
윈도우_클래스_만들기
윈도우_객체_생성하기
윈도우_객체_화면에_띄우기
메시지_루프_돌리기

}

- WinMain() 함수의 원형

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)

// hInstance : 현재 실행되고 있는 프로그램의 인스턴스 핸들
hPrevlnstance : 바로 앞에 실행된 프로그램의 인스턴스 핸들, 통상 NULL 값을 준다.
lpCmdLine : 명령행 인자. main 함수의 argv에 해당.
nCmdShow : 윈도우를 보여주는 형태의 플래그.


* 인스턴스 핸들
// 메모리에 생성된 클래스의 실체.
예를 들면, 내 방에 있는 컴퓨터, 책상, 스탠드 등을 클래스라 할 수 있으며, 이 물건들을 활용한다면 메모리에 생선한다고 말할 수 있다.
내 방에 컴퓨터는 존재한다( 클래스가 존재한다 ) 내가 컴퓨터의 전원을 켠다 (메모리에 클래스를 생성한다) 존재의 가치가 있으려면 메모리가 생성되어야한다.
각 프로그램마다 고유하다.

* 핸들
// 레이블과 같은 것으로, 대상을 식별하는데 주로 사용.
- 접두어 h로 시작하며, 정수형 32bit이다.
- 핸들은 운영체제가 발급하며 사용자는 핸들을 쓰기만 하면 된다.
- 같은 종류의 핸들끼리는 절대 중복된 값을 가지지 않는다.


< 윈도우 생성을 위해서 > // WinMain()함수
1. 윈도우 클래스 생성 // 구조체 이용
2. 윈도우 객체 생성 // 클래스 이용
3. 윈도우 화면에 출력
4. 입력장치로부터 입력신호를 받음(메시지 루프)
// 메시지 루프로부터 전달 받은 윈도우 메시지를 처리 // WndProc()함수

(2) WndProc() 함수 // 실제 일어나는 윈도우 메시지를 처리 ( 윈도우 프로시져 = 윈프록 )

WndProc()
{
전달된_메시지_처리하기


}


1.     OSI 7계층


1) 물리(Physical)계층 // bit로 데이터 전송, 거리멀면 리피터로 신호 증폭

  ex) 동축케이블, 광섬유


2) 데이터링크(Data Link)계층

// ip주소를 읽어 mac주소 구함, 네트워크 부하x -> 흐름제어, 에러 탐지/교정

  ex) 흐름제어, 오류제어(ARQ), Frame Relay


3) 네트워크(Network)계층

// ip주소 읽어 라우터 경로 결정 후 포워딩, IPv4/IPv6, 에러는 ICMP 프로토콜 사용.

 ex) IP, ICMP, 라우팅 프로토콜


4) 전송(Transport)계층 // 송수신자 논리적 연결, TCP/UDP, 에러 탐지/재전송/수정

 ex) TCP/UDP


5) 세션(Session)계층 // 송수신자 동기화 신호 주고받음, 단순/반이중/전이중 방식

 ex) 단순/반이중/전이중 결정


6) 표현(Presentation)계층 // 코드변환, 메시지 압축, 스니핑 막기위해 암호화 수행.

 ex) 압축, 암호, 코드 변환, GIF, ASCII, EBCDIC


7) 응용(Application)계층 // 메시지 생성 (인터넷-HTTP, 파일 업로드/다운로드-FTP,

네트워크 모니터링-SNMP, 전자우편 발송/수신-SMTP)

                                              ex) FTP, SNMP, HTTP, Mail, Telnet

 

 

2.     TCP/IP 4계층

1)    애플리케이션(Application)계층

ex) HTTP, FTP, SMTP, DNS, RIP, SNMP


2)    전송(Transport)계층

   ex) TCP, UDP


3)    인터넷(Internet)계층

ex) IP, ICMP, ARP, RARP


4)    네트워크접근(Network Access)계층

ex) Ethernet, Token Ring, Frame Relay, ATM



// 2- Ethernet은 네트워크 접근 계층

3- IP는 인터넷 계층

              4- TCP는 전송 계층

              5- HTTP는 전송 계층

 

 

3.     TCP/UDP 포트 목록


 

포트

TCP

UDP

설명

20

TCP

 

FTP(데이터)

21

TCP

 

FTP(제어)

22

TCP

 

SSH(Secure Shell)

23

TCP

 

Telnet

25

TCP

 

SMTP

53

TCP(Zone transfer)

UDP(질의응답)

DNS

69

 

UDP

TFTP

80

TCP

UDP

HTTP

110

TCP

 

POP3

143

TCP

 

IMAP4

161

 

UDP

SNMP(Agent)

162

 

UDP

SNMP(Manager)

443

TCP

 

HTTPS

 

 

  











   



4.   TCP 구조


Source Port

Destination Port

Sequence Number

Acknowledment Number

Data

Offset

Reserved

URG

ACK

PSH

RST

SYN

FIN

Receive Window

Checksum

Urgent Pointer

Options and Padding

Data bytes

// Sequence Number: 메시지 순서 파악

   Acknownledment Number: 수신자가 응답받은 데이터의 수

Checksum: 메시지 변조 파악

Window : 수신자의 윈도우 크기(메모리 버퍼), 버퍼 크기만큼 데이터 한꺼번에 전송.

 

- TCP의 주요 기능

// 신뢰성 있는 전송, 순서 제어, 완전이중, 흐름 제어, 혼잡 제어


'이론충' 카테고리의 다른 글

어셈블리어  (0) 2019.04.12

+ Recent posts