Codebase list sliver / master protobuf
master

Tree @master (Download .tar.gz)

Protobuf

This directory contains the protobuf message definitions and is organized in the following packages:

  • commonpb - Common generic messages shared between clientpb and sliverpb. Notably the generic Request and Response types, which are used as headers in gRPC request/responses.
  • clientpb - These messages should only be sent from the client to server or vice versa.
  • sliverpb - These message may be sent from the client to the server or from the server to the implant and vice versa. Not all messages defined in this file will appear in client<->server communication, some are specific to implant<->server.
  • rpcpb - gRPC service definitions

Naming

The protobuf messages and service definitions follow a naming schemes.

Unary Operations

Unary requests are named with method subject and the suffix Req and corresponding responses simple the method subject. For example, with Foo the following scheme would be used, assuming Foo messages are only sent between a client and the server:

rpc Foo(clientpb.FooReq) returns (clientpb.Foo);

In cases where the Foo message just needs to be forwarded to the implant the definition would simply put in sliverpb package:

rpc Foo(sliverpb.FooReq) returns (sliverpb.Foo);

In other cases the server may need to perform certain operations based on the gRPC request and send subsequent messages to the implant. For example, in the "GetSystem" workflow the server will compile a new implant based on the request's (clientpb.GetSystemReq) clientpb.ImplantConfig, which we do not want to forward to the implant. In this sliverpb will define a corresponding message with the prefix Invoke for in this case it would be sliverpb.InvokeGetSystemReq. Invoke-style messages are only sent to the implant and should not appear in gRPC definitions.