티스토리 뷰

<!--[if !supportLists]-->1. <!--[endif]-->Analysis Delphi application

<!--[if !supportLists]-->1.1. <!--[endif]-->Malware File Info

분석에 사용된 샘플은 중국 커뮤니티 사이트인 3jy.com을 경유지로 사용한 악성코드로 시스템에 감염될 경우 2345.cn에서 제공하는 어플리케이션을 설치하는 악성 애드웨어입니다.

  

Malware Name

cos.exe

File Size

671,744 Byte

MD5

E224ACD0DE41161B8B91D043DB9926D5

Compiled Date

1992.06.20 07:22:17

Etc

Borland Delphi 6.0 - 7.0

Table 1. File Info


<!--[if !supportLists]-->1.2. <!--[endif]-->Analysis Environment

샘플의 개발 언어는 Borland Delphi 6.0 – 7.0이며 상위 버전의 경우 분석 결과가 다를 수 있습니다.

 

Index

Description

OS

Windows XP SP3 KR

Browser

Windows Internet Explorer 8

Language

Borland Delphi 6.0 – 7.0

Table 2. Analysis Environment


<!--[if !supportLists]-->1.3. <!--[endif]-->Analysis Detail

IDA를 이용해 샘플을 열어보면 아래와 같이 프로젝트 코드를 확인할 수 있으며 해당 샘플의 경우 뮤텍스를 생성하는 루틴이 추가되었습니다.

 

Figure 1. Delphi Application Entry-1


CreateForm메소드를 이용해 폼을 메모리에 할당하고 Run메소드를 이용해 내부적으로 메시지 루프를 실행시킵니다. 메시지 루프에서는 발생하는 메시지에 따라 프로시저를 호출하게 되며 메시지 루프를 실행하기까지 수행되는 메소드의 실행순서는 아래와 같습니다.

<!--[if !supportLists]-->-       <!--[endif]-->TApplication::Run

<!--[if !supportLists]-->n  <!--[endif]-->TApplication::HandleMessage

<!--[if !supportLists]-->u  <!--[endif]-->TApplication::ProcessMessage

<!--[if !supportLists]-->l  <!--[endif]-->Message Loop Execution


 

Figure 2. Message loop

 

어플리케이션의 세부 동작을 분석하기 위해서는 DispatchMessage로 호출되는 프로시저의 주소를 찾아야 하며, 해당 주소는 VMT(Virtual Method Table)의 주소로부터 확인할 수 있습니다.


 

Figure 3. Virtual Method Table


VMT의 주소는 메인폼을 메모리에 할당하는 CreateForm메소드의 첫 번째 매개변수인 TConponentClass에서 확인할 수 있습니다.


 

Figure 4. CreateForm Method

 

델파이 어플리케이션의 함수호출은 Fastcall을 사용하기 때문에 함수호출 매개변수는 ECXEDX레지스터를 사용하고 2개를 초과하는 매개변수에 대해서는 오른쪽에서 왼쪽으로 스택에 저장합니다. 그렇기 때문에 VMT의 주소는 CreateForm메소드를 호출하기 전 EDX레지스터에 할당됩니다.


 

Figure 5. Delphi Application Entry-2


 

VMT 메모리의 구조는 VMT와 메인폼에 등록된 Controls필드와 Events필드로 구성됩니다.

 

Figure 6. VMT Structure

 

Controls필드와 Events필드의 바이트 배열의 정보는 아래와 같습니다.

 

Controls

ID

Type

NameLength

Name

Size

4Byte

2Byte

1Byte

[NameLength]Byte

Table 3. Controls field

 

Events

Hint

Address

NameLength

Name

Size

2Byte

4Byte

1Byte

[NameLength]Byte

Table 4. Events field

 

각 각의 필드간에 포함된 바이트 배열의 정보는 확인이 안됐으며 최신 델파이 버전에서도 바이트 배열의 차이가 약간 있는 것으로 보이지만 Events필드의 AddressName의 배열은 같습니다.


 

델파이 어플리케이션의 메인폼에 등록된 프로시저의 주소와 이름은 Events필드의 AddressName을 통해 확인됩니다. 결론적으로 델파이 어플리케이션 리버싱에서는 엔트리포인트에 해당하는 프로젝트 파일의 코드부분과 Events필드에 등록된 프로시저의 주소들을 기반으로 분석을 진행해야 프로세스의 실행흐름을 순차적으로 확인할 수 있습니다.

 

, 델파이 디컴파일 툴을 이용하면 메인폼에 등록된 EventsControls에 대한 정보를 손쉽게 확인할 수 있습니다.


 

Figure 7. Events info


 

Figure 8. Controls info

 

'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 - 1 (Whis is Delphi Application)  (0) 2014.08.21
댓글