본문 바로가기

운영체제/[ecourse] Windows Programming25

7-2. API Hooking API Hooking이란? API의 호출을 가로채는 기술 예를 들면, A라는 함수를 호출했는데 내가 만든 B라는 함수를 호출하는 것. IAT Hook, DLL 함수의 호출 원리 DLL이 로드되는 위치를 알고 있고, 그 DLL이 가진 함수의 Offset을 알고 있다면? 어셈블리 명령으로 call 0x주소로 호출할 수 있을 것이다. 그러나 컴파일/링크 시 DLL 안의 함수 주소는 알 수 없다 (ASLR 때문) ASLR(Address space layout randomization)이란? ASLR은 실행 시 exe, dll, stack, heap등의 주소를 임의로 변경하는 보안 기법 ASLR을 끄고 MessageBoxA의 주소 덮어쓰기 #include #include using namespace std; ty.. 2022. 9. 21.
7-1. DllMain 기본 개념 DllMain DLL에는 DllMain이라는 함수를 만들 수 있는데 필수는 아님. hInstDLL - dll의 모듈 핸들, DLL이 프로세스 가상 메모리에 로드됐을 때 그 시작 주소 fdwReason - 어떤 이유로 DllMain이 호출되었는지에 대한 내용 lpvReserved - 명시적 링킹인지, 암시적 링킹인지를 구분짓는 매개변수임 (명시적 (LoadLibrary) 호출이면 0, 아니면 0이 아닌 값) fdwReason에 대한 상세 내용 DLL_PROCESS_ATTACH : DLL이 처음 프로세스에 매핑될 때 (LoadLibrary 등) DLL_PROCESS_DETACH : DLL이 프로세스에서 언로드될 때 (FreeLibrary 등) DLL_THREAD_ATTACH : 매핑된 프로세스에서 쓰레드를 .. 2022. 9. 21.
6-2-3. Critical Section 실습 #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include using namespace std; CRITICAL_SECTION cs; int totalCount = 0; UINT threadProc(void* p) { totalCount++; int count = totalCount; static int value = 0; printf("%d번째 쓰레드 진입.. value = %d\n", count, value); EnterCriticalSection(&cs); for (int i = 0; i < 100; i++) value += 1; LeaveCriticalSection(&cs); printf("\t%d번째 쓰레드 종료.. .. 2022. 9. 20.
6-2-2. Event 실습 배운 이론을 실습하는 과정 #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include using namespace std; int globalMemory = 0; HANDLE hEvent = INVALID_HANDLE_VALUE; UINT writeValueProc(void* p) { static int increase = 100; globalMemory += increase; SetEvent(hEvent); return 0; } UINT readValueProc(void* p) { //WaitForSingleObject(hEvent, INFINITE); printf("read value : %d\n", globalMemory.. 2022. 9. 20.