본문 바로가기
Study/Reversing

[리버싱] 정적&동적 라이브러리

by graygreat 2017. 9. 16.
728x90
반응형


정적 라이브러리(Static library)


특정 기능의 라이브러리를 static하게 제작한다는 것은 링크단계에서 라이브러리(*.lib 파일)를 실행 바이너리에 포함시킨다는 것이다.


즉, 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되기 때문에 별도의 추가 작업없이 


독립적으로 라이브러리 함수들을 사용할 수 있다.


하지만, 정적 라이브러리를 사용하는 프로그램이 늘어날수록 불필요하게 실행 파일들의 크기가 커지며, 라이브러리가 동시에 여러 실행 바이너리에 포함되는 경우 메인 메모리의 공간 활용 효율이 떨어진다.




동적 라이브러리(Dynamic library) : DLL


동적 라이브러리는 이를 사용하고자 하는 실행 바이너리에서 필요시 사용할 수 있도록 최소한의 정보만 포함하여 링크하거나, 독립적으로 DLL을 로드/사용/해제할 수 있다.


DLL 로딩 방식은 2가지이다.


프로그램내에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리를 해제시키는 방법(Explicit Linking)과 프로그램 시작할 때 같이 로딩되어 프로그램 종료 할 때 메모리에서 해제되는 방법(Implicit Linking)이 있다.



1) Implicit Linking


DLL을 구현하고 컴파일하고 나면 Static library와 다르게 output file이 2개 생성된다.


하나는 *.lib 파일, 하나는 *.dll 파일이다.


여기서 *.lib 파일은 static library의 *.lib파일과는 전혀 다르다.


Static library의 *.lib 파일은 라이브러리 전체 코드를 포함하는 바이너리이며, DLL의 *.lib 파일은 DLL이 제공하고자 하는 함수 정보(함수명)을 가지는 정보 파일이다.


DLL의 *.lib 파일을 이용하여 linking하는 것을 implicit linking이라고 한다.


실행 바이너리를 링크 단계에서 실행 바이너리의 *.obj 파일들과 DLL의 *.lib 파일을 함께 링크하여 이 정보를 토대로 runtime에 DLL의 함수 코드를 참조하게 되는 것이다. (*.lib파일은 링크 시 필요하고, (*.dll 파일은 실행 시 필요하다.)



2) Explicit Linking


Explicit linking에서는 *.lib 파일이 필요하지 않다.


실행 바이너리 링크 단계에서 DLL의 함수 정보가 필요하지 않기 때문이다.


Explicit linking에서 사용되는 세 가지 함수와 역할은 다음과 같다.


1. LoadLibrary : 필요한 DLL을 프로세스 가상 메모리에 맵핑한다.


2. GetProcAddress : DLL 함수의 포인터를 획득한다.


3. FreeLibrary : 프로세스 가상 메모리에서 DLL을 반환한다.



프로세스는 내부적으로 DLL의 레퍼런스 카운트를 계산한다.


LoadLibrary 호출시 DLL의 (프로세스) 레퍼런스 카운트는 1씩 증가하고,


FreeLibrary 호출시 레퍼런스 카운트가 1씩 감소한다.


레퍼런스 카운트(각 프로세스 내부의 호출 회수)가 0이 될 때 해당 DLL은 프로세스 가상 메모리에서 해제된다.


이러한 레퍼런스 카운트를 두는 이유는 프로그램 실행 중에 DLL을 가상 메모리에 할당, 해제할 수 있도록 하기 위함이다.





반응형

'Study > Reversing' 카테고리의 다른 글

[리버싱] 패킹  (0) 2017.09.18
[리버싱] IAT&EAT  (0) 2017.09.17
[리버싱] PE파일  (0) 2017.09.14
[리버싱] CALL, JMP, RET(RETN) 명령어에 대해 알아보자  (0) 2017.09.03
[리버싱] 인터럽트에 대해 알아보자  (0) 2017.09.03

댓글