Windows 프로세스 작성 프로세스 정보

5568 단어
이전에는 시스템 창설 프로세스의 구체적인 과정이 무엇이냐는 질문을 들은 적이 있는데, 먼저 Create Process가 떠올랐지만, 구체적인 과정에 대해서는 잘 모르니 오늘 정리해 보겠습니다.
운영 체제 관점에서 볼 때
프로세스 단계 작성: 1.신청 프로세스 블록 2.프로세스에 메모리 자원을 분배합니다 3.프로세스 블록 초기화 4.준비 대기열에 프로세스 블록 체인 가져오기
교과서의 지식...
 
CreateProcess의 구체적인 절차는 다음과 같습니다.
CreateProcess는 먼저 실행체 프로세스 대상인 EPROCESS 대상을 만들고 초기 루틴을 만들고 초기 루틴에 창고를 만들고 초기 실행 환경을 설정합니다.이 작업을 완성한 후, 이 라인은 시스템의 라인 스케줄링에 참여할 수 있다.그러나 Windows API 함수를 통해 생성된 프로세스도 Windows 서브시스템의 관리를 받아야 한다. 이런 상황에서 커널 부분의 작업만으로는 부족하고 시스템은 프로세스를 만드는 과정에서 서브시스템과 접촉해야 한다.또 독립된 메모리 주소 공간을 만들어야 한다.
CreateProcess는 커널을 통해 프로세스를 작성하는 단계를 크게 6단계로 나눕니다.
NtCreate Process, 매개 변수를 간단하게 처리한 다음 프로세스를 만드는 작업을 NtCreate ProcessEx 함수에 맡기기 때문에 NtCreate ProcessEx의 원형과 절차를 살펴보겠습니다.
 
NTSTATUS  
NtCreateProcessEx(  
__out PHANDLE ProcessHandle,  
__in ACCESS_MASK DesiredAccess,  
__in_opt POBJECT_ATTRIBUTES ObjectAttributes,  
__in HANDLE ParentProcess,  
__in ULONG Flags,  
__in_opt HANDLE SectionHandle,  
__in_opt HANDLE DebugPort,  
__in_opt HANDLE ExceptionPort,  
__in ULONG JobMemberLevel  
); 

 
NtCreate ProcessEx 함수의 코드는 ProcessHandle 매개 변수가 대표하는 핸들을 간단하게 검사한 다음에 진정한 생성 작업을 PspCreate Process 함수에 맡기기 때문에 PspCreate Process가 진정으로 프로세스를 만드는 함수입니다.
PsCreateSystemProcess는 시스템 프로세스의 대상을 만드는 데 사용할 수 있으며, 이 프로세스는 모두 PsInitialSystemProcess의 하위 프로세스입니다.따라서 PspCreateProcess 함수는 시스템의 모든 프로세스를 만들고 시스템 프로세스를 포함합니다.다음은 이 함수의 기본 절차를 소개한다.
 
 
1단계: 대상 이미지 파일 열기
2단계: 내부 핵의 프로세스 대상 만들기
3단계: 초기 스레드 생성
4단계: 윈도우즈 서브시스템 프로세스 알림 csrss.새 프로세스를 관리하기 위한 exe 프로세스
5단계: 초기 스레드 시작
6단계: 사용자 공간 초기화 및 Dll 연결
 
구체적인 내용:
Windows에서CreateProcess는 먼저 시스템을 통해 NtCreateProcess 생성 프로세스를 호출하고 성공한 후에 시스템을 통해 NtCreateThread를 호출하여 첫 번째 라인을 생성합니다.1단계: 대상 이미지 파일을 열려면 먼저 Create Process(실제로는 Create Process W)로 지정한 실행 가능한 이미지 파일을 열고 메모리 영역의 대상을 만듭니다.메모리 영역의 대상은 메모리에 비치지 않았습니다. (목표 프로세스가 구축되지 않았기 때문에 메모리 맵을 완성할 수 없습니다.) 그러나 이것은 확실히 열렸습니다.2단계: 내부 핵의 프로세스 대상을 만드는 것은 실제적으로 EPROCESS를 핵심으로 하는 관련 데이터 구조를 만드는 것이다. 주로 내부 핵의 NtCreate ProcessEx 시스템 서비스를 호출하는데 실제 호출 과정은 다음과 같다:kernel32.dll의 CreateProcessW 호출 ntdll.dll의 스텁 함수 NtCreate ProcessEx, ntdll.dll의 NtCreate ProcessEx는 프로세서의 함정 메커니즘을 이용하여 핵 모드로 전환한다.커널 모드에서 시스템 서비스 배달 함수인KiSystemService는 현재 스레드가 지정한 시스템 서비스 테이블을 이용하여 실행체 층의 NtCreateProcessEx 함수를 호출합니다.그 다음에 실행체 층의 NtCreate ProcessEx 함수는 앞에서 설명한 프로세스 창설 논리를 실행한다. 이는 EPROCESS 대상 창설, 그 중의 영역 초기화, 초기 프로세스 주소 공간 창설, 핸들 테이블 창설과 초기화, 그리고 EPROCESS와 KPROCESS의 각종 속성, 예를 들어 프로세스 우선순위, 보안 속성, 창설 시간 등을 설정한다.여기서 실행체 층의 프로세스 대상이 구축되었고 프로세스의 주소 공간이 초기화되었고 EPROCESS의 PEB도 초기화되었습니다.3단계: 초기 루틴 만들기 이 단계는 NtCreateThread () 호출을 통해 이루어집니다. 주로 다음과 같습니다. 현재는 프로세스 대상이 만들어졌지만 루틴이 없기 때문에 그 자체로 아무것도 할 수 없습니다.다음은 초기 라인을 만들어야 합니다. 그 전에 창고와 실행 가능한 환경을 만들어야 합니다.초기 스레드의 창고 크기는 이미지 파일을 통해 얻을 수 있으며, 스레드를 만들면 ntdll를 호출할 수 있습니다.dll의 NtCreateThread 함수로 완료합니다.대상 스레드의 ETHREAD 데이터 구조를 작성하고 설정하며 프로세스 블록의 스레드 수 등과 같은 EPROCESS와의 관계를 처리합니다.대상 프로세스의 사용자 공간에서 대상 스레드의 TEB를 만들고 설정합니다.사용자 공간에서 대상 스레드의 시작 주소를 Kernel32로 설정합니다.dll의 Base Process Start () 또는 Base Thread Start () 는 프로세스의 첫 번째 라인에 사용되고, 후자는 다음 라인에 사용됩니다.사용자 프로그램은 NtCreateThread () 를 호출할 때도 사용자 수준의 시작 함수 (주소) 를 제공해야 합니다. BaseProcessStart () 와BaseThreadStart () 는 초기화가 완료될 때 이 시작 함수를 호출합니다.ETHREAD 데이터 구조에는 두 개의 성분이 있는데, 각각 이 두 개의 주소를 저장하는 데 쓰인다.KeInitThread를 호출하여 대상 스레드의 KTHREAD 데이터 구조를 설정하고 스택을 할당하고 실행 환경을 설정합니다.특히, 상하문에 있는 인터럽트 (되돌아오는 점) 를 커널에 있는 프로그램인 KiThreadStartup을 가리키도록 설정하여, 이 라인이 스케줄링되면 여기서부터 실행됩니다.시스템에서 라인을 만들 때마다 호출해야 하는 '알림' 함수를 등록해서 호출할 수 있습니다.4단계: 윈도우즈 서브시스템에 모든 프로세스가 생성/종료될 때 윈도우즈 서브시스템 프로세스 csrss에 알립니다.exe 프로세스는 윈도우즈의 모든 프로세스를 관리하는 책임을 지고 있기 때문에, 이 프로세스는Create Process의 호출자이며, 새로 만든 프로세스가 아닙니다. 아직 실행되지 않았기 때문입니다.이로써 Create Process의 작업은 완료되었지만 하위 프로세스의 루틴은 아직 실행되지 않았습니다. 루틴의 실행은 아래의 5단계와 6단계를 거쳐야 합니다.5단계: 초기 스레드 시작
커널에서 새 스레드의 시작 절차는KiThreadStartup 함수입니다. 이것은 PspCreateThread가KeInitThread 함수를 호출할 때KeInitThread 함수가KiInitializeContextThread(basetos\ke\i386\thredini.c 파일 참조)를 호출하여 설정합니다.
KiThreadStartup 함수는 IRQL을 APC 로 낮춥니다.LEVEL, 그리고 시스템의 초기 스레드 함수 PspUserThreadStartup을 호출합니다.이 PspUserThreadStartup 함수는 PspCreateThread 함수가KeInitThread를 호출할 때 지정합니다.PspCreateThread 함수는 시스템 스레드를 만들 때 지정한 초기 스레드 함수는 PspSystemThreadStartup입니다.스레드 시작 함수는 PspUserThreadStartup에 매개 변수로 전달됩니다. 여기서kernel32입니다.dll의 BaseProcessStart
PspUserThreadStartup 함수가 호출되었습니다.논리는 복잡하지 않지만 비동기 함수 호출(APC) 메커니즘과 관련된다.
새로 만든 스레드가 즉시 실행될 수 있는 것은 아닙니다. 사용자가 만들 때 로고 위치를 CREATESUSPENDED가 1로 설정됨;만약 그렇다면, 다른 프로세스가 시스템 호출을 통해 실행 자격을 회복한 후에야 스케줄링이 실행될 수 있습니다.그렇지 않으면 지금 이미 스케줄링되어 운행할 수 있다.언제 스케줄링이 될지 우선 순위 등 조건을 살펴야 한다.6단계: 사용자 공간 초기화 및 Dll 연결
PspUserThreadStartup 함수가 반환된 후 KiThreadStartup 함수는 사용자 모드로 반환됩니다. 이때 PspUserThreadStartup에 삽입된 APC가 전달되고 LdrInitializeThunk 함수가 호출됩니다. 이것은 이미지 로더(image loader)의 초기화 함수입니다.LdrInitializeThunk 함수는 로더, 더미 관리자 등의 초기화 작업을 마치고 필요한 DLL을 불러오고 이 DLL의 입구 함수를 호출합니다.마지막으로 LdrInitializeThunk이 사용자 모드 APC 배달기로 되돌아갈 때 이 스레드는 사용자 모드에서 실행되고 프로그램이 지정한 스레드 시작 함수를 호출합니다. 이 시작 함수의 주소는 APC가 배달할 때 사용자 창고에 눌려 있습니다.
DLL 연결은 ntdll.dll의 LdrInitializeThunk()가 사용자 공간에서 완료됩니다.그 전에 ntdll.dll은 응용 프로그램과 연결되지 않았지만 사용자 공간 함수인 LdrInitializeThunk () 에 비쳐져 있습니다. 이미지에 있는 위치는 시스템이 초기화될 때 미리 정해져 기록되어 있기 때문에 이 함수에 들어가기 전에 연결할 필요가 없습니다.
 
Windows 커널에 대한 지식과 세부 사항은 아직 이해해야 합니다...
참조 자료:
http://www.cnblogs.com/csyisong/archive/2010/10/22/1858115.html
http://www.cnblogs.com/Gotogoo/p/5262536.html
http://book.51cto.com/art/201011/235767.htm
《Windows 내장 원리와 실현》 반애민
 
전재 대상:https://www.cnblogs.com/HsinTsao/p/6534317.html

좋은 웹페이지 즐겨찾기