분류 전체보기 294

[어셈블리] OllyDbg 소개

어셈블리를 디버깅 할 수 있는 OllyDbg를 소개합니다. 이 툴을 이용하여 어셈블리의 동작을 디버깅 및 확인을 할 수 있어서 어셈블리어를 학습하는데 도움이 됩니다. 그리고, 리버스 엔지니어링 툴로 사용되는 프로그램입니다. OllyDbg 설치 version 2.01을 받습니다. 받은 후 압축을 풀면 OllyDbg.exe 파일을 관리자 권한으로 실행합니다. 기본 기능 & 레이아웃 사용을 위해서는 먼저 실행 파일을 열어야 합니다. 실행 파일을 열면 다음과 같이 로딩되며, 이 화면은 코드뷰, 레지스터 뷰, 덤프 뷰, 스택뷰로 구성되어 있습니다. 코드 뷰에서는 기계어와 어셈블리어를 볼 수 있습니다. 어셈블리어 영역을 마우스 더블 클릭하여 어셈블리 명령어를 입력 할 수 있습니다. 디버그와 트레이스 기능들을 활용하..

Visual Studio 인라인 어셈블리 x86 예제

power #include int power2( int num, int power ); int main( void ) { printf_s( "3 times 2 to the power of 5 is %d\n", \ power2( 3, 5) ); } int power2( int num, int power ) { __asm { mov eax, num ; Get first argument mov ecx, power ; Get second argument shl eax, cl ; EAX = EAX * ( 2 to the power of CL ) } // Return with result in EAX } docs.microsoft.com/ko-kr/cpp/assembler/inline/writing-function..

Visual Studio 2019에서 어셈블리 64bit 프로젝트 생성

어셈블리를 위한 프로젝트 생성 새 빈 콘솔 프로젝트를 만듭니다. 64Bit로 변경합니다. 빌드 종속성에서 masm을 체크합니다. .asm 파일과 .cpp 파일을 하나씩 추가 합니다. asm 파일의 속성을 선택합니다. asm 파일의 항목 형식이 Microsoft Macro Assemply로 선택된 것을 확인 합니다. 어셈블리에서 표준 함수들 사용 할 수 있도록 하자 printf, scanf와 같은 표준 함수들을 어셈블리에서 사용할 수 있게 하려면 다음과 같이 두 개의 라이브러리를 추가해주어야 합니다. 프로젝트 속성의 링커 -> 일반 -> 추가 속성에서 다음과 같이 두 라이브러리를 추가 합니다. legacy_stdio_definitions.lib legacy_stdio_wide_specifiers.lib 예..

CPU 레지스터

레지스터는 CPU 내부에 존재하는 다목적 메모리(저장 공간)입니다. CPU와 함께 있는 메모리 이므로 고속으로 데이터를 처리할 수 있습니다. 간단히 레지스터는 CPU가 사용하는 변수로 생각면 좋습니다. IA-32(Intel Architecture, 32bit) 레지스터의 구성은 아래 그림과 같습니다. 범용 레지스터(General-Purpose Registers)EAX (Extended Accumulator Register)산술연산 명령에서 상수/변수 값을 저장하거나 함수의 리턴 값이 저장되는 용도로도 사용됩니다. EDX(Extended Data Register)EAX와 함께 복잡한 연산을 위한 추가적인 데이터를 저장할 때 사용됩니다. 리턴 값 용도록는 사용되지 않습니다. EDX는 EAX의 확장 개념으로 ..

[C++] std::function

