파일에 쓰지 않고 메모리 버퍼에서 EXE 로드
많은 개발자는 필요 없이 메모리 버퍼에서 EXE를 시작하는 문제에 직면합니다. 파일 생성을 위해. 이 기사에서는 CreateProcess 기능과 학술 연구에서 파생된 기술을 사용하여 이 일반적인 문제에 대한 솔루션을 자세히 설명합니다.
Windows에서는 새로운 프로세스를 생성할 수 있는 CreateProcess 기능을 제공합니다. CREATE_SUSPENDED 플래그를 사용하면 명시적으로 재개될 때까지 프로세스를 일시 중단할 수 있습니다. 이 일시 중단은 프로세스의 컨텍스트를 조작하는 데 필요한 시간을 제공합니다.
GetThreadContext 함수는 PEB(프로세스 환경 블록) 구조에 대한 포인터가 포함된 EBX를 사용하여 일시 중단된 스레드의 컨텍스트를 검색합니다. 프로세스의 기본 주소를 찾는 데 중요한 ImageBaseAddress는 PEB 내의 오프셋 8에 저장됩니다.
일시 중지된 프로세스의 기본 주소가 결정되면 메모리 내 EXE를 로드할 수 있습니다. 인 메모리 EXE와 일시 중지된 프로세스의 기본 주소가 일치하고 인 메모리 EXE의 크기가 일시 중지된 프로세스의 크기보다 작거나 같은 경우 WriteProcessMemory를 사용하여 일시 중지된 프로세스의 메모리 공간을 직접 덮어쓸 수 있습니다.
단, 위의 조건이 충족되지 않을 경우 추가 조치가 필요합니다. ZwUnmapViewOfSection 함수는 원본 이미지의 매핑을 해제하는 반면 VirtualAllocEx는 일시 중지된 프로세스의 메모리 공간 내에 충분한 메모리를 할당합니다. 그런 다음 WriteProcessMemory를 사용하여 이 할당된 공간에 인 메모리 EXE가 기록됩니다.
그 후, 인 메모리 EXE의 BaseAddress가 일시 중단된 프로세스의 PEB->ImageBaseAddress에 패치됩니다. 일시 중단된 프로세스의 EntryPoint 주소는 스레드 컨텍스트의 EAX 레지스터를 사용하여 메모리 내 EXE의 진입점으로 다시 작성됩니다. SetThreadContext 함수는 변경된 스레드 컨텍스트를 저장하고 마지막으로 ResumeThread는 패치된 프로세스를 실행합니다.
이 정교한 프로세스를 통해 개발자는 EXE를 파일에 작성하고 메모리 버퍼에서 원활하게 시작할 필요가 없습니다. 업데이트와 패치를 효율적이고 안전하게 배포할 수 있습니다.
위 내용은 파일에 쓰지 않고 메모리 버퍼에서 EXE를 실행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!