Bluepill 은 회피 맬웨어를 처리하기위한 오픈 소스 동적 분석 프레임 워크입니다. 목표는 수동 분석에 필요한 세밀한 실행 검사 및 패치 기능을 사용하여 자동 분석에 필요한 투명성 속성을 조정하는 것입니다.
Bluepill은 여가 시간에 우리가 유지하는 학문적 프로토 타입입니다. 귀하의 피드백은 소중합니다!
Bluepill은 하이퍼 바이저, 디버거, 타사 도구 및 타이밍 아티팩트를 대상으로하는 많은 적색 알약에 대응할 수 있습니다. DBI (Dynamic Binary Instrumentation)를 기반으로 맬웨어가 환경에서 인공물을 찾는 쿼리를 모니터링하여 자동화 된 분석 시스템 또는 휴먼 에이전트의 존재를 보여줄 때 결과를 변경합니다. Bluepill은 GDB 원격 인터페이스를 제공하여 분석가를 대신하여 퇴비를 돌보는 동안 샘플을 디버깅하고 새로운 스텔스 패치 메커니즘과 함께 자체 체크 덤밍 체계에서 디버거의 코드 변경을 숨기는 새로운 스텔스 패치 메커니즘을 제공합니다.
우리는 32 비트 Wind
Bluepill은 다음과 같이 제시되었습니다.
DBI Evasions에 대항하기 위해 Bluepill은 Paper Sok의 일환으로 Intel Pin 용으로 쓴 완화 라이브러리를 사용합니다. ASIACCS 2019에서 보안을위한 동적 바이너리 계측기 (및 붉은 손잡이를 잡는 방법)를 사용합니다. Bluepill에서는 시간 간과 및 gdb 원격 디그깅을 대상으로 한 시간 간과 및 레드 환약을위한 추가 완화를 위해 라이브러리를 확장했습니다. 눈에 띄는 특징 및 아티팩트가 최근 ACM DTRAP (Preprint)에 나타난 인공물에 대한 동적 바이너리 계측 시스템을 평가하는 논문에서 DBI 회피에 대한 자세한 내용을 읽을 수 있습니다.
Bluepill이 Windows 7 SP1 32 비트 virtualbox 5.2 기계에서 우리의 테스트에서 반대 된 부분 목록 아래에서 다양한 실행 가능 보호기 및 장갑 샘플을위한 다음과 같습니다.
| 범주 | 인스턴스 |
|---|---|
| 하이퍼 바이저 | 가상 상자의 게스트 추가, 파일, 레지스트리 항목, 라이브러리 및 드라이버 |
| 하드웨어 | 바이오스 및 펌웨어 문자열, MAC 주소, cpuid , 디스크 크기, 전원/열 기능 |
| 시간 | rtdsc 및 Windows 시간 관련 API를 사용한 둔화 감지 |
| 소프트웨어 | 공통 모니터링 도구 (실행 프로세스, GUI Windows), 부모 프로세스, HKL 키보드 레이아웃, 냉동 마우스 커서의 아티팩트 |
| 디버깅 | 단일 단계 예외, int 2d , 활성/설치된 디버거 (예 : NtQueryInformationProcess ), 프로세스 엔트리 블록 필드에 대한 OS 쿼리 |
| WMI 쿼리 | CPU, 디스크 크기, MAC 주소, ACPI, MUI 언어, VirtualBox VBOXVIDEO |
| DBI | FPU 지침, 메모리 내용 및 권한이있는 포인터 누출 (예 : 가드 페이지, NX 시행) |
참고 : BH Europe 2019에 공개되기 전에, 우리는 WOW64 서브 시스템의 64 비트 코드와 (적은 정도) 처리를 깨뜨리는 급진적 인 변경을 수행했습니다. 회귀 테스트를 완료 할 때 이러한 시나리오를 실험적으로 고려하십시오.
Bluepill은 Intel Pin (v3.16 권장)을 구축하며 컴파일을 위해 Visual Studio 2015 이상이 필요합니다.
PIN에는 프로젝트에 수동 포함이 필요한 일부 의존성이 있습니다. 프로젝트 구성을 단순화하는 Locals.props 파일을 만들었습니다. 기본값은 C:Pin316 에 PIN이 설치되고 SDK 8.1 헤더가 사용 중입니다.
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
예를 들어, SDK 10.0.17763.0 헤더를 사용하려면 Visual Studio에서 프로젝트 설정을 수정 한 후 WinHPath 속성의 값을 C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um 으로 변경해야합니다. similary, sdk 8.1 헤더가 C:/Program Files/ 에 C:/Program Files (x86)/ 대신 설치되면 속성 값을 수정하십시오. 이 필드의 목적은 CRT 헤더에서 Windows.h 의 절대 경로를 포함 할 때 핀을 지원하는 것입니다.
이제 Bluepill을 컴파일 할 수 있어야합니다. 컴파일이 끝나면 핀 디렉토리에 bluepill32.dll 라이브러리가 있습니다. 누락 된 msvc_compat.h 오류가 발생하면 $(PinFolder)extrascrtinclude 유효한 경로인지 확인하십시오.
Bluepill 사용 하에서 실행 파일을 실행하려면 :
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
Bluepill은 다음 명령 줄 옵션을 지원합니다.
| 옵션 | 의미 |
|---|---|
-evasions | 지원되는 대부분의 회피를 감지하고 처리하십시오 (DBI의 경우 아래 참조) |
-debugger | GDB 원격 인터페이스를 통해 디버거 모드를 활성화하십시오 |
-leak | DBI Evasions : 실제 EIP 누출 수정 (예 : FPU 지침) |
-nx | DBI Evasions : 코드 페이지가 실행 가능한지 확인하십시오 |
-rw | DBI Evasions : DBI 엔진에 속하는 페이지 숨기기 |
예를 들어, 샌드 박스와 같은 자동 모드에서 sample.exe 라는 회피 프로그램을 실행하려면 시도해보십시오.
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
-leak 완화를 가능하게하는 것은 성능에 미치는 영향을 최소화하지만 -nx 및 궁극적으로 -rw 프로그램의 주소 공간에서 적합성 검사를 시도하는 복잡한 패커를 도울 수 있습니다.
Bluepill은 evasions.log 라는 파일을 PIN의 폴더 C:Pin316 ( pintoolsrclogging.h 내부의 LOGPATH 변수를 수정하여 변경)을 작성합니다.
Bluepill은 디버거 사용을 지원하여 실행을 제어하고 맬웨어 해부를 수행합니다. 우리는 핀의 GDB 원격 인터페이스에 의존합니다. 따라서 Bluepill은 GDB 프로토콜을 지원하는 경우 디버거 도구에서 원격 백엔드로 사용할 수 있습니다. 다음에서는 IDA Pro와 디버깅 세션을 설정하는 지침을 제공합니다.
디버거 인터페이스를 활성화하려면 다음과 같이 PIN ( -appdebug -appdebug_server_port <port> ) 및 Bluepill ( -debugger ) 모두에 추가 명령 줄 옵션을 제공해야합니다.
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
이 안내서에서 10000 포트 번호로 사용합니다. 디버거를 소켓에 연결할 때까지 응용 프로그램은 일시 정지 상태를 유지합니다. 그러나 로컬 디버거를 프로세스에 연결 하려면 응용 프로그램 대신 전체 핀 엔진을 디버깅하게됩니다. 화면의 예상 출력은 다음과 같습니다.

