본문 바로가기

카테고리 없음

dll 관련 의문

DLL이 사용되는 이유가 여러 프로세스에서 DLL을 한번만 올리고, 프로세스가 공유해서 사용하면서 메모리 낭비를 줄이는 것인데,

A,B라는 2개의 프로세스가 동일한 DLL을 사용하고 있고 디버거로 A 프로세스에 붙어서 코드나 데이터를 수정하면 B 프로세스에도 동일한 DLL이기 때문에 수정한 DLL이 적용 될까?

 

실험을 해봤다.

 

내가 DLL을 만들어서 processExplore로 지켜보며 실험해본 결과, 일단 DLL이 한번만 올라가지 않는다. DLL을 주입할때 프로세스의 메모리가 증가했다. 그리고 한 프로세스에 디버거를 붙여서 DLL을 수정하면 다른 프로세스의 DLL이 변화하지 않는다. 

 

구글에 찾다보니

https://blog.naver.com/ontow/140131030101

 

윈도우 시스템 DLL 을 메모리 상에서 코드 수정을 했을 경우

윈도우 OS 에서 DLL 을 로드하면 한번만 메모리에 올라오고, 프로세스들이 코드 영역을 공유해서 사용...

blog.naver.com

 

글을 발견했다.

윈도우 OS 에서 DLL 을 로드하면 한번만 메모리에 올라오고, 프로세스들이 코드 영역을 공유해서 사용하면서 메모리 낭비를 줄이고 있다.
 
한가지 가정을 해보자
GDI.DLL  이 메모리에 올라오고, 특정 프로그램이 GDI.DLL 이 로드된 메모리의 코드영역을 수정했다.
이 경우, GDI.DLL 을 사용하는 다른 프로세스들이 수정된 코드로 작동할까?
 
정답은 NO 다.
윈도우는 DLL 의 코드가 수정되면 수정된 부분만 메모리를 생성해서, 수정한 프로세스에 생성하여,
그 프로세스만 수정된 내용이 반영되도록 한다.
 
만일, 이렇게 하지 않는다면, 수정 할 당시에 그 부분을 실행하고있던 많은 프로세스는 모두 크래쉬가 발생 할 것이고, 자칫 시스템까지 크래쉬가 될 것이기 때문이다.
[출처] 윈도우 시스템 DLL 을 메모리 상에서 코드 수정을 했을 경우|작성자 땅땅치킨

시스템 DLL이 아니라 내가 만든 DLL은 프로세스마다 올라가는것같다.