본문 바로가기

My Study/Programming&Theory

Dll Self Unloading

오랜만에 포스팅하는 것 같습니다. 요샌 뭘하는지 정신이 없군요.


요즘 뭐좀 코딩하다가 문뜩 이런생각이 들었습니다.

dll이 로드되려면 프로세스에서 LoadLibrary를 사용해서 로드를 시켜주고 더 이상 사용하지 않을 땐 FreeLibrary로 해당 dll을 Unload 시켜주게 됩니다. 그러면 dll이 내부적으로 스스로 unload 할 수 있지 않을까? 라는 무모한 생각을 했었습니다. 몇 분쯤 생각하다가 아이디어가 잘 안떠올라서 구글에 찾아보니 Stack overflow에 어떤분이 답글이 있었습니다.


저랑 똑같은 생각을 한 사람이 글을 올렸더군요.

하지만 답글은 안정적인 방법으로는 dll 스스로 unload 할 수 있는 방법이 없다는 답변이었습니다. 그 이유로는 FreeLibrary를 하게되면 dll에 대한 레퍼런스 카운트가 0이 되는데 이러면 해당 모듈이 unmapped 된다는 것입니다. 그러면 FreeLibrary는 성공하겠지만 FreeLibrary가 리턴을 하게되면 잘못된 영역(이미 해제된 영역)으로 리턴되면서 crash가 발생하게 됩니다.


어떻게 해결하면 좋을까요? 곰곰히 생각해보다가 그러면 FreeLibrary를 외부에서 실행하면 되겠다 싶더군요.

간단하게 POC 코드를 작성해 보았습니다. 아무리 POC 코드라도 해도 x86, x64에서 전부다 잘 동작합니다 :D



100줄 도 안되는 짧은 코드군요. 테스트 코드는 다음과 같습니다.

위 dll 코드로 컴파일한 바이너리 이름은 "DllTest.dll" 입니다.



결과 화면 입니다.


안정성 측면에서 보면 할당한 메모리 해제와 생성한 스레드 핸들 해제를 못하고 있는데 이는 안정성 측면에선 크게 문제될만한 부분이 없기 때문에 상관 안해도 될 것 같습니다. 다른 좋은 방법이 있을까요? 굿밤입니다.