티스토리 뷰
Delphi Application Reversing Technique - 2 (Analysis Delphi Application)
RCE_Mania 2014. 8. 21. 15:07<!--[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을 사용하기 때문에 함수호출 매개변수는 ECX와 EDX레지스터를 사용하고 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필드의 Address와 Name의 배열은 같습니다.
델파이 어플리케이션의 메인폼에 등록된 프로시저의 주소와 이름은 Events필드의 Address와 Name을 통해 확인됩니다. 결론적으로 델파이 어플리케이션 리버싱에서는 엔트리포인트에 해당하는 프로젝트 파일의 코드부분과 Events필드에 등록된 프로시저의 주소들을 기반으로 분석을 진행해야 프로세스의 실행흐름을 순차적으로 확인할 수 있습니다.
또, 델파이 디컴파일 툴을 이용하면 메인폼에 등록된 Events와 Controls에 대한 정보를 손쉽게 확인할 수 있습니다.
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 |
- Total
- Today
- Yesterday
- Mobile hacking
- 델파이 분석
- Mobile security threat
- Ghidra
- 애드센스
- Analysis
- REMNux
- IA-32
- 티스토리
- 썸네일
- 디컴파일에러
- AOSP
- build
- OSX
- Python
- 스킨
- 광고
- 악성코드 분석
- Mobile game hacking
- Github
- Malware
- Android
- 델파이 리버싱
- 악성코드
- delphi
- Mobile Security
- reversing
- segment
- Cyber Threat
- 구글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |