
Drltrace는 Windows 및 Linux 애플리케이션을 위한 라이브러리 호출 추적기입니다.
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:\Windows\Fonts\staticcache.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:\Windows\SysWOW64\calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:\Users\Max\Downloads\drltrace\drltrace\dynamorio\lib32\release\dynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:\Users\Max\Downloads\drltrace\drltrace\bin\release/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:\Windows\System32\CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:\Windows\System32\SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:\Windows\System32\GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:\Windows\System32\RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:\Windows\System32\IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:\Windows\System32\advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:\Windows\System32\cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:\Windows\System32\SHELL32.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와 같은) 이러한 도구가 없으며, 또한 최신 맬웨어에서 사용하는 안티-리서치 트릭에 대해 투명한 도구는 없을까요?
이를 가능하게 하는 기술이 있습니다: 동적 바이너리 계측(DBI)입니다. DBI는 계측 코드를 삽입하여 런타임 시 바이너리 애플리케이션의 동작을 분석하는 기술입니다.
그러나 맬웨어 분석에 DBI를 적용하는 것은 언패킹 자동화와 명령어, 기본 블록, 함수 호출 추적에 대한 몇 가지 개념 증명에 지나치게 제한되어 있습니다. 우리가 아는 한, drltrace는 DBI를 기반으로 한 최초의 API 호출 추적 도구로서 실제 맬웨어 분석에 사용될 수 있습니다. 우리는 위키에서 drltrace가 IDA나 디버거를 시작하지 않고도 몇 분 만에 정교한 악성 샘플의 많은 내부 기술 세부 정보를 밝혀낼 수 있었던 여러 맬웨어 분석 예제를 제공했습니다.
-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는 사용자가 특정 API 호출에 대한 인수를 어떻게 출력할지 설명할 수 있는 외부 구성 파일을 지원합니다.
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
각 함수 인수는 |로 구분해야 합니다. 첫 번째 인수는 반환 유형, 두 번째 인수는 함수 이름 자체이며 나머지는 함수 인수입니다. 토큰 __out은 출력 인수를 표시하고 ___inout은 입력+출력 인수를 표시합니다.
복잡한 맬웨어 분석에 drltrace를 사용하는 방법에 대한 예제는 Wiki 페이지에서 확인할 수 있습니다.
로그 파일 작업을 더 쉽게 하기 위해 api_calls_viz.py라는 스크립트를 구현했습니다. 이 스크립트는 각 픽셀 색상이 고유한 API 호출을 나타내는 RGB 이미지를 생성하는 데 사용할 수 있습니다. 예를 들어 아래 그림은 WannaCry 맬웨어의 로그 파일을 나타냅니다.

그림의 큰 녹색 영역은 파일 확장자(예: docx, xls, py)를 선택하여 암호화하는 데 사용되는 API 호출(wcscmp/wcsicmp)을 나타냅니다. 보라색 영역은 디스크의 파일과 폴더를 열거하고 암호화하는 데 사용되는 API 호출(FindFirstFile/FindNextFile/CryptEncrypt)을 나타냅니다.
이 스크립트는 또한 생성된 RGB 이미지의 HTML 표현을 생성할 수 있으며, 각 요소를 선택하여 API 호출 이름을 표시할 수 있습니다.

자세한 내용은 api_calls_viz 디렉터리를 참조하세요.
자세한 매뉴얼은 Wiki 페이지에서 확인할 수 있습니다.
Windows, Linux (향후 macOS).
x86, x64 (ARM도 리스트에 포함).
C 및 C++ 표준 라이브러리 (로그 처리 스크립트는 Python으로 작성).
우리는 동적 바이너리 계측 프레임워크 DynamoRIO 위에 API 호출 추적기를 구현하기로 결정했습니다. Drltrace는 DynamoRIO에게 LoadLibrary 호출의 계측을 수행하도록 요청하여 대상 프로세스에서 새 라이브러리가 로드되는 것을 처리할 수 있게 합니다. 프로세스가 새 라이브러리를 로드하려고 하면 DynamoRIO는 제어 흐름을 drltracelib.dll로 리디렉션합니다. 그러면 drltrace는 새로 로드된 DLL에서 내보낸 함수를 열거하고 각 함수에 대해 특별한 콜백을 등록합니다. 따라서 맬웨어가 특정 내보낸 함수를 호출하면 drltrace의 콜백이 이 함수 전에 실행되어 함수 이름 및 인수와 같은 필요한 모든 정보를 기록할 수 있습니다. 함수 후에 다른 콜백을 등록하여 실행 결과를 저장할 수도 있습니다.
왜 Intel Pin이 아닌가? 다음과 같은 이유로 DynamoRIO를 사용하기로 결정했습니다:
drrun.exe의 -syswide_on 옵션). 그러나 향후에는 이러한 상황에 대한 특별 지원을 drltrace에 구현해야 합니다.이슈 트래커에는 drltrace의 미래에 대한 자세한 내용이 포함되어 있습니다.
Maksim Shudrak https://github.com/mxmssh
Derek Bruening https://github.com/derekbruening
Joe Testa https://github.com/jtesta