설명에서 이미 대상 프로세스에서 DLL을로드하는 방법을 알고있는 것으로 보입니다. 내 가정이 맞다면 대답은 간단합니다 : DLLMain에서 스레드를 만들고 스레드에서 논리를 구현하십시오. 코드가 아래에 설명 된 규칙을 존중하는 한 괜찮을 것입니다.
이 document은 DLLMain에서 수행 할 수있는 작업과 수행 할 수없는 작업과 그 이유를 설명합니다. 기록으로
, 당신은 DllMain 내에서 다음과 같은 작업을 수행해서는 안 :
- 통화에서 LoadLibrary 또는 함 2 LoadLibraryEx (직접 또는 간접적으로). 교착 상태 또는 충돌이 발생할 수 있습니다.
- 다른 스레드와 동기화하십시오. 교착 상태가 발생할 수 있습니다.
- 로더 잠금을 얻기 위해 대기중인 코드가 소유 한 동기화 개체를 가져옵니다. 교착 상태가 발생할 수 있습니다.
- CoInitializeEx를 사용하여 COM 스레드를 초기화하십시오. 특정 조건에서이 함수는 LoadLibraryEx를 호출 할 수 있습니다.
- 레지스트리 함수를 호출하십시오. 이러한 함수는 Advapi32.dll에서 구현됩니다. Advapi32.dll이 DLL보다 먼저 초기화되지 않으면 DLL이 초기화되지 않은 메모리에 액세스하여 프로세스가 중단 될 수 있습니다.
- CreateProces를 호출하십시오. 프로세스를 생성하면 다른 DLL을로드 할 수 있습니다.
- ExitThread를 호출하십시오. DLL 분리 중 스레드를 종료하면 로더 잠금이 다시 획득되어 교착 상태 나 충돌을 일으킬 수 있습니다.
- CreateThread를 호출하십시오. 다른 스레드와 동기화하지 않으면 스레드를 만들 수 있지만 위험합니다.
- 명명 된 파이프 또는 다른 명명 된 개체를 만듭니다 (Windows 2000 만 해당). Windows 2000에서 터미널 서비스 DLL은 명명 된 개체를 제공합니다. 이 DLL이 초기화되지 않은 경우 DLL을 호출하면 프로세스가 중단 될 수 있습니다.
- 동적 C 런타임 (CRT)의 메모리 관리 기능을 사용하십시오. CRT DLL이 초기화되지 않은 경우이 함수를 호출하면 프로세스가 중단 될 수 있습니다.
- User32.dll 또는 Gdi32.dll의 함수를 호출하십시오. 일부 함수는 초기화되지 않을 수있는 다른 DLL을로드합니다.
- 관리 코드를 사용하십시오.
다음 작업은는 DllMain 내에서 수행 할 안전 :
- 컴파일시 정적 데이터 구조와 멤버를 초기화합니다.
- 생성하고 동기화
- 메모리를 할당 및 동적 데이터 구조를 초기화하는 초기화 개체 (위의 함수를 회피한다.)
- 설정 스레드 로컬 저장소 (TLS)를.
- 파일 열기, 읽기 및 쓰기.
- Kernel32.dll의 함수를 호출합니다 (위에 나열된 함수 제외).
- 동적 멤버의 초기화를 수행하지 않고 전역 포인터를 NULL로 설정합니다. Microsoft Windows Vista ™에서는 한 번 초기화 기능을 사용하여 다중 스레드 환경에서 코드 블록이 한 번만 실행되도록 할 수 있습니다.
두 번째 질문이 나에게 덜 분명합니다. 다른 프로세스에 코드를 삽입하려면 어딘가 (브라우저, EXE 등)에서 시작한 다음 대상 프로세스 메모리에 작성하여 DLL을로드해야합니다.