이제 IDA에서 실행 파일을 열고 Debugger->Switch debugger 에서 원격 GDB 디버거 백엔드를 선택할 수 있습니다. 옵션 (예 : 포트 번호)이 Debugger->Process options 사용하여 아래 스크린 샷과 같이 올바른지 확인하십시오.

이 시점에서 기본 실행 가능 섹션 (예 : EntryPoint)의 일부 주소에 중단 점을 삽입하는 데 도움이됩니다. 그런 다음 Debugger->Start process 로 디버깅 세션을 시작할 수 있습니다. Ida는 "원격으로 이미 디버깅 된 프로세스가 있습니다. 첨부하고 싶습니까?" . 예를 클릭하면 디버깅 세션이 시작되며 EIP는 NTDLL.DLL 내부에 있습니다.
GDB 원격 프로토콜을 통해 기본적으로 메모리 매핑 정보를 사용할 수 없으므로 Bluepill에게 그러한 맵을 작성하도록 지시하는 사용자 정의 디버거 명령 vmmap 추가했습니다. scripts/ 폴더에서 사용할 수있는 스크립트 addSegments.py 로이 프로세스를 자동화했습니다. File->Script file 사용하여 IDA에로드하십시오. 스크립트는 각 코드 모듈에 대한 메모리 레이아웃 정보 (예 : 섹션 및 권한)로 IDA의 세그먼트 서브 뷰를 채 웁니다. 참고 : 곧 코드를 추가하여 모듈 하위 뷰를 업데이트하고 현재는 오래 지속됩니다.
이제 블루 필로 샘플을 디버깅 할 수 있습니다.
예외 처리에는 PIN의 현재 GDB 서버 지원에 대한 해결 방법이 필요합니다. 예외를 응용 프로그램에 전달하지 않아야하는 경우 (예 : Closhandle로 전달 된 유효하지 않은 손잡이의 경우 0xc0000008 ) 예외 메시지를받은 직후 GDB 콘솔에서 wait 명령을 보내고 IDA를 BluePill로 분리하여 다시 연결하십시오. 그 동안 디버거 헬퍼는 명령에 대한 응답으로 실행 파일을 유지합니다.
참고 : 우리는 원래 다른 예외 종류에 대해서도 단절 속임수에 의존했습니다. 그들에게, 3.5 이후에 일부 핀 릴리스에서 새로 소개 된 일부 핀 릴리스에서 Debugger를 다시 잡을 때 ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID ). 따라서 int 3 opcode 또는 int 2d 회피에서 0xc0000005 예외에 직면하면 예외를 애플리케이션으로 전달합니다. 핀의 디버거 인터페이스는 직접 감지되지 않지만 적대자는 여전히 쓰기 시계를 사용하여 그렇게 할 수 있습니다. 우리는 현재 그러한 유물을 보호하기위한 해결 방법을 생각하고 있습니다.
Bluepill은 고유 한 기능을 구현하여 실행 코드에서 숨길 때 코드 부분을 패치합니다. 적용된 패치는 핀의 JIT 메커니즘과 유사하게 결합되므로 방지 방지 체계 (예 : 자체 체크 덤밍 시퀀스)에 보이지 않습니다. 간단히 말해서, 우리는 JIT 컴파일을 다시 만들기 위해 컴파일 된 (원본) 지침을 무시하고 코드 보호 메커니즘에 눈에 띄지 않는 트램폴린을 추가하고 메모리 읽기가 원래 프로그램 지침으로 계속 리디렉션됩니다.
패치 생성은 세 단계로 나뉩니다.
아래 이미지의 코드 블록을 고려하고 mov ebp, esp 명령어 ( 89 e0 )와 함께 주소 0x771X37A5 에서 MOV mov eax, esp 명령을 덮어 쓰고 있다고 가정 한 다음 주소 0x771X37A8 에서 실행을 재개하십시오.

Bluepill이 디버거 모드에서 작동 할 때 사용자 정의 GDB 명령 set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> 통해 패치에 대한 핀을 지시 할 수 있습니다. 위의 예는 set_771c37a6_771c37a6_771c37a8_89,e0 사용할 수 있습니다.
rm_<START_ADDR>_<END_ADDR> 다음 패치를 다른 사용자 정의 GDB 명령을 사용하여 간단히 제거 할 수 있습니다.
학업 프로젝트에서 Bluepill을 사용하거나 논문의 일부 토론 섹션에 적합하다고 생각하는 경우 다음 Bibtex 항목을 사용하여 작업을 참조 할 수 있다면 감사하겠습니다.
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}