이 글은 블로그 스타일을 확인하기 위한 샘플입니다. 본문, inline code,
강조 표시, 코드 블록, 표, 인용문이 어두운 배경에서 어떻게 보이는지 확인할 수
있게 구성했습니다.
빠르게 보는 핵심
리버싱 노트에서는 PE header, IOCTL, DriverEntry, anti-cheat callback
같은 키워드를 자주 표시하게 됩니다. 이런 짧은 용어는 문장 안에서 바로 눈에
들어와야 합니다.
굵은 강조는 중요한 결론에 쓰고, _기울임 강조_는 관찰이나 가정처럼 조금 덜 단정적인 문장에 쓰면 좋습니다.
분석 메모는 나중에 다시 읽을 사람을 위해 쓰는 글입니다. 명령어, 입력값, 관찰 결과를 분리해서 남기면 재현성이 좋아집니다.
체크리스트
분석을 시작할 때는 아래처럼 작은 단위로 정리합니다.
- 샘플의 해시와 출처를 기록합니다.
- 실행 환경과 OS 빌드 번호를 고정합니다.
- 주요 API 호출과 문자열을 빠르게 훑습니다.
- 코드에서 상태가 바뀌는 지점을 먼저 찾습니다.
자주 보는 항목은 다음과 같습니다.
- import table
- embedded string
- debug symbol
- kernel callback
- user-mode hook
상태 표
| 항목 | 예시 | 확인 목적 |
|---|---|---|
| entry point | main, DriverEntry | 최초 실행 흐름 확인 |
| control code | 0x222003 | IOCTL 분기 추적 |
| callback | PsSetCreateProcessNotifyRoutine | 프로세스 감시 여부 확인 |
| artifact | C:\Temp\trace.log | 재현 로그 보관 |
터미널 출력 예시
target: windows-11-vm
symbol path: srv*C:\symbols*https://msdl.microsoft.com/download/symbols
breakpoint: nt!NtDeviceIoControlFile
status: waiting for ioctl dispatch
C++ 코드 예시
아래 코드는 단순한 헤더 검증 함수입니다. 실제 분석 글에서는 이런 식으로 구조체, 상수, 경계 조건을 같이 보여주면 읽기 편합니다.
#include <cstdint>
#include <span>
#include <string_view>
struct CommandPacket {
std::uint32_t magic;
std::uint16_t command;
std::uint16_t size;
};
constexpr std::uint32_t kExpectedMagic = 0x41434B21;
bool is_known_command(std::uint16_t command) {
switch (command) {
case 0x1001:
case 0x1002:
case 0x2001:
return true;
default:
return false;
}
}
bool validate_packet(const CommandPacket& packet, std::span<const std::byte> body) {
if (packet.magic != kExpectedMagic) {
return false;
}
if (!is_known_command(packet.command)) {
return false;
}
return packet.size == body.size();
}
std::string_view command_name(std::uint16_t command) {
switch (command) {
case 0x1001:
return "query_status";
case 0x1002:
return "read_memory";
case 0x2001:
return "write_memory";
default:
return "unknown";
}
}
마무리 메모
긴 글에서는 결론을 마지막에 다시 짧게 적어두면 좋습니다. 예를 들면:
validate_packet은magic,command,size를 모두 확인합니다.command_name은 분석 중 로그를 읽기 쉽게 만드는 보조 함수입니다.- 표와 코드 블록을 섞을 때는 문단 간격이 너무 좁지 않은지 확인해야 합니다.