
Windows RPC 인터페이스 발굴 및 분석 도구로, 시각적 엔드포인트 열거, PE 파싱, 심볼 해석, 실시간 ETW 스니핑, 그리고 보안 감사를 위한 즉석 클라이언트 코드 생성을 지원합니다.
저희의 블로그 포스트 공지사항을 읽어보세요.
RPC 조사기(RPCI)는 .NET/C# Windows Forms UI 애플리케이션으로, Windows RPC 엔드포인트에 대한 고급 검색 및 분석 인터페이스를 제공합니다. 이 도구는 NtApiDotNet 플랫폼의 기존 핵심 RPC 기능을 둘러싼 시각적 인터페이스를 제공하며, 다음을 포함합니다:
이러한 핵심 기능 외에도 RPCI는 추가 기능을 제공합니다:
RPC 조사기가 지원하는 여러 워크플로가 있습니다:
이 예제에서는 예약된 작업을 관리하고 실행하는 데 사용되는 Windows 작업 스케줄러 RPC 서비스를 검사합니다. 서비스를 찾고, 클라이언트 코드를 생성한 다음, 노출된 프로시저 중 하나와 상호 작용하도록 클라이언트를 사용자 지정합니다.
먼저 File -> Load From Service를 클릭하여 Windows 서비스 목록을 로드합니다. 그러면 새 서비스 목록 창이 열립니다:

Windows 작업 스케줄러인 Schedule 서비스를 찾아 서비스를 선택하고 Go를 클릭합니다.

RPCI가 관련된 모든 RPC DLL을 로드하기 전에 확인 메시지가 표시됩니다. 계속하려면 Yes를 클릭하세요. 로드되면 서비스 프로세스에 로드된 모든 모듈에서 발견된 모든 RPC 서버 목록이 표시됩니다. Windows 작업 스케줄러 RPC 서버의 인터페이스 ID는 86D35949-83C9-4044-B424-DB363231FD0C입니다. 이 인터페이스 ID가 있는 행을 목록에서 찾으십시오. 해당 행에는 Task Scheduler라는 실행 중인 서비스가 있어야 합니다. 해당 행을 마우스 오른쪽 버튼으로 클릭하고 New Client를 선택합니다.

클라이언트 창의 왼쪽 부분에는 RPC 서버 메타데이터와 클라이언트 코드의 명령줄 출력이 표시됩니다. 오른쪽에는 두 개의 탭이 있습니다:
이 예제에서는 SchRpcHighestVersion 프로시저를 호출합니다. 이 메서드는 out int version 하나의 인수를 허용하며, 프로시저 호출 후 이 인수에는 RPC 인터페이스에서 지원하는 가장 높은 작업 스케줄러 프로토콜 버전이 포함됩니다. 상위 16비트는 주 버전이고 하위 16비트는 부 버전입니다.
이 프로시저를 호출하려면:
Client Code 창에서 RPC 클라이언트의 주요 진입점인 Run 메서드를 찾습니다.
Run 메서드 본문을 편집하여 프로시저를 호출합니다:
public async Task<bool> Run()
{
int version;
int status = SchRpcHighestVersion(out version);
if (status == 0) {
long major = (version & 0xffff0000) >> 16;
long minor = version & 0x0000ffff;
Console.WriteLine("highest supported RPC version: {0}.{1}", major, minor);
} else {
Console.WriteLine("call to SchRpcHighestVersion failed with error: {0:X}", status);
}
return true;
}
이 코드를 추가한 후 Run 버튼을 클릭하여 클라이언트를 실행합니다. 그러면 C# 코드가 컴파일된 후 Run 메서드가 실행됩니다.
컴파일에 성공하면 Output 상자에 다음과 유사한 내용이 표시됩니다:
> Run() output:
highest supported RPC version: 1.6

RPC 조사기에는 여러 구성 설정이 있습니다.
| 설정 | 설명 | 기본값 |
|---|---|---|
| dbghelp.dll | dbghelp.dll 모듈의 파일 위치 | 설치된 Windows 키트에서 최신 버전 찾기 |
| Symbol Path | Windows 심볼 경로(심볼 서버 또는 로컬 디렉터리 가능) | 기본 공개 Windows 서버: srv*c:\symbols*https://msdl.microsoft.com/download/symbols |
| Trace Level | 로깅 추적 수준 | info |
구성 설정은 애플리케이션 내 Edit -> Settings 메뉴를 통해 수정할 수 있습니다.
초기 릴리스 이후 RPC 조사기는 .NET Framework 애플리케이션에서 .NET 7 애플리케이션으로 변환되었습니다. 빌드 문제가 발생하면 Visual Studio가 최신 상태인지 확인하세요. .NET Framework 버전에서 빌드하기 전에 모든 빌드 출력 폴더를 삭제하는 것이 좋습니다.
또한 안전하지 않은 BinaryFormatter 클래스에서 protobuf-net으로 이동했기 때문에 .NET Framework 버전으로 생성된 RPC 라이브러리는 .NET 버전과 호환되지 않습니다.
RPC 조사기에서 무작위 충돌이 발생하는 경우 관리자에게 EDR을 조정해 달라고 요청하여 해결책을 찾을 수 있습니다. 일부 EDR은 JIT 컴파일 언어와 정상적으로 작동하지 않는다는 사실을 발견했습니다.
경우에 따라 RPC 조사기가 EDR에 의해 악성으로 탐지되며, Virus Total에서 일부 오탐(false positive)이 발생하기도 합니다. 이는 알려진 문제입니다. 그 이유는 RPC 조사기에 James Forshaw가 만든 NtObjectManager 패키지가 포함되어 있기 때문입니다. 이 패키지는 Windows Defender를 포함한 많은 EDR에서 탐지(오탐)되는 것으로 알려져 있습니다.
Windows RPC는 10년 넘게 인기 있는 연구 주제였기 때문에 여기에 언급할 관련 리소스와 연구 노력이 너무 많습니다. 이 도구를 구축하는 동안 접한 몇 가지를 아래에 나열했습니다:
RPC 내부에 익숙하지 않거나 기술적인 복습이 필요하다면, 이 주제에 대한 권위 있는 자료 중 하나인 Alex Ionescu의 2014년 싱가포르 SyScan 강연 All about the RPC, LRPC, ALPC, and LPC in your PC를 추천합니다.