Operating System 72

DLL injection

DLL 인젝션을 하는 이유와 알려진 방법들CreateRemoteThread() API 활용가장많이 사용되는 방법레지스트리에서 AppInit_DLLs 값을 변경해서 인젝션HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WindowsSetWindowsHookEx() API 활용  TCP Socket API hookChatting client/server 예제를 활용해 Winsock API를 hookServer는 전형적인 멀티스레드 기반으로 구현(접속하는 클라이언트 마다 스레드 생성)본 수업에서 예제 차제는 설명하지는 않음최초 Client 코드 수준에서 Hook 관련 코드를 추가해 동작을 확인하고 DLL Injection 기능을 추가하는 방식으..

Inline hook

inline hook 기술 개요 및 작동 원리함수의 진입점(function prologue)에 jmp code(0xE9)를 삽입해서 흐름을 변경하는 방법32bit 시스템에서 jmp 코드 피연산자는 점프할 위치에 대한 절대값이 아니라 현재 명령어가 저장된 위치를 기준으로 떨어진 거리를 상대적으로 계산한다.jmp code는 명령어와 피연산자를 포함 모두 5바이트 (x86기준)inline hook 사용시 주의사항jmp 코드로 흐름을 조작하더라도 정상적인 호출관계에 의한 stack frame 구조를 손상시키지 말아야한다. (function prologue , epilogue가 정상적으로 동작해야함)조작된 흐름이 끝나고 본래 위치로 되돌아 가는 과정에서 문제가 발생하지 않도록 강제화 해야한다. 32bit inli..

IAT hook

IAT = Import Address TableDLL 에서 가져다 쓴 함수들에대한 정보들을 가지고 있다고함묵시적인 로딩인 경우에만 남아있는다 PE (portable excutable) 파일 구조https://github.com/corkami/pics/blob/master/binary/pe101/pe101.pdf RVA (Relative Virutal Address)dll 이 가상메모리에 로딩이 되고 어떤 함수가 어디에 써있느냐를 나타낼떄 RVA를 통해 나타낸다. IAT hook 기술 개요실행 파일이 가지고 있는 IAT 영역 정보를 직접 조작하는 방식으로 피호출 API함수를 변경하는 기법C 언어 기반 응용 프로그램의 주요 함수들은 별도의 C Runtime Library(DLL) 로 구현되어 있으며 프로그램..

사전지식 - 두 번째

가상 메모리 접근 모드메모리에 대한 접근 권한은 보통 3 가지로 분류read ,write ,execute타 프로세스 메모리에 대해서도 권한이 잇다면 접근가능debugger가 그러하다VirtualProtect 라는 함수가 가상메모리 접근모드를 조절하는 함수이다.int main(){ const char* pszHello = "Hello World!\n"; std::cout (pszHello); //pszNewHello[4] = '\0'; DWORD dwOldProtect = 0; ::VirtualProtect( (LPVOID)pszHello, 8, PAGE_READWRITE, &dwOldProtect); pszNewHello[4] = '\0'; std::co..

사전 지식 - 첫 번째

함수 포인터C언어에서 함수의 이름은 실행코드가 저장되는 메모리의 주소디버거로 대상 메모리 내용 확인 가능디스어셈블 기능을 이용해서 명령 단위 실행으로 역추적 가능함수 포인터는 대상 플랫폼에 따라 32bit 혹은 64bit로 달라질 수 있다.Callback 구조 적용에 적합하다.소위 API라는것들은 모두 함수로 구현되며 일반 함수 포인터와 동일한 개념이 적용된다.calling convetion__cdecl (호출자가 스택정리)__stdcall (피호출자가 스택정리)__fastcall (매개변수에 레지스터 사용)64bit에서는 요게 기본이다.int(__cdecl * pfTest)(int, int) = testFunc 처럼 함수포인터에서 써줘야한다.함수 프롤로그 와 에필로그함수 내부에서 사용된 자동변수는 스택..

DLL

DLL 기본 이론 정적 / 동적 라이브러리 소개 라이브러리는 쉽게 생각해 함수만 따로 모은 실행 파일 함수라는 표현보다 API 라고 부르는 경우가 많고 특정 환경에 맞춘 종합적인 API 묶음을 SDK라 함 정적 라이브러리는 실행파일과 link시 결합되어 한 실행파일로 합성 동적 라이브러리는 실행 파일과 Link시 합쳐지지 않고 독립적인 실행파일 형태로 생성되며 실행파일이 실행 될 때 "동적으로" 결합 동적lib (dll) = 런타임에 바인딩(링크) 된다. Window API LoadLibrary로 로딩하게된다. 묵시적 로딩 DLL 라이브러리 개발 #include "pch.h" #include __declspec(dllexport) void WINAPI DllTestFunction(int); BOOL AP..

프로세스 관리

프로세스 생성 및 제어CreateProcess(), OpenProcess()ExitProcess() = 내가 작성한 내프로세스를 종료시킬때TerminateProcess() = 남의 프로세스를 종료시킬때, 해당 process handle이 있어야함Get/SetProcessAffinityMask() = process 내부의 모든 스레드가 affinity 영향을 받게됨EnumProcessGetModuleFileNameExCreateToolhelp32Snapshot =  enumProcess도 현재 돌고있는 process를 열거하지만 이 방법을 주로 사용해야한다.Process32First, Process32Next실행 중인 프로세스 열거int main(){ _wsetlocale(LC_ALL, L"korean")..

메모리 시스템

Windows 시스템 메모리 운용 방법 가상 메모리 시스템 직접 활용 메모리 맵 File -> char * 로 맵핑해서 쓰는것 (비동기 쓰기) 힙 크기가 작은 데이터 (4kb 이하) 할당 시 매우 우용 할당 단위나 페이지 경계를 고려하지 않음 heap data structure 로 관리되고 있는 메모리를 의미 ram 이 16기가 라 하더라도 32 bit cpu processor 에서 process 는 4gb 정도로 최대로 할당 받기 때문에 4개의 program(process) 만 띄우더라도 꽉차게 된다. process가 할당 받은 VMS(virutal memeroy space) 에서 받은 user , 나머지 반은 kernel 이 가지게 되고 이 작업을 OS 나 compiler가 하게 된다. user sp..

Win32 파일 입/출력

디스크, 디렉토리, 파일열거#include #include #include void LoadDiskInfo(const TCHAR* pszPath){ TCHAR szVolName[MAX_PATH] = { 0 }; TCHAR szFileSys[MAX_PATH] = { 0 }; TCHAR szRoot[MAX_PATH] = { 0 }; DWORD dwSerialNum = 0, dwMaxCompLen = 0, dwSysFlag = 0; memcpy(szRoot, pszPath, sizeof(TCHAR) * 3); ::GetVolumeInformation(szRoot, szVolName, MAX_PATH, &dwSerialNum, &dwMaxCompLen, &dwSysFlag, szFileSys, MAX_PATH..

스레드 동기화

기본 이론임계구간 코드가 여러 스레드에서 동시에 실행되는 일을 막는것연산 시점(혹은 종료) 감지동기화 객체를 이용해 구현Critical Section , Mutext, Semaphore, Event(Set/Reset 상태)Kernel Object라고 부른다. 스레드 실행 시점 동기화T2 스레드에서 어떤 특정 시점 A,B에서 Set Event를 해주면 T1 스레드에서 해당 Event 객체를 WaitForSingleObject 에 넣어주면 Set 되는 순간을 알 수 있게 된다.UINT WINAPI ThreadFunction(LPVOID pParam){ HANDLE hEvent = pParam; std::cout worker thread에서 사용자의 input을 감지하고 event를 set하여서 m..