CreateRemoteThread Function

2019. 5. 4. 23:48
728x90
728x90
728x90

출처: https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createremotethread

 

CreateRemoteThread function (processthreadsapi.h)

Creates a thread that runs in the virtual address space of another process.

docs.microsoft.com

 

가. 다른 프로세스의 가상 주소 공간에서 실행되는 스레드를 생성해라.

나. CreateRemoteThreadEx 함수를 사용하여 다른 프로세스의 가상 주소 공간에서 실행되는 스레드를 생성하고 필요한 경우 확장된 특성을 지정해라.

 

Syntax

HANDLE CreateRemoteThread(
  HANDLE                 hProcess,
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  SIZE_T                 dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID                 lpParameter,
  DWORD                  dwCreationFlags,
  LPDWORD                lpThreadId
);

 

Parameters

 (1) hProcess

  thread가 생성될 프로세스에 대한 핸들. 핸들은 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE 및 PROCESS_VM_READ 액세스 권한이 있어야 하며, 특정 플랫폼에서 이러한 권한이 없으면 실패할 수 있다. 자세한 내용은 Process Security와 Access Rights를 참조해라.

 

 (2) lpThreadAttributes

  1) 새 thread에 대한 보안 설명자를 지정하고 하위 프로세스가 반환된 핸들을 상속할 수 있는지 여부를 결정하는 SECURITY_ATTRIBUTES 구조에 대한 포인터. lpThreadAtributes가 NULL이면 thread는 default 보안 설명자를 얻고 핸들을 상속할 수 없다. thread에 대한 default 보안 설명자의 ACL(Access Control List)은 creator의 primary token으로부터 가져온 것이다.

 

  2) Windows XP

   thread의 default 보안 설명자의 ACL은 creator의 primary 또는 impersionation 토큰에서 나온다. 이 동작은 Windows XP SP2 및 Windows Server 2003에서 변경되었다.

 

 (3) dwStackSize

  스택의 초기 크기, 바이트. 시스템은 이 값을 가장 가까운 페이지로 round 한다. 이 parameter가 0이면 새 thread는 실행 파일의 default size를 사용한다. 자세한 내용은 Thread Stack Size를 참조해라.

 

 (4) lpStartAddress

  thread에 의해 실행될 LPTHREAD_START_ROUTINE 유형의 application-defined 함수에 대한 포인터로, 원격 프로세스에서 thread의 시작 주소를 나타낸다. 함수는 원격 프로세스에서 존재해야 한다. 자세한 내용은 ThreadProc을 참조해라.

 

 (5) lpParameter

  thread 함수로 전달될 변수에 대한 포인터.

 

 (6) dwCreationFlags

  thread의 생성을 제어하는 flags (세부내용은 맨 위 출처 참조)

   0, CREATE_SUSPENDED(0x00000004), STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000)

 

 (7) lpThreadId

  1) thread 식별자를 수신하는 변수에 대한 포인터

 

  2) 이 parameter가 NULL이면 thread 식별자는 반환되지 않는다.

 

Return Value

 (1) 함수가 성공하면, return value는 새 thread에 대한 핸들이다.

 

 (2) 함수가 실패하면, return value는 NULL이며 extended error information을 얻으려면 GetLastError를 호출해라.

 

 (3) lpStartAddress가 데이터, 코드를 가리키거나 접근할 수 없는 경우에도 CreateRemoteThread가 성공할 수 있음을 주의해라. thread가 실행될 때 시작 주소가 유효하지 않으면 예외가 발생하고 thread는 종료된다. 유효하지 않은 시작 주소로 인한 thread 종료는 thread의 프로세스에 대한 error exit로 처리된다. 이 동작은 유효하지 않거나 누락된 DLL을 참조하더라도 프로세스가 생성되는 CreateProcess의 비동기적 특성과 비슷하다.

 

