Windows 테스트 빌드
리눅스 테스트 빌드
Drltrace는 Windows 및 Linux 애플리케이션을 위한 동적 API 호출 추적 프로그램입니다. Drltrace는 DynamoRIO 동적 바이너리 계측 프레임워크 위에 구축되었습니다. Drltrace는 처음에 Derek Bruening에 의해 구현되었으며 DynamoRIO 및 DrMemory 프레임워크와 함께 배포되었습니다. 이 저장소에는 맬웨어 분석에 사용하는 방법에 대한 추가 스크립트 및 자료와 함께 drltrace의 독립형 버전이 포함되어 있습니다. 릴리스 빌드는 여기에서 다운로드할 수 있습니다.
drltrace의 사용법은 매우 간단합니다. 사용자는 다음과 같은 방법으로 로그 디렉터리와 대상 프로세스의 이름을 지정해야 합니다.
drltrace -logdir . -- calc.exe
그게 전부입니다. 도구는 대상 프로세스에 필수 DLL을 삽입하고 계측을 시작하며 동시에 대상 프로세스에서 실행되는 모든 라이브러리 호출에 대한 정보를 기록합니다.
~~43600~~ msvcrt.dll!__wgetmainargs
arg 0: 0x010d2364
arg 1: 0x010d2368
and return to module id:0, offset:0x193a
~~43600~~ ntdll.dll!EtwEventRegister
arg 0: 0x002ff994
arg 1: 0x010d1490
and return to module id:0, offset:0x157e
~~43600~~ ntdll.dll!EtwEventSetInformation
arg 0: 0x007b4b40
arg 1: 0x00000033
and return to module id:0, offset:0x15a1
~~43600~~ SHELL32.dll!ShellExecuteW
arg 0: <null> (type=<unknown>, size=0x0)
arg 1: <null> (type=wchar_t*, size=0x0)
arg 2: calculator:// (type=wchar_t*, size=0x0)
arg 3: <null> (type=wchar_t*, size=0x0)
arg 4: <null> (type=wchar_t*, size=0x0)
arg 5: 0x1 (type=int, size=0x4)
and return to module id:0, offset:0x167d
출력 형식은 간단하며 외부 스크립트로 쉽게 구문 분석할 수 있습니다.
~~[thread id]~~ [dll name]![api call name]
arg [arg #]: [value] (type=[Windows type name], size=[size of arg])
and return to module id:[module unique id], offset:[offset in memory]
-grepable
인수를 사용하면 grep
을 사용한 구문 분석을 수행할 수 있습니다. 이는 함수 이름과 인수를 모두 한 줄에 인쇄합니다.
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:WindowsFontsstaticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
모듈 고유 식별자 테이블은 로그 파일 끝에 인쇄됩니다.
Module Table: version 3, count 70
Columns: id, containing_id, start, end, entry, checksum, timestamp, path
0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:WindowsSysWOW64calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:UsersMaxDownloadsdrltracedrltracedynamoriolib32releasedynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:UsersMaxDownloadsdrltracedrltracebinrelease/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:WindowsSystem32CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:WindowsSystem32SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:WindowsSystem32GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:WindowsSystem32RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:WindowsSystem32IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:WindowsSystem32advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:WindowsSystem32cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:WindowsSystem32SHELL32.dll
Drltrace는 대용량 로그를 생성하는 애플리케이션의 경우 매우 유용한 -only_from_app
옵션을 지정하여 라이브러리 간 호출을 쉽게 필터링하고 대상 애플리케이션의 기본 모듈(또는 힙)에서 수행된 API 호출만 인쇄할 수 있습니다. 보다 세부적인 제어를 위해 -filter
옵션을 사용하면 사용자는 특정 화이트리스트 기능을 필터링하거나 블랙리스트 기능을 무시하기 위해 필터 구성 파일을 지정할 수 있습니다(예제는 filter.config 파일 참조). Drltrace에는 특정 라이브러리에 대한 API 호출을 필터링하고 잠재적으로 흥미로운 API 호출 및 문자열만 인쇄하는 몇 가지 유용한 외부 스크립트도 있습니다.
Drltrace 기본 모듈은 BSD에 배포됩니다.
drltrace에 필요한 일부 파일은 LGPL에 따라 배포됩니다. 자세한 내용은 소스 파일을 참조하세요.
악성코드 분석은 쉬운 일이 아닙니다. Themida 및 Armadillo와 같은 정교한 소프트웨어 패커와 물론 맬웨어 작성자가 작성한 수십 개의 이름 없는 패커와 코드 및 데이터 암호화는 이러한 샘플의 정적 역엔지니어링을 상당히 촉진(어떤 경우에는 완전히 불가능하게 함)하여 맬웨어 분석가의 삶을 복잡하게 만듭니다. 이러한 경우 API 호출 추적을 통해 실제 악의적인 의도를 파악하는 데 필요한 시간을 크게 줄이고 보호된 악성 코드에 대한 많은 기술적 세부 정보를 공개할 수 있습니다.
전통적인 API 후킹 기술이 여러 솔루션에서 성공적으로 구현되었지만 이 접근 방식은 악성 코드 작성자에 의해 잘 연구되었으며 쉽게 탐지 및/또는 우회할 수 있습니다. 더욱이 이러한 도구는 기존 악성 코드 분석 워크플로우 내에서 통합하기가 쉽지 않은 독립 실행형 무거운 GUI 애플리케이션(독점 제품)으로 배포됩니다.
Linux 세계를 살펴보면 ltrace라는 훌륭한 도구가 있습니다. 단일 bash 명령을 사용하면 특정 실행 파일의 API 호출 전체 추적을 쉽게 얻을 수 있습니다.
최신 악성 코드가 사용하는 연구 방지 트릭에 대해서도 투명한 Windows용 도구(Linux의 ltrace와 같은)가 없는 이유는 무엇입니까?
Windows용 도구를 보유하고 실행된 프로그램에 대한 API 호출을 투명하게 추적하는 데 도움이 될 수 있는 기술이 있습니다. 이 기술을 동적 바이너리 계측(DBI)이라고 합니다. DBI는 계측 코드 삽입을 통해 런타임 시 바이너리 애플리케이션의 동작을 분석하는 기술입니다.
그러나 악성 코드 분석을 위한 DBI 적용은 자동화와 지침, 기본 블록 및 함수 호출 추적에 대한 여러 가지 개념 증명을 풀기 때문에 당연히 제한됩니다. 우리가 아는 한, drltrace는 실제로 악성 코드 분석에 사용할 수 있는 DBI 기반 API 호출 추적을 위한 첫 번째 도구입니다. 우리는 IDA나 디버거를 시작하지 않고도 drltrace가 정교한 악성 샘플에 대한 많은 내부 기술 세부 정보를 몇 분 안에 공개할 수 있었는지 설명하는 위키에서 여러 가지 악성 코드 분석 예제를 제공했습니다.
-logdir [ .] Log directory to print library call data
-only_from_app [ false] Reports only library calls from the app
-follow_children [ true] Trace child processes
-print_ret_addr [ false] Print library call's return address
-num_unknown_args [ 2] Number of unknown libcall args to print
-num_max_args [ 6] Maximum number of arguments to print
-default_config [ true] Use default config file.
-config [ ""] The path to custom config file.
-filter [filter.config] The path of the whitelist/blacklist file.
-ignore_underscore [ false] Ignores library routine names starting with "_".
-help [ false] Print this message.
-version [ false] Print version number.
-verbose [ 1] Change verbosity.
-use_config [ true] Use config file
-grepable [ false] Grepable output
Drltrace는 사용자가 drltrace가 특정 API 호출에 대한 인수를 인쇄하는 방법을 설명할 수 있는 외부 구성 파일을 지원합니다.
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
각 함수 인수는 |
로 구분되어야 합니다. . 첫 번째 인수는 반환 유형이고 두 번째 인수는 함수 이름 자체이며 나머지는 함수 인수입니다. __out
토큰은 출력 인수를 표시하는 데 사용되고 ___inout
입력+출력 인수를 표시하는 데 사용됩니다.
Wiki 페이지에서 복잡한 악성 코드 분석을 위해 drltrace를 사용하는 방법에 대한 예를 찾을 수 있습니다.
로그 파일 작업을 더 쉽게 만들기 위해 각 픽셀 색상이 고유한 API 호출을 나타내는 RGB 이미지를 생성하는 데 사용할 수 있는 api_calls_viz.py
라는 스크립트를 구현했습니다. 예를 들어 아래 그림은 워너크라이(WannaCry) 악성코드의 로그 파일을 나타낸다.
그림의 큰 녹색 영역은 흥미로운 확장자(예: docx, xls, py)가 있는 파일을 선택하여 암호화하는 데 사용되는 API 호출( wcscmp/wcsicmp
)을 나타냅니다. 보라색 영역은 디스크의 파일과 폴더를 열거하고 암호화하는 데 사용되는 API 호출( FindFirstFile/FindNextFile/CryptEncrypt
)을 나타냅니다.
스크립트는 API 호출의 이름을 표시하기 위해 각 요소를 선택할 수 있는 생성된 RGB 이미지의 HTML 표현을 생성할 수도 있습니다.
원시 HTML 파일.
자세한 내용은 api_calls_viz
디렉터리를 참조하세요.
이 Wiki 페이지에서 자세한 매뉴얼을 찾을 수 있습니다.
Windows, Linux(향후 macOS).
x86, x64(목록에 ARM).
C 및 C++ 표준 라이브러리(및 Python으로 작성된 로그 처리 스크립트)
우리는 동적 바이너리 계측 프레임워크 DynamoRIO 위에 API 호출 추적기를 구현하기로 결정했습니다. Drltrace는 대상 프로세스에 의해 로드되는 새 라이브러리를 처리할 수 있도록 DynamoRIO에게 LoadLibrary 호출 계측을 수행하도록 요청합니다. 프로세스가 새 라이브러리를 로드하려고 시도하면 DynamoRIO는 제어 흐름을 drltracelib.dll
로 리디렉션합니다. 그러면 drltrace는 새로 로드된 DLL에 내보낸 함수를 열거하고 각 함수에 대한 특수 콜백을 등록합니다. 따라서 일부 내보낸 함수가 맬웨어에 의해 호출되는 경우 drltrace의 콜백은 이 함수 전에 실행되며 도구는 함수 이름 및 인수와 같은 모든 필수 정보를 기록할 수 있습니다. 실행 결과를 저장하기 위해 함수 뒤에 또 다른 콜백을 등록할 수도 있습니다.
왜 인텔 핀이 아닌가? 우리는 다음과 같은 이유로 DynamoRIO를 사용하기로 결정했습니다:
drrun.exe
의 -syswide_on
옵션). 그러나 앞으로는 그러한 상황에 대비하여 drltrace에서 특별한 지원을 구현할 필요가 있습니다.우리의 이슈 트래커에는 drltrace의 미래에 대한 자세한 내용이 포함되어 있습니다.
막심 슈드락 https://github.com/mxmssh
데릭 브루닝 https://github.com/derekbruening
조 테스타 https://github.com/jtesta