Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
gobee — Scrivi i tuoi programmi BPF in Go, non in C. gobee transpila un sottoinsieme di Go in BPF C e genera binding cilium/ebpf tipizzati. | Kitploit
Strumenti/GitHubGitHub/boratanrikulu/gobee
Analisi StaticaAnalisi del CodiceScripting e AutomazioneDevSecOpsUtilità e FrameworkAnalisi di Binari
GitHubboratanrikulu/gobee

gobee

Scrivi i tuoi programmi BPF in Go, non in C. gobee transpila un sottoinsieme di Go in BPF C e genera binding cilium/ebpf tipizzati.

Vedi Repository
3454225 mesi faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

gobee

Scrivi i tuoi programmi BPF in Go, non in C. gobee transpila un sottoinsieme rigoroso di Go in BPF C, genera binding Go tipizzati per il lato userspace e controlla i load rispetto al kernel in esecuzione.

L'ecosistema Go ha strumenti userspace solidi per BPF. Il lato kernel si è sempre concluso con "ora scrivi il tuo programma in C." Aya ha portato eBPF su Rust scrivendo un nuovo backend BPF in rustc. gobee ci arriva in un altro modo: transpilando in C e riusando il backend maturo di clang.

Un file Go in ingresso, un programma BPF in uscita

Un tracepoint che invia in streaming ogni execve allo userspace tramite un ringbuf:

Il tuo input (Go) Ciò che gobee genera (BPF C)
//go:build ignore

package main

import "github.com/boratanrikulu/gobee/bpf"

//bpf:license GPL

type Event struct {
    Pid  uint32
    Comm [16]byte
}

var Events = bpf.RingBuf[Event]{
    MaxEntries: 4096,
}

//bpf:section tracepoint/syscalls/sys_enter_execve
func OnExec(ctx *bpf.ExecveEnterCtx) bpf.TpReturn {
    e, ok := Events.Reserve()
    if !ok {
        return bpf.TpOk
    }
    e.Pid = bpf.GetCurrentPid()
    bpf.GetTaskComm(&e.Comm)
    Events.Submit(e)
    return bpf.TpOk
}

func main() {}
// Code generated by gobee. DO NOT EDIT.

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>

char _license[] SEC("license") = "GPL";

struct Event {
    __u32 Pid;
    __u8 Comm[16];
};

struct {
    __uint(type, BPF_MAP_TYPE_RINGBUF);
    __uint(max_entries, 4096);
} Events SEC(".maps");

SEC("tracepoint/syscalls/sys_enter_execve")
int OnExec(struct trace_event_raw_sys_enter *ctx) {
    struct Event *e = bpf_ringbuf_reserve(
        &Events, sizeof(struct Event), 0);
    if (!e) {
        return 0;
    }
    e->Pid = (__u32)(
        bpf_get_current_pid_tgid() >> 32);
    bpf_get_current_comm(&e->Comm, 16);
    bpf_ringbuf_submit(e, 0);
    return 0;
}

gobee translate --bindings-dir ./bpf ./bpf/src produce entrambi i file, più una sourcemap (events.bpf.c.map) così gli errori del verifier vengono mappati sulle righe Go e un file di binding tipizzati (bpf/events_bindings.go) così il driver userspace scrive objs.Events, objs.AttachOnExec() e decodifica i payload del ringbuf direttamente in bpf.Event (la stessa struct che vedi sopra, ripubblicata in Go) invece di lookup coll.Programs["..."] tipizzati come stringhe.

Il C è leggibile di proposito. Se gobee emette qualcosa di strano, puoi vederlo. Per tracepoint + kprobe + XDP combinati in un unico binario, vedi example/sysmon/.

Come si confronta

gobeeC + clang + bpf2goAya (Rust)bpftraceBCC
Linguaggio lato kernelsottoinsieme di GoCRustDSLC
Integrazione userspacebinding Go tipizzati + cilium/ebpfbpf2goaya-runtimenessunopython
CO-RE✅ via clang✅✅ via LLVM✅✅
Copertura helper200 wrapper Go tipizzaticompleto (scrivi C)completolimitatocompleto (scrivi C)
Errore del verifier → sorgente✅ Go file:line:col❌ C grezzo✅ Rust file:line❌parziale
Controllo versione kernel al load✅ via bpfvetmanualemanualen/aruntime
Dipendenze toolchainGo + clangclang + bpf2gorustc + LLVMbpftracepython + bcc
Artefatto generato.bpf.o + binario Go.bpf.o + binario Go.bpf.o + binario RustJITJIT

