2013-04-27 5 views
4

주소 A의 값을 250ms마다 편집하려는 프로세스에 DLL을 삽입한다고 가정합니다. DllMain을 사용해야 겠지? 문제는 내가 DllMain을 기다릴 수 없다는 것입니다. 그래서 스레드를 만들어야합니까? 아니면 제한을 우회하지 않습니까? 이 일을 어떻게 하죠?DLL 주입에 대한 유용한 정보

또한 DLL 삽입을 사용하여 EXE를 사용하는 것보다 응용 프로그램의 메모리를 편집 할 때 어떤 이점이 있습니까?

또한 CreateThread에서 스택 크기는 어떻게되어야합니까? 너무 작거나 너무 큰 경우에는 어떻게해야합니까? 얼마나 필요한지 어떻게 알 수 있습니까?

답변

5

설명에서 이미 대상 프로세스에서 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을로드해야합니다.

관련 문제