티스토리 뷰

<!--[if !supportLists]-->1. <!--[endif]-->Overview

<!--[if !supportLists]-->1.1. <!--[endif]-->What is Delphi

델파이는 볼랜드사로 이직한 엔더슨 헤즐버그가 개발한 터보 파스칼에서 시작되어 볼랜드 파스칼로 이어졌으며, 1995년에 RAD 개발 환경을 갖춘 델파이로 다시 탄생하여 현재는 엠바카데로사에서 소유하여 개발하고 있습니다. 델파이는 윈도우 환경에서 모든 부분을 프로그래밍할 수 있는 강력한 고급 언어로 높은 생산성과 간결한 코드가 대표적인 장점이지만, 한편으로는 C++과 비슷한 수준의 저 수준의 시스템 프로그래밍도 가능합니다.

 

현재 엠바카데로 델파이의 XE6 버전까지 릴리스 되어 윈도우, , iOS, Android에서 개발 가능한 환경을 지원하고 있습니다.

 

Figure 1. Delphi XE6 overview

 

 

 


 

<!--[if !supportLists]-->2. <!--[endif]-->Delphi unit components

델파이의 프로젝트는 여러 가지 유닛들로 구성됩니다. 유닛은 상수, 데이터 형, 변수, 프로시저, 함수 등의 집합체로 프로그램을 짜맞출 수 있는 선언 라이브러리이며, 프로그램을 분할하여 각각의 컴파일을 하기 위한 것입니다.

 

델파이의 유닛은 아래와 같이 크게 네 종류가 있습니다.

<!--[if !supportLists]-->1)    <!--[endif]-->Project File

<!--[if !supportLists]-->2)    <!--[endif]-->Pas File (Unit)

<!--[if !supportLists]-->3)    <!--[endif]-->DCU(Delphi Compiled Unit) File

<!--[if !supportLists]-->4)    <!--[endif]-->Form File

 

델파이가 사용하는 유닛들은 오브젝트 파스칼의 형식에 RAD(Rapid Application Development)를 구현하기 위한 폼 파일이 추가된 형태로 폼 파일을 이용해 Visual Basic과 같은 빠른 개발 환경을 제공합니다. 물론 콘솔 애플리케이션이나 DLL 프로젝트 같이 폼이 없는 프로젝트에서는 폼 파일을 사용하지 않습니다.

 

<!--[if !supportLists]-->2.1. <!--[endif]-->Project File

프로젝트 파일은 프로그램의 메인으로 다른 유닛이나 폼들을 포함하는 총 연결파일입니다. 때문에 델파이로 작성된 모든 어플리케이션의 Entry Point는 프로젝트 파일을 가리키게 됩니다. 기본적으로 프로젝트 파일은 델파이가 자동으로 생성해주므로 편집을 하지 않아도 되지만, 악성코드와 같은 별도의 행위를 위해서 종종 코드가 변경되는 경우가 있습니다.


 

Figure 2. Project file


<!--[if !supportLists]-->2.2. <!--[endif]-->Analysis to project file

<!--[if !supportLists]-->2.2.1. <!--[endif]-->유닛 헤더

파스칼의 모든 유닛은 유닛 헤더에 유닛의 종류와 유닛 이름을 쓰며, 프로젝트 파일의 경우 program이라고 유닛의 종류를 명시합니다. 또한 유닛 종류와 유닛 이름은 소스 코드 에디터 상에서 직접 작성하지 않고 프로젝트나 유닛을 저장할 때 델파이가 자동으로 작성합니다. 유닛의 종류가 program인 것은 해당 프로젝트가 EXE확장자를 갖는 애플리케이션 임을 나타내고 library인 경우는 DLL확장자를 갖는 동적 링크 라이브러리를 나타냅니다.


 

Figure 3. Unit header


<!--[if !supportLists]-->2.2.2. <!--[endif]-->참조 유닛

델파이에서는 하나의 폼을 하나의 유닛에 작성하는 것을 기본 원칙으로 합니다. 이때 다른 유닛의 interface에 선언된 함수나 자료형 등을 사용하려면 uses절에 해당 유닛을 선언해 주어야 합니다. C #include와 비슷한 역할을 한다고 보면 되고, 프로젝트 파일의 uses는 일반 유닛의 uses와는 또 다르게 프로젝트관리자에 나타내는 목록으로도 사용됩니다.


 

Figure 4. Uses-1

 

프로젝트관리자에서는 폼이 있는 유닛과 그렇지 않은 유닛으로 표현되는데 {Formx}는 폼이 있음을 표현하고 해당 폼을 {}내부에 표현합니다.


 

Figure 5. Uses-2


<!--[if !supportLists]-->2.2.3. <!--[endif]-->컴파일 명령

Figure 6. Compile command

<!--[if !supportLists]-->-       <!--[endif]-->$ : 컴파일 지시자로 컴파일러에게 지시를 하는 것

