4주차 과제는 Windows 데스크톱 앱 개발로 5주차 과제에 선행하여 필요합니다.
- [필수 1] 직접 프로젝트를 생성하거나 샘플을 다운받아서 Windows 데스크톱 앱을 만듭니다. (Link 1, 2)
- [필수 2] 소스 코드를 설명합니다. 주석을 달아도 되고 소스코드와 별도로 각 요소들을 설명하는 글을 작성해도 좋습니다. 함수 정보는 Microsoft Docs에서 검색해주세요.
- [선택 1] Windows의 창에 대해 배우고 이를 응용하여 그림을 그리거나 창을 닫기 전 알림을 띄우는 등의 코드를 작성해봅니다.
- [선택 2] 작성한 Windows 데스크톱 앱을 x86-32 디버거(Visual Studio 내장 디버거, x64dbg 등)를 사용하여 소스코드와 비교하며 관찰합니다.
- [선택 3] Windows의 클래스, 프로시저, 메시지 등에 대해 공부합니다.
Link 1 - 최소한의 Windows 데스크톱 프로그램 작성
docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program
Link 2 - Windows Hello World 샘플 다운로드
docs.microsoft.com/en-us/windows/win32/learnwin32/windows-hello-world-sample
Link 3 Win32 API 문서 (기능기준)
docs.microsoft.com/en-us/windows/win32/apiindex/windows-api-list
Link 4 - Window 개요
docs.microsoft.com/en-us/windows/win32/winmsg/windows
[필수 1] 소스코드
[필수 2] 소스코드 설명
출처 - docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms633573%28v=vs.85%29
윈도우로 전송 된 메세지를 처리하는 애플리케이션 정의 함수. WNDPROC 유형은 이 콜백 함수에 대한 포인터를 정의한다.(이해를 잘 못함) 또한 4개의 인자로 구성되어 있다.
-
hwnd [in]
Type: HWNDA handle to the window.
-
uMsg [in]
Type: UINTThe message.
For lists of the system-provided messages, see System-Defined Messages.
-
wParam [in]
Type: WPARAMAdditional message information. The contents of this parameter depend on the value of the uMsg parameter.
-
lParam [in]
Type: LPARAMAdditional message information. The contents of this parameter depend on the value of the uMsg parameter.
인자 | 의미 |
HWND hwnd | 윈도우의 핸들 |
UINT uMsg | 메세지 |
WPARAM wParam | 메세지의 추가 정보. 내용은 파라미터 값에 따라 달라진다. |
LPARAM lParam | 메세지의 추가 정보. 내용은 파라미터 값에 따라 달라진다. |
메세지 결과를 리턴하는 함수이며, 메세지의 정보가 파라미터 값마다 달라지므로 리턴 값도(메세지 내용도 달라진다?) 정도로 이해했다.
출처 - docs.microsoft.com/en-us/windows/win32/learnwin32/winmain--the-application-entry-point
모든 Windows 프로그램에는 WinMain 또는 wWinMain이라는 이름을 가진 시작점 함수가 포함되어 있다.
또한 파라미터 값은 4개를 가진다.
- hInstance is something called a "handle to an instance" or "handle to a module." The operating system uses this value to identify the executable (EXE) when it is loaded in memory. The instance handle is needed for certain Windows functions—for example, to load icons or bitmaps. 운영체제는 hInstance 값을 이용하여 실행파일이 메모리에 로드될때 식별한다.
- hPrevInstance has no meaning. It was used in 16-bit Windows, but is now always zero. 16-bit Windows에서 사용됐지만 현재는 항상 0이다.
- pCmdLine contains the command-line arguments as a Unicode string. pCmdLine은 명령어 라인 정의를 유니코드로 한다.
- nCmdShow is a flag that says whether the main application window will be minimized, maximized, or shown normally nCmdShow는 윈도우 기본 응용 프로그램(main application window)을 최소화, 최대화 또는 정상적으로 표시할지 말지를 나타내는 플래그다.
모든 Windows Program 시작시 시작점(Entry Point)이 되는 함수이며 이 함수로부터 프로그램이 시작된다로 이해했다.
출처 - docs.microsoft.com/en-us/windows/win32/winmsg/window-classes
출처 - docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa
Window Classes는 클래스 유형, 시스템의 위치 지정 방법 및 해당 클래스에 속한 윈도우 기본 동작을 정의하는 요소 설명. 윈도우 클래스는 시스템이 창을 만들기 위해 템플릿으로 사용하는 속성 집합.
WNDCLASSA는 Window Class Structure다.(구조체)
인자 | 의미 |
UINT style | 클래스 스타일. |
WNDPROC lpfnWndProc | 윈도우 프로시저에 대한 포인터. |
int cbClsExtra | 클래스 구조에 따라 할당할 추가 바이트 수 |
int cbWndExtra | 인스턴스 다음에 할당할 추가 바이트 수 |
HINSTANCE hInstance | 클래스에 대한 윈도우 프로시저를 포함하는 인스턴스 핸들 |
HICON hIcon | 클래스 아이콘에 대한 핸들 |
HCURSOR hCursor | 클래스 커서의 핸들 |
HBRUSH hbrBackground | 클래스 배경 브러시에 대한 핸들(색상 값 등) |
LPCSTR lpszMenuName, ClassName | 클래스 메뉴의 리소스 이름, 문자열에 대한 포인터. |
윈도우 클래스 구조체에서 속성 값들을 지정후 Register Class를 사용하여 클래스를 등록 후 사용.
위의 예제로 예를들면 14번 라인으로 구조체 선언 후 16~18번 라인의 속성 값을 설정 후 20번 라인 Register로 등록 후 사용한다는 의미인것 같다.
출처 - docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexw
겹침, 팝업 또는 하위 창을 만든데 사용하는 함수이다.
인자 | 의미 |
DWORD dwExStyle | 작성 중인 윈도우의 확장 창 스타일. |
LPCWSTR lpClassName, WindowName | RegisterClass 또는 RegisterClassEx 함수에 대한 이전 호출에 의해 생성된 null 종료 문자열 또는 클래스 원자. 윈도우 창 이름. |
DWORD dwStyle | 작성 중인 창의 스타일 |
int X, Y, nWidth, nHeight | X: 창초기 수평 위치. Y: 수직 위치 W: 너비 H: 높이 |
Hwnd hWndParent | 작성 중인 창의 부모 또는 소유자의 창에 대한 핸들 |
HMENU hMenu | 스타일에 따라 메뉴에 대한 핸들 또는 하위 창 식별자를 지정 |
HINSTANCE hInstance | 창과 연결할 모듈의 인스턴스 핸들 |
LPVOID lpParam | WM_CREATE 메세지의 IParam 매개 변수로 가리친 CREATESTROCATE 구조를 통해 창에 전달되는 값에 대한 포인터 |
CLASS_NAME 은 위의 "Sample Window Class"라고 설정했으며 창 이름은 "Learn to Program Window"라고 적었으며 나머지는 null 값으로 설정됐으며 hInstance도 설정되어 있다라고 생각했다.
'리버싱 > 리버싱 걸음마' 카테고리의 다른 글
정보보안 SUA - [정보보안공부] 6주차 과제 - 런타임 API Hooking 수행 (0) | 2021.03.11 |
---|---|
정보보안 SUA - [정보보안공부] 5주차 과제 - Hooking의 기초 (0) | 2021.03.03 |
정보보안 SUA - [정보보안공부] 3주차 과제 - 리버싱 로드 맵 및 PE로더 (0) | 2021.02.24 |
정보보안 SUA - [정보보안공부] 2주차 과제 - Windows 데스크톱 앱 개C/C++ 언어의 다양한 개념들이 x86 어셈블리 언어로 변환 결과물 (0) | 2021.02.05 |
정보보안 SUA - [정보보안공부] 2주차 과제 - C/C++ 언어의 다양한 개념들이 x86 어셈블리 언어로 변환 (0) | 2021.02.05 |