
Sliver C2 임플란트 프레임워크용 Windows 키로깅 모듈로, Raw Input을 사용하여 키 입력을 캡처하고 운영자에게 start, stop 및 retrieval 명령을 제공합니다.
이 sliver 확장은 주로 sliver가 확장 기능을 처리하는 방법에 대한 학습 연습으로 작성되었습니다. 
이 공개 임플란트 프레임워크에 대한 작업을 해준 Sliver 팀 전체에 감사드립니다. 특히 @rkervell 님께 감사드립니다. sliver가 확장 기능을 처리하는 방법과 관련된 많은 질문에 답변해 주셨습니다.
기본적으로 raw input을 사용합니다. 이는 다른 일반적인 키로깅 방법과 비교하여 장단점이 있습니다.
제가 이 방법을 선호하는 이유는 다른 바이너리에 인젝션할 필요가 없고, 특정 호출을 자주 폴링하면서 결과를 놓칠 가능성도 없기 때문입니다.
이 코드는 제가 직접 작성한 부분과 인터넷에서 찾은 예제들을 조합한 부분이 섞여 있습니다.
Visual Studio 2019로 솔루션 파일을 열고 x86 및 x64 릴리스를 빌드하세요.
이 확장이 잠재적으로 armory에 포함되기 전까지는 Windows 시스템에서 빌드할 수 있습니다. 그런 다음 생성된 $(solutiondir)\bin 폴더를 sliver 클라이언트에 배치하고 extensions install <path to folder>를 실행하여 확장을 설치할 수 있습니다. 다시 시작해야 하거나 extensions load <path to folder>도 실행해야 할 수 있습니다.
raw_keylogger <cmdid>
다음 cmdid가 유효합니다.
0 = stop
1 = start
2 = get keystrokes
모든 것이 잘 진행되면 다음과 같이 표시됩니다.

Sliver의 API에는 다음과 같은 두 가지 주요 부분이 있습니다.
typedef int (*goCallback)(const char*, int);
extern "C" {
__declspec(dllexport) int __cdecl entrypoint(char* argsBuffer, uint32_t bufferSize, goCallback callback);
}
임플란트는 .json 파일에 정의된 "entrypoint"를 호출합니다. 이는 여러분의 entrypoint 함수를 가리킵니다(함수 이름이 그럴 필요는 없으며 시그니처만 따르면 됩니다).
goCallback은 go로 출력을 반환하는 함수입니다. 이는 callback(string, string_length)처럼 호출됩니다.
현재 확장을 코딩할 때 "name"과 "command_name"이 일치해야 합니다. 그렇지 않으면 임플란트가 호출할 때마다 확장을 다시 로드합니다.
이 글을 쓰는 시점 기준으로 non-BOF 확장은 강력한 형식의 인자(strongly typed arguments)를 지원하지 않습니다. 따라서 명령 이름 뒤에 CLI로 제공되는 모든 것은 문자열로 전송됩니다. 그 이후부터는 확장의 네이티브 코드 측에서 처리해야 합니다.