인기 글
-
03. DLL Injection
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. DLL Injection
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..
-
5. 구현
항목 30: 인라인 함수는 미주알고주알 따져서 이해해 두자.
인라인함수 = 함수 호출문 -> 함수 본문으로 바꿔치기 인라인 함수의 장점 인라인 함수 => 함수처럼 보이고, 함수처럼 동작하고, 매크로보다 훨씬 안전하고(항목 2 참조), 함수 호출 시 오버헤드도 걱정할 필요 없고 + 컴파일러 최적화는 함수 호출이 없 코드가 연속적으로 이어지는 구간에 보통 적용되도록 설계되었기 때문에, 인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별(context-specific) 최적화를 걸기가 쉽다. 아웃라인 함수엔 적용X 인라인 함수의 단점 목적 코드의 크기가 커진다!!! => 제한된 메모리 환경에서는 코드가 메모리에 다 올라가지 못할 수도 있고, 가상 메모리 환경이더라도 페이징 횟수가 늘어나고, 명령어 캐시 적중률이 떨어질 가능성이 높다. [운영체제 OS] 메모리 관..
-
1. C++에 왔으면 C++ 법을 따릅시다
항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화 하자
객체의 초기화에 있어서는 C++이 이랬다저랬다 하는 경향이 있다.(맘에 들지 않음) int x; 이 코드가 어떤 상황에서는 0으로 자동 초기화가 되지만, 또 다른 상황에서는 그렇지 않다는 것이다. class Point{ int x, y; }; Point p; 이렇게 했을 때에도, p의 데이터 맴버(x,y) 역시 어떤 상황에서는 0으로 자동 초기화가 되지만, 또 다른 상황에서는 안된다. => ???????????? 초기화되지 않은 값을 만약 그대로 읽으면 C++에서는 그대로 흘러 나오게 된다. 다른 언어에서는 뭐 초기화되지 않은 객체를 읽기만 해도 프로그램이 멈추는 경우도 있지만… C++의 객체 초기화가 중구난방인건 절대 아니다. 언제 초기화가 보장되며, 언제 그렇지 않은지에 대한 규칙이 명확하게 있지만,..
-
7. 템플릿과 일반화 프로그래밍
항목 42: typename의 두 가지 의미를 제대로 파악하자
질문: 아래의 두 템플릿 선언문에 쓰인 class와 typename의 차이점이 뭘까요? 답변 : 차이가 없다! 템플릿의 타입 매개변수를 선언할 때는 class와 typename이 완전히 똑같다. 하지만 언제까지나 class와 typename이 똑같으면 이 둘을 구분할 이유가 없다. 이 둘이 다를 때가 언제인지 알아볼려면, 일단 템플릿 안에서 우리가 참조할 수 있는 이름의 종류가 2가지라는 것부터 알아야 한다. 함수 템플릿이 하나 있다고 가정하자. 이 템플릿은 STL과 호환되는 컨테이너를 받아드리도록 만들었고, 이 컨테이너에 담기는 객체는 int에 대입할 수 있다. 이 템플릿이 하는 일은 컨테이너에 담긴 원소들 중 두번째 것의 값을 출력하는 것이다. 여기서 지역변수 iter와 value에 강조 표시를 한다..