악성코드와 백신/악성코드 개발일지

[악성코드 개발](5)[Windows process & thread]

황올뱀 2026. 3. 2. 13:58

windows process

윈도우에서 실행되는 프로그램 또는 응용 프로그램
-> 프로세스 간 기본적으로는 자원 격리

 

각각의 프로세스에는 ID가 있고 (PID)
프로세스 내에서 스레드는 유일한 ID를 갖는다 (TID)

 

프로세스 메모리

페이지 단위로 운영체제가 할당

  • private memory: 다른 프로세스와 공유 못함
  • mapped memory: 프로세스간 공유 가능
    다른 프로세스에 의해 변경되지 않음 (read only)
  • image memory: 실행파일의 코드, 데이터 포함
    주로 dll파일과 관련

 

프로세스 환경 블록 (PEB)

사용중인 프로세스에 대한 정보를 담은 구조체
-> 운영체제가 실행중인 프로세스 정보를 저장할 때 사용
-> user 메모리 영역에 저장됨

 

핵심 필드

  • BeingDebugged: 이 프로세스가 디버깅 당하고 있나
    -> 디버깅을 탐지해 anti-debugging 기능을 구현할수도?
  • Ldr: 로드된 dll 목록
    -> 내가 로드한 dll을 숨길수도?
    -> kernel32.dll같은 dll의 주소를 찾을수도?
  • ProcessParameters: 전달된 인자, 환경변수, 실행 파일 경로 저장
  • AtlThunkSListPtr: thunking 함수와의 연결 포인터 저장
  • PostProcessInitRoutine: 모든 스레드의 TLS 초기화 후 운영체제에서 호출하는 함수의 포인터 저장
  • SessionID
  • ImageBaseAddress: Image base의 주소

 

스레드

프로세스 내에서 독립적으로 실행될 수 있는 실행 단위

  • 같은 프로세스 내의 자원을 공유
    코드
    데이터
  • 전역변수나 힙을 통해서 직접 통신 가능
    프로세스간 통신은 IPC를 이용해야 함...
  • TLS: 스레드 별 고유의 데이터를 저장하는 공간스레드 환경 블록 (TEB)스레드 정보를 담은 구조체
  • TlsSlots: 스레드 별 데이터를 저장하는 장소
  • TlsExpansionSlots: 추가 TLS Slot
    dll이 사용하게 예약됨
  • 참고) TEB 안에는 PEB의 주소가 저장되어 있다
    x86: FS:[0x30]
    x64: FS:[0x60]

프로세스 & 스레드 핸들

윈도우가 리소스 식별, 제어하기 위한 값
    프로세스마다 고유의 값이 있음

 

OpenProcess(권한, 상속핸들, PID)
OpenThread(권한, 상속핸들, TID)

 

  • 핸들 테이블
    프로세스마다 가지고 있는 핸들 값과 커널 객체를 연결하는 테이블
    -> OpenProcess로 가져온 핸들값(정수)는 이 핸들 테이블의 인덱스임!
  • handle leaking
    memory leak마냥 핸들도 leak의 대상이 될 수 있다
    -> 따라서 CleoseHandle()로 닫아줘야 한다
반응형