어셈블리: 함수 호출 규약(Calling Convention)
어셈블리: 함수 호출 규약(Calling Convention)
2013.06.07[어셈블리 스터디] 호출자와 피호출자간의 약속! 함수 호출 규약(Calling Convention) 함수 호출 규약(Calling Convention)이란 호출자(Caller)와 피호출자(Callee) 간에 '함수를 호출할 때 전달되는 인자의 순서나 사용이 끝나고 나서의 스택 정리 등'에 대한 약속이라고 할 수 있습니다. 크게 3가지가 있으며, 이 3가지는 각각 __cdecl, __stdcall, __fastcall 방식입니다. 오늘은 이 세가지 방식에 대해 알아보려고 합니다. __cdecl 방식 __cdecl 방식은 C/C++ 함수에서 기본적으로 사용되는 호출 규약이며, 호출자가 스택을 정리합니다. 그리고 인자는 오른쪽에서 왼쪽으로 전달되며 호출자가 피호출자를 호출 시에 전달되는 인자의 개수를 알고있기..
D3D Tutorial 07: IndexBuffer
D3D Tutorial 07: IndexBuffer
2013.02.13/**----------------------------------------------------------------------------------- * \brief 인덱스 버퍼 생성 * 파일: 소스.cpp * * 설명: 인덱스 버퍼(Index Buffer)란 정점을 보관하기 위한 정점 버퍼처럼 인덱스를 보관하기 위한 전용 객체다. D3D 학습 예제에는 이러한 예제가 IB를 사용한 예제가 없기 때문에 새롭게 추가한 것이다. *------------------------------------------------------------------------------------ */ #include /**-------------------------------------------------------..
D3D Tutorial 06: Meshes
D3D Tutorial 06: Meshes
2013.02.12/**----------------------------------------------------------------------------------- *\brief 메시 사용 *파일: 소스.cpp * *설명: 보다 멋진 기하 정보를 출력하기 위해서는 전문적인 3D모델러가 만든 모델을 * 파일로 읽어들이는 것이 일반적이다. 다행스럽게도 D3DX에는 강력한 X파일 * 처리 기능이 있어서 정점 버퍼, 인덱스 버퍼 생성 등의 많은 부분을 대신해 준다. * 이번 예제는 D3DXMESH를 이용하여 파일을 읽어서 이 파일과 연관된 재질과 * 텍스처를 함께 사용하는 것을 알아보자. *-------------------------------------------------------------------------..
D3D Tutorial 05: Textures
D3D Tutorial 05: Textures
2012.12.08#include "stdafx.h" // SHOW_HOW_TO_USE_TCI가 선언된 것과 선언되지 않은 것의 컴파일 결과를 반드시 비교해보자. #define SHOW_HOW_TO_USE_TCI LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 렌더링에 사용될 D3D 디바이스 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 정점을 보관할 정점 버퍼 LPDIRECT3DTEXTURE9 g_pTexture = NULL; // 텍스처 정보 // 사용자 정점을 정의할 구조체 // 텍스처 좌표가 추가되었다는 것을 알 수 있다. struct CUSTOMVERTEX { D3..
D3D Tutorial 04: Lights
D3D Tutorial 04: Lights
2012.12.02#include "stdafx.h" LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 렌더링에 사용될 D3D 디바이스 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 정점을 보관할 정점 버퍼 // 사용자 정점을 정의할 구조체 // 광원을 사용하기 때문에 법선벡터가 있어야 한다는 사실을 명심하자. struct CUSTOMVERTEX { D3DXVECTOR3 position; // 정점의 3차원 좌표 // 정점의 법선 벡터, 빛은 법선을 기준으로 반사되기 때문에, // 광원을 사용할때는 '반드시' 법선벡터가 있어야 처리가 가능하다. D3DXVECTOR3 norma..
어셈블리: 데이터 타입, 피연산자 타입, 명령어 정리
어셈블리: 데이터 타입, 피연산자 타입, 명령어 정리
2012.11.251. 데이터 타입(Data Type) 타입 설명 BYTE 8비트 부호 없는 정수 SBYTE 8비트 부호 있는 정수 WORD 16비트 부호 없는 정수 SWORD 16비트 부호 있는 정수 DWORD 32비트 부호 없는 정수 SDWORD 32비트 부호 있는 정수 FWORD 48비트 정수 QWORD 64비트 정수 TBYTE 80비트 정수 2. 피연산자 타입(Operand Type) 피연산자 설명 r8 8비트 범용 레지스터 r16 16비트 범용 레지스터 r32 32비트 범용 레지스터 Reg 임의의 범용 레지스터 Sreg 16비트 세그먼트 레지스터 Imm 8, 16, 32비트 즉시값 imm8 8비트 즉시값 imm16 16비트 즉시값 imm32 32비트 즉시값 r/m8 8비트 범용 레지스터, 메모리 r/m16 16비..
범용 레지스터: EAX, ECX, EDX, ESI, EDI, ESP, EBP
범용 레지스터: EAX, ECX, EDX, ESI, EDI, ESP, EBP
2012.11.241. EAX(Extended Accumulator Register) 첫번째로, EAX 레지스터에 대해 알아보도록 하겠습니다. EAX 레지스터는 산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행하며 함수의 반환값이 이 레지스터에 저장됩니다. 즉, 덧셈, 곱셈, 나눗셈 등의 명령은 모두 EAX 레지스터를 사용하며, 함수의 반환 값이 EAX 레지스터에 저장되므로 호출 함수의 성공 여부, 실패 여부를 쉽게 파악할 수 있으며, 반환값을 쉽게 얻어올 수 있습니다. 직접 EAX 레지스터의 값이 어떻게 변하는지 확인해보도록 하겠습니다. 두 정수를 더하는 함수가 호출되고 나서 EAX 레지스터의 값이 어떻게 변하는지 확인해보기 위해, 아래와 같은 구조의 프로그램을 디버깅하여 EAX 레지스터의 값을 살펴보았습니다. #in..
DirectX 스터디: 월드 변환, 카메라 변환, 투영 변환
DirectX 스터디: 월드 변환, 카메라 변환, 투영 변환
2012.11.231. 월드 변환(World Transform) 월드 변환(World Transform)이란 현재 물체가 사용하는 지역 좌표계로부터 월드 좌표계로의 변환을 하는 동안 이동, 회전, 크기 변환 등의 변환을 거칩니다. 3차원 그래픽에서 모든 정점은 각자 자기만의 지역 좌표계상에서 정의됩니다. 이 지역 좌표계는 모델 좌표계라고도 합니다. 위의 이미지를 한번 보시면, 위의 물체는 고유한 원점을 기준으로 모델링되어 있습니다. 그런데, 한개가 아닌 여러개의 물체를 3차원 공간에 출력할 경우 어떤일이 벌어질까요? 여러개의 물체 모두 원점을 공유하는 일이 벌어져, 3차원 공간상에 모두 배치하게 되면 물체가 겹치게 됩니다. 이것들을 따로따로 출력하기 위해 로컬 좌표계를 월드 좌표계로 변환할 필요성이 생깁니다. 로컬 좌표계..
D3D Tutorial 03: Matrices
D3D Tutorial 03: Matrices
2012.11.23#include "stdafx.h" LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 렌더링에 사용될 D3D 디바이스 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 정점을 보관할 정점 버퍼 // 사용자 정점을 정의할 구조체 struct CUSTOMVERTEX { FLOAT x, y, z; // 정점의 변환된 좌표 // FVF 선언 순서에 위배되면 절대로 작동하지 않고, 출력 결과는 장담할 수 없게된다. DWORD color; // 정점의 색깔 }; // 사용자 정점 구조체에 관한 정보를 나타내는 FVF(Flexible Vertext Format) 값 // 구..
D3D Tutorial 02: Vertices
D3D Tutorial 02: Vertices
2012.11.22#include "stdafx.h" LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 렌더링에 사용될 D3D 디바이스 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 정점을 보관할 정점 버퍼 // 사용자 정점을 정의할 구조체 struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // 정점의 변환된 좌표(rhw 값이 있으면 변환이 완료된 정점이다.) // RHW(reciprocal homogeneous W)는 동차 좌표계의 w값이며, 값이 있으면 변환이 완료된 정점을 말한다. // FVF 선언 순서에 위배되면 절대로 작동하지 않고, 출력 결..
D3D Tutorial 01: CreateDevice
D3D Tutorial 01: CreateDevice
2012.11.22#include "stdafx.h" LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 렌더링에 사용될 D3D 디바이스 /* Direct3D 초기화 */ HRESULT InitD3D(HWND hWnd) { // 디바이스를 생성하기 위한 D3D 객체 생성 if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; // 생성 실패시 E_FAIL를 반환 D3DPRESENT_PARAMETERS d3dpp; // 디바이스 생성을 위한 구조체 // 반드시 ZeroMemory() 함수로 미리 구조체를 깨끗이 지워야 한다. Zero..
Abex Crack-Me 1번문제.
Abex Crack-Me 1번문제.
2012.08.16Abex Crack-Me 1번문제는 Immunity Debugger를 사용하여 풀었습니다. 우선 위의 apexcrackme를 다운받고 실행해봅시다. '나를 CD-ROM으로 생각하게 만들어라' 그리고 확인을 누르게되면, '아냐... 이것은 CD-ROM 드라이브가 아니다!' 아마도 CD-ROM인지 아닌지에 따라 각각 성공했을 때와 실패했을때의 메세지 박스가 뜰것이며, 이것을 우회하여 성공 메세지 박스를 띄우게 만들어야 하는 문제 같습니다. 그럼 이제 디버거를 실행하여 파일을 열어봅시다. 디버거를 실행하면, 주소 창, 옵코드 창, 디스어셈블리 창, 레지스터 창, 스택 창, 메모리 덤프창 등이 보이죠.우선 F8(Step over)키를 이용해서 한줄 한줄 실행해보도록 하겠습니다. (F7(Step info)키와 차..