2015-01-16 3 views
1

DLL 응용 프로그램에서 Direct3DCreate8에 대한 호출을 가로 채기 위해 dll 주입을 사용하여 Direct3d 장치에 대한 핸들을 확보하고 프로젝트가 투영되는 화면에 오버레이를 그립니다. 이 API에 대한 호출은 응용 프로그램이 실행 된 직후에 발생합니다. 제대로 이해하면 dll 주입을 실행 프로세스에 API 호출로 사용 했으므로 DLL 호출시 이미 발생했습니다. 이 가정이 맞습니까? 그렇다면 프로세스 실행 중에 dll을 주입하여 원하는 API 호출을 잡을 수 있습니까?프로세스 실행 이전에 DLL 주입

편집 : 시스템 전체의 API 후크에 대해 알고 있지만이 문제에 대한 '로컬'솔루션을 듣는 것이 좋습니다.

편집 2 :는 응용 프로그램이 SYSTEM32/SysWOW64와 디렉토리에서 .DLL (내 경우 d3d8.dll)를 찾습니다으로, 아무 소용이 응용 프로그램의 폴더에 .DLL을 대체 언급하는 것을 잊었다.

+1

(전체 대답은 아니므로 주석으로 게시하고 있습니다.) 디버거 API를 살펴보십시오. http://msdn.microsoft.com/en-us/library/ms809754.aspx - 프로세스 디버깅을 위해 시작된 DLL은 일시 중지되기 시작하므로 DLL을 주입 한 다음 일시 정지 해제 한 다음 디버깅을 중지 할 수 있습니다. (귀하의 프로그램이 실제로 디버거가 아니더라도 디버거 API를 사용할 수 있습니다.) – immibis

답변

1

파티에 좀 늦었으므로 Microsoft Detours (x86 플랫폼에서 비상업적 인 용도로는 무료이며 다른 방식으로는 엄청난 비용이 듭니다)을 사용하는 솔루션을 제공하고 싶습니다. 그들은 귀하의 필요에 맞게 DetourCreateProcessWithDllEx 기능을 가지고 있습니다.

우회 문서를 인용 :

프로세스가 CreateProcess를 행 CREATE_SUSPENDED 플래그 현탁 상태로 생성된다. 그런 다음 Detours는 새 프로세스에서 응용 프로그램 바이너리의 이미지를 수정하여 지정된 DLL을 첫 번째 가져 오기로 포함시킵니다. 그런 다음 프로세스에서 실행이 재개됩니다. 실행이 다시 시작되면 Windows 프로세스 로더는 응용 프로그램 시작점을 호출하기 전에 먼저 대상 DLL을로드 한 다음 응용 프로그램의 가져 오기 테이블에 다른 DLL을로드합니다.

+0

이 프로젝트를 개발할 때 우회로를 사용하여 끝났습니다 :) 감사합니다. – astralmaster