1) DLL 파일 내에 있는 함수 호출 방법
DLL 내부에는 다른 프로그램들이 호출할 수 있는 다양한 함수들이 존재한다. 이 함수는 묵시적 링킹(Implicit linking)과 명시적 링킹(Explicit linking)으로 사용이 가능하다.
묵시적 링킹은 실행 파일 내에 사용하고자 하는 DLL의 이름과 함수를 포함시킨 뒤 프로그램 실행 시 해당 함수를 초기화하고 이용하는 방법이다. 이는 컴파일 시 헤더파일(*.h)과 라이브러리 파일(*.lib) 파일이 필요하다. 단점으로는 DLL 파일이 존재하더라도 헤더파일과 라이브러리 파일이 배포되지 않는다면 분석이 불가능하다.
명시적 링킹은 프로그램 실행 도중 LoadLibrary와 GetProcAddress API를 이용해 동적으로 함수를 불러와 사용하는 방법이다. Figure 1은 두 API를 이용해 실제로 해당 함수를 호출한 코드이다.
Figure 1. DLL 명시적 링킹 사용 코드(C++)
이 방법의 단점은 DLL 파일을 통해 함수의 인자의 자료형이 무엇이고 개수가 몇 개인지 알 수 없다는 점인데 이는 DLL 파일의 콜링 컨벤션과 디어셈블코드를 분석해 대략적으로 유추할 수 있다. 또는 IDA 프로그램과 ollydbg 프로그램을 통해서 쉽게 확인할 수 있다. Figure 2는 IDA 프로그램과 olldbg 프로그램을 통해 분석하고자 하는 DLL의 아규먼트를 확인한 화면이다.
Figure 2. IDA의 Functions 뷰어와 ollydbg의 Call DLL exports 기능을 이용한 함수 인자 확인
2) PEview.exe 도구를 이용한 exports된 함수 확인
PEview.exe 도구는 PE 파일의 구조를 분석해 주는 프로그램이다. 이를 사용하면 DLL파일이 제공하는 exports된 함수 이름과 주소를 알 수 있다. Figure 3은 분석하고자 하는 DLL 파일을 PEview.exe 도구를 이용해 불러온 뒤 EXPORT Address Table을 확인한 화면이다.
Figure 3. PEview.exe를 통해 DLL 파일 내에 있는 exports 함수를 확인
3) olldbg.exe를 이용해 DLL 파일 내에 있는 함수 호출
Figure 4와 같이 ollydbg.exe 실행 파일 있는 폴더에는 loaddll.exe 실행파일이 존재한다. 그리고 ollydbg.exe 도구를 통해 DLL 파일을 열 경우 자동으로 동일 경로에 있는 loaddll.exe 파일을 실행시킨다. 그리고 LoadLibrary API를 사용해 DLL 파일을 프로세스 주소공간에 매핑시킨다. 정상적으로 API가 호출되면 DLL의 usage count가 1증가하고 DllMain 함수를 호출한 뒤 DLL의 로드된 주소를 반환한다.
정상적으로 DLL 파일을 ollydbg.exe로 실행시키면 Figure 5와 같이 자동적으로 DLL 파일의 EP 에서 브레이크 포인트가 걸리게 된다.
Figure 5. DLL파일을 ollydbg.exe로 열었을 때의 화면
이 상태에서 Debug의 Call DLL export 의 기능을 이용하면 DLL 내의 exports 된 함수를 호출할 수 있다. Figure 6은 해당 기능을 이용해 DLL 내의 함수를 호출하는 화면이다. 그리고 적절한 인자를 입력한 뒤(없을 경우 입력하지 않음) Call export 버튼을 클릭하게 되면 해당 함수가 위치한 주소로 브레이크 포인트가 걸리게 된다.
Figure 6. ollydbg의 Call DLL exports 기능
첨부파일1 : Dll Export 예제
첨부파일2 : Dll 동적 분석을 위한 코드
'리버싱 > 리버싱기초' 카테고리의 다른 글
취약점 리버싱 요약 노트 (0) | 2020.02.06 |
---|---|
리버싱 예제 2 (정적분석 vs 동적분석) (0) | 2015.10.14 |
PE파일 데이터 암호화 (0) | 2015.10.05 |
PE파일 구조 (0) | 2015.09.23 |
리버싱 예제 1 (라이센스 우회) (1) | 2015.09.15 |