diff --git "a/docs/SystemInformer_\352\270\260\354\210\240\353\254\270\354\204\234_\354\240\204\354\236\220\354\261\205.md" "b/docs/SystemInformer_\352\270\260\354\210\240\353\254\270\354\204\234_\354\240\204\354\236\220\354\261\205.md" new file mode 100644 index 000000000000..be4fbccbda55 --- /dev/null +++ "b/docs/SystemInformer_\352\270\260\354\210\240\353\254\270\354\204\234_\354\240\204\354\236\220\354\261\205.md" @@ -0,0 +1,503 @@ +# System Informer 기술 가이드북 + +--- + +# 전자책 (E-Book) + +**Windows 시스템 모니터링 도구의 설계와 구현** + +--- + +## 저자 정보 +- **프로젝트**: System Informer (구 Process Hacker) +- **라이선스**: MIT License +- **발행일**: 2026년 1월 + +--- + +# 목차 + +1. [서론](#1-서론) +2. [프로젝트 구조](#2-프로젝트-구조) +3. [핵심 기능](#3-핵심-기능) +4. [기술 스택](#4-기술-스택) +5. [빌드 환경](#5-빌드-환경) +6. [핵심 기술 구현](#6-핵심-기술-구현) +7. [플러그인 개발](#7-플러그인-개발) +8. [보안 메커니즘](#8-보안-메커니즘) +9. [부록](#9-부록) + +--- + +# 1. 서론 + +## 1.1 System Informer란? + +System Informer는 Windows 운영체제를 위한 고급 시스템 모니터링 및 분석 도구입니다. 기존 Windows 작업 관리자의 한계를 넘어 프로세스, 스레드, 핸들, 메모리, 네트워크 연결 등 시스템의 모든 측면을 심층적으로 분석할 수 있습니다. + +## 1.2 주요 특징 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ System Informer 특징 │ +├─────────────────────────────────────────────────────────────┤ +│ ✓ 상세한 프로세스/스레드/핸들 정보 │ +│ ✓ 실시간 CPU/메모리/디스크/네트워크 모니터링 │ +│ ✓ 커널 드라이버를 통한 심층 시스템 접근 │ +│ ✓ 악성코드 분석을 위한 고급 기능 │ +│ ✓ 확장 가능한 플러그인 시스템 │ +│ ✓ 100% 오픈소스 (MIT 라이선스) │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 1.3 역사 + +- **2008**: Process Hacker로 시작 +- **2022**: System Informer로 리브랜딩 +- **현재**: 940,000+ 라인의 코드베이스 + +--- + +# 2. 프로젝트 구조 + +## 2.1 아키텍처 개요 + +System Informer는 3계층 아키텍처를 따릅니다: + +``` +┌─────────────────────────────────────────┐ +│ 사용자 인터페이스 계층 │ +│ SystemInformer.exe + Plugins │ +├─────────────────────────────────────────┤ +│ 핵심 라이브러리 계층 │ +│ phlib.dll + kphlib.dll │ +├─────────────────────────────────────────┤ +│ 커널 드라이버 계층 │ +│ KSystemInformer.sys │ +└─────────────────────────────────────────┘ +``` + +## 2.2 디렉토리 구조 + +| 디렉토리 | 설명 | 주요 파일 | +|----------|------|-----------| +| `SystemInformer/` | GUI 애플리케이션 | mainwnd.c, proctree.c | +| `phlib/` | 핵심 라이브러리 | native.c, treenew.c | +| `phnt/` | NT API 헤더 | ntpsapi.h, ntmmapi.h | +| `KSystemInformer/` | 커널 드라이버 | driver.c, comms.c | +| `kphlib/` | KPH 통신 라이브러리 | kphcomms.c | +| `plugins/` | 플러그인 (11개) | 각 플러그인 폴더 | + +## 2.3 컴포넌트 통신 + +``` +User Mode Kernel Mode +┌────────────┐ ┌─────────────────┐ +│SystemInform│ DeviceIO │ KSystemInformer │ +│ er.exe │◄────────────►│ .sys │ +└─────┬──────┘ └────────┬────────┘ + │ │ + ▼ ▼ +┌────────────┐ ┌─────────────────┐ +│ phlib.dll │ │ Windows Kernel │ +└────────────┘ └─────────────────┘ +``` + +--- + +# 3. 핵심 기능 + +## 3.1 프로세스 관리 + +### 프로세스 목록 +- 실시간 프로세스 정보 표시 +- 트리/플랫 뷰 전환 +- 상세 속성 (토큰, 모듈, 핸들 등) + +### 프로세스 작업 +| 작업 | 설명 | +|------|------| +| Terminate | 프로세스 종료 | +| Suspend/Resume | 일시 중지/재개 | +| Create Dump | 메모리 덤프 생성 | +| Inject DLL | DLL 주입 | + +## 3.2 시스템 모니터링 + +### 실시간 그래프 +- CPU 사용률 (코어별) +- 메모리 사용량 +- 디스크 I/O +- 네트워크 트래픽 +- GPU 사용률 (플러그인) + +### 정보 수집 주기 +```c +// 기본 업데이트 간격: 1초 +#define PH_PROVIDER_UPDATE_INTERVAL 1000 +``` + +## 3.3 네트워크 분석 + +- TCP/UDP 연결 목록 +- 로컬/원격 주소 및 포트 +- 연결 상태 (Established, Listening 등) +- 프로세스별 네트워크 사용량 + +## 3.4 서비스 관리 + +- 서비스 시작/중지/재시작 +- 서비스 속성 편집 +- 의존성 분석 (플러그인) +- 복구 옵션 설정 (플러그인) + +--- + +# 4. 기술 스택 + +## 4.1 프로그래밍 언어 + +``` +C 언어 ████████████████████████████░░ 95% +C++ ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 4% +기타 █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1% +``` + +## 4.2 Windows API 계층 + +| API | 용도 | 예시 | +|-----|------|------| +| Win32 | GUI, 일반 작업 | CreateWindow, ReadFile | +| Native NT | 저수준 시스템 | NtQuerySystemInformation | +| WDM | 커널 드라이버 | IoCreateDevice | +| ETW | 이벤트 추적 | StartTrace | +| WMI | 시스템 관리 | Win32_Process | +| COM/DirectX | GPU 정보 | D3DKMTQueryStatistics | + +## 4.3 써드파티 라이브러리 + +| 라이브러리 | 용도 | +|------------|------| +| JSON-C | JSON 파싱 | +| PCRE | 정규 표현식 | +| Zydis | 디스어셈블러 | +| MaxMindDB | GeoIP | +| Detours | 함수 후킹 | +| MinIZ | ZIP 압축 | + +--- + +# 5. 빌드 환경 + +## 5.1 필수 요구사항 + +``` +☑ Visual Studio 2022 +☑ Windows 10/11 SDK (10.0.22621.0) +☑ C++ ATL/MFC 구성 요소 +☑ Git +``` + +## 5.2 드라이버 빌드 시 추가 요구사항 + +``` +☑ Windows Driver Kit (WDK) +☑ 테스트 서명 모드 또는 EV 인증서 +``` + +## 5.3 빌드 명령 + +```cmd +:: 릴리스 빌드 +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 + +:: 플러그인 빌드 +msbuild Plugins.sln /p:Configuration=Release /p:Platform=x64 +``` + +## 5.4 CMake 빌드 + +```bash +mkdir build && cd build +cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release +cmake --build . +``` + +--- + +# 6. 핵심 기술 구현 + +## 6.1 Native NT API 활용 + +System Informer는 비공개 NT API를 광범위하게 사용합니다: + +```c +// 프로세스 열거 +NTSTATUS PhEnumProcesses(_Out_ PVOID *Processes) +{ + return NtQuerySystemInformation( + SystemProcessInformation, + buffer, + bufferSize, + &returnLength + ); +} +``` + +### 주요 NT API 함수 + +| 함수 | 용도 | +|------|------| +| NtQuerySystemInformation | 시스템 정보 조회 | +| NtQueryInformationProcess | 프로세스 정보 | +| NtReadVirtualMemory | 메모리 읽기 | +| NtQueryObject | 객체 정보 | + +## 6.2 참조 카운팅 메모리 관리 + +```c +// 객체 생성 +PPH_STRING string = PhCreateString(L"Hello"); + +// 참조 증가 +PhReferenceObject(string); + +// 참조 감소 (0이면 자동 해제) +PhDereferenceObject(string); +``` + +## 6.3 커널 드라이버 통신 + +```c +// 드라이버 연결 +NTSTATUS KphConnect(_Out_ PKPH_COMMS_HANDLE Handle) +{ + return NtOpenFile( + &Handle->DeviceHandle, + FILE_READ_DATA | FILE_WRITE_DATA, + &objectAttributes, + &ioStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0 + ); +} +``` + +## 6.4 TreeNew 고성능 컨트롤 + +가상화된 트리/리스트 컨트롤로 수천 개 항목을 효율적으로 표시: + +```c +// 노드 콜백 (필요할 때만 데이터 요청) +BOOLEAN TreeNewCallback( + _In_ PH_TREENEW_MESSAGE Message, + _In_ PVOID Parameter1, + _In_ PVOID Parameter2 +) +{ + switch (Message) { + case TreeNewGetCellText: + // 셀 텍스트 반환 + break; + case TreeNewGetChildren: + // 자식 노드 반환 + break; + } +} +``` + +## 6.5 ETW 이벤트 추적 + +```c +// ETW 세션 시작 +StartTrace(&sessionHandle, SessionName, &properties); + +// 공급자 활성화 +EnableTraceEx2( + sessionHandle, + &DiskIoGuid, + EVENT_CONTROL_CODE_ENABLE_PROVIDER, + TRACE_LEVEL_INFORMATION, + 0, 0, 0, NULL +); +``` + +## 6.6 동적 데이터 시스템 + +Windows 버전별 커널 구조체 오프셋 관리: + +```xml + + + + 0x440 + 0x4b8 + + +``` + +--- + +# 7. 플러그인 개발 + +## 7.1 플러그인 구조 + +```c +// 필수 내보내기 함수 +BOOLEAN PhPluginLoad( + _In_ PPH_PLUGIN Plugin, + _In_ ULONG SystemServiceNumber +) +{ + // 플러그인 초기화 + PH_PLUGIN_INFORMATION info; + info.Name = L"MyPlugin"; + info.Author = L"Author"; + info.Description = L"Description"; + + PhRegisterPlugin(&info); + + // 콜백 등록 + PhRegisterCallback( + &PhProcessAddedEvent, + OnProcessAdded, + NULL, + &CallbackRegistration + ); + + return TRUE; +} +``` + +## 7.2 내장 플러그인 + +| 플러그인 | 기능 | +|----------|------| +| DotNetTools | .NET 런타임 분석 | +| ExtendedTools | ETW, GPU, NPU 모니터링 | +| HardwareDevices | 디스크, 네트워크 모니터링 | +| NetworkTools | Ping, Traceroute, GeoIP | +| OnlineChecks | VirusTotal 검사 | +| Updater | 자동 업데이트 | + +## 7.3 확장 가능한 지점 + +- 메인 메뉴 항목 추가 +- 컨텍스트 메뉴 확장 +- 프로세스 속성 페이지 추가 +- 컬럼 추가 +- 정보 제공자 등록 + +--- + +# 8. 보안 메커니즘 + +## 8.1 서명 검증 + +```c +// Authenticode 서명 검증 +VERIFY_RESULT PhVerifyFile(_In_ PWSTR FileName) +{ + WINTRUST_DATA trustData; + // WinVerifyTrust API 사용 + return WinVerifyTrust(NULL, &actionGuid, &trustData); +} +``` + +## 8.2 드라이버 클라이언트 검증 + +```c +// 클라이언트 프로세스 검증 +NTSTATUS KphVerifyClient(_In_ PEPROCESS Process) +{ + // 이미지 해시 계산 후 신뢰할 수 있는 해시와 비교 + if (RtlEqualMemory(hash, KphTrustedHash, sizeof(hash))) { + return STATUS_SUCCESS; + } + return STATUS_ACCESS_DENIED; +} +``` + +## 8.3 보안 기능 활성화 + +빌드 시 SDL (Security Development Lifecycle) 검사 활성화: + +```xml + + true + true + +``` + +--- + +# 9. 부록 + +## 9.1 프로젝트 통계 + +| 항목 | 수치 | +|------|------| +| 총 소스 파일 | 864개 | +| 코드 라인 | 940,000+ | +| C 파일 | 504개 | +| 헤더 파일 | 335개 | +| 플러그인 수 | 11개 | + +## 9.2 주요 소스 파일 + +| 파일 | 위치 | 기능 | +|------|------|------| +| proctree.c | SystemInformer/ | 프로세스 트리 | +| procprv.c | SystemInformer/ | 프로세스 공급자 | +| native.c | phlib/ | Native API 래퍼 | +| treenew.c | phlib/ | TreeNew 컨트롤 | +| comms.c | KSystemInformer/ | 드라이버 통신 | + +## 9.3 참고 자료 + +### 공식 리소스 +- GitHub: github.com/winsiderss/si +- 문서: docs.systeminformer.com + +### Windows 내부 구조 +- Windows Internals (7th Edition) +- ReactOS 소스 코드 + +### Native API +- phnt 헤더 컬렉션 +- ntinternals.net + +## 9.4 용어 사전 + +| 용어 | 설명 | +|------|------| +| EPROCESS | 커널의 프로세스 구조체 | +| ETHREAD | 커널의 스레드 구조체 | +| PEB | Process Environment Block | +| TEB | Thread Environment Block | +| NT API | Native NT API | +| WDM | Windows Driver Model | +| ETW | Event Tracing for Windows | +| PPL | Protected Process Light | + +--- + +# 라이선스 + +``` +MIT License + +Copyright (c) System Informer Authors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software. +``` + +--- + +**문서 끝** + +*이 전자책은 System Informer 프로젝트의 기술 문서를 종합하여 제작되었습니다.* diff --git "a/docs/technical/01_\355\224\204\353\241\234\354\240\235\355\212\270_\352\265\254\354\241\260\354\204\244\352\263\204\354\204\234.md" "b/docs/technical/01_\355\224\204\353\241\234\354\240\235\355\212\270_\352\265\254\354\241\260\354\204\244\352\263\204\354\204\234.md" new file mode 100644 index 000000000000..40827a06a02a --- /dev/null +++ "b/docs/technical/01_\355\224\204\353\241\234\354\240\235\355\212\270_\352\265\254\354\241\260\354\204\244\352\263\204\354\204\234.md" @@ -0,0 +1,573 @@ +# System Informer 프로젝트 구조설계서 + +## 문서 정보 +- **프로젝트명**: System Informer (구 Process Hacker) +- **버전**: 3.x +- **라이선스**: MIT License +- **문서 작성일**: 2026-01-25 + +--- + +## 1. 프로젝트 개요 + +### 1.1 프로젝트 소개 + +System Informer는 Windows 운영체제를 위한 고급 시스템 모니터링 및 분석 도구입니다. 프로세스, 스레드, 핸들, 메모리, 네트워크 연결 등 시스템의 모든 측면을 심층적으로 분석할 수 있는 기능을 제공합니다. + +### 1.2 주요 특징 + +- **다층 아키텍처**: GUI 애플리케이션, 핵심 라이브러리, 커널 드라이버의 3계층 구조 +- **보안 중심 설계**: 드라이버 서명, 클라이언트 검증, 무결성 확인 +- **확장 가능한 플러그인 시스템**: 기능 확장을 위한 모듈화된 플러그인 아키텍처 +- **포괄적 시스템 모니터링**: 프로세스, 스레드, 핸들, 메모리, 네트워크, GPU 등 +- **저수준 시스템 접근**: Native NT API 및 커널 드라이버를 통한 심층 분석 + +### 1.3 지원 플랫폼 + +| 플랫폼 | 아키텍처 | 지원 | +|--------|----------|------| +| Windows XP | x86 | 제한적 | +| Windows Vista/7 | x86, x64 | 완전 지원 | +| Windows 8/8.1 | x86, x64 | 완전 지원 | +| Windows 10 | x86, x64, ARM64 | 완전 지원 | +| Windows 11 | x64, ARM64 | 완전 지원 | + +--- + +## 2. 시스템 아키텍처 + +### 2.1 계층 구조도 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 사용자 인터페이스 계층 │ +│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ SystemInformer │ │ Plugins │ │ PEView │ │ +│ │ (GUI App) │ │ (Extensions) │ │ (PE Viewer) │ │ +│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ +└───────────┼────────────────────┼────────────────────┼───────────┘ + │ │ │ +┌───────────┼────────────────────┼────────────────────┼───────────┐ +│ ▼ ▼ ▼ │ +│ 핵심 라이브러리 계층 │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ phlib ││ +│ │ (프로세스/시스템 라이브러리 - 130K+ LOC) ││ +│ └──────────────────────────┬──────────────────────────────────┘│ +│ │ │ +│ ┌─────────────────┐ ┌─────┴─────┐ ┌─────────────────┐ │ +│ │ phnt │ │ kphlib │ │ phsvc │ │ +│ │ (NT API 헤더) │ │(KPH 통신) │ │ (서비스) │ │ +│ └─────────────────┘ └─────┬─────┘ └─────────────────┘ │ +└─────────────────────────────┼───────────────────────────────────┘ + │ +┌─────────────────────────────┼───────────────────────────────────┐ +│ ▼ │ +│ 커널 드라이버 계층 │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ KSystemInformer ││ +│ │ (WDM 커널 드라이버) ││ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ ││ +│ │ │ Informer │ │ Protection │ │ CID Tracking │ ││ +│ │ │ (모니터링) │ │ (보안) │ │ (추적) │ ││ +│ │ └─────────────┘ └─────────────┘ └─────────────────┘ ││ +│ └─────────────────────────────────────────────────────────────┘│ +└─────────────────────────────────────────────────────────────────┘ + │ +┌─────────────────────────────┼───────────────────────────────────┐ +│ ▼ │ +│ Windows 커널 (NT Kernel) │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 컴포넌트 간 통신 + +``` +┌──────────────┐ IPC/RPC ┌──────────────┐ +│ SystemInformer│◄───────────────►│ phsvc │ +│ (Client) │ │ (Service) │ +└──────┬───────┘ └──────────────┘ + │ + │ Native API (ntdll.dll) + │ + ▼ +┌──────────────┐ DeviceIoControl ┌──────────────┐ +│ phlib │◄─────────────────►│KSystemInformer│ +│ (Library) │ │ (Driver) │ +└──────────────┘ └──────────────┘ +``` + +--- + +## 3. 디렉토리 구조 + +### 3.1 루트 디렉토리 + +``` +systeminformer/ +├── SystemInformer/ # 메인 GUI 애플리케이션 +├── KSystemInformer/ # 커널 드라이버 +├── phlib/ # 핵심 라이브러리 +├── phnt/ # Native NT API 헤더 +├── kphlib/ # 커널 프로토콜 라이브러리 +├── plugins/ # 플러그인 모음 +├── tools/ # 빌드 도구 및 유틸리티 +├── build/ # 빌드 스크립트 +├── cmake/ # CMake 설정 +├── .github/ # GitHub Actions CI/CD +├── .vscode/ # VS Code 설정 +├── SystemInformer.sln # 메인 솔루션 +├── KSystemInformer.sln # 드라이버 솔루션 +├── Plugins.sln # 플러그인 솔루션 +└── CMakeLists.txt # CMake 루트 설정 +``` + +### 3.2 SystemInformer (GUI 애플리케이션) + +``` +SystemInformer/ +├── include/ # 헤더 파일 +│ ├── phapp.h # 메인 애플리케이션 헤더 +│ ├── phplug.h # 플러그인 인터페이스 +│ ├── mainwndp.h # 메인 윈도우 비공개 헤더 +│ └── ... +├── phsvc/ # 서비스 컴포넌트 +│ ├── svcmain.c # 서비스 진입점 +│ ├── svcclient.c # 클라이언트 +│ └── svcapi.c # API 구현 +├── resources/ # 리소스 파일 +│ ├── etwguids.txt # ETW GUID 매핑 +│ ├── pooltag.txt # 커널 풀 태그 +│ └── *.png # 아이콘 이미지 +├── mainwnd.c # 메인 윈도우 +├── proctree.c # 프로세스 트리 뷰 +├── procprv.c # 프로세스 공급자 +├── actions.c # 프로세스 작업 +├── options.c # 설정 관리 +├── plugin.c # 플러그인 로더 +└── SystemInformer.vcxproj # VS 프로젝트 +``` + +### 3.3 KSystemInformer (커널 드라이버) + +``` +KSystemInformer/ +├── include/ # 드라이버 헤더 +│ ├── kph.h # 메인 헤더 +│ ├── kphmsg.h # 메시지 정의 +│ └── informer*.h # Informer 헤더 +├── informer_process.c # 프로세스 모니터링 +├── informer_thread.c # 스레드 모니터링 +├── informer_file.c # 파일 모니터링 +├── informer_fileop.c # 파일 작업 감시 +├── informer_registry.c # 레지스트리 감시 +├── informer_image.c # 이미지 로드 감시 +├── comms.c # 통신 계층 +├── comms_handlers.c # 통신 핸들러 +├── protection.c # 보호 메커니즘 +├── cid_tracking.c # CID 추적 +├── verify.c # 검증 +├── driver.c # 드라이버 진입점 +└── KSystemInformer.vcxproj # VS 프로젝트 +``` + +### 3.4 phlib (핵심 라이브러리) + +``` +phlib/ +├── include/ # 공개 헤더 +│ ├── ph.h # 메인 헤더 +│ ├── phbase.h # 기본 타입/매크로 +│ ├── phgui.h # GUI 헤더 +│ └── ... +├── native.c # Native API 래퍼 +├── nativeprocess.c # 프로세스 관리 +├── nativethread.c # 스레드 관리 +├── nativetoken.c # 토큰/권한 +├── nativefile.c # 파일 작업 +├── guisup.c # GUI 지원 +├── treenew.c # 트리/리스트뷰 +├── symprv.c # 심볼 공급자 +├── util.c # 유틸리티 +├── settings.c # 설정 관리 +├── json.c # JSON 파싱 +├── http.c # HTTP 통신 +└── phlib.vcxproj # VS 프로젝트 +``` + +### 3.5 Plugins (플러그인) + +``` +plugins/ +├── include/ # 플러그인 공유 헤더 +├── DotNetTools/ # .NET 분석 도구 +├── ExtendedTools/ # 확장 도구 (ETW, GPU) +├── HardwareDevices/ # 하드웨어 모니터링 +├── NetworkTools/ # 네트워크 도구 +├── ExtendedServices/ # 서비스 확장 +├── ExtendedNotifications/ # 알림 확장 +├── ToolStatus/ # 도구 모음 상태 +├── OnlineChecks/ # 온라인 검사 (VirusTotal) +├── Updater/ # 자동 업데이트 +├── UserNotes/ # 사용자 주석 +├── WindowExplorer/ # 윈도우 탐색기 +└── Plugins.sln # 플러그인 솔루션 +``` + +--- + +## 4. 주요 모듈 설계 + +### 4.1 프로세스 관리 모듈 + +``` +┌────────────────────────────────────────────────────────────┐ +│ 프로세스 관리 모듈 구조 │ +├────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │ +│ │ procprv.c │─────►│ proctree.c │─────►│ UI 렌더링 │ │ +│ │ (Provider) │ │ (Tree View) │ │ │ │ +│ └──────┬──────┘ └─────────────┘ └───────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ Native API Layer │ │ +│ │ NtQuerySystemInformation / NtQueryProcess... │ │ +│ └──────────────────────┬──────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ KSystemInformer Driver │ │ +│ │ (확장 정보: 보호 상태, 토큰, 메모리 등) │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +└────────────────────────────────────────────────────────────┘ +``` + +### 4.2 플러그인 시스템 아키텍처 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Plugin Manager │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ plugman.c / plugin.c │ │ +│ │ - 플러그인 검색 및 로드 │ │ +│ │ - 의존성 관리 │ │ +│ │ - 콜백 등록 │ │ +│ └───────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ + │ + ┌───────────────┼───────────────┐ + ▼ ▼ ▼ + ┌───────────┐ ┌───────────┐ ┌───────────┐ + │ Plugin A │ │ Plugin B │ │ Plugin C │ + │ (.dll) │ │ (.dll) │ │ (.dll) │ + └───────────┘ └───────────┘ └───────────┘ + + 각 플러그인 필수 구현: + - PhPluginGetInformation() : 플러그인 정보 제공 + - DllMain() : DLL 진입점 +``` + +### 4.3 커널 드라이버 통신 아키텍처 + +``` +┌──────────────────────────────────────────────────────────────┐ +│ User Mode (Ring 3) │ +│ │ +│ ┌────────────────┐ ┌────────────────┐ │ +│ │ SystemInformer │ │ kphlib │ │ +│ │ (Client) │────────►│ (통신 라이브러리)│ │ +│ └────────────────┘ └───────┬────────┘ │ +│ │ │ +│ CreateFile/DeviceIoControl │ +└─────────────────────────────────────┼────────────────────────┘ + │ +══════════════════════════════════════╪════════════════════════ + │ +┌─────────────────────────────────────┼────────────────────────┐ +│ Kernel Mode (Ring 0) │ +│ ▼ │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ KSystemInformer Driver │ │ +│ │ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │ │ +│ │ │ comms.c │ │ handlers.c │ │ verify.c │ │ │ +│ │ │ (IRP 처리) │ │ (요청 처리) │ │ (검증) │ │ │ +│ │ └──────────────┘ └──────────────┘ └────────────┘ │ │ +│ │ │ │ +│ │ ┌──────────────────────────────────────────────┐ │ │ +│ │ │ Informer Modules │ │ │ +│ │ │ Process | Thread | File | Registry | Image │ │ │ +│ │ └──────────────────────────────────────────────┘ │ │ +│ └──────────────────────────────────────────────────────┘ │ +│ │ +└──────────────────────────────────────────────────────────────┘ +``` + +--- + +## 5. 데이터 흐름 + +### 5.1 프로세스 정보 수집 흐름 + +``` +1. 타이머 트리거 (1초 간격) + │ + ▼ +2. PhEnumProcesses() 호출 + │ + ├──► NtQuerySystemInformation(SystemProcessInformation) + │ │ + │ ▼ + │ 프로세스 기본 정보 수집 + │ + ├──► KPH 드라이버 쿼리 (확장 정보) + │ │ + │ ▼ + │ 보호 상태, 서명 레벨 등 + │ + ▼ +3. 프로세스 노드 업데이트 + │ + ▼ +4. 델타 계산 (CPU, I/O, 메모리) + │ + ▼ +5. UI 트리뷰 업데이트 +``` + +### 5.2 이벤트 처리 흐름 + +``` +┌─────────────────┐ +│ 시스템 이벤트 │ (프로세스 생성, 파일 접근 등) +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ KSystemInformer │ (커널 콜백 수신) +│ Informer │ +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ 이벤트 큐잉 │ (필터링, 버퍼링) +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ 사용자 모드 │ (DeviceIoControl로 전달) +│ 수신 │ +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ 콜백 실행 │ (등록된 콜백 호출) +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ UI 업데이트 │ +└─────────────────┘ +``` + +--- + +## 6. 보안 아키텍처 + +### 6.1 드라이버 보안 계층 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 보안 검증 흐름 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ 1. 클라이언트 검증 │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ - 프로세스 서명 검증 (Authenticode) │ │ +│ │ - 이미지 무결성 확인 │ │ +│ │ - 신뢰할 수 있는 게시자 확인 │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ 2. 동적 데이터 검증 │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ - kphdyn.xml 서명 확인 │ │ +│ │ - Windows 버전별 오프셋 검증 │ │ +│ │ - 구조체 크기 유효성 검사 │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ 3. 요청 권한 검사 │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ - 클라이언트 권한 레벨 확인 │ │ +│ │ - 대상 프로세스 보호 상태 확인 │ │ +│ │ - 작업 허용 여부 결정 │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 6.2 프로세스 보호 메커니즘 + +``` +보호 레벨: +┌──────────────────────────────────────────────────────────┐ +│ Level 3 (Max) │ 완전 보호 - 종료, 수정 불가 │ +├──────────────────────────────────────────────────────────┤ +│ Level 2 │ 부분 보호 - 일부 작업 허용 │ +├──────────────────────────────────────────────────────────┤ +│ Level 1 │ 기본 보호 - 대부분 작업 허용 │ +├──────────────────────────────────────────────────────────┤ +│ Level 0 │ 보호 없음 │ +└──────────────────────────────────────────────────────────┘ +``` + +--- + +## 7. 메모리 관리 + +### 7.1 참조 카운팅 시스템 + +```c +// phlib의 참조 카운팅 패턴 +typedef struct _PH_OBJECT { + PH_OBJECT_HEADER Header; + // 객체 데이터 +} PH_OBJECT; + +// 참조 카운트 관리 +PhReferenceObject(Object); // 참조 증가 +PhDereferenceObject(Object); // 참조 감소 (0이면 해제) +``` + +### 7.2 메모리 풀 관리 + +``` +┌─────────────────────────────────────────────────────┐ +│ 메모리 풀 구조 │ +├─────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ ┌─────────────┐ │ +│ │ Small Pool │ │ Large Pool │ │ +│ │ (< 256KB) │ │ (>= 256KB) │ │ +│ └──────┬──────┘ └──────┬──────┘ │ +│ │ │ │ +│ ▼ ▼ │ +│ ┌─────────────────────────────────────────┐ │ +│ │ Heap Manager (phlib) │ │ +│ │ - 캐시된 할당/해제 │ │ +│ │ - 디버그 모드 추적 │ │ +│ └─────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────┘ +``` + +--- + +## 8. 스레드 및 동기화 + +### 8.1 동기화 프리미티브 + +| 프리미티브 | 용도 | 구현 | +|-----------|------|------| +| Queued Lock | 경량 잠금 | `PH_QUEUED_LOCK` | +| Init Once | 일회성 초기화 | `PH_INITONCE` | +| Rundown Protection | 안전한 해제 | `EX_RUNDOWN_REF` | +| Push Lock | 커널 잠금 | `EX_PUSH_LOCK` | + +### 8.2 작업 스레드 모델 + +``` +┌─────────────────────────────────────────────────────┐ +│ 작업 큐 시스템 │ +├─────────────────────────────────────────────────────┤ +│ │ +│ Main Thread Worker Threads │ +│ ┌─────────┐ ┌─────────────────┐ │ +│ │ UI Loop │────────►│ Thread Pool │ │ +│ └─────────┘ │ - I/O 작업 │ │ +│ │ - 네트워크 │ │ +│ │ - 파일 작업 │ │ +│ └─────────────────┘ │ +│ │ +│ Provider Threads │ +│ ┌─────────────────────────────────────────┐ │ +│ │ Process | Thread | Handle | Network │ │ +│ │ (주기적 갱신 스레드) │ │ +│ └─────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────┘ +``` + +--- + +## 9. 확장성 설계 + +### 9.1 플러그인 확장점 + +``` +┌────────────────────────────────────────────────────────────┐ +│ 확장 가능한 지점 │ +├────────────────────────────────────────────────────────────┤ +│ │ +│ • 메인 메뉴 확장 │ +│ • 컨텍스트 메뉴 확장 │ +│ • 프로세스 속성 페이지 추가 │ +│ • 서비스 속성 페이지 추가 │ +│ • 컬럼 추가 (프로세스, 스레드, 핸들 등) │ +│ • 정보 제공자 등록 │ +│ • 이벤트 콜백 등록 │ +│ • 필터 추가 │ +│ • 도구 모음 버튼 추가 │ +│ │ +└────────────────────────────────────────────────────────────┘ +``` + +### 9.2 콜백 시스템 + +```c +// 콜백 등록 예제 +typedef struct _PH_PLUGIN_CALLBACKS { + PPH_CALLBACK ProcessAdded; + PPH_CALLBACK ProcessDeleted; + PPH_CALLBACK ProcessHighlighting; + PPH_CALLBACK TreeNewMessage; + PPH_CALLBACK MenuItemExecute; + // ... +} PH_PLUGIN_CALLBACKS; +``` + +--- + +## 10. 프로젝트 통계 + +| 항목 | 수치 | +|------|------| +| 총 소스 파일 수 | 864개 | +| C 파일 | 504개 | +| C++ 파일 | 25개 | +| 헤더 파일 | 335개 | +| 총 코드 라인 | 940,000+ 라인 | +| 플러그인 수 | 11개 | +| 지원 Windows 버전 | 40+ | + +--- + +## 부록: 주요 파일 참조 + +### 핵심 소스 파일 (코드 라인 기준) + +| 파일 | 위치 | 라인 수 | 설명 | +|------|------|---------|------| +| util.c | phlib/ | 308K | 범용 유틸리티 | +| treenew.c | phlib/ | 279K | 트리/리스트뷰 | +| proctree.c | SystemInformer/ | 244K | 프로세스 트리 | +| native.c | phlib/ | 242K | Native API | +| tokprp.c | SystemInformer/ | 244K | 토큰 속성 | +| actions.c | SystemInformer/ | 199K | 프로세스 작업 | +| mapimg.c | phlib/ | 181K | PE 이미지 매핑 | +| mainwnd.c | SystemInformer/ | 175K | 메인 윈도우 | +| devprv.c | SystemInformer/ | 173K | 디바이스 공급자 | +| guisup.c | phlib/ | 170K | GUI 지원 | diff --git "a/docs/technical/02_\352\270\260\353\212\245_\353\252\205\354\204\270\354\204\234.md" "b/docs/technical/02_\352\270\260\353\212\245_\353\252\205\354\204\270\354\204\234.md" new file mode 100644 index 000000000000..d8808f054c2a --- /dev/null +++ "b/docs/technical/02_\352\270\260\353\212\245_\353\252\205\354\204\270\354\204\234.md" @@ -0,0 +1,782 @@ +# System Informer 기능 명세서 + +## 문서 정보 +- **프로젝트명**: System Informer +- **문서 버전**: 1.0 +- **작성일**: 2026-01-25 + +--- + +## 1. 기능 개요 + +System Informer는 Windows 시스템의 포괄적인 모니터링 및 관리 도구로, 다음과 같은 주요 기능 카테고리를 제공합니다. + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ System Informer 기능 맵 │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ 프로세스 관리 │ │ 스레드 관리 │ │ 핸들 관리 │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ 메모리 분석 │ │ 네트워크 모니터│ │ 모듈 분석 │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ 서비스 관리 │ │ 디스크 모니터 │ │ GPU 모니터 │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ 시스템 정보 │ │ 보안 분석 │ │ 플러그인 │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 2. 프로세스 관리 기능 + +### 2.1 프로세스 목록 표시 + +**기능 ID**: PROC-001 +**소스 파일**: `SystemInformer/proctree.c`, `SystemInformer/procprv.c` + +#### 기능 설명 +시스템에서 실행 중인 모든 프로세스를 트리 또는 목록 형태로 표시합니다. + +#### 표시 정보 + +| 컬럼 | 설명 | 구현 위치 | +|------|------|-----------| +| Name | 프로세스 이름 | `procprv.c:PhpProcessQueryName` | +| PID | 프로세스 ID | 시스템 정보 | +| CPU | CPU 사용률 (%) | `procprv.c:PhpProcessCalculateCpu` | +| I/O Total Rate | 초당 I/O 바이트 | 델타 계산 | +| Private Bytes | 개인 메모리 사용량 | 시스템 정보 | +| User Name | 실행 사용자 | 토큰 정보 | +| Description | 파일 설명 | 버전 정보 | +| Company Name | 제조사 | 버전 정보 | +| Command Line | 명령줄 | PEB 정보 | +| DEP | 데이터 실행 방지 상태 | 프로세스 정보 | +| ASLR | 주소 공간 무작위화 | 이미지 정보 | +| Integrity | 무결성 레벨 | 토큰 정보 | +| Verified Signer | 디지털 서명자 | `verify.c` | + +#### 사용자 시나리오 + +``` +사용자 → 메인 윈도우 열기 + → 프로세스 목록 확인 + → 특정 프로세스 선택 + → 상세 정보 확인 또는 작업 수행 +``` + +--- + +### 2.2 프로세스 트리 뷰 + +**기능 ID**: PROC-002 +**소스 파일**: `SystemInformer/proctree.c` + +#### 기능 설명 +부모-자식 관계를 트리 구조로 표시하여 프로세스 계층 구조를 시각화합니다. + +#### 트리 구조 예시 + +``` +System (4) +├── smss.exe (392) +│ └── csrss.exe (508) +├── services.exe (620) +│ ├── svchost.exe (812) +│ │ └── WmiPrvSE.exe (2340) +│ ├── svchost.exe (844) +│ └── spoolsv.exe (1280) +├── lsass.exe (636) +└── winlogon.exe (580) + └── explorer.exe (1856) + ├── notepad.exe (3456) + └── chrome.exe (4520) +``` + +#### 기능 옵션 + +- **트리 모드 토글**: 트리/플랫 목록 전환 +- **자식 하이라이트**: 선택된 프로세스의 자식 강조 +- **부모 추적**: 선택된 프로세스의 부모로 이동 + +--- + +### 2.3 프로세스 작업 + +**기능 ID**: PROC-003 +**소스 파일**: `SystemInformer/actions.c` + +#### 지원 작업 목록 + +| 작업 | 설명 | 필요 권한 | 구현 함수 | +|------|------|-----------|-----------| +| Terminate | 프로세스 종료 | PROCESS_TERMINATE | `PhUiTerminateProcess` | +| Terminate Tree | 프로세스 트리 종료 | PROCESS_TERMINATE | `PhUiTerminateProcesses` | +| Suspend | 프로세스 일시 중지 | PROCESS_SUSPEND_RESUME | `PhUiSuspendProcess` | +| Resume | 프로세스 재개 | PROCESS_SUSPEND_RESUME | `PhUiResumeProcess` | +| Restart | 프로세스 재시작 | 다중 권한 | `PhUiRestartProcess` | +| Reduce Working Set | 워킹셋 축소 | PROCESS_SET_QUOTA | `PhUiReduceWorkingSet` | +| Virtualization | 가상화 토글 | TOKEN_WRITE | `PhUiSetVirtualization` | +| Create Dump | 덤프 파일 생성 | PROCESS_ALL_ACCESS | `PhUiCreateDumpFile` | +| Debug | 디버거 연결 | PROCESS_ALL_ACCESS | `PhUiDebugProcess` | +| Inject DLL | DLL 주입 | PROCESS_ALL_ACCESS | `PhUiInjectDll` | +| Set Priority | 우선순위 변경 | PROCESS_SET_INFORMATION | `PhUiSetPriority` | +| Set I/O Priority | I/O 우선순위 변경 | PROCESS_SET_INFORMATION | `PhUiSetIoPriority` | +| Set Affinity | CPU 친화도 설정 | PROCESS_SET_INFORMATION | `PhUiSetAffinity` | + +#### 강제 종료 메커니즘 + +``` +일반 종료 실패 시: +┌─────────────────────────────────────────┐ +│ 1. NtTerminateProcess 시도 │ +│ ↓ 실패 │ +│ 2. KSystemInformer 드라이버 사용 │ +│ ↓ 실패 │ +│ 3. 스레드 개별 종료 시도 │ +│ ↓ 실패 │ +│ 4. 사용자에게 실패 알림 │ +└─────────────────────────────────────────┘ +``` + +--- + +### 2.4 프로세스 속성 + +**기능 ID**: PROC-004 +**소스 파일**: `SystemInformer/prpg*.c` + +#### 속성 페이지 목록 + +| 페이지 | 소스 파일 | 표시 정보 | +|--------|-----------|-----------| +| General | `prpggen.c` | 기본 정보, 이미지 경로, 명령줄 | +| Statistics | `prpgstat.c` | CPU, 메모리, I/O 통계 | +| Performance | `prpgperf.c` | 성능 그래프 | +| Threads | `prpgthrd.c` | 스레드 목록 | +| Token | `tokprp.c` | 보안 토큰, 권한, 그룹 | +| Modules | `prpgmod.c` | 로드된 모듈 | +| Memory | `prpgmem.c` | 메모리 맵 | +| Handles | `prpghndl.c` | 열린 핸들 | +| Environment | `prpgenv.c` | 환경 변수 | +| Job | `prpgjob.c` | 잡 객체 정보 | +| Services | `prpgsrv.c` | 호스팅된 서비스 | +| WMI Providers | `prpgwmi.c` | WMI 공급자 | +| .NET | Plugin | .NET 어셈블리 (플러그인) | +| GPU | Plugin | GPU 사용량 (플러그인) | + +--- + +## 3. 스레드 관리 기능 + +### 3.1 스레드 목록 + +**기능 ID**: THRD-001 +**소스 파일**: `SystemInformer/thrdprv.c`, `SystemInformer/thrdlist.c` + +#### 표시 정보 + +| 컬럼 | 설명 | +|------|------| +| TID | 스레드 ID | +| CPU | CPU 사용률 | +| Cycles Delta | 사이클 델타 | +| Start Address | 시작 주소 (심볼 해석) | +| Priority | 스레드 우선순위 | +| State | 실행 상태 (Running, Waiting 등) | +| Start Time | 시작 시간 | +| Kernel Time | 커널 모드 시간 | +| User Time | 사용자 모드 시간 | + +#### 스레드 작업 + +``` +┌─────────────────────────────────────────────────────┐ +│ 스레드 컨텍스트 메뉴 │ +├─────────────────────────────────────────────────────┤ +│ • Terminate - 스레드 종료 │ +│ • Force Terminate - 강제 종료 │ +│ • Suspend - 일시 중지 │ +│ • Resume - 재개 │ +│ • Set Priority - 우선순위 변경 │ +│ • Set I/O Priority - I/O 우선순위 │ +│ • Set Affinity - CPU 친화도 │ +│ • Analyze Wait - 대기 분석 │ +│ • View Stack - 스택 보기 │ +│ • View Token - 토큰 보기 │ +└─────────────────────────────────────────────────────┘ +``` + +### 3.2 스레드 스택 추적 + +**기능 ID**: THRD-002 +**소스 파일**: `phlib/symprv.c` + +#### 기능 설명 +선택한 스레드의 호출 스택을 심볼과 함께 표시합니다. + +#### 스택 프레임 정보 + +``` +Frame #0: ntdll.dll!NtWaitForSingleObject+0x14 +Frame #1: KERNELBASE.dll!WaitForSingleObjectEx+0x8e +Frame #2: myapp.exe!WorkerThread+0x125 +Frame #3: myapp.exe!main+0x45 +Frame #4: KERNEL32.DLL!BaseThreadInitThunk+0x1d +Frame #5: ntdll.dll!RtlUserThreadStart+0x28 +``` + +--- + +## 4. 핸들 관리 기능 + +### 4.1 핸들 목록 + +**기능 ID**: HNDL-001 +**소스 파일**: `SystemInformer/hndlprv.c`, `SystemInformer/hndllist.c` + +#### 표시 정보 + +| 컬럼 | 설명 | +|------|------| +| Type | 객체 타입 (File, Key, Event 등) | +| Name | 객체 이름 | +| Handle | 핸들 값 | +| Object Address | 커널 객체 주소 | +| Access | 접근 권한 | +| Attributes | 핸들 속성 | +| Granted Access | 부여된 접근 권한 | +| Original Name | 원본 이름 (해석 전) | + +#### 지원 객체 타입 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 지원되는 핸들 타입 │ +├─────────────────────────────────────────────────────────────┤ +│ File 파일 및 디렉토리 │ +│ Key 레지스트리 키 │ +│ Event 이벤트 객체 │ +│ Mutant 뮤텍스 │ +│ Semaphore 세마포어 │ +│ Section 메모리 섹션 │ +│ Process 프로세스 핸들 │ +│ Thread 스레드 핸들 │ +│ Token 토큰 핸들 │ +│ Desktop 데스크톱 │ +│ WindowStation 윈도우 스테이션 │ +│ Timer 타이머 │ +│ Job 잡 객체 │ +│ Directory 객체 디렉토리 │ +│ SymbolicLink 심볼릭 링크 │ +│ ALPC Port ALPC 포트 │ +│ 기타 100+ 타입 │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 4.2 핸들 검색 + +**기능 ID**: HNDL-002 +**소스 파일**: `SystemInformer/findobj.c` + +#### 기능 설명 +시스템 전체에서 특정 이름 또는 타입의 핸들을 검색합니다. + +#### 검색 옵션 + +- **이름으로 검색**: 와일드카드 지원 (`*.dll`, `\Device\*`) +- **타입으로 필터링**: 특정 객체 타입만 검색 +- **정규식 검색**: 정규 표현식 패턴 지원 + +--- + +## 5. 메모리 관리 기능 + +### 5.1 메모리 맵 뷰어 + +**기능 ID**: MEM-001 +**소스 파일**: `SystemInformer/memprv.c`, `SystemInformer/prpgmem.c` + +#### 표시 정보 + +| 컬럼 | 설명 | +|------|------| +| Base Address | 시작 주소 | +| Size | 영역 크기 | +| Protection | 보호 속성 (RWX) | +| State | 상태 (Commit, Reserve, Free) | +| Type | 타입 (Image, Mapped, Private) | +| Use | 용도 (Stack, Heap, PE 섹션) | +| Mapped File | 매핑된 파일 경로 | + +#### 메모리 보호 속성 + +``` +┌────────────────────────────────────────────────────┐ +│ 메모리 보호 속성 │ +├────────────────────────────────────────────────────┤ +│ PAGE_NOACCESS --- 접근 불가 │ +│ PAGE_READONLY R-- 읽기 전용 │ +│ PAGE_READWRITE RW- 읽기/쓰기 │ +│ PAGE_EXECUTE --X 실행 전용 │ +│ PAGE_EXECUTE_READ R-X 읽기/실행 │ +│ PAGE_EXECUTE_READWRITE RWX 전체 권한 │ +│ PAGE_GUARD +G 가드 페이지 │ +│ PAGE_NOCACHE +NC 캐시 비활성화 │ +│ PAGE_WRITECOMBINE +WC 쓰기 결합 │ +└────────────────────────────────────────────────────┘ +``` + +### 5.2 메모리 편집기 + +**기능 ID**: MEM-002 +**소스 파일**: `SystemInformer/memedit.c`, `phlib/hexedit.c` + +#### 기능 설명 +프로세스의 메모리를 16진수 편집기로 읽고 수정합니다. + +#### 기능 목록 + +- **메모리 읽기**: 지정된 주소에서 메모리 읽기 +- **메모리 쓰기**: 메모리 내용 수정 +- **검색**: 패턴, 문자열, 바이트 검색 +- **바이너리 보기**: 16진수 + ASCII 병렬 표시 + +### 5.3 메모리 검색 + +**기능 ID**: MEM-003 +**소스 파일**: `SystemInformer/memsrch.c` + +#### 검색 옵션 + +| 검색 타입 | 설명 | +|-----------|------| +| String (ASCII) | ASCII 문자열 검색 | +| String (Unicode) | 유니코드 문자열 검색 | +| Hex Pattern | 16진수 패턴 검색 | +| Regex | 정규 표현식 검색 | +| Struct | 구조체 패턴 검색 | + +--- + +## 6. 네트워크 모니터링 기능 + +### 6.1 네트워크 연결 목록 + +**기능 ID**: NET-001 +**소스 파일**: `SystemInformer/netprv.c`, `SystemInformer/netlist.c` + +#### 표시 정보 + +| 컬럼 | 설명 | +|------|------| +| Process | 프로세스 이름 | +| Local Address | 로컬 주소 | +| Local Port | 로컬 포트 | +| Remote Address | 원격 주소 | +| Remote Port | 원격 포트 | +| Protocol | 프로토콜 (TCP/UDP) | +| State | 연결 상태 | +| Owner | 소유 프로세스 | +| Time Stamp | 연결 시간 | + +#### 연결 상태 + +``` +TCP 상태: +┌──────────────┬─────────────────────────────────┐ +│ Listening │ 연결 대기 중 │ +│ Established │ 연결 수립됨 │ +│ SynSent │ SYN 패킷 전송됨 │ +│ SynReceived │ SYN 패킷 수신됨 │ +│ FinWait1/2 │ 종료 대기 │ +│ CloseWait │ 닫기 대기 │ +│ Closing │ 닫는 중 │ +│ TimeWait │ 시간 대기 │ +│ Closed │ 닫힘 │ +└──────────────┴─────────────────────────────────┘ +``` + +### 6.2 네트워크 작업 + +**기능 ID**: NET-002 + +#### 지원 작업 + +| 작업 | 설명 | +|------|------| +| Close Connection | TCP 연결 종료 | +| Copy | 정보 복사 | +| Go to Process | 소유 프로세스로 이동 | +| Whois | WHOIS 조회 (플러그인) | +| GeoIP | 지리적 위치 조회 (플러그인) | +| Traceroute | 경로 추적 (플러그인) | + +--- + +## 7. 서비스 관리 기능 + +### 7.1 서비스 목록 + +**기능 ID**: SVC-001 +**소스 파일**: `SystemInformer/srvprv.c`, `SystemInformer/srvlist.c` + +#### 표시 정보 + +| 컬럼 | 설명 | +|------|------| +| Name | 서비스 이름 | +| Display Name | 표시 이름 | +| Type | 서비스 타입 | +| Status | 현재 상태 | +| Start Type | 시작 유형 | +| PID | 프로세스 ID | +| Description | 설명 | +| Binary Path | 실행 파일 경로 | + +### 7.2 서비스 작업 + +**기능 ID**: SVC-002 +**소스 파일**: `SystemInformer/srvctl.c` + +#### 지원 작업 + +| 작업 | 설명 | +|------|------| +| Start | 서비스 시작 | +| Stop | 서비스 중지 | +| Pause | 서비스 일시 중지 | +| Continue | 서비스 계속 | +| Restart | 서비스 재시작 | +| Delete | 서비스 삭제 | +| Create | 새 서비스 생성 | +| Properties | 서비스 속성 | + +### 7.3 서비스 속성 + +**기능 ID**: SVC-003 + +#### 속성 페이지 + +| 페이지 | 설명 | +|--------|------| +| General | 기본 정보, 시작 유형 | +| Log On | 로그온 계정 설정 | +| Dependencies | 의존성 관계 (플러그인) | +| Recovery | 복구 옵션 (플러그인) | +| Triggers | 트리거 설정 (플러그인) | + +--- + +## 8. 모듈 분석 기능 + +### 8.1 모듈 목록 + +**기능 ID**: MOD-001 +**소스 파일**: `SystemInformer/modprv.c`, `SystemInformer/modlist.c` + +#### 표시 정보 + +| 컬럼 | 설명 | +|------|------| +| Name | 모듈 이름 | +| Base Address | 기본 주소 | +| Size | 모듈 크기 | +| Description | 설명 | +| Company Name | 제조사 | +| Version | 파일 버전 | +| Path | 전체 경로 | +| Verified Signer | 서명 검증 | +| ASLR | ASLR 적용 여부 | + +### 8.2 모듈 작업 + +**기능 ID**: MOD-002 + +#### 지원 작업 + +| 작업 | 설명 | +|------|------| +| Unload | DLL 언로드 | +| Open File Location | 파일 위치 열기 | +| Copy | 정보 복사 | +| Properties | PE 속성 | +| Search Online | 온라인 검색 | +| VirusTotal | VT 검사 (플러그인) | + +--- + +## 9. 시스템 정보 기능 + +### 9.1 시스템 정보 창 + +**기능 ID**: SYS-001 +**소스 파일**: `SystemInformer/sysinfo.c` + +#### 정보 탭 + +| 탭 | 표시 정보 | +|----|-----------| +| CPU | CPU 사용률 그래프, 코어별 사용률 | +| Memory | 메모리 사용량, 커밋 차지 | +| I/O | 디스크 I/O 그래프 | +| GPU | GPU 사용률 (플러그인) | +| Disk | 디스크 사용률 (플러그인) | +| Network | 네트워크 사용률 (플러그인) | + +### 9.2 시스템 정보 상세 + +**기능 ID**: SYS-002 + +#### 표시 정보 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 시스템 정보 │ +├─────────────────────────────────────────────────────────────┤ +│ OS 버전: Windows 11 Pro 23H2 (Build 22631) │ +│ 프로세서: AMD Ryzen 9 5900X (12 cores, 24 threads) │ +│ RAM: 32.0 GB │ +│ 시스템 시작: 2026-01-20 09:15:23 │ +│ 부팅 시간: 45초 │ +│ 프로세스 수: 287 │ +│ 스레드 수: 4,521 │ +│ 핸들 수: 152,847 │ +│ 커밋 차지: 8.2 / 48.0 GB │ +│ 커널 풀: Paged: 512 MB / Nonpaged: 256 MB │ +└─────────────────────────────────────────────────────────────┘ +``` + +--- + +## 10. 검색 및 필터링 기능 + +### 10.1 전역 검색 + +**기능 ID**: SRCH-001 +**소스 파일**: `SystemInformer/searchbox.c` + +#### 검색 대상 + +- 프로세스 이름 +- 서비스 이름 +- 네트워크 연결 +- 핸들 이름 +- 모듈 이름 + +### 10.2 고급 필터 + +**기능 ID**: SRCH-002 + +#### 필터 옵션 + +``` +필터 연산자: +┌────────────────────────────────────────────────────┐ +│ contains - 포함 │ +│ equals - 일치 │ +│ startswith - 시작 │ +│ endswith - 끝 │ +│ regex - 정규식 │ +│ > < >= <= - 비교 │ +└────────────────────────────────────────────────────┘ + +예시: +• name contains "chrome" +• cpu > 5 +• private_bytes > 100MB +• user equals "SYSTEM" +``` + +--- + +## 11. 플러그인 기능 + +### 11.1 내장 플러그인 목록 + +| 플러그인 | 기능 ID | 설명 | +|----------|---------|------| +| DotNetTools | PLG-001 | .NET 런타임 분석 | +| ExtendedTools | PLG-002 | ETW, GPU, NPU 모니터링 | +| HardwareDevices | PLG-003 | 디스크, 네트워크, 배터리 모니터링 | +| NetworkTools | PLG-004 | Ping, Traceroute, GeoIP | +| ExtendedServices | PLG-005 | 서비스 의존성, 복구, 트리거 | +| ExtendedNotifications | PLG-006 | 파일 로깅, 이벤트 알림 | +| ToolStatus | PLG-007 | 도구 모음 커스터마이징 | +| OnlineChecks | PLG-008 | VirusTotal, Hybrid Analysis | +| Updater | PLG-009 | 자동 업데이트 | +| UserNotes | PLG-010 | 프로세스 주석 | +| WindowExplorer | PLG-011 | 윈도우 탐색 | + +### 11.2 DotNetTools 플러그인 + +**기능 ID**: PLG-001 +**소스 파일**: `plugins/DotNetTools/` + +#### 기능 + +- .NET 어셈블리 목록 표시 +- CLR 버전 정보 +- AppDomain 정보 +- 스택 추적 (관리 코드) +- 성능 카운터 모니터링 + +### 11.3 ExtendedTools 플러그인 + +**기능 ID**: PLG-002 +**소스 파일**: `plugins/ExtendedTools/` + +#### 기능 + +| 기능 | 설명 | +|------|------| +| ETW 모니터링 | 디스크, 네트워크 I/O 추적 | +| GPU 모니터링 | GPU 사용률, 메모리 | +| NPU 모니터링 | NPU 사용률 | +| 프레임 모니터링 | FPS 추적 | +| 펌웨어 편집기 | UEFI/EFI 변수 | +| TPM 편집기 | TPM 정보 | + +### 11.4 HardwareDevices 플러그인 + +**기능 ID**: PLG-003 +**소스 파일**: `plugins/HardwareDevices/` + +#### 기능 + +- 디스크 사용률 및 온도 +- 네트워크 어댑터 통계 +- GPU 정보 및 온도 +- 배터리 상태 +- 디바이스 트리 + +--- + +## 12. 알림 및 로깅 기능 + +### 12.1 시스템 트레이 알림 + +**기능 ID**: NOTIF-001 +**소스 파일**: `SystemInformer/notifico.c` + +#### 알림 이벤트 + +- 새 프로세스 생성 +- 프로세스 종료 +- 서비스 상태 변경 +- 높은 CPU 사용량 경고 + +### 12.2 이벤트 로깅 + +**기능 ID**: NOTIF-002 +**소스 파일**: `SystemInformer/logwnd.c` + +#### 로그 정보 + +``` +[2026-01-25 10:15:23] Process created: chrome.exe (PID: 1234) +[2026-01-25 10:15:45] Service started: Windows Update +[2026-01-25 10:16:02] High CPU: System Idle Process (98.5%) +[2026-01-25 10:16:30] Process terminated: notepad.exe (PID: 5678) +``` + +--- + +## 13. 설정 기능 + +### 13.1 일반 설정 + +**기능 ID**: OPT-001 +**소스 파일**: `SystemInformer/options.c` + +#### 설정 카테고리 + +| 카테고리 | 설정 항목 | +|----------|-----------| +| General | 시작 시 실행, 최소화 시작, 업데이트 확인 | +| Highlighting | 프로세스 하이라이팅 색상 | +| Graphs | 그래프 설정, 업데이트 간격 | +| Advanced | 드라이버 로드, 심볼 서버 | +| Plugins | 플러그인 활성화/비활성화 | + +### 13.2 하이라이팅 설정 + +**기능 ID**: OPT-002 + +#### 하이라이팅 규칙 + +| 색상 | 의미 | +|------|------| +| 녹색 | 새로 생성된 프로세스 | +| 빨강 | 종료된 프로세스 | +| 분홍 | 서비스 프로세스 | +| 파랑 | 시스템 프로세스 | +| 보라 | 높은 권한 프로세스 | +| 노랑 | 패킹/보호된 프로세스 | +| 주황 | 일시 중지된 프로세스 | + +--- + +## 14. 보안 기능 + +### 14.1 서명 검증 + +**기능 ID**: SEC-001 +**소스 파일**: `phlib/verify.c` + +#### 검증 상태 + +| 상태 | 설명 | +|------|------| +| Valid | 유효한 서명 | +| Invalid | 서명 손상 | +| Unsigned | 서명 없음 | +| Expired | 서명 만료 | +| Revoked | 인증서 폐기 | +| Untrusted | 신뢰할 수 없는 루트 | + +### 14.2 프로세스 보호 + +**기능 ID**: SEC-002 +**소스 파일**: `KSystemInformer/protection.c` + +#### 보호 기능 + +- PPL (Protected Process Light) 우회 +- 프로세스 숨기기 감지 +- 커널 모드 작업 수행 + +--- + +## 15. 기능 요구사항 매트릭스 + +### 15.1 권한 요구사항 + +| 기능 | 일반 사용자 | 관리자 | 드라이버 필요 | +|------|-------------|--------|---------------| +| 프로세스 목록 | O | O | - | +| 프로세스 종료 | 일부 | 대부분 | 모든 프로세스 | +| 메모리 읽기 | 일부 | 대부분 | 보호된 프로세스 | +| 핸들 목록 | X | O | - | +| 서비스 관리 | X | O | - | +| 드라이버 로드 | X | X | 별도 서명 필요 | + +### 15.2 Windows 버전별 지원 + +| 기능 | Win 7 | Win 8/8.1 | Win 10 | Win 11 | +|------|-------|-----------|--------|--------| +| 기본 기능 | O | O | O | O | +| ETW 모니터링 | O | O | O | O | +| GPU 모니터링 | 제한적 | O | O | O | +| NPU 모니터링 | X | X | 일부 | O | +| 프로세스 보호 | X | 일부 | O | O | +| ARM64 지원 | X | X | O | O | diff --git "a/docs/technical/03_\352\270\260\354\210\240\354\212\244\355\203\235.md" "b/docs/technical/03_\352\270\260\354\210\240\354\212\244\355\203\235.md" new file mode 100644 index 000000000000..9959b0bb05fc --- /dev/null +++ "b/docs/technical/03_\352\270\260\354\210\240\354\212\244\355\203\235.md" @@ -0,0 +1,737 @@ +# System Informer 기술스택 + +## 문서 정보 +- **프로젝트명**: System Informer +- **문서 버전**: 1.0 +- **작성일**: 2026-01-25 + +--- + +## 1. 기술스택 개요 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ System Informer 기술스택 │ +├─────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 프로그래밍 언어 │ │ +│ │ C (95%) │ C++ (4%) │ PowerShell (1%) │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Windows API │ │ +│ │ Win32 API │ Native NT API │ WDM │ ETW │ WMI │ COM/DirectX │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 빌드 시스템 │ │ +│ │ Visual Studio 2022 │ MSBuild │ CMake │ WDK │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 써드파티 라이브러리 │ │ +│ │ JSON-C │ PCRE │ Zydis │ MaxMindDB │ MinIZ │ Detours │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 2. 프로그래밍 언어 + +### 2.1 C 언어 (주요 언어) + +**버전**: C11 / C17 (최신 표준) +**컴파일러**: MSVC (Microsoft Visual C++) + +#### 사용 이유 + +1. **저수준 시스템 접근**: Windows 커널 및 Native API와 직접 상호작용 +2. **성능 최적화**: 메모리 및 CPU 효율적 사용 +3. **드라이버 개발**: WDM 드라이버는 C로 작성 +4. **호환성**: Windows API와 자연스러운 통합 + +#### 코드 통계 + +| 구분 | 파일 수 | 코드 라인 | +|------|---------|-----------| +| 애플리케이션 (SystemInformer) | 89개 | ~400,000 | +| 라이브러리 (phlib) | 75개 | ~300,000 | +| 드라이버 (KSystemInformer) | 42개 | ~150,000 | +| 플러그인 | 189개 | ~90,000 | +| **총계** | 504개 | ~940,000 | + +#### 코딩 컨벤션 + +```c +// 함수 명명 규칙 (헝가리안 표기법 변형) +NTSTATUS PhOpenProcess( + _Out_ PHANDLE ProcessHandle, // 출력 파라미터 + _In_ ACCESS_MASK DesiredAccess, // 입력 파라미터 + _In_ HANDLE ProcessId // 입력 파라미터 + ); + +// SAL 주석 사용 +_Success_(return != NULL) +_Must_inspect_result_ +PPH_STRING PhCreateString( + _In_ PWSTR Buffer + ); + +// 참조 카운팅 패턴 +PhReferenceObject(Object); +PhDereferenceObject(Object); +``` + +### 2.2 C++ 언어 (보조 언어) + +**버전**: C++17 / C++20 +**사용 영역**: GUI 컴포넌트, COM 인터페이스 + +#### 사용 파일 + +| 파일 | 위치 | 용도 | +|------|------|------| +| notiftoast.cpp | SystemInformer/ | Windows Toast 알림 | +| guisuplistview.cpp | phlib/ | ListView 확장 | +| devicetree.cpp | plugins/HardwareDevices/ | 디바이스 트리 | + +### 2.3 PowerShell (스크립트) + +**용도**: 빌드 자동화, 코드 생성 + +#### 주요 스크립트 + +``` +build/ +├── build_zwntapi.ps1 # Native API 헤더 생성 +├── build_init.ps1 # 빌드 초기화 +└── build_release.ps1 # 릴리스 빌드 +``` + +--- + +## 3. Windows API 스택 + +### 3.1 Win32 API + +**설명**: 표준 Windows 애플리케이션 개발 API + +#### 사용 영역 + +| 카테고리 | API 함수 | 용도 | +|----------|----------|------| +| 윈도우 관리 | CreateWindowEx, SetWindowPos | GUI 생성/관리 | +| 컨트롤 | ListView, TreeView, ComboBox | UI 컨트롤 | +| 대화상자 | DialogBoxParam, MessageBox | 대화상자 | +| 메뉴 | CreateMenu, AppendMenu | 메뉴 관리 | +| GDI | GetDC, BitBlt, CreateFont | 그래픽 렌더링 | +| 파일 | CreateFile, ReadFile | 파일 I/O | +| 프로세스 | CreateProcess, OpenProcess | 프로세스 관리 | +| 스레드 | CreateThread, WaitForSingleObject | 스레드 관리 | +| 레지스트리 | RegOpenKeyEx, RegQueryValueEx | 레지스트리 접근 | +| 서비스 | OpenSCManager, StartService | 서비스 관리 | + +### 3.2 Native NT API (NTAPI) + +**설명**: Windows 커널과 직접 통신하는 비공개 API +**헤더 위치**: `phnt/` 디렉토리 + +#### 핵심 함수 + +```c +// 프로세스 관련 +NTSTATUS NtQuerySystemInformation( + SYSTEM_INFORMATION_CLASS SystemInformationClass, + PVOID SystemInformation, + ULONG SystemInformationLength, + PULONG ReturnLength +); + +NTSTATUS NtQueryInformationProcess( + HANDLE ProcessHandle, + PROCESSINFOCLASS ProcessInformationClass, + PVOID ProcessInformation, + ULONG ProcessInformationLength, + PULONG ReturnLength +); + +// 메모리 관련 +NTSTATUS NtReadVirtualMemory( + HANDLE ProcessHandle, + PVOID BaseAddress, + PVOID Buffer, + SIZE_T BufferSize, + PSIZE_T NumberOfBytesRead +); + +NTSTATUS NtWriteVirtualMemory( + HANDLE ProcessHandle, + PVOID BaseAddress, + PVOID Buffer, + SIZE_T BufferSize, + PSIZE_T NumberOfBytesWritten +); + +// 핸들 관련 +NTSTATUS NtQueryObject( + HANDLE Handle, + OBJECT_INFORMATION_CLASS ObjectInformationClass, + PVOID ObjectInformation, + ULONG ObjectInformationLength, + PULONG ReturnLength +); +``` + +#### phnt 헤더 구조 + +``` +phnt/ +├── ntbcd.h # 부팅 구성 데이터 +├── ntd3dkmt.h # Direct3D 커널 모드 +├── ntdbg.h # 디버깅 +├── ntexapi.h # 확장 API +├── ntgdi.h # GDI +├── ntheap.h # 힙 관리 +├── ntioapi.h # I/O 관리 +├── ntkeapi.h # 커널 확장 +├── ntldr.h # 로더 +├── ntlpcapi.h # LPC (로컬 프로시저 호출) +├── ntmisc.h # 기타 +├── ntmmapi.h # 메모리 관리 +├── ntnls.h # NLS (국가 언어 지원) +├── ntobapi.h # 객체 관리 +├── ntpebteb.h # PEB/TEB 구조체 +├── ntpfapi.h # 페이지 파일 +├── ntpnpapi.h # 플러그 앤 플레이 +├── ntpoapi.h # 전원 관리 +├── ntpsapi.h # 프로세스/스레드 +├── ntregapi.h # 레지스트리 +├── ntrtl.h # 런타임 라이브러리 +├── ntsam.h # SAM (보안 계정 관리) +├── ntseapi.h # 보안 +├── ntsmss.h # 세션 관리 +├── nttmapi.h # 트랜잭션 관리 +├── nttp.h # 스레드 풀 +├── ntwmi.h # WMI +├── ntwow64.h # WOW64 +├── ntxcapi.h # 예외 처리 +├── ntzwapi.h # Zw 시스템 콜 +├── phnt.h # 메인 헤더 +├── phnt_ntdef.h # 기본 정의 +└── phnt_windows.h # Windows 호환 정의 +``` + +### 3.3 WDM (Windows Driver Model) + +**설명**: 커널 모드 드라이버 개발 프레임워크 +**사용 위치**: `KSystemInformer/` + +#### 드라이버 구조 + +```c +// 드라이버 진입점 +NTSTATUS DriverEntry( + _In_ PDRIVER_OBJECT DriverObject, + _In_ PUNICODE_STRING RegistryPath +) +{ + // 드라이버 초기화 + DriverObject->MajorFunction[IRP_MJ_CREATE] = KphDispatchCreate; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = KphDispatchClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = KphDispatchDeviceControl; + DriverObject->DriverUnload = KphDriverUnload; + + return STATUS_SUCCESS; +} +``` + +#### 사용 커널 API + +| API | 용도 | +|-----|------| +| PsSetCreateProcessNotifyRoutine | 프로세스 생성/종료 알림 | +| PsSetCreateThreadNotifyRoutine | 스레드 생성/종료 알림 | +| PsSetLoadImageNotifyRoutine | 이미지 로드 알림 | +| CmRegisterCallback | 레지스트리 콜백 | +| ObRegisterCallbacks | 객체 콜백 | +| FltRegisterFilter | 미니필터 드라이버 | +| ZwQuerySystemInformation | 시스템 정보 쿼리 | +| ZwOpenProcess | 프로세스 열기 | +| ZwQueryInformationProcess | 프로세스 정보 쿼리 | + +### 3.4 ETW (Event Tracing for Windows) + +**설명**: 고성능 이벤트 추적 시스템 +**사용 위치**: `plugins/ExtendedTools/` + +#### 추적 대상 + +| 이벤트 타입 | 설명 | +|-------------|------| +| 디스크 I/O | 읽기/쓰기 작업 추적 | +| 네트워크 I/O | 송수신 추적 | +| 파일 시스템 | 파일 작업 추적 | +| 프로세스 | 프로세스 이벤트 | +| 스레드 | 스레드 이벤트 | +| 이미지 로드 | DLL/EXE 로드 | + +#### ETW 사용 코드 패턴 + +```c +// ETW 세션 시작 +StartTrace(&SessionHandle, SessionName, &TraceProperties); + +// 공급자 활성화 +EnableTraceEx2( + SessionHandle, + &ProviderGuid, + EVENT_CONTROL_CODE_ENABLE_PROVIDER, + TRACE_LEVEL_INFORMATION, + 0, 0, 0, NULL +); + +// 이벤트 처리 +ProcessTrace(&SessionHandle, 1, NULL, NULL); +``` + +### 3.5 WMI (Windows Management Instrumentation) + +**설명**: 시스템 관리 인터페이스 +**사용 위치**: `SystemInformer/prpgwmi.c` + +#### 쿼리 대상 + +``` +Win32_Process 프로세스 정보 +Win32_Service 서비스 정보 +Win32_ComputerSystem 컴퓨터 시스템 +Win32_OperatingSystem OS 정보 +Win32_PhysicalMemory 물리 메모리 +Win32_Processor 프로세서 정보 +``` + +### 3.6 COM/DirectX + +**설명**: GPU 정보 및 그래픽 관련 API +**사용 위치**: `plugins/ExtendedTools/`, `plugins/HardwareDevices/` + +#### 사용 API + +| API | 용도 | +|-----|------| +| D3DKMTQueryStatistics | GPU 통계 쿼리 | +| D3DKMTOpenAdapterFromLuid | 어댑터 열기 | +| IDXGIFactory | DXGI 팩토리 | +| IDXGIAdapter | 어댑터 정보 | + +--- + +## 4. 빌드 시스템 + +### 4.1 Visual Studio + +**버전**: Visual Studio 2022 (v17.x) +**필수 구성 요소**: + +``` +워크로드: +├── C++를 사용한 데스크톱 개발 +├── Windows 10/11 SDK +└── C++ ATL for v143 build tools + +개별 구성 요소: +├── MSVC v143 - VS 2022 C++ x64/x86 build tools +├── MSVC v143 - VS 2022 C++ ARM64 build tools +├── Windows 10 SDK (10.0.22621.0) +├── C++ ATL for latest v143 build tools +└── C++ MFC for latest v143 build tools +``` + +### 4.2 MSBuild + +**설명**: Microsoft 빌드 엔진 +**프로젝트 파일**: `.vcxproj` + +#### 솔루션 구조 + +``` +SystemInformer.sln +├── SystemInformer.vcxproj # 메인 애플리케이션 +├── phlib.vcxproj # 핵심 라이브러리 +├── peview.vcxproj # PE 뷰어 +└── kphlib.vcxproj # KPH 라이브러리 + +KSystemInformer.sln +├── KSystemInformer.vcxproj # 커널 드라이버 +└── ksidll.vcxproj # 드라이버 DLL + +Plugins.sln +├── DotNetTools.vcxproj +├── ExtendedTools.vcxproj +├── HardwareDevices.vcxproj +├── NetworkTools.vcxproj +├── ExtendedServices.vcxproj +├── ExtendedNotifications.vcxproj +├── ToolStatus.vcxproj +├── OnlineChecks.vcxproj +├── Updater.vcxproj +├── UserNotes.vcxproj +└── WindowExplorer.vcxproj +``` + +### 4.3 CMake + +**버전**: 3.30.0 이상 +**설정 파일**: `CMakeLists.txt` + +#### CMake 옵션 + +```cmake +# 빌드 옵션 +option(SI_WITH_CORE "Build core components" ON) +option(SI_WITH_PLUGINS "Build plugins" ON) +option(SI_WITH_KERNEL "Build kernel driver" OFF) + +# 최소 요구사항 +cmake_minimum_required(VERSION 3.30.0) + +# 프로젝트 설정 +project(SystemInformer + VERSION 3.0.0 + LANGUAGES C CXX +) + +# 타겟 아키텍처 +set(CMAKE_SYSTEM_PROCESSOR "x64" CACHE STRING "Target architecture") +``` + +### 4.4 WDK (Windows Driver Kit) + +**버전**: Windows 11 WDK (10.0.22621) +**용도**: 커널 드라이버 빌드 + +#### 드라이버 빌드 설정 + +```xml + + + Driver + WDM + Windows10 + +``` + +--- + +## 5. 써드파티 라이브러리 + +### 5.1 라이브러리 개요 + +``` +tools/thirdparty/ +├── detours/ # Microsoft Detours (함수 후킹) +├── jsonc/ # JSON-C (JSON 파싱) +├── maxminddb/ # MaxMind GeoIP 데이터베이스 +├── md5/ # MD5 해싱 +├── miniz/ # MinIZ (ZIP 압축) +├── mxml/ # Mini-XML (XML 파싱) +├── pcre/ # PCRE (정규 표현식) +├── sha/ # SHA-1 해싱 +├── sha256/ # SHA-256 해싱 +├── ssdeep/ # ssdeep (퍼지 해싱) +├── tlsh/ # TLSH (유사도 해싱) +├── xxhash/ # xxHash (고속 해싱) +├── zydis/ # Zydis (x86/x64 디스어셈블러) +└── winsdk/ # Windows SDK 래퍼 +``` + +### 5.2 JSON-C + +**용도**: JSON 파싱 및 생성 +**사용 위치**: `phlib/json.c` + +```c +// JSON 파싱 예제 +json_object *root = json_tokener_parse(jsonString); +json_object *value; +if (json_object_object_get_ex(root, "key", &value)) { + const char *str = json_object_get_string(value); +} +json_object_put(root); +``` + +### 5.3 PCRE (Perl Compatible Regular Expressions) + +**용도**: 정규 표현식 검색 +**사용 위치**: `phlib/regex.c` + +```c +// 정규식 컴파일 +pcre2_code *regex = pcre2_compile( + pattern, PCRE2_ZERO_TERMINATED, + 0, &errorcode, &erroroffset, NULL +); + +// 매칭 수행 +pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(regex, NULL); +int rc = pcre2_match(regex, subject, length, 0, 0, match_data, NULL); +``` + +### 5.4 Zydis + +**용도**: x86/x64 명령어 디스어셈블 +**사용 위치**: 디버거 기능 + +```c +// 디스어셈블 예제 +ZydisDecoder decoder; +ZydisDecoderInit(&decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_STACK_WIDTH_64); + +ZydisDecodedInstruction instruction; +ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; + +if (ZYAN_SUCCESS(ZydisDecoderDecodeFull( + &decoder, data, length, + &instruction, operands))) { + // 명령어 분석 +} +``` + +### 5.5 Microsoft Detours + +**용도**: 함수 후킹 +**사용 위치**: `SystemInformer/delayhook.c` + +```c +// 함수 후킹 예제 +DetourTransactionBegin(); +DetourUpdateThread(GetCurrentThread()); +DetourAttach(&(PVOID&)TrueFunction, HookedFunction); +DetourTransactionCommit(); +``` + +### 5.6 MaxMindDB + +**용도**: GeoIP 위치 조회 +**사용 위치**: `plugins/NetworkTools/` + +```c +// GeoIP 조회 +MMDB_lookup_result_s result = MMDB_lookup_string(&mmdb, ip_address, &gai_error, &mmdb_error); +if (result.found_entry) { + MMDB_entry_data_s entry_data; + MMDB_get_value(&result.entry, &entry_data, "country", "names", "en", NULL); +} +``` + +### 5.7 MinIZ + +**용도**: ZIP 압축/해제 +**사용 위치**: 업데이트 기능 + +```c +// ZIP 해제 +mz_zip_archive zip; +mz_zip_reader_init_mem(&zip, data, size, 0); +mz_zip_reader_extract_to_file(&zip, index, dest_path, 0); +mz_zip_reader_end(&zip); +``` + +### 5.8 xxHash + +**용도**: 고속 비암호화 해싱 +**사용 위치**: 캐시 및 비교 + +```c +// 해시 계산 +XXH64_hash_t hash = XXH64(data, length, seed); +``` + +### 5.9 ssdeep / TLSH + +**용도**: 퍼지 해싱 (유사도 분석) +**사용 위치**: 악성코드 분석 + +```c +// ssdeep 해시 +char hash[FUZZY_MAX_RESULT]; +fuzzy_hash_buf(data, length, hash); + +// TLSH 해시 +Tlsh tlsh; +tlsh.update(data, length); +tlsh.final(); +const char *hash = tlsh.getHash(); +``` + +--- + +## 6. 개발 도구 + +### 6.1 디버깅 도구 + +| 도구 | 용도 | +|------|------| +| Visual Studio Debugger | 사용자 모드 디버깅 | +| WinDbg | 커널 모드 디버깅 | +| x64dbg | 리버스 엔지니어링 | +| Process Monitor | 시스템 활동 모니터링 | + +### 6.2 정적 분석 도구 + +| 도구 | 용도 | +|------|------| +| Visual Studio Code Analysis | 정적 코드 분석 | +| PVS-Studio | 고급 정적 분석 | +| Cppcheck | C/C++ 정적 분석 | + +### 6.3 빌드 도구 + +| 도구 | 용도 | +|------|------| +| CustomBuildTool | 커스텀 빌드 작업 | +| CustomSignTool | 코드 서명 | +| GenerateZw | Zw 함수 생성 | + +--- + +## 7. 아키텍처 지원 + +### 7.1 지원 아키텍처 + +| 아키텍처 | 지원 | 비고 | +|----------|------|------| +| x86 (32-bit) | O | Windows 7+ | +| x64 (64-bit) | O | 주 대상 | +| ARM64 | O | Windows 10+ | + +### 7.2 아키텍처별 빌드 설정 + +```xml + + + Win32;x64;ARM64 + + + + v143 + + + + v143 + + + + v143 + +``` + +--- + +## 8. 보안 기술 + +### 8.1 코드 서명 + +**요구사항**: EV 코드 서명 인증서 (드라이버) + +``` +인증서 체인: +└── Root CA + └── Intermediate CA + └── EV Code Signing Certificate + └── 드라이버 서명 +``` + +### 8.2 보안 개발 주기 (SDL) + +```xml + + + true + true + Level3 + +``` + +### 8.3 보안 기능 + +| 기능 | 설명 | +|------|------| +| ASLR | 주소 공간 무작위화 | +| DEP | 데이터 실행 방지 | +| CFG | 컨트롤 플로우 가드 | +| SEHOP | SEH 덮어쓰기 방지 | +| GS | 스택 버퍼 오버런 탐지 | + +--- + +## 9. 버전 호환성 + +### 9.1 Windows 버전 지원 + +| Windows 버전 | 빌드 | 지원 수준 | +|--------------|------|-----------| +| Windows XP | 2600 | 제한적 | +| Windows Vista | 6000 | 기본 | +| Windows 7 | 7600 | 완전 | +| Windows 8 | 9200 | 완전 | +| Windows 8.1 | 9600 | 완전 | +| Windows 10 1507 | 10240 | 완전 | +| Windows 10 1903 | 18362 | 완전 | +| Windows 10 21H2 | 19044 | 완전 | +| Windows 11 21H2 | 22000 | 완전 | +| Windows 11 22H2 | 22621 | 완전 | +| Windows 11 23H2 | 22631 | 완전 | + +### 9.2 동적 데이터 시스템 + +**파일**: `kphlib/kphdyn.xml` + +```xml + + + + + 0x440 + 0x448 + 0x4b8 + 0x5a8 + + + + +``` + +--- + +## 10. 기술스택 요약 표 + +| 카테고리 | 기술 | 버전/상세 | +|----------|------|-----------| +| **언어** | C | C11/C17 | +| | C++ | C++17/C++20 | +| | PowerShell | 5.1+ | +| **빌드** | Visual Studio | 2022 (v17.x) | +| | MSBuild | 17.x | +| | CMake | 3.30.0+ | +| | WDK | 10.0.22621 | +| **Windows API** | Win32 | Windows 7+ | +| | Native NT API | 비공개 API | +| | WDM | 커널 드라이버 | +| | ETW | 이벤트 추적 | +| | WMI | 시스템 관리 | +| | COM/DirectX | GPU 정보 | +| **라이브러리** | JSON-C | JSON 처리 | +| | PCRE | 정규식 | +| | Zydis | 디스어셈블러 | +| | Detours | 함수 후킹 | +| | MaxMindDB | GeoIP | +| | MinIZ | ZIP 압축 | +| | xxHash | 고속 해싱 | +| | ssdeep/TLSH | 퍼지 해싱 | +| **아키텍처** | x86 | 32-bit | +| | x64 | 64-bit (주) | +| | ARM64 | Windows 10+ | diff --git "a/docs/technical/04_\353\271\214\353\223\234\355\231\230\352\262\275_\354\204\244\354\240\225.md" "b/docs/technical/04_\353\271\214\353\223\234\355\231\230\352\262\275_\354\204\244\354\240\225.md" new file mode 100644 index 000000000000..2a22884da3bf --- /dev/null +++ "b/docs/technical/04_\353\271\214\353\223\234\355\231\230\352\262\275_\354\204\244\354\240\225.md" @@ -0,0 +1,866 @@ +# System Informer 빌드환경 설정 가이드 + +## 문서 정보 +- **프로젝트명**: System Informer +- **문서 버전**: 1.0 +- **작성일**: 2026-01-25 + +--- + +## 1. 빌드환경 개요 + +### 1.1 빌드 시스템 구성도 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ 빌드 환경 구성 │ +├─────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 개발 환경 (필수) │ │ +│ │ Visual Studio 2022 │ Windows 10/11 SDK │ Git │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 드라이버 빌드 (선택) │ │ +│ │ Windows Driver Kit (WDK) │ EV 코드 서명 인증서 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ 대안 빌드 시스템 │ │ +│ │ CMake (3.30.0+) │ Ninja │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +### 1.2 지원 빌드 구성 + +| 구성 | Platform | Configuration | 대상 | +|------|----------|---------------|------| +| Debug x86 | Win32 | Debug | 32비트 디버그 | +| Debug x64 | x64 | Debug | 64비트 디버그 | +| Debug ARM64 | ARM64 | Debug | ARM64 디버그 | +| Release x86 | Win32 | Release | 32비트 릴리스 | +| Release x64 | x64 | Release | 64비트 릴리스 | +| Release ARM64 | ARM64 | Release | ARM64 릴리스 | + +--- + +## 2. 사전 요구사항 + +### 2.1 운영체제 + +- Windows 10 버전 1909 이상 +- Windows 11 (권장) + +### 2.2 Visual Studio 2022 설치 + +#### 필수 워크로드 + +``` +설치해야 할 워크로드: + +☑ C++를 사용한 데스크톱 개발 + ├── MSVC v143 - VS 2022 C++ x64/x86 빌드 도구 + ├── MSVC v143 - VS 2022 C++ ARM64 빌드 도구 + ├── Windows 10 SDK (10.0.22621.0) + ├── C++ ATL for v143 빌드 도구 (x86 및 x64) + ├── C++ ATL for v143 빌드 도구 (ARM64) + └── C++ MFC for v143 빌드 도구 (x86 및 x64) +``` + +#### Visual Studio Installer 명령줄 설치 + +```powershell +# Visual Studio 2022 Community Edition 설치 +winget install Microsoft.VisualStudio.2022.Community --silent --override "--add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.VC.Tools.ARM64 --add Microsoft.VisualStudio.Component.Windows10SDK.22621 --add Microsoft.VisualStudio.Component.VC.ATL --add Microsoft.VisualStudio.Component.VC.ATL.ARM64 --add Microsoft.VisualStudio.Component.VC.ATLMFC" +``` + +### 2.3 Windows SDK + +**버전**: 10.0.22621.0 이상 + +```powershell +# Windows SDK 설치 확인 +Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0" -Name ProductVersion +``` + +### 2.4 Git + +```powershell +# Git 설치 +winget install Git.Git + +# 설치 확인 +git --version +``` + +### 2.5 Windows Driver Kit (드라이버 빌드 시) + +```powershell +# WDK 다운로드 및 설치 +# https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk + +# 또는 winget 사용 +winget install Microsoft.WindowsDriverKit +``` + +--- + +## 3. 소스 코드 준비 + +### 3.1 저장소 클론 + +```bash +# HTTPS 사용 +git clone https://github.com/winsiderss/si.git systeminformer + +# SSH 사용 +git clone git@github.com:winsiderss/si.git systeminformer + +# 디렉토리 이동 +cd systeminformer +``` + +### 3.2 서브모듈 초기화 + +```bash +# 서브모듈 초기화 및 업데이트 +git submodule update --init --recursive +``` + +### 3.3 디렉토리 구조 확인 + +``` +systeminformer/ +├── SystemInformer.sln # 메인 솔루션 +├── KSystemInformer.sln # 드라이버 솔루션 +├── Plugins.sln # 플러그인 솔루션 +├── CMakeLists.txt # CMake 설정 +├── build/ # 빌드 스크립트 +│ ├── build_init.cmd +│ ├── build_debug.cmd +│ ├── build_release.cmd +│ └── ... +├── SystemInformer/ # 메인 애플리케이션 +├── phlib/ # 핵심 라이브러리 +├── phnt/ # NT 헤더 +├── kphlib/ # KPH 라이브러리 +├── KSystemInformer/ # 커널 드라이버 +├── plugins/ # 플러그인 +└── tools/ # 빌드 도구 +``` + +--- + +## 4. Visual Studio 빌드 + +### 4.1 솔루션 열기 + +``` +1. Visual Studio 2022 실행 +2. 파일 → 열기 → 프로젝트/솔루션 +3. SystemInformer.sln 선택 +``` + +### 4.2 빌드 구성 선택 + +``` +솔루션 구성: Release 또는 Debug +솔루션 플랫폼: x64 (권장) 또는 Win32, ARM64 +``` + +### 4.3 빌드 실행 + +``` +방법 1: 메뉴 +빌드 → 솔루션 빌드 (Ctrl+Shift+B) + +방법 2: 배치 빌드 +빌드 → 솔루션 일괄 빌드 +└── 원하는 구성 선택 후 빌드 +``` + +### 4.4 빌드 출력 경로 + +``` +빌드 출력 디렉토리: + +bin/ +├── Debug32/ # 32비트 디버그 +│ ├── SystemInformer.exe +│ ├── phlib.dll +│ └── plugins/ +├── Debug64/ # 64비트 디버그 +│ ├── SystemInformer.exe +│ ├── phlib.dll +│ └── plugins/ +├── Release32/ # 32비트 릴리스 +│ └── ... +├── Release64/ # 64비트 릴리스 +│ └── ... +└── ARM64/ # ARM64 + └── ... +``` + +--- + +## 5. 명령줄 빌드 + +### 5.1 MSBuild 사용 + +#### Developer Command Prompt 열기 + +``` +시작 메뉴 → Visual Studio 2022 → Developer Command Prompt for VS 2022 +``` + +#### 기본 빌드 + +```cmd +:: 64비트 릴리스 빌드 +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 + +:: 32비트 디버그 빌드 +msbuild SystemInformer.sln /p:Configuration=Debug /p:Platform=Win32 + +:: ARM64 릴리스 빌드 +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=ARM64 +``` + +#### 고급 옵션 + +```cmd +:: 병렬 빌드 (CPU 코어 수만큼) +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 /m + +:: 상세 로깅 +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 /v:detailed + +:: 클린 후 빌드 +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 /t:Clean,Build + +:: 특정 프로젝트만 빌드 +msbuild SystemInformer/SystemInformer.vcxproj /p:Configuration=Release /p:Platform=x64 +``` + +### 5.2 빌드 스크립트 사용 + +#### 디버그 빌드 + +```cmd +:: build 디렉토리로 이동 +cd build + +:: 디버그 빌드 실행 +build_debug.cmd +``` + +#### 릴리스 빌드 + +```cmd +cd build + +:: 릴리스 빌드 실행 +build_release.cmd +``` + +#### 전체 빌드 과정 + +```cmd +cd build + +:: 1. 초기화 +build_init.cmd + +:: 2. 써드파티 라이브러리 빌드 +build_thirdparty.cmd + +:: 3. 메인 빌드 +build_release.cmd + +:: 4. 플러그인 빌드 +msbuild ../Plugins.sln /p:Configuration=Release /p:Platform=x64 +``` + +--- + +## 6. CMake 빌드 + +### 6.1 CMake 설치 + +```powershell +# winget 사용 +winget install Kitware.CMake + +# 버전 확인 (3.30.0 이상 필요) +cmake --version +``` + +### 6.2 Ninja 설치 (선택) + +```powershell +winget install Ninja-build.Ninja +``` + +### 6.3 CMake 구성 + +```bash +# 빌드 디렉토리 생성 +mkdir cmake-build && cd cmake-build + +# Visual Studio 생성기 사용 +cmake .. -G "Visual Studio 17 2022" -A x64 + +# Ninja 생성기 사용 (빠른 빌드) +cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release +``` + +### 6.4 CMake 빌드 옵션 + +```bash +# 옵션 설명 +cmake .. -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ # 빌드 타입 (Debug/Release) + -DSI_WITH_CORE=ON \ # 코어 컴포넌트 빌드 + -DSI_WITH_PLUGINS=ON \ # 플러그인 빌드 + -DSI_WITH_KERNEL=OFF # 커널 드라이버 빌드 (기본 OFF) +``` + +### 6.5 CMake 빌드 실행 + +```bash +# 빌드 실행 +cmake --build . --config Release + +# 병렬 빌드 +cmake --build . --config Release --parallel + +# 특정 타겟만 빌드 +cmake --build . --config Release --target SystemInformer +``` + +--- + +## 7. 커널 드라이버 빌드 + +### 7.1 사전 요구사항 + +``` +필수 요소: +☑ Windows Driver Kit (WDK) 10.0.22621 이상 +☑ Visual Studio 2022 WDK 확장 +☑ 테스트 서명 모드 활성화 (개발 시) +☑ EV 코드 서명 인증서 (릴리스 배포 시) +``` + +### 7.2 WDK 설치 확인 + +```powershell +# WDK 설치 확인 +Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots" -Name KitsRoot10 +``` + +### 7.3 드라이버 솔루션 빌드 + +```cmd +:: Visual Studio에서 +1. KSystemInformer.sln 열기 +2. 구성: Release, 플랫폼: x64 선택 +3. 솔루션 빌드 + +:: 명령줄에서 +msbuild KSystemInformer.sln /p:Configuration=Release /p:Platform=x64 +``` + +### 7.4 테스트 서명 모드 활성화 + +```cmd +:: 관리자 권한 명령 프롬프트에서 + +:: 테스트 서명 모드 활성화 +bcdedit /set testsigning on + +:: 재부팅 필요 +shutdown /r /t 0 +``` + +### 7.5 드라이버 서명 (개발용) + +```cmd +:: 테스트 인증서 생성 +makecert -r -pe -ss PrivateCertStore -n "CN=SystemInformer Test" SystemInformer.cer + +:: 드라이버 서명 +signtool sign /s PrivateCertStore /n "SystemInformer Test" /t http://timestamp.digicert.com KSystemInformer.sys +``` + +### 7.6 프로덕션 서명 (EV 인증서) + +```cmd +:: EV 코드 서명 인증서로 서명 +signtool sign /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 /sha1 <인증서_지문> KSystemInformer.sys + +:: WHQL 서명 (Microsoft 제출 후) +``` + +--- + +## 8. 플러그인 빌드 + +### 8.1 플러그인 솔루션 빌드 + +```cmd +:: Visual Studio에서 +1. Plugins.sln 열기 +2. 구성 선택 후 빌드 + +:: 명령줄에서 +msbuild Plugins.sln /p:Configuration=Release /p:Platform=x64 +``` + +### 8.2 개별 플러그인 빌드 + +```cmd +:: 특정 플러그인만 빌드 +msbuild plugins/ExtendedTools/ExtendedTools.vcxproj /p:Configuration=Release /p:Platform=x64 +``` + +### 8.3 플러그인 출력 위치 + +``` +bin/Release64/plugins/ +├── DotNetTools.dll +├── ExtendedTools.dll +├── HardwareDevices.dll +├── NetworkTools.dll +├── ExtendedServices.dll +├── ExtendedNotifications.dll +├── ToolStatus.dll +├── OnlineChecks.dll +├── Updater.dll +├── UserNotes.dll +└── WindowExplorer.dll +``` + +--- + +## 9. 빌드 구성 파일 + +### 9.1 Directory.Build.props + +**위치**: 프로젝트 루트 + +```xml + + + + + $(SolutionDir)bin\$(Configuration)$(Platform)\ + $(SolutionDir)obj\$(Configuration)$(Platform)\$(ProjectName)\ + + + 10.0 + + + v143 + + +``` + +### 9.2 Common.User.props + +**위치**: `build/Common.User.props` + +```xml + + + + + true + Level3 + true + true + stdcplatest + true + + + + + UseLinkTimeCodeGeneration + true + true + + + + Disabled + MultiThreadedDebugDLL + + + + MaxSpeed + MultiThreadedDLL + true + true + + +``` + +### 9.3 Common.Kernel.props + +**위치**: `build/Common.Kernel.props` + +```xml + + + + Driver + WDM + Windows10 + <_NT_TARGET_VERSION>0x0A00 + + + + Spectre + false + + +``` + +--- + +## 10. 디버깅 설정 + +### 10.1 Visual Studio 디버깅 + +#### 사용자 모드 디버깅 + +``` +프로젝트 속성 → 디버깅 +├── 명령: $(OutDir)SystemInformer.exe +├── 작업 디렉토리: $(OutDir) +└── 디버거 유형: 자동 +``` + +#### 기호 서버 설정 + +``` +도구 → 옵션 → 디버깅 → 기호 +├── Microsoft 기호 서버 활성화 +└── 캐시 위치: C:\Symbols +``` + +### 10.2 커널 모드 디버깅 + +#### WinDbg 설정 + +```cmd +:: 대상 컴퓨터에서 디버그 모드 활성화 +bcdedit /debug on +bcdedit /dbgsettings net hostip:192.168.1.100 port:50000 + +:: 재부팅 +shutdown /r /t 0 +``` + +#### WinDbg 연결 + +``` +File → Kernel Debug → Net +├── Port Number: 50000 +├── Key: <자동 생성된 키> +└── Target: <대상 IP> +``` + +### 10.3 디버그 출력 + +#### 코드에서 디버그 출력 + +```c +// phlib 디버그 매크로 +dprintf("Debug message: %d\n", value); + +// 커널 모드 +KdPrint(("Kernel debug: %d\n", value)); +DbgPrintEx(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL, "Info: %d\n", value); +``` + +#### DebugView로 출력 확인 + +``` +1. Sysinternals DebugView 실행 +2. Capture → Capture Global Win32 활성화 +3. 애플리케이션 실행 +``` + +--- + +## 11. CI/CD 설정 + +### 11.1 GitHub Actions + +**파일 위치**: `.github/workflows/` + +```yaml +# .github/workflows/build.yml +name: Build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v1.1 + + - name: Build x64 Release + run: msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 /m + + - name: Build x86 Release + run: msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=Win32 /m + + - name: Build Plugins + run: msbuild Plugins.sln /p:Configuration=Release /p:Platform=x64 /m + + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: SystemInformer-x64 + path: bin/Release64/ +``` + +### 11.2 로컬 자동 빌드 스크립트 + +**파일**: `build/build_all.cmd` + +```cmd +@echo off +setlocal enabledelayedexpansion + +echo ======================================== +echo System Informer Full Build Script +echo ======================================== + +:: Visual Studio 경로 찾기 +set VSWHERE="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" +for /f "usebackq tokens=*" %%i in (`%VSWHERE% -latest -property installationPath`) do set VSINSTALL=%%i + +:: Developer Command Prompt 환경 설정 +call "%VSINSTALL%\Common7\Tools\VsDevCmd.bat" -arch=amd64 + +:: 빌드 시작 +echo. +echo [1/4] Building x64 Release... +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=x64 /m /v:minimal +if errorlevel 1 goto :error + +echo. +echo [2/4] Building x86 Release... +msbuild SystemInformer.sln /p:Configuration=Release /p:Platform=Win32 /m /v:minimal +if errorlevel 1 goto :error + +echo. +echo [3/4] Building Plugins... +msbuild Plugins.sln /p:Configuration=Release /p:Platform=x64 /m /v:minimal +if errorlevel 1 goto :error + +echo. +echo [4/4] Build completed successfully! +goto :end + +:error +echo. +echo Build failed with error code %errorlevel% +exit /b %errorlevel% + +:end +endlocal +``` + +--- + +## 12. 문제 해결 + +### 12.1 일반적인 빌드 오류 + +#### 오류: SDK를 찾을 수 없음 + +``` +해결 방법: +1. Visual Studio Installer 실행 +2. 수정 → 개별 구성 요소 +3. Windows 10 SDK (10.0.22621.0) 선택 후 설치 +``` + +#### 오류: ATL/MFC 헤더를 찾을 수 없음 + +``` +해결 방법: +1. Visual Studio Installer 실행 +2. C++ ATL for v143 build tools 설치 +3. C++ MFC for v143 build tools 설치 +``` + +#### 오류: ARM64 빌드 실패 + +``` +해결 방법: +1. Visual Studio Installer 실행 +2. MSVC v143 - VS 2022 C++ ARM64 build tools 설치 +3. Windows SDK ARM64 구성 요소 설치 +``` + +### 12.2 드라이버 빌드 오류 + +#### 오류: WDK를 찾을 수 없음 + +``` +해결 방법: +1. WDK 설치 확인 +2. Visual Studio WDK 확장 설치 +3. Visual Studio 재시작 +``` + +#### 오류: 서명 실패 + +``` +해결 방법: +1. 테스트 서명 모드 활성화: bcdedit /set testsigning on +2. 재부팅 +3. 또는 프로덕션용 EV 인증서 사용 +``` + +### 12.3 링크 오류 + +#### 오류: 해결되지 않은 외부 기호 + +``` +확인 사항: +1. 모든 의존 프로젝트가 빌드되었는지 확인 +2. 라이브러리 경로 확인 +3. 플랫폼/구성 일치 확인 +``` + +--- + +## 13. 빌드 최적화 + +### 13.1 빌드 시간 단축 + +```xml + + + + true + + + true + + + Use + +``` + +### 13.2 출력 크기 최적화 + +```xml + + + + true + + + true + + + true + + + UseLinkTimeCodeGeneration + +``` + +--- + +## 14. 빌드 출력물 + +### 14.1 릴리스 빌드 출력 + +``` +bin/Release64/ +├── SystemInformer.exe # 메인 실행 파일 +├── phlib.dll # 핵심 라이브러리 +├── peview.exe # PE 뷰어 +├── kphlib.dll # KPH 라이브러리 +├── plugins/ # 플러그인 폴더 +│ ├── DotNetTools.dll +│ ├── ExtendedTools.dll +│ ├── HardwareDevices.dll +│ ├── NetworkTools.dll +│ ├── ExtendedServices.dll +│ ├── ExtendedNotifications.dll +│ ├── ToolStatus.dll +│ ├── OnlineChecks.dll +│ ├── Updater.dll +│ ├── UserNotes.dll +│ └── WindowExplorer.dll +├── SystemInformer.pdb # 디버그 심볼 +└── phlib.pdb +``` + +### 14.2 드라이버 빌드 출력 + +``` +bin/Release64/ +├── KSystemInformer.sys # 커널 드라이버 +├── KSystemInformer.pdb # 드라이버 심볼 +├── KSystemInformer.inf # 드라이버 설치 파일 +└── ksidll.dll # 드라이버 DLL +``` + +### 14.3 배포 패키지 생성 + +```cmd +:: MSIX 패키지 빌드 +cd build +build_msix.cmd + +:: 출력 +setup/SystemInformer-x64.msix +``` + +--- + +## 15. 빌드 환경 체크리스트 + +``` +빌드 전 확인 사항: + +□ Visual Studio 2022 설치됨 +□ Windows 10 SDK (10.0.22621.0) 설치됨 +□ C++ ATL/MFC 구성 요소 설치됨 +□ Git 설치됨 +□ 소스 코드 클론됨 +□ 서브모듈 초기화됨 + +드라이버 빌드 시 추가 확인: +□ WDK 설치됨 +□ 테스트 서명 모드 활성화됨 (개발용) +□ EV 코드 서명 인증서 준비됨 (배포용) + +선택적 확인 사항: +□ CMake 3.30.0+ 설치됨 +□ Ninja 설치됨 +□ WinDbg 설치됨 (디버깅용) +``` diff --git "a/docs/technical/05_\355\225\265\354\213\254\352\270\260\354\210\240_\352\265\254\355\230\204\354\203\201\354\204\270.md" "b/docs/technical/05_\355\225\265\354\213\254\352\270\260\354\210\240_\352\265\254\355\230\204\354\203\201\354\204\270.md" new file mode 100644 index 000000000000..e2e85a590be3 --- /dev/null +++ "b/docs/technical/05_\355\225\265\354\213\254\352\270\260\354\210\240_\352\265\254\355\230\204\354\203\201\354\204\270.md" @@ -0,0 +1,897 @@ +# System Informer 핵심기술 구현 상세 + +## 문서 정보 +- **프로젝트명**: System Informer +- **문서 버전**: 1.0 +- **작성일**: 2026-01-25 + +--- + +## 1. Native NT API 활용 + +### 1.1 개요 + +System Informer는 Windows의 비공개 Native NT API를 광범위하게 활용하여 일반 Win32 API로는 접근할 수 없는 시스템 정보를 수집합니다. + +### 1.2 핵심 구현 + +**파일 위치**: `phlib/native.c`, `phnt/*.h` + +```c +// 프로세스 정보 조회 (phlib/native.c:PhEnumProcesses) +NTSTATUS PhEnumProcesses( + _Out_ PVOID *Processes +) +{ + NTSTATUS status; + PVOID buffer; + ULONG bufferSize = 0x8000; // 초기 버퍼 크기 + + // 버퍼 크기가 충분할 때까지 반복 + do { + buffer = PhAllocate(bufferSize); + status = NtQuerySystemInformation( + SystemProcessInformation, + buffer, + bufferSize, + &bufferSize + ); + + if (status == STATUS_INFO_LENGTH_MISMATCH) { + PhFree(buffer); + bufferSize *= 2; // 버퍼 크기 증가 + } + } while (status == STATUS_INFO_LENGTH_MISMATCH); + + *Processes = buffer; + return status; +} +``` + +### 1.3 주요 시스템 정보 클래스 + +| 클래스 | 용도 | 구현 위치 | +|--------|------|-----------| +| SystemProcessInformation | 프로세스 목록 | `procprv.c` | +| SystemHandleInformation | 핸들 목록 | `hndlprv.c` | +| SystemModuleInformation | 커널 모듈 | `modprv.c` | +| SystemPerformanceInformation | 성능 정보 | `sysinfo.c` | + +--- + +## 2. 커널 드라이버 통신 + +### 2.1 통신 아키텍처 + +``` +User Mode Kernel Mode +┌──────────────┐ ┌──────────────────┐ +│ kphlib.dll │ DeviceIoControl │ KSystemInformer │ +│ │────────────────►│ .sys │ +│ KphConnect() │ │ KphDispatch() │ +└──────────────┘ └──────────────────┘ +``` + +### 2.2 드라이버 연결 + +**파일**: `kphlib/kphcomms.c` + +```c +NTSTATUS KphConnect( + _Out_ PKPH_COMMS_HANDLE Handle +) +{ + NTSTATUS status; + HANDLE deviceHandle; + UNICODE_STRING deviceName; + OBJECT_ATTRIBUTES objectAttributes; + IO_STATUS_BLOCK ioStatusBlock; + + RtlInitUnicodeString(&deviceName, KPH_DEVICE_NAME); + InitializeObjectAttributes(&objectAttributes, &deviceName, + OBJ_CASE_INSENSITIVE, NULL, NULL); + + status = NtOpenFile( + &deviceHandle, + FILE_READ_DATA | FILE_WRITE_DATA, + &objectAttributes, + &ioStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0 + ); + + if (NT_SUCCESS(status)) { + Handle->DeviceHandle = deviceHandle; + } + + return status; +} +``` + +### 2.3 메시지 기반 통신 + +**파일**: `KSystemInformer/comms.c` + +```c +// 요청 처리 디스패치 +NTSTATUS KphDispatchDeviceControl( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp +) +{ + PIO_STACK_LOCATION irpStack; + ULONG ioControlCode; + NTSTATUS status; + + irpStack = IoGetCurrentIrpStackLocation(Irp); + ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; + + switch (ioControlCode) { + case KPH_QUERYPROCESSINFO: + status = KphQueryProcessInfo(Irp); + break; + case KPH_OPENPROCESS: + status = KphOpenProcess(Irp); + break; + case KPH_TERMINATEPROCESS: + status = KphTerminateProcess(Irp); + break; + // ... 기타 핸들러 + } + + return status; +} +``` + +--- + +## 3. 프로세스 모니터링 + +### 3.1 프로세스 공급자 패턴 + +**파일**: `SystemInformer/procprv.c` + +```c +// 프로세스 공급자 메인 루프 +VOID PhProcessProviderUpdate(VOID) +{ + PSYSTEM_PROCESS_INFORMATION processes; + PSYSTEM_PROCESS_INFORMATION process; + + // 1. 시스템에서 프로세스 정보 수집 + PhEnumProcesses(&processes); + + // 2. 각 프로세스 처리 + process = PH_FIRST_PROCESS(processes); + while (process) { + PPH_PROCESS_ITEM processItem; + + // 기존 프로세스인지 확인 + processItem = PhReferenceProcessItem(process->UniqueProcessId); + + if (processItem) { + // 기존 프로세스 업데이트 + PhUpdateProcessItem(processItem, process); + PhDereferenceObject(processItem); + } else { + // 새 프로세스 추가 + processItem = PhCreateProcessItem(process); + PhAddProcessItem(processItem); + + // 새 프로세스 이벤트 발생 + PhInvokeCallback(&PhProcessAddedEvent, processItem); + } + + process = PH_NEXT_PROCESS(process); + } + + // 3. 종료된 프로세스 정리 + PhRemoveTerminatedProcesses(); + + PhFree(processes); +} +``` + +### 3.2 CPU 사용률 계산 + +```c +// CPU 델타 계산 (procprv.c) +VOID PhCalculateProcessCpuUsage( + _Inout_ PPH_PROCESS_ITEM ProcessItem, + _In_ PSYSTEM_PROCESS_INFORMATION Process +) +{ + ULONG64 kernelDelta, userDelta, totalDelta; + + // 커널/사용자 시간 델타 계산 + kernelDelta = Process->KernelTime.QuadPart - + ProcessItem->KernelTime.QuadPart; + userDelta = Process->UserTime.QuadPart - + ProcessItem->UserTime.QuadPart; + totalDelta = kernelDelta + userDelta; + + // CPU 사용률 계산 (시스템 전체 시간 대비) + ProcessItem->CpuUsage = (FLOAT)totalDelta / + PhCpuTotalCycleDelta / + PhSystemBasicInformation.NumberOfProcessors; + + // 값 저장 + ProcessItem->KernelTime.QuadPart = Process->KernelTime.QuadPart; + ProcessItem->UserTime.QuadPart = Process->UserTime.QuadPart; +} +``` + +--- + +## 4. 메모리 관리 시스템 + +### 4.1 참조 카운팅 객체 + +**파일**: `phlib/ref.c` + +```c +// 객체 헤더 구조 +typedef struct _PH_OBJECT_HEADER { + union { + struct { + USHORT TypeIndex; + UCHAR Flags; + UCHAR Reserved; + LONG RefCount; + }; + ULONG_PTR Alignment; + }; +} PH_OBJECT_HEADER; + +// 참조 증가 +VOID PhReferenceObject( + _In_ PVOID Object +) +{ + PPH_OBJECT_HEADER header = PhObjectToObjectHeader(Object); + InterlockedIncrement(&header->RefCount); +} + +// 참조 감소 (0이면 해제) +VOID PhDereferenceObject( + _In_ PVOID Object +) +{ + PPH_OBJECT_HEADER header = PhObjectToObjectHeader(Object); + + if (InterlockedDecrement(&header->RefCount) == 0) { + PhpFreeObject(Object); + } +} +``` + +### 4.2 문자열 관리 + +**파일**: `phlib/basesup.c` + +```c +// 문자열 생성 +PPH_STRING PhCreateString( + _In_ PWSTR Buffer +) +{ + return PhCreateStringEx(Buffer, wcslen(Buffer) * sizeof(WCHAR)); +} + +PPH_STRING PhCreateStringEx( + _In_opt_ PWCHAR Buffer, + _In_ SIZE_T Length +) +{ + PPH_STRING string; + + string = PhCreateObject( + FIELD_OFFSET(PH_STRING, Buffer) + Length + sizeof(UNICODE_NULL), + PhStringType + ); + + string->Length = Length; + if (Buffer) { + memcpy(string->Buffer, Buffer, Length); + } + string->Buffer[Length / sizeof(WCHAR)] = UNICODE_NULL; + + return string; +} +``` + +--- + +## 5. GUI 트리뷰 컨트롤 + +### 5.1 TreeNew 컨트롤 + +**파일**: `phlib/treenew.c` + +고성능 가상화된 트리/리스트 컨트롤로, 수천 개의 항목을 효율적으로 표시합니다. + +```c +// 컨트롤 생성 +HWND PhCreateTreeNewControl( + _In_ HWND ParentWindow, + _In_ INT_PTR Id +) +{ + return CreateWindow( + PH_TREENEW_CLASSNAME, + NULL, + WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_TABSTOP, + 0, 0, 0, 0, + ParentWindow, + (HMENU)Id, + PhInstanceHandle, + NULL + ); +} + +// 컬럼 추가 +VOID PhAddTreeNewColumn( + _In_ HWND TreeNewHandle, + _In_ ULONG Id, + _In_ BOOLEAN Visible, + _In_ PWSTR Text, + _In_ ULONG Width +) +{ + PH_TREENEW_COLUMN column; + + memset(&column, 0, sizeof(column)); + column.Id = Id; + column.Visible = Visible; + column.Text = Text; + column.Width = Width; + + TreeNew_AddColumn(TreeNewHandle, &column); +} +``` + +### 5.2 가상화 렌더링 + +```c +// 노드 콜백 (필요할 때만 데이터 요청) +BOOLEAN ProcessTreeNewCallback( + _In_ HWND hwnd, + _In_ PH_TREENEW_MESSAGE Message, + _In_opt_ PVOID Parameter1, + _In_opt_ PVOID Parameter2, + _In_opt_ PVOID Context +) +{ + switch (Message) { + case TreeNewGetChildren: + // 자식 노드 반환 (트리 구조) + return GetProcessChildren(Parameter1, Parameter2); + + case TreeNewGetCellText: + // 셀 텍스트 반환 + return GetProcessCellText(Parameter1, Parameter2); + + case TreeNewSortChanged: + // 정렬 변경 + SortProcessList(); + return TRUE; + } + + return FALSE; +} +``` + +--- + +## 6. 플러그인 시스템 + +### 6.1 플러그인 인터페이스 + +**파일**: `SystemInformer/include/phplug.h` + +```c +// 플러그인 정보 구조체 +typedef struct _PH_PLUGIN_INFORMATION { + PWSTR Name; + PWSTR Author; + PWSTR Description; + PWSTR Url; + ULONG Version; + ULONG InterfaceVersion; +} PH_PLUGIN_INFORMATION; + +// 플러그인 필수 내보내기 함수 +typedef BOOLEAN (NTAPI *PPH_PLUGIN_LOAD)( + _In_ PPH_PLUGIN Plugin, + _In_ ULONG SystemServiceNumber +); +``` + +### 6.2 플러그인 로딩 + +**파일**: `SystemInformer/plugin.c` + +```c +BOOLEAN PhLoadPlugin( + _In_ PWSTR FileName +) +{ + HMODULE moduleHandle; + PPH_PLUGIN_LOAD loadFunction; + PPH_PLUGIN plugin; + + // DLL 로드 + moduleHandle = LoadLibrary(FileName); + if (!moduleHandle) + return FALSE; + + // 초기화 함수 찾기 + loadFunction = (PPH_PLUGIN_LOAD)GetProcAddress( + moduleHandle, "PhPluginLoad"); + + if (!loadFunction) { + FreeLibrary(moduleHandle); + return FALSE; + } + + // 플러그인 객체 생성 + plugin = PhCreatePlugin(FileName, moduleHandle); + + // 플러그인 초기화 호출 + if (!loadFunction(plugin, PhSystemServiceNumber)) { + PhDestroyPlugin(plugin); + return FALSE; + } + + // 플러그인 목록에 추가 + PhAddPlugin(plugin); + + return TRUE; +} +``` + +### 6.3 콜백 등록 + +```c +// 플러그인에서 콜백 등록 +VOID MyPluginInitialize( + _In_ PPH_PLUGIN Plugin +) +{ + // 프로세스 추가 이벤트 구독 + PhRegisterCallback( + &PhProcessAddedEvent, + OnProcessAdded, + NULL, + &ProcessAddedCallbackRegistration + ); + + // 메뉴 항목 추가 + PhRegisterCallback( + &PhMenuShowingEvent, + OnMenuShowing, + NULL, + &MenuShowingCallbackRegistration + ); +} +``` + +--- + +## 7. ETW 이벤트 추적 + +### 7.1 ETW 세션 관리 + +**파일**: `plugins/ExtendedTools/etwmon.c` + +```c +// ETW 세션 시작 +NTSTATUS EtStartEtwSession(VOID) +{ + NTSTATUS status; + TRACEHANDLE sessionHandle; + EVENT_TRACE_PROPERTIES properties; + + memset(&properties, 0, sizeof(properties)); + properties.Wnode.BufferSize = sizeof(properties); + properties.Wnode.Flags = WNODE_FLAG_TRACED_GUID; + properties.LogFileMode = EVENT_TRACE_REAL_TIME_MODE; + properties.MinimumBuffers = 4; + properties.MaximumBuffers = 64; + properties.BufferSize = 64; // KB + + status = StartTrace( + &sessionHandle, + L"SystemInformerEtwSession", + &properties + ); + + if (NT_SUCCESS(status)) { + EtSessionHandle = sessionHandle; + + // 공급자 활성화 + EnableTraceEx2( + sessionHandle, + &DiskIoGuid, + EVENT_CONTROL_CODE_ENABLE_PROVIDER, + TRACE_LEVEL_INFORMATION, + 0, 0, 0, NULL + ); + } + + return status; +} +``` + +### 7.2 이벤트 처리 + +```c +// 이벤트 콜백 +VOID WINAPI EtEtwEventCallback( + _In_ PEVENT_RECORD EventRecord +) +{ + if (IsEqualGUID(&EventRecord->EventHeader.ProviderId, &DiskIoGuid)) { + // 디스크 I/O 이벤트 처리 + ProcessDiskIoEvent(EventRecord); + } + else if (IsEqualGUID(&EventRecord->EventHeader.ProviderId, &TcpIpGuid)) { + // 네트워크 이벤트 처리 + ProcessNetworkEvent(EventRecord); + } +} + +VOID ProcessDiskIoEvent( + _In_ PEVENT_RECORD EventRecord +) +{ + PDISK_IO_EVENT data = (PDISK_IO_EVENT)EventRecord->UserData; + ULONG processId = EventRecord->EventHeader.ProcessId; + + // 프로세스별 I/O 통계 업데이트 + PPH_PROCESS_ITEM processItem = PhReferenceProcessItem( + UlongToHandle(processId)); + + if (processItem) { + InterlockedAdd64(&processItem->DiskReadBytes, data->TransferSize); + PhDereferenceObject(processItem); + } +} +``` + +--- + +## 8. 심볼 해석 시스템 + +### 8.1 심볼 공급자 + +**파일**: `phlib/symprv.c` + +```c +// 심볼 초기화 +BOOLEAN PhSymbolProviderInitialize(VOID) +{ + // DbgHelp 초기화 + SymSetOptions( + SYMOPT_UNDNAME | + SYMOPT_DEFERRED_LOADS | + SYMOPT_LOAD_LINES + ); + + // 심볼 경로 설정 + SymSetSearchPath( + NtCurrentProcess(), + L"srv*C:\\Symbols*https://msdl.microsoft.com/download/symbols" + ); + + return SymInitialize(NtCurrentProcess(), NULL, FALSE); +} +``` + +### 8.2 주소 해석 + +```c +// 주소에서 심볼 이름 가져오기 +PPH_STRING PhGetSymbolFromAddress( + _In_ HANDLE ProcessHandle, + _In_ ULONG64 Address +) +{ + SYMBOL_INFO_PACKAGE symbolInfo; + DWORD64 displacement; + + symbolInfo.si.SizeOfStruct = sizeof(SYMBOL_INFO); + symbolInfo.si.MaxNameLen = MAX_SYM_NAME; + + if (SymFromAddr(ProcessHandle, Address, &displacement, &symbolInfo.si)) { + // 모듈!함수+오프셋 형식 + return PhFormatString( + L"%s!%S+0x%I64x", + ModuleName, + symbolInfo.si.Name, + displacement + ); + } + + return NULL; +} +``` + +--- + +## 9. 보안 및 검증 + +### 9.1 서명 검증 + +**파일**: `phlib/verify.c` + +```c +// Authenticode 서명 검증 +VERIFY_RESULT PhVerifyFile( + _In_ PWSTR FileName, + _Out_opt_ PPH_STRING *SignerName +) +{ + WINTRUST_DATA trustData; + WINTRUST_FILE_INFO fileInfo; + GUID actionGuid = WINTRUST_ACTION_GENERIC_VERIFY_V2; + LONG status; + + memset(&fileInfo, 0, sizeof(fileInfo)); + fileInfo.cbStruct = sizeof(fileInfo); + fileInfo.pcwszFilePath = FileName; + + memset(&trustData, 0, sizeof(trustData)); + trustData.cbStruct = sizeof(trustData); + trustData.dwUIChoice = WTD_UI_NONE; + trustData.dwUnionChoice = WTD_CHOICE_FILE; + trustData.pFile = &fileInfo; + + status = WinVerifyTrust(NULL, &actionGuid, &trustData); + + if (status == ERROR_SUCCESS) { + if (SignerName) { + *SignerName = PhGetSignerName(&trustData); + } + return VrTrusted; + } + + return VrUntrusted; +} +``` + +### 9.2 드라이버 클라이언트 검증 + +**파일**: `KSystemInformer/verify.c` + +```c +// 클라이언트 프로세스 검증 +NTSTATUS KphVerifyClient( + _In_ PEPROCESS Process +) +{ + NTSTATUS status; + PUNICODE_STRING imageName; + UCHAR hash[32]; + + // 프로세스 이미지 경로 가져오기 + status = SeLocateProcessImageName(Process, &imageName); + if (!NT_SUCCESS(status)) + return status; + + // 이미지 해시 계산 + status = KphHashFile(imageName, hash); + if (!NT_SUCCESS(status)) + return status; + + // 알려진 해시와 비교 + if (RtlEqualMemory(hash, KphTrustedHash, sizeof(hash))) { + return STATUS_SUCCESS; + } + + return STATUS_ACCESS_DENIED; +} +``` + +--- + +## 10. 동적 데이터 시스템 + +### 10.1 Windows 버전별 오프셋 관리 + +**파일**: `kphlib/kphdyn.c`, `kphlib/kphdyn.xml` + +```c +// 동적 데이터 로드 +NTSTATUS KphLoadDynamicData(VOID) +{ + NTSTATUS status; + RTL_OSVERSIONINFOEXW versionInfo; + PKPH_DYN_DATA dynData; + + // 현재 Windows 버전 가져오기 + RtlGetVersion(&versionInfo); + + // 해당 버전의 동적 데이터 찾기 + dynData = KphFindDynamicData( + versionInfo.dwBuildNumber, + versionInfo.dwMajorVersion, + versionInfo.dwMinorVersion + ); + + if (!dynData) { + return STATUS_NOT_SUPPORTED; + } + + // 오프셋 적용 + KphDynEprocessUniqueProcessId = dynData->EprocessUniqueProcessId; + KphDynEprocessToken = dynData->EprocessToken; + KphDynEprocessImageFileName = dynData->EprocessImageFileName; + // ... + + return STATUS_SUCCESS; +} +``` + +### 10.2 XML 데이터 구조 + +```xml + + + + + + 0x440 + 0x448 + 0x4b8 + 0x5a8 + 0x550 + + + 0x478 + 0x4a0 + + + + +``` + +--- + +## 11. 동기화 기법 + +### 11.1 Queued Lock (경량 잠금) + +**파일**: `phlib/queuedlock.c` + +```c +// 큐 기반 스핀락 - 공정하고 빠름 +typedef struct _PH_QUEUED_LOCK { + ULONG_PTR Value; +} PH_QUEUED_LOCK; + +VOID PhAcquireQueuedLockExclusive( + _Inout_ PPH_QUEUED_LOCK Lock +) +{ + ULONG_PTR value; + ULONG_PTR newValue; + ULONG spinCount; + + spinCount = PhQueuedLockSpinCount; + + while (TRUE) { + value = Lock->Value; + + if (!(value & PH_QUEUED_LOCK_OWNED)) { + newValue = value | PH_QUEUED_LOCK_OWNED; + if (InterlockedCompareExchangePointer( + &Lock->Value, newValue, value) == value) { + return; // 잠금 획득 성공 + } + } + + if (spinCount-- == 0) { + // 대기 큐에 추가 + PhpBlockOnQueuedLock(Lock, value); + spinCount = PhQueuedLockSpinCount; + } + + YieldProcessor(); + } +} +``` + +### 11.2 Rundown Protection + +```c +// 객체가 사용 중일 때 안전하게 해제 대기 +BOOLEAN PhAcquireRundownProtection( + _Inout_ PPH_RUNDOWN_PROTECT Protection +) +{ + ULONG_PTR value; + ULONG_PTR newValue; + + value = Protection->Value; + + if (value & PH_RUNDOWN_ACTIVE) { + return FALSE; // 이미 rundown 중 + } + + newValue = value + PH_RUNDOWN_REF_INC; + + return InterlockedCompareExchangePointer( + &Protection->Value, newValue, value) == value; +} +``` + +--- + +## 12. 성능 최적화 기법 + +### 12.1 지연 로딩 + +```c +// 필요할 때만 심볼 로드 +VOID PhLoadSymbolsDeferred( + _In_ PPH_PROCESS_ITEM ProcessItem +) +{ + if (!ProcessItem->SymbolsLoaded) { + // 백그라운드 스레드에서 심볼 로드 + PhQueueItemWorkQueue( + PhGetGlobalWorkQueue(), + LoadSymbolsWorkItem, + ProcessItem + ); + } +} +``` + +### 12.2 캐싱 + +```c +// 해시 테이블 기반 프로세스 캐시 +static PH_HASHTABLE ProcessHashtable; + +PPH_PROCESS_ITEM PhReferenceProcessItem( + _In_ HANDLE ProcessId +) +{ + PPH_PROCESS_ITEM *entry; + + PhAcquireQueuedLockShared(&ProcessHashtableLock); + + entry = PhFindEntryHashtable( + &ProcessHashtable, + &ProcessId + ); + + if (entry) { + PhReferenceObject(*entry); + PhReleaseQueuedLockShared(&ProcessHashtableLock); + return *entry; + } + + PhReleaseQueuedLockShared(&ProcessHashtableLock); + return NULL; +} +``` + +--- + +## 요약 + +System Informer의 핵심 기술들: + +| 기술 | 목적 | 구현 위치 | +|------|------|-----------| +| Native NT API | 저수준 시스템 접근 | `phlib/native.c` | +| 커널 드라이버 | 권한 상승, 보호 우회 | `KSystemInformer/` | +| 참조 카운팅 | 메모리 관리 | `phlib/ref.c` | +| TreeNew 컨트롤 | 고성능 UI | `phlib/treenew.c` | +| 플러그인 시스템 | 확장성 | `SystemInformer/plugin.c` | +| ETW 추적 | 이벤트 모니터링 | `plugins/ExtendedTools/` | +| 심볼 해석 | 디버그 정보 | `phlib/symprv.c` | +| 동적 데이터 | 버전 호환성 | `kphlib/kphdyn.c` |