본문 바로가기

전체 글 보기

(54)
항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화 하자 객체의 초기화에 있어서는 C++이 이랬다저랬다 하는 경향이 있다.(맘에 들지 않음) int x; 이 코드가 어떤 상황에서는 0으로 자동 초기화가 되지만, 또 다른 상황에서는 그렇지 않다는 것이다. class Point{ int x, y; }; Point p; 이렇게 했을 때에도, p의 데이터 맴버(x,y) 역시 어떤 상황에서는 0으로 자동 초기화가 되지만, 또 다른 상황에서는 안된다. => ???????????? 초기화되지 않은 값을 만약 그대로 읽으면 C++에서는 그대로 흘러 나오게 된다. 다른 언어에서는 뭐 초기화되지 않은 객체를 읽기만 해도 프로그램이 멈추는 경우도 있지만… C++의 객체 초기화가 중구난방인건 절대 아니다. 언제 초기화가 보장되며, 언제 그렇지 않은지에 대한 규칙이 명확하게 있지만,..
항목 3: 낌새만 보이면 const를 들이대 보자! cosnt = 외부 변경을 불가능 하게 하는 keyword => 값이 변하면 안되는게 맞다면, 우리도 반드시 지켜야 한다. 이렇게 해야 컴파일러가 const를 지키는데 한 몫 거들 수 있기 때문이다. char text[] = "hello"; char *p = text; 비상수 포인터, 비상수 데이터 const char *p = text; 비상수 포인터, 상수 데이터 char * const p = text; 상수 포인터, 비상수 데이터 const char * const p = text; 상수 포인터, 상수 데이터 iterator =: pointer std::vector vec; int arr[] = {1,2,3}; const std::vector::iterator iter = vec.begin(); con..
항목 2: #define을 쓰려거든 cosnt, enum, inline을 떠올리자 위 항목은 가급적 선행 처리자(#, preprosessor) 보다 컴파일러를 더 가까이 하자 라는 말임 #define RATIO 3.141592 라는 코드를 짰다고 생각하면, 컴파일러에게 넘어가기 전에 preprosessor가 RATIO라는 글자를 다 밀어버리고 3.14라는 상수로 바꾼다. 즉 RATIO라는 이름은 컴파일러가 쓰는 기호 테이블에 들어가지 않게 된다. 그래서 이 때 컴파일 에러라도 발생하게 되면 꽤나 헷갈릴 수 있다. RATIO에 에러가 났다고 해도 컴파일러는 3.14라는 상수에서 에러가 난 것으로 알기 때문에 에러 메세지에 RATIO라는 글자가 안 뜰 것이고 그럼 어디서 틀렸는지 햇갈릴 수 있다. 이 문제는 symbolic debugger(기호식 디버거)에서 나타날 수도 있다. 마찬가지로..
항목 1: C++를 언어들의 연합체로 바라보는 안목은 필수 초창기 C++ : C with Classes 라고 불릴 정도 예외(함수 구성방식 변화), 템플릿(새로운 프로그램 설계 방식), STL(확장성) 등등 => C++ : multiparadigm programming language (다중 패러다임 프로그래밍언어) 절차적 프로그래밍(구조적 프로그래밍) + 객체 지향 + 함수식(functional) + 일반화(generic) + metaprogramming 등등 여러 가지 패러다임이 포함되어있음. => 여러가지가 있는건 좋지만, 이들 사이에서 혼동을 느낄 수 있다. => C++ 를 단일 언어로 바라보는 시각에서 벗어나 상관관계가 있는 여러 언어들의 연합체로 봐야 한다. 그 후 각개격파 => C++는 여러 개의 하위언어를 제공한다고 봐야됨 C C++는 C를 기본으..
03-04. DLL Ejection 1. DLL Ejection 동작 원리 앞에서 소개했던 DLL Injection의 동작 원리는 다음과 같다. 대상 프로세스가 LoadLibrary() API를 호출하도록 만드는 것 마찬가지로 DLL Ejection의 동작 원리는 다음과 같다. 대상 프로세스가 FreeLibrary() API를 호출하도록 만드는 것 즉 CreateRemoteThread()의 lpStartAddress에 FreeLibrary() API의 주소를 넘겨주고 lpParameter 에 Ejection할 DLL의 핸들을 넘겨주면 된다. 참고로 Windows Kernel Object에는 Reference Count 라는 것이 있다. 예를 들어 LoadLibrary("a.dll");를 10번 호출하면 a.dll 에 대한 Reference..
03-01. Windows 메세지 후킹 1.메세지 훅 Windows는 GUI를 제공하고, 이는 Event Driven 방식으로 동작한다. 우리가 키보드/마우스를 이용하여 메뉴 선택, 버튼 선택 등을 할 때의 작업이 모두 Event이다. Windows는 이런 Event가 발생할 때 응용 프로그램으로 미리 정의된 Message를 보낸다. 이 Message를 중간에서 가로채는 것이 Message Hooking이다. (자세한 내용은 찰스 펫졸드의 『Programming Windows』를 참고) 2. SetWindowsHookEx() Message Hooking은 SetWindowsHookEx() API를 통해 간단히 구현할 수 있다. HHOOK SetWindowsHookExA( int idHook, HOOKPROC lpfn, HINSTANCE hmo..
03-03. DLL Injection 1. DLL Injection DLL Injection이란 실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입(Inject)하는 것이다. 실제로는 다른 프로세스에게 LoadLibrary() API를 호출하게 하여 사용자가 원하는 DLL을 로딩하는 것이다. 2. DLL Injection 구현 방법 원격 스레드 생성(CreateRemoteThread() API 이용) 레지스트리 이용(AppInit_DLLs 값 이용) 메시지 후킹(SetWindowsHookEx() API 이용) 3. CreateRemoteThread() 3.1 InjectDll.cpp #include "windows.h" #include "tchar.h" BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL..
02. Rhapsody - Symphony of the Enchanted Lands Track listing noTitleLength1.Epicus Furor1:142.Emerald Sword4:203.Wisdom of the Kings4:284.Heroes of the Lost Valley2:045.Eternal Glory7:296.Beyond the Gates of Infinity7:237.Wings of Destiny4:288.The Dark Tower of Abyss6:469.Riding the Winds of Eternity4:1310.Symphony of Enchanted Lands13:16 Line-up (members) Fabio Lione:Vocals Luca Turilli:Guitars Alessandro Lotta:Bass Daniele Carbonera:Drums ..
01. Rhapsody - Legendary Tales Track listing 1.Ira Tenax2.Warrior of Ice3.Rage of the Winter4.Forest of Unicorns5.Flames of Revenge6.Virgin Skies7.Land of Immortals8.Echoes of Tragedy9.Lord of the Thunder10.Legendary Tales Line-up (members) Fabio Lione:Vocals Luca Turilli:Guitars, Choirs Daniele Carbonera:Drums Alex Staropoli:Keyboards, Choirs Guest / additional musicians Sascha Paeth:Bass, Mandolin, Acoustic Guitars Robert H..