이 글은 블로그 스타일을 확인하기 위한 샘플입니다. 본문, inline code, 강조 표시, 코드 블록, 표, 인용문이 어두운 배경에서 어떻게 보이는지 확인할 수 있게 구성했습니다.

빠르게 보는 핵심

리버싱 노트에서는 PE header, IOCTL, DriverEntry, anti-cheat callback 같은 키워드를 자주 표시하게 됩니다. 이런 짧은 용어는 문장 안에서 바로 눈에 들어와야 합니다.

굵은 강조는 중요한 결론에 쓰고, _기울임 강조_는 관찰이나 가정처럼 조금 덜 단정적인 문장에 쓰면 좋습니다.

분석 메모는 나중에 다시 읽을 사람을 위해 쓰는 글입니다. 명령어, 입력값, 관찰 결과를 분리해서 남기면 재현성이 좋아집니다.

체크리스트

분석을 시작할 때는 아래처럼 작은 단위로 정리합니다.

  1. 샘플의 해시와 출처를 기록합니다.
  2. 실행 환경과 OS 빌드 번호를 고정합니다.
  3. 주요 API 호출과 문자열을 빠르게 훑습니다.
  4. 코드에서 상태가 바뀌는 지점을 먼저 찾습니다.

자주 보는 항목은 다음과 같습니다.

  • import table
  • embedded string
  • debug symbol
  • kernel callback
  • user-mode hook

상태 표

항목예시확인 목적
entry pointmain, DriverEntry최초 실행 흐름 확인
control code0x222003IOCTL 분기 추적
callbackPsSetCreateProcessNotifyRoutine프로세스 감시 여부 확인
artifactC:\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_packetmagic, command, size를 모두 확인합니다.
  • command_name은 분석 중 로그를 읽기 쉽게 만드는 보조 함수입니다.
  • 표와 코드 블록을 섞을 때는 문단 간격이 너무 좁지 않은지 확인해야 합니다.