• 프로세스(Process) : 실행중인 상태의 프로그램, 테스크(task)라고도 부른다.
  • 스레드(Thread) : 디스패칭의 단위, 실제적으로 명령어가 CPU를 사용하여 실행되어지는 객체의 단위
    • 같은 프로세스 내의 스레드는 같은 주소공간에 존재함
    • 같은 프로세스 내의 스레드는 같은 메모리를 참조함
  • 프로세스의 구조
    • EPROCESS
      • windbg로 EPROCESS구조체를 볼 수 있다! (windbg를 커널에 연결해야한다)
        • EPROCESS란 프로세스가 생성되면 해등 프로세스의 정보를 담고있는 구조체, 커널메모리에 생성된다.
        • PEB? 유저모드에서의 프로세스 구조체
      • windbg로 EPROCESS의 구조를 보는 과정은 추후에 작성하도록 하겠다..
      • 프로그램에서EPROCESS의 구조체를 보려면?
        • 본인 프로세스라면 아래 api를 사용하여 EPROCESS포인터를 리턴받는다
          PEPORCESS PsGetCurrentProcess()
        • 타 프로세스라면 undocumented된 함수인 다음 함수를 사용해야한다.  
          • NTSTATUS PsLookupProcessByProcessID(IN LONG PID, OUT PVOID* EProcess)
    • 프로세스를 구성하는 요소들
      • 독립적인 메모리 공간
        • 각 프로세서가 가지는 레지스터값은 그 프로세스의 서로다른 페이지 디렉토리를 가리키고 있어서, 사용자가 서로 같은 메모리 주소를 지정한다해도 실제 물리 메모리는 다르다.
      • 유저 메모리 영역 관리(Virtual Address Descriptors)
        • Windows에서 프로세스 별로 독립된 영역을 가지게 되는 곳은 유저 메모리 공간 뿐이다. (커널 메모리 공간의 경우 모든 프로세스가 공유하고 있으므로 독립적이라 할 수 없다)
        • VAD(Virtual Address Descriptors) : Windows에서 프로세스 별로 독립적으로 존재하는 유저 메모리 영역을 관리하기 위해 사용하는 데이터
          • 프로세스에서 가상메모리 할당 함수로 할당한 메모리나 파일을 매핑함으로써 생성한 메모리 등과 같은 모든 유저메모리의 할당정보를 바이너리 트리 형태로 가지고 있게 된다.
          • windbg 명령어 : !vad 
        • 핸들 테이블(Handle Table)
          • 프로세스에서 사용하는 모든 핸들들에 대한 커널 객체 포인터 정보를 배열형태로 가지고 있는 공간
          • 프로세스가 종료될 때 Windows에서 이 테이블을 참조하여 사용하는 모든 커널 객체를 자동으로 반환한다
        • Windows의 커널 객체
        • PEB(Process Environment Block)
          • 유저레벨에서 프로세스에 대한 추가적인 정보를 저장하고 있는 구조체
          • 이 프로세스에서 로드하고 있는 모듈 정보나, 힙과같은 정보들이 저장되어 커널레벨 진입을 줄이고 있다.
  • 스레드의 구조
    • 프로그램에서 ETHREAD 정보 얻기
      • 본인 프로세스일 경우
        • PETHREAD PsGetCurrentThread()
        • NTSTATUS PsLookupThreadByThreadId(IN ULONG ThreadId, OUT PVOID* EThread)
      • 타 프로세스일 경우
        • NTSTATUS PsLookupProcessThreadByCid*IN PCLIENT_ID ClientId, OUT PEPROCESS* Process, OUT PETHREAD* Thread)
      • SEH(Structed Exception Handling)에 관해서는 또 다른 게시글을 하나 써야할 듯 하다..
      •  

 

복사했습니다!