<!--[if !supportLists]-->-       <!--[endif]-->R : 리소스를 포함하라는 뜻

<!--[if !supportLists]-->-       <!--[endif]-->*.res : 확장자가 res인 모든 파일

 

델파이는 한 프로젝트에 한 개의 리소스 파일을 자동으로 생성해 주므로 사용자가 직접 리소스 파일을 만들지 않아도 된다.

 

<!--[if !supportLists]-->2.2.4. <!--[endif]-->Source (begin .. end)

프로젝트의 실행부분으로 어플리케이션의 시작은 프로젝트 파일의 begin에서 시작됩니다.


 

Figure 7. Source

 

CreateForm메소드는 폼을 생성하는데 해당 메소드를 이용하여 제일먼저 생성되는 폼이 이 프로젝트의 메인 폼이 됩니다. Run메소드는 메시지를 처리하는 메시지 루프가 들어있는 메소드로 어플리케이션에 전달되는 모든 메시지는 Run메소드 안에서 호출되며 Run메소드가 종료되는 시점이 이 애플리케이션이 종료되는 시점입니다. , CreateForm을 이용해 메모리에 폼을 할당하고 Run메소드를 통해 메인폼을 화면에 보여줍니다.


<!--[if !supportLists]-->2.3. <!--[endif]-->Pas File (Unit)

어플리케이션의 구체적인 루틴들은 그 기능과 종류, 역할 등에 따라서 여러 유닛에 나누어져서 작성하게 되며 유닛은 크게 선언부, 구현부, 초기화 부분으로 나뉘어집니다. 선언부에는 interface절부터 var절까지로 델파이 타입 선언(type), 상수, 변수, 프로시져, 함수 선언 등의 작업을 수행합니다. Implementation절부터는 구현부로서 실제 소스코드를 작성하게 되는 곳이며 추가적으로 초기화 작업이 필요할 경우 initialization절과 finalization절을 이용하여 초기화 작업을 수행할 수 있습니다.


 

Figure 8. Pas File (Unit)

 

<!--[if !supportLists]-->2.4. <!--[endif]-->DCU File

DCU파일은 Pas파일이 컴파일된 유닛입니다. C에서의 오브젝트 파일과 비슷하지만 오브젝트 파일이 완전하게 컴파일 된 목적 파일이므로 형 정의, 전역 변수, 전역 상수 등을 다른 유닛에서 참조할 수 없으므로 링크 단계에서만 사용됩니다. 때문에 오브젝트 파일의 내용을 사용하기 위해서는 오브젝트 파일에서 사용된 내용이 정의된 헤더 파일이 따로 있어야 합니다. 하지만 델파이의 DCU는 완전한 목적 파일이 아니고 목적 파일과 선언부가 합쳐진 상태라고 말 할 수 있는데 Pas 파일의 기본 구조, 즉 형 정의, 변수, 상수 정의 등을 모두 가지고 있어서 다른 유닛이 DCU의 선언부를 참조 할 수 있습니다. 때문에 DCU파일은 별도의 유닛이 없이도 그 자체 만으로도 사용될 수 있습니다. 하지만, 이러한 특징 때문에 디컴파일에 취약한 단점을 지니고 있습니다.

 

<!--[if !supportLists]-->2.5. <!--[endif]-->Form File

델파이는 폼 디자이너를 통해서 폼을 디자인합니다. 이 때 디자인된 폼의 데이터를 dfm확장자를 가진 파일로 저장하게 되는데 이 파일은 파스칼 문법으로 작성된 소스 코드가 아니고 델파이만의 특별한 포맷으로 만들어진 파일입니다. 폼 파일은 pas유닛이 저장될 때 함께 저장되며 텍스트로 된 폼 파일을 바이너리로 바꾸거나 바이너리로 된 폼 파일을 텍스트로 바꿀 때는 델파이의 Bin 폴더에 있는 Convert.exe를 이용할 수 있습니다.

 

  

델파이 어플리케이션 리버싱을 위해 먼저 알아야 할 델파이 어플리케이션의 코드 흐름은 첫째로 어플리케이션의 시작점인 엔트리는 프로젝트 파일의 코드부분부터이며, 둘째로 어플리케이션의 실제 기능이 동작하는 프로시저와 함수들은 Pas(Unit)파일의 Implementation절에 있는 구현부에서부터 시작한다는 것 입니다.

 


ref. http://withwani.tistory.com/80

'Reversing' 카테고리의 다른 글

Ghidra PDB Execution failure  (0) 2020.12.11
Ghidra Installation  (0) 2020.12.10
How to reversing Il2cpp  (4) 2019.03.05
Cutter : Radare2 공식 GUI 툴  (0) 2018.06.20
Delphi Application Reversing Technique - 2 (Analysis Delphi Application)  (0) 2014.08.21
댓글