Delphi 악성 파일 분석

Delphi 악성 파일 분석

Delphi, .Net 과 같은 프로그래밍 언어로 작성된 PE 실행 파일을 분석할 때는 요령이 필요하다. 이러한 언어로 작성된 실행 파일은 PE 파일의 규격을 따르기 때문에 일반적인 PE 파일처럼 분석해도 되지만, 굳이 분석하지 않아도 되는 내용이 압도적으로 많아 시간을 무의미하게 허비할 수 있다.

이 글에서는 Delphi 언어로 작성된 PE 실행 파일에서 Delphi 함수 심볼을 찾아 rename 하는 방법에 대해 설명하겠다.

Interactive Delphi Reconstructor

IDR 은 Delphi 언어로 빌드된 PE 파일을 디컴파일하는 기능을 가진 프로젝트이다.
링크의 Git repository 를 다운로드 후, /bin/Idr.exe 파일을 실행하면 IDR을 실행할 수 있다.

IDR 을 실행하기 위해서는 Delphi Knowledge Base 바이너리 파일이 필요하다. 분석할 샘플의 Delphi 버전에 맞는 Delphi Knowledge Base 을 다운로드 후, 바이너리 파일을 /bin/ 경로에 저장한다.

테스트 샘플은 Delphi 6 버전이므로 kb6.bin 파일을 다운로드했다. 실행 파일의 Delphi 버전을 잘 모르겠다면 Autodetect Version 을 클릭하여 어떤 버전의 바이너리를 로딩하려고 시도하는지 확인하자.

File - Load File - Autodetect Version 을 클릭하여 분석 대상 Delphi 실행 파일을 지정한다. 참고로 앞서 저장한 Knowledge Base 바이너리를 제대로 인식하여 Delphi6 버전 버튼이 활성화된 것을 확인할 수 있다.

Delphi 파일 버전 선택

Native Knowledge Base 사용 여부를 묻는 창이 뜨면 클릭한다.

native Knowledge 사용 여부 선택

정상적으로 로딩되면 아래와 같이 Delphi 네이티브 함수의 이름이 복구된 것을 확인할 수 있다.

IDR에 의해 복구된 Delphi 코드

다음은 Tools - IDC Generator 버튼을 클릭하여 .idc 파일을 생성한다. .idc 파일은 IDR 이 분석한 Delphi 메타 데이터를 가지는 파일이다.

IDC Generator 선택

Dhrake

Dhrake 는 Ghidra 와 IDR 을 이용하여 Delphi 바이너리를 정적 분석하는 Ghidra 스크립트이다. DhrakeDhrakeInit.java, DhrakeParseClass.java 로 구성되며, 본문에서는 함수 심볼 이름을 rename 하는 DhrakeInit.java 스크립트에 대해서만 다루겠다.

Ghidra 로 테스트 샘플을 로딩한 후, Script Manager 를 실행하여 DhrakeInit.java 스크립트를 실행하면 파일 선택창이 출력된다. 앞서 IDR 로 생성한 .idc 파일을 선택하면 IDR 이 생성한 메타데이터를 토대로 Ghidra 에 함수 이름을 포함한 심볼 데이터를 적절하게 rename하거나 comment 한다.

정상적으로 스크립트가 실행되었다면 아래 이미지와 같이 .idc 파일의 메타 데이터를 이용하여 함수명이 rename 된 것을 확인할 수 있다.

.idc 파일을 통해 rename 된 Delphi 코드
rename 된 Delphi 함수 리스트