2009-10-23 2 views
4

나는 그것을 사용하는 DLL이 포함 된 응용 프로그램 디렉토리에 C++ Exe를 가지고 있습니다. 자, 일부 테스트 목적을 위해 기존 DLL을 수정하고 원래 DLL 대신 사용해야합니다. 그러나 기존 설치를 수정하지 않으려면 기존 DLL을 백업하여 수정 된 DLL로 대체하거나 기존 DLL을 다른 곳으로 옮길 수 없습니다. 나는 또한 Exe를 바꿀 수 없다. 2 개의 DLL이 나란히 존재해야합니다. 유일한 변경 사항은 Exe가 Exe 폴더와 같은 폴더에있는 기존 DLL이 아닌 다른 폴더에있는 수정 된 DLL을 투명하게로드해야한다는 것입니다. 거기에 우아한 방법이 있습니까?Windows : Exe에 대한 DLL 검색 순서 변경

일부 MSDN 기사를 보았지만이를 수행 할 방법을 찾지 못했습니다. 이 솔루션은 Windows XP 이상에서 작동해야합니다.

답변

-1

내가 아는 유일한 방법은 경로를 포함하여 LoadLibrary API를 사용하지만 EXE를 변경할 수 없다는 말입니다.

1

MSDN에 따르면 대체 검색 순서 방법으로 수정하지 않는 한 항상 응용 프로그램 디렉토리에서 시작하므로 어려울 것으로 보입니다. 실행 파일과 그 밖의 다른 종속성을 여전히 복사 할 수 있습니다. 그것은 우아하지 않습니다.

또는 원래 디렉터리에서 새 DLL과 함께 다른 위치로 복사 한 실행 파일을 시작할 수 있습니다. 검색 순서에 따르면 너무 노력해야합니다.

0

프로세스의 LoadLibrary() 호출을 처음부터 연결할 수 있습니다. LoadLibrary()의 패치 된 버전에서 DLL이로드 된 LoadLibrary()를 호출하면 원래의 LoadLibrary()가 수정 된 DLL의 경로로 호출됩니다 .Windows CRT는 LoadLibrary() 호출을 사용하지 않아도 DLL을로드합니다. 따라서이 기술은 효과가 있어야합니다.

+0

어떻게 작동하는지 예를 들어 설명해주십시오. 감사합니다. gg –

+0

설명 된 MSalters 방법은 시도해야 할 첫 번째 방법입니다. 그것은 DLL 주입을하는 가장 쉬운 방법입니다. 작동하지 않는 경우 (이유가 표시되지 않음) 실제 API 후킹을 구현해야합니다. 이것은 복잡한 주제입니다. 웹에서 "Windows API Hooking"주제를 검색하여 몇 가지 예제 코드와 유틸리티 라이브러리를 얻을 수 있습니다. –

2

Windows는 프로세스마다 각 DLL 이름을 최대 하나의 버전으로로드합니다. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs에 나열된 DLL을로드하면 나중에 비슷한 이름의 DLL을로드하지 않습니다. 그러나 AppInit_DLLs에서 일반 LoadLibrary() 순서를 무시하고 명시 적 경로가있는 DLL을 나열 할 수 있습니다.

임시적으로 테스트 DLL을 AppInit_DLLs에 넣으면 같은 이름의 다른 DLL보다 우선합니다.