Se sei già in un workflow C / libbpf, gobee non cerca di sostituirlo del tutto. È pensato per i casi in cui vuoi il lato kernel, il lato userspace e la pipeline di build tutti in un unico modulo Go.

Cosa è supportato oggi

Vedi docs/status.md per la matrice completa (sottoinsieme di Go, statement, espressioni, ogni helper, ogni tipo di mappa, ogni direttiva). Vista rapida:

AmbitoCopertura
Tipi di programma (8)XDP, tracepoint, kprobe / kretprobe, uprobe / uretprobe, sock_ops, TC, cgroup_skb, LSM
Tipi di mappa (19)array, hash, lru_hash, varianti per-CPU, bloom_filter, lpm_trie, ringbuf, perf_event_array, prog_array, queue, stack, storage sk/task/inode, devmap/cpumap/xskmap
Helper BPF~200 stub Go tipizzati auto-generati dagli header libbpf v1.5.0. Quelli esercitati da example/helloworld/ e example/sysmon/ sono testati in CI su kernel reale; il resto non è verificato. Apri una issue se uno stub non corrisponde alla firma del kernel
CO-RE✅ rilevato automaticamente. BPF_CORE_READ per i campi delle struct interne al kernel (task_struct, sock, inode); ctx->field diretto per le struct di contesto BPF UAPI (xdp_md, __sk_buff, bpf_sock_ops). Testato su Linux 6.x (CI Ubuntu 24.04); i kernel meno recenti non sono ancora nella matrice CI
Output pronto per BTF✅ il C emesso include vmlinux.h e usa BPF_CORE_READ per le letture dei campi interni al kernel, così il BTF che clang genera da clang -g porta le giuste rilocazioni. clang stesso resta una tua responsabilità (i Makefile di esempio mostrano l'invocazione canonica)
Helper definiti dall'utente✅ le func Go di primo livello senza //bpf:section vengono emesse come funzioni C static __always_inline
Binding Go tipizzati✅ Load<Stem>, Close, Attach<Name> per programma, AttachAll, più i tuoi tipi di struct lato kernel e le costanti ripubblicati in Go
Controllo versione kernel✅ bpfvet viene eseguito al momento del load. Fallisce rapidamente con bpf program needs kernel >= 5.8, host is 5.4 invece dell'opaco EINVAL
Errore del verifier → sorgente Go✅ annotato automaticamente dentro Load<Stem>. Nessun pipe manuale verso gobee diagnose; *ebpf.VerifierError ritorna con marcatori → counter.go:18:5
Sourcemap sidecar✅ <stem>.bpf.c.map scritto accanto a ogni .bpf.c anche per l'uso offline di gobee diagnose
Cross-arch✅ Linux arm64 + amd64

Cosa fa gobee

  • Transpila un sottoinsieme di Go in BPF C (ed esegue go/types sul tuo input prima, così gli usi errati emergono a file:line:col).
  • Genera un <Stem>_bindings.go tipizzato accanto al .bpf.c: bpf.LoadCounter(spec), objs.PerIface.Lookup(...), objs.AttachAll(ifindex), più i tuoi tipi di struct lato kernel e le costanti ripubblicati in Go.
  • Annota automaticamente *ebpf.VerifierError di LoadAndAssign con posizioni nel sorgente Go, senza bisogno di pipe manuale verso gobee diagnose.
  • Esegue bpfvet all'interno di Load<Stem> così i kernel vecchi falliscono rapidamente con bpf program needs kernel >= 5.8, host is 5.4.
  • Espone circa 200 stub Go tipizzati per il set di helper libbpf v1.5.0, più funzioni helper definite dall'utente emesse come static __always_inline.

Cosa gobee non farà

  • Sostituire clang. Il backend BPF di clang ci dà gratuitamente CO-RE, BTF e codegen amico del verifier. Reimplementarlo costa anni e non porta alcun vantaggio.
  • Sostituire cilium/ebpf. I binding generati si appoggiano su di esso.
  • Nascondere BPF. Il sottoinsieme di Go mappa 1:1 agli idiomi di BPF C. Se conosci BPF, gobee è zucchero sottile. Se non lo conosci, il manuale resta comunque lettura obbligatoria.
  • Eseguire clang al posto tuo. Compilazione, embedding e load restano a carico dell'utente. Stesso schema di bpf2go.

Perché transpilare, invece di generare BPF direttamente

gc, il compilatore Go, non ha un backend BPF basato su LLVM. Aggiungerne uno è un progetto di compilatore pluriennale. rustc è costruito su LLVM ed è per questo che Aya funziona. Quindi gobee emette C e riusa il backend BPF di clang, che ci dà gratuitamente codegen maturo, BTF e rilocazioni CO-RE.

Scarica lo strumento