C++11표준 라이브러리의 한 템플릿으로, 함수 포인터 개념을 일반화한 것입니다. 함수 포인터는 함수만 가리킬 수 있지만 std::function은 호출 가능한 객체이면 그 어느 것도 가리킬 수 있습니다. 즉, 함수 처럼 호출 할 수 있는 것이면 그 무엇이라도 std::function으로 가리킬 수 있습니다. 예를 들면 함수, operator(), 람다 함수들이 있으며 다음은 그 예시입니다. int sum(int a, int b) { return a + b; } struct Sum { int operator()(int a, int b) { return a + b; } }; int main() { std::function s1 = sum; std::function s2 = Sum(); std::functi..

대용량 데이터베이스 솔루션 with MSSQL

대용량 데이터베이스 솔루션 1, 2권은 제가 20년 전에 데이터베이스 공부를 위해 읽었던 책입니다. 이 책들은 제가 데이터베이스를 대하는 임하는 자세를 바꾸게 해 준 책입니다. DBA에게는 바이블과 같은 책이기도 합니다. 이 책들의 내용들 중에 서버 개발 프로그래머들이 꼭 필요한 내용들을 정리하였습니다. 이 책은 오라클로 설명하고 있으며 오라클은 게임 개발에서 거의 사용되지 않고 있고 주로 많이 사용하는 MS-SQL에 맞추어 내용을 정리 하였습니다. 여러분에게 관계형 데이터베이스 즉 RDB 개발은 어려웠나요? 제 생각에는 대부분의 서버 개발 프로그래머는 DB 개발을 쉬워 해요. SQL 문법을 익히기만 하면 원하는 결과를 쉽게 얻을 수 있기 때문이죠. SQL 문법 자체는 쉽기 때문에 이렇게 생각합니다. 이..

독서 리뷰 2020.09.09

콘텐츠의 미래

옐로우스톤 국립공원의 화재에 대한 대처 방법 소개로 부터 이 책은 시작한다. 화재가 나면 당연히 불을꺼야 하는데 오히려 자연적으로 진화가 되도록 내버려 둘 때도 있다. 생각치도 못했던 사고의 전환이었다. 이러한 사고의 전환은 책을 읽는 내내 이어 졌다. 노르웨이의 작은 신문사 십스테드가 42개국의 광고를 점령, 애플의 스티브 잡스가 PC 시장에서 얻은 교훈으로 아이팟, 아이폰으로 성공, 뉴욕타임스가 모두들 안 될 것이라고 했던 디지털 신문의 유료화를 성공, 인터피디아는 실패 했디만 위키피디아가 성공한 이유, 넷플릭스, 아마존, 텐센트, 페이스북 등이 관계를 이해하고 성공한 이야기 들을 전하고 있다. CD 시장에서 인터넷의 발달하고 mp3 파일 불법 복제로 인해 음악 시장이 망할 것으로 생각하였으나 음악 ..

독서 리뷰 2020.09.09

[C++] Closure(클로저)

Closure? Lexical binding을 지원하는 함수형 언어로 부터 파생된 개념이며, 코드 블럭을 정의할때 스코프내의 환경들을 기억하여 나중에 수행될 때도 원래의 환경에 따라 수행되는 것을 말합니다. 람다 표현식 VS 클로저 스콧 마이어(Scott Meyers)는 "람다와 클로저의 차이는 클래스와 클래스 인스턴스 사이의 차이점과 동일하다"라는 좋은 예를 들었습니다. 클래스는 오직 소스 코드에만 존재하며 런타임에 존재하지 않습니다. 클래스 인스턴스만이 런타임에 존재합니다. 즉, C++에서는 람다 표현식이 인스턴스화 된 것을 클로저라 합니다. 클로저의 예 #include #include std::function closureWrapper1() { int x = 10; return [x](){std::..

[Effective Modern C++] 항목 4: 연역된 형식을 파악하는 방법을 알아두라

형식 연역의 결과를 직접 확인 하는 수단으로서 코드를 작성/수정하는 시점에서, 컴파일 시점에서, 실행 시점에서 형식 연역 정보를 얻는 방법을 살펴보겠습니다. IDE 편집기 IDE의 코드 편집기 중에서 프로그램 개체(변수, 매개변수, 함수 등) 위에 마우스 커서를 올리면 그 개체의 형식을 표시해 주는 것이 많습니다. const int theAnswer= 42; auto x = theAnswer; auto y = &theAnswer; IDE 편집기는 x의 연역된 형식이 int이고 y의 연역된 형식이 const int*임을 표시해 줄 것입니다. 컴파일 가능 상태여야 편집기에서 요청된 개체의 형식을 표시 할 수 있을 것입니다. 간단한 경우에는 IDE가 알려준 정보가 쓸만합니다. 그러나, 복잡한 형식에서는 그리고..

[Effective Modern C++] 항목 3: decltype의 작동 방식을 숙지하라

decltype은 주어진 식의 구체적인 타입 그대로 전달하는(추출하는) 키워드입니다. 대부분은 예측한 형식 추출되지만 가끔씩 그렇지 않은 경우가 있습니다. decltype 과 auto에 관한 설명을 참고해주세요.decltype의 일반적 쓰임먼저 decltype의 명확한 경우들을 살펴봅시다.const int i = 0; // decltype(i)는 const int bool f(const Widget& w) // decltype(w)는 const Widget& // decltype(f)는 bool(const Widget&) struct Point{ int x; // decltype(Point::x)는 int int y; // decltype(Point::y)는 int }; Widget w; // declt..