Remarks

 (1) CreateRemoteThread 함수는 지정된 프로세스의 주소 공간에서 새 thread를 시작하게 한다. thread는 프로세스가 열리는 모든 개체에 접근할 수 있다.

 

 (2) Terminal Services는 설계에 의해 각 터미널 세션을 격리한다. 따라서 CreateRemoteThread는 target 프로세스가 호출 프로세스와 다른 세션인 경우 실패한다.

 

 (3) 새 thread 핸들은 새 thread에 완전히 접근할 수 있도록 생성된다. 보안 설명자가 제공되지 않은 경우 핸들은 thread 개체 핸들을 필요로 하는 모든 함수에 사용될 수 있다. 보안 설명자가 제공된 경우 접근 권한이 부여되기 전에 이후의 모든 핸들에 대해 접근 점검을 수행한다. 접근 점검이 액세스를 거부할 경우 요청 프로세스는 thread에 접근할 수 없다.

 

 (4) thread가 실행 가능한 상태(즉, CREATE_SUSPENDED 플래그를 사용하지 않는 경우)에서 생성되는 경우 thread는 CreateThread가 반환되기 전에, 특히 호출자가 생성된 thread의 핸들 및 식별자를 받기 전에 실행될 수 있다.

 

 (5) thread는 THREAD_PRIORITY_NORMAL의 thread priority에 따라 생성된다. GetThreadPriority 및 SetThreadPriority 함수를 사용하여 thread의 priority 값을 가져오고 설정해라.

 

 (6) thread가 종료될 때, thread 개체는 신호 상태를 획득하며 이는 개체를 기다리고 있는 thread를 만족시킨다.

 

 (7) thread 개체는 thread가 종료될 때까지 시스템에 남아 있고, 그것에 대한 모든 핸들은 CloseHandle에 대한 호출을 통해 close 된다.

 

 (8) ExitProcess, ExitThread, CreateThread, CreateRemoteThread 함수 및 시작 중인 프로세스(CreateProcess 호출의 결과)는 프로세스 내에서 서로 직렬화된다. 이러한 이벤트 중 하나는 한 번에 주소 공간에서 발생한다. 이는 다음과 같은 제한사항이 보류됨을 의미한다.

  1) 프로세스 시작 및 DLL 초기화 루틴 중에는 새 thread를 생성할 수 있지만 프로세스에 대한 DLL 초기화가 완료될 때까지 실행을 시작하지 않는다.

 

  2) 한 프로세스에서 하나의 thread만 한 번에 DLL 초기화 또는 detach routine에 포함될 수 있다.

 

  3) ExitProcess는 모든 thread가 DLL 초기화 또는 detach routines를 완료한 후 반환한다.

 

 (9) 이 함수의 일반적인 용도는 break가 발생한 디버깅 중인 프로세스에 thread를 inject 하는 것이다. 그러나 extra thread는 응용 프로그램을 디버깅하는 사람에게 혼란을 주고 이 기술을 사용하는 데 몇 가지 부작용이 있으므로 이러한 사용을 권장하지 않는다.

  1) single-threaded applicatons를 multithreaded applications로 변환한다.

 

  2) 프로세스의 메모리 레이아웃과 timing을 변경한다.

 

  3) 프로세스의 각 DLL의 entry point에 대한 호출의 결과이다.

 

 (10) 이 함수의 다른 일반적인 용도는 힙 또는 기타 프로세스 정보를 쿼리하기 위해 프로세스에 thread를 inject 하는 것이다. 이것은 앞의 단락에서 언급된 것과 같은 부작용을 일으킬 수 있다. 또한 thread가 다른 thread가 사용 중인 자원의 소유권을 얻으려고 할 경우 응용 프로그램이 교착 상태가 될 수 있다.

 

Requirements

 (1) Minimum supported client

  Windows XP [desktop apps only]

 

 (2) Minimum supported server

  Windows Server 2003 [desktop apps only]

 

 (3) Target Platform

  Windows

 

 (4) Header

  processthreadsapi.h (include Windows Server 2003, Windows vista, Windows 7, Windows server 2008, Windows Server 2008 R2, Windows.h)

 

 (5) Library

  Kernel32.lib

 

 (6) DLL

  Kernel32.dll

728x90
728x90

'ETC > Windows API' 카테고리의 다른 글

LoadLibraryA Function  (0) 2019.05.05
WaitForSingleObject Function  (1) 2019.05.05
GetProcAddress Function  (1) 2019.05.04
GetModuleHandleA Function  (0) 2019.05.04
WriteProcessMemory Function  (0) 2019.05.04

+ Recent posts