어느 프로그램이건 가끔 다운받아서 실행하면 DLL을 찾을 수 없습니다 또는 로드할 수 없습니다 하면서 실행이 안되는
경우가 다들 한 번 쯤은 경험이 있을 것이다.
DLL이란?? 간단한 예를 들어서 알아보도록 하자.
A파일과 B파일이 있고 두 파일 모두 C함수를 공통으로 사용한다. 그렇다고해서 A와 B파일에 C를 박아버리면 용량
이 둘 다 커져버리니 비효율적이라고 할 수 있다. 그래서 C를 DLL로 만들어버리고 외부에서 참조하도록 하여 용량도 줄이
고 효율적으로 관리(C함수에 오류가 나면 모든 파일을 뜯지 않고 C.DLL만 고치면 해결됨)할 수 있게 된다. 바로 이렇게
효율적으로 파일을 관리하기 위한 목적을 지닌 것이 DLL이다.
그럼 이러한 DLL을 변조하면 어떻게 될까?
C함수를 임의적인 악성코드로 바꿔치기했다고 하자. 그렇다면 C.DLL이 연결된 모든 프로그램들은 실행이 될 때 마다 외부
참조를 사용하여 C.DLL을 읽어버리기 때문에 주옥되는 수가 있다.
이러한 시스템 DLL 파일을 사용하지 않는 방법은 크게 3가지가 존재한다.
1. 프로그램의 실행에 있어 필요한 순수 DLL 파일들을 실행 파일이 있는 폴더로 모두 옮긴다.
2. DLL Redirection을 이용한다.
3. 실행파일의 코드를 수정한다.
1번 방법은 실무에 사용하기엔 적합하지 않기 때문에 추천하지 않는다.
3번째 방법을 먼저 보면, 코드를 수정하여 DLL을 프로그램에 정적으로 박아버린다는 말이 된다. 이는 보안상 괜찮겠지만,
필요한 DLL을 프로그램에 모두 박기 때문에 용량이 매우 커질 수 있고, 이로 인해 프로그램의 가독성과 효율성이 떨어지기
때문에 추천하지 않는다.
이제 2번 방법인 DLL Redirection에 대해 알아보자
DLL 리디렉션이란, 시스템에서 기본적으로 지원하는 DLL 파일을 사용하지 않기 위해 사용하는 기술이다.
또한, 이는 시스템 DLL보다 검색 순서(프로세스가 필요한 DLL 파일을 찾기 위해 검색하는 순서)가 높기 때문에 사용된다.
if SafeDllSearchMode is Disabled.
1. SxS(Side by Side Assembly)파일에서 지정된 폴더 안의 DLL
2. DLL Redirection에 의해 지정된 폴더 안의 DLL
3. IpPathName이 가리키고 있는 폴더 안의 DLL
4. Known-DLL-File
5. 필요로 하는 개체와 같은 폴더에 있는 DLL
6. 현재 폴더에 있는 DLL
7. 시스템 폴더에 있는 DLL
8. 윈도우 폴더에 있는 DLL
9. 윈도우 환경 설정 정보에 있는 Default Path 중에 있는 DLL
DLL 리디렉션을 사용하는 방법은 다음과 같다.
1. *.exe.local 형식의 파일과 필요한 DLL 파일을 같은 폴더에 넣는 방법
2. *.exe.local 형식의 폴더를 생성하여 *.exe 파일과 필요한 DLL을 넣는 방법
[FIGURE 1 - DLL Redirection 실행 전(Win7)]
nc.exe를 실행했을 때 프로세스의 모습이다.
다수의 DLL들이 모두 윈도우 폴더에 존재하는 DLL 파일을 참조한다.
그렇다면 DLL Redirection을 사용하게 된다면?
[FIGURE 2 - DLL Redirection 실행 후(WinXP)]
nc.exe가 참조하는 DLL인 ws2_32.dll을 DLL Redirection한 것이다.
보면 시스템 DLL로써 참조하지 않고 DLL Redirection된 파일로써 참조되어지고 있다.
[FIGURE 3 - DLL Redirection 실행 후 (Win7)]
윈도우 세븐에서 실행했을 땐 리디렉션이 실행되지 않는다.
리디렉션이 진행되지 않는다면 SxS 폴더로 지정되었다는 것 밖에 답이 없는데.. 솔직히 말해서 SxS에 대한 글을 봐도
이게 "dll hell 막기 위한 것이다" 라던가 "DLL 충돌 일어나지 않게 하기 위한 것이다" 라는 것 밖에 모르겠다.
SxS에 대해 자세히 알고싶은 사람은 http://bit.ly/LuMqPu 에서 보도록...