강의정리/Z0FCourse_Re

[x64] DLL(import/export), Function Overriding, Mangling, and Decoration

우와해커 2020. 1. 23. 17:09

6.2- DLL

https://github.com/0xZ0F/Z0FCourse_ReverseEngineering/blob/master/Chapter%206%20-%20DLL/6.3%20Exports.md

 

-실습용 파일에 대한 설명-
RunDLL.exe는 DLL.dll의 내 보낸 함수를 호출하는 프로그램입니다.
DLL.dll은 RunDLL.exe와 같은 폴더에 있어야합니다. SourceCode 폴더에는 프로그램의 소스 코드가 포함되어 있습니다.
DebugFiles 폴더에는 원하는 경우 심볼을 확인하는데 사용할 수있는 디버그 파일이 포함되어 있습니다.
디버그 파일을 RunDLL.exe 및 DLL.dll과 같은 폴더에 넣습니다


- Dynamic Libraries

(프로그램과 따로 분리되어 로드된다. 다양한 프로그램에서 사용될 수 있다. 프로그램 크기가 감소한다.)
A Dynamic Link Library (DLL) is a library that is loaded separately from the program that uses it. The advantage of DLLs is that you can load one DLL into memory, and multiple programs can use it. This decreases the size of programs.

 

- Static Libraries

(프로그램과 함께 링크된다. 링크된 프로그램에서만 사용할 수 있다. 프로그램 크기가 더 커진다.)
A static library is linked directly to/with the program that uses it. A library that is statically linked cannot be used by multiple programs at once. The library is part of the program it is used in. This makes the program bigger because of the extra code.

 

Import - 외부 소스에서 가져온 것입니다. 라이브러리에서 함수를 사용하려면 라이브러리로부터 해당 함수를 import해야 합니다.
Export - 다른 소스에서 가져올 수 있도록 외부에 exposed 된 것입니다. DLL이 해당 함수를 exported 했기 때문에 DLL로부터 함수에 접근할 수 있습니다.


exported 됬기 때문에 당신의 프로그램은 그것을 import할 수 있습니다.

 


- dumpbin 소개 (C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe)

 

dumpbin은 M$에서 제공하는 COFF(Common Object File Format) / PE(Portable Executable)
포맷의 내용을 dump 떠서 확인할 수 있게 해 주는 툴이다.

 

PE는 실행가능한 이미지에 해당하며, COFF는 오브젝트 개념이다.

이 dumpbin을 통해 COFF/PE 헤더의 내용을 모두 확인할 수 있다.

 

DLL을 다룰 때 유용한 exports/imports 테이블을 확인할 수 있으며,

section header를 통해 해당 바이너리의 섹션 정보를 확인할 수 있다.

 

To show the exports for a DLL use the command dumpbin DLL.dll /EXPORTS.

 

x64dbg를 사용할 수도 있습니다. 먼저 DLL을 x64dbg에 로드하십시오.

로드되면 "기호"탭으로 이동하십시오. "모듈"열에 DLL.dll이 표시 될 때까지 실행 버튼을 계속 누르십시오.

 

그 밖에 함수 exports를 찾는 도구가 많이 있습니다. 또 다른 대중적인 방법은 "Dependency Walker"라는 도구를 사용하

는 것입니다.

 


- Function Overriding, Mangling, and Decoration

 

PrintArray@@YAXQEHH@Z, PrintArray@@YAXQEAD@Z와 같은 함수 이름의 일부분인 랜덤한 문자 무엇입니까?
이 이름 맹글링은 함수 오버라이딩을 위해 수행됩니다. 함수 오버라이딩은 다른 이름을 가진 동일한 이름의 여러 기능을 허용합니다.

 

예를 들어, 추가 기능을 원할 수 있습니다. 정수 또는 부동 소수점을 추가하는 기능을 원할 것입니다.
이를 위해 함수 오버라이딩을 사용할 수 있습니다. 또 다른 예는 다음과 같습니다.

 

float Add(float x, float y){
return x+y;
}

int Add(int x, int y){
return x+y;
}

When a function's name is mangled, it's called a decorated function.

함수 이름이 맹글됬을 때 (@@랜덤문자@@), 그것을 decorated 함수라고 부릅니다.

 

DLL에서 우리는 리버싱할 것입니다."PrintArray"라는 두 함수가 모두 decorated 되어 있는걸 볼 수 있습니다.
이것은 그것들이 오버라이딩되고 하나는 다른 것과 다른 파라미터를 취한다는 것을 의미합니다.
이것이 보장되는 것은 아니지만 대부분 동일한 작업을 수행합니다.

 

decorated 함수는 C의 기능이 아닙니다. 데코레이션되지 않은 함수는 C함수가 됩니다.
함수 선언 앞에 extern "C"를 붙여서 함수를 C함수로 수동으로 정의할 수 있습니다.
이 때문에 SayHello와 같은 다른 함수에는 extern "C"접두사가 있다고 가정 할 수 있습니다.

 

오버라이딩이 없는 함수는 C함수로 정의할 필요가 없습니다.
보시다시피 InitializeClass는 decorated 되어 있지만 같은 이름을 가진 다른 함수는 없으므로 overwriting되지 않습니다.
decorated 함수에 대한 좋은 점은 리턴 유형과 매개 변수를 알 수 있다는 것입니다.
InitializeClass가 "Player"라는 클래스에 대한 포인터를 가져와서 void를 반환한다는 것을 알 수 있습니다.

 

당신은 또한 "__cdecl"을 볼 수 있습니다. 이것은 호출규약 인 C선언의 약자입니다.
cdecl 호출규약을 따를 필요는 없지만 C 함수이기 때문에 접두사가 붙습니다.