2010-06-09 1 views
8

여기C 또는 C++ : 로더/래퍼는 어떻게 작동합니까?

  • 사용자가
  • LOADER.EXE 다른 EXE가 다운로드
  • LOADER.EXE 프로그램을 실행하지만,
  • 다운로드 한 실행 디스크에 저장하지 않고 메모리에있는 모든 유지 ... 무슨 뜻인지의 예 EXE는 디스크에서 실행되었지만 메모리에서 직접 수행하는 경우와 동일합니다.

이렇게 몇 가지 응용 프로그램을 보았지만 어떻게 작동하는지 예제 나 설명을 본 적이 없습니다.

아는 사람 있습니까?

또 다른 예는 암호화 된 EXE를 다른 예로 삽입 한 것입니다. 그것은 실행되기 전에 디스크에 저장되지 않고 메모리에서 추출되고 해독됩니다.

불법 복제를 방지하기 위해 일부 애플리케이션에서 사용되는 것을 보았습니다.

편집 : 참고 : UPX와 같은 프로그램이 이와 같은 작업을 수행합니까? 나는 코드를 보았지만 나를 위해 해독하기가 어렵다. 그리고 나는 주로 호기심에서 물었다. 나는 그것을 필요로하지 않는다.

답변

4

이것은 단지 (나는 내가 알고있는) % temp %를에 압축을 풉니 다, 그러나 큰 소년이 기본적으로해야하는 OS 실행 로더, 다시 구현 않는 프로그램의 많은 :

  • 가 실행지도를 메모리에. .exe에는 페이지 정렬로로드해야하는 여러 개의 '섹션'이 포함되어 있으므로 (4K의 배수 인 주소에서 시작해야 함) 각각 특정 요청을 가지고 있으므로 간단하게 들리는만큼 간단하지 않습니다 - 읽기 전용, 복사 쓰기, 제로 초기화 등 ...
  • 일반적으로 LoadLibrary() 및 GetProcAddress()를 사용하여 가져 오기 테이블 섹션을 업데이트하여 정적 가져 오기를 충족시킵니다.
  • dll의 경우 (실제로는 거의 동일하지만 중요한 차이점은 가져 오기와 내보내기가 있음)로드 할 컴파일 된 메모리 주소가 dll 인 경우 dll을 리베이스해야 할 수도 있습니다. 이미 사용 중입니다 (이것은 매우 일반적입니다). 이것은 보통로드 된 코드에서 업데이트해야 할 위치를 나열하는 재배치 섹션을 포함하지 않기 때문에 일반적으로 EXE에서는 불가능합니다. 일반적으로 프로세스에로드 된 첫 번째 것이므로 차단할 수 없기 때문입니다 뭔가 의해. 이는 로더가로드 된 exe를 차단하지 않는 자체 exe에 대해 비정상적인로드 주소를 가져야 함을 의미합니다.

요약하면 : 이것은 많은 작업입니다.관심이 있으시면 .exe 및 .dll 파일을 설명하는 PE 형식 사양과 VirtualAlloc() 기능을 살펴보십시오.

+0

와우, 그건 내가 생각했던 것보다 훨씬 복잡해 보인다. UPX에 대한 경험이 있습니까? 이런 식으로 작동합니까? (나는 포장업자에 대해 많이 모른다.) 필자는 다소 쉽게 이해할 수있는 몇 가지 소스 코드를 발견 할 수 있기를 희망했습니다. –

+0

@ 기타 : 방금 코드를 살펴 보았습니다. 로더 스텁은 꽤 무거운 무거운 어셈블리이지만,이 경우 패커가 많은 양의 사전 처리를하는 것처럼 보이므로 스텁은 이미 정렬 된 파일을 메모리로 압축 해제 한 다음 가져 오기를 가져올 수 있습니다. 이것은 분명히 당신의 두 번째와 세 번째 예제에 충분하지 않습니다. http://upx.hg.sourceforge.net/hgweb/upx/upx/file/c3853d205747/src/pefile.cpp의 패커 항목은 더 가깝지만 다른 곳에서는 특별한 사례가 적다는 것을 확신합니다. –

+0

이것은 상업적인 품질은 아니지만 좋은 시작처럼 보입니다. http://code.google.com/p/egodust/source/browse/trunk/pe.c –

1

실행 파일의 진입 점에 대한 오프셋이 어디인지 알면 어떤 매개 변수가 필요한지 알면 함수 포인터를 사용하여 주소 "exeBase + entryPointOffset"에서 함수를 호출하면됩니다.

x86 시스템에서 적어도 OS로 표시된 데이터는 데이터로 표시된 메모리를 실행하지 못하게하는 경향이 있습니다. 예를 들어, 창 아래에서 "Virtual ProtectEx"기능을 사용하여 메모리를 실행 가능으로 표시 할 수 있습니다.

사실, 옛날 옛날에 이것은 메모리를 절약하는 일반적인 시스템이었습니다. 당신은 "overlays"을 가지고 있으므로 필요에 따라 코드를 교환 할 수있어 메모리를 절약 할 수 있습니다.

+0

정말 작동합니까? 어떻게 실행 코드 안에 절대 주소로 점프 할 수 없다는 것을 확신 할 수 있습니까? –

+0

절대 주소 픽스 업은 EXE 데이터에 있습니다. 이것이 바로 Vista의 ASLR 기능이 작동하는 방식입니다. 그럼에도 불구하고 로더는 부트 스트랩 코드를 이동시켜 EXE가 정상 기본 주소로로드되도록합니다. –

+0

@ 한스 : exe는 주소 공간에 할당 된 첫 번째 것이므로 재배치 섹션을 포함하지 않으므로 (ASLR 만 해당) 재배치 섹션을 포함하지는 않습니다. DLL의). @Goz : 원시 파일 데이터의 섹션이 페이지 정렬되지 않았으므로 작동하지 않습니다. 파일 오프셋과 RVA의 차이점에 대한 PE 스펙을 참조하십시오. –