simple compile script so i dont have to type it out each time

This commit is contained in:
WhatDidYouExpect 2025-07-26 21:09:11 +02:00
parent 70d0a9948e
commit bc02105dfa
2 changed files with 100 additions and 2 deletions

3
compile.sh Normal file
View file

@ -0,0 +1,3 @@
#!/bin/sh
go build -o portscraper main.go
GOOS=windows GOARCH=amd64 go build -o portscraper.exe main.go

99
main.go
View file

@ -2,6 +2,7 @@ package main
import ( import (
"bufio" "bufio"
"bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net" "net"
@ -20,7 +21,7 @@ type OpenPort struct {
} }
const batchSize = 255 const batchSize = 255
var minecraftServers []string
var ( var (
printMutex sync.Mutex printMutex sync.Mutex
fileLock sync.Mutex fileLock sync.Mutex
@ -103,6 +104,86 @@ func identifyServiceAndOS(ip string, port int) string {
return "" return ""
} }
func queryMinecraftServer(ip string, port int) string {
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 3*time.Second)
if err != nil {
return ""
}
defer conn.Close()
writeVarInt := func(val int) []byte {
var out []byte
for {
temp := byte(val & 0x7F)
val >>= 7
if val != 0 {
temp |= 0x80
}
out = append(out, temp)
if val == 0 {
break
}
}
return out
}
protocolVersion := 754
serverAddr := ip
state := 1
// so confusing for me i actually had to comment stuff
var payload []byte
payload = append(payload, 0x00) // fackin packet ID for handshake
payload = append(payload, writeVarInt(protocolVersion)...) // protocol version
payload = append(payload, writeVarInt(len(serverAddr))...) // address length
payload = append(payload, []byte(serverAddr)...) // address
payload = append(payload, byte(port>>8), byte(port&0xFF)) // port
payload = append(payload, byte(state)) // next state: status
packet := append(writeVarInt(len(payload)), payload...) // full packet = length + payload
conn.Write(packet) // send handshake
conn.Write([]byte{0x01, 0x00}) // send status request
conn.SetReadDeadline(time.Now().Add(3 * time.Second))
buf := make([]byte, 4096)
n, err := conn.Read(buf)
if err != nil || n == 0 {
return ""
}
start := bytes.IndexByte(buf, '{')
if start == -1 {
return ""
}
jsonData := string(buf[start:n])
var status struct {
Version struct {
Name string `json:"name"`
} `json:"version"`
Description interface{} `json:"description"`
Players struct {
Online int `json:"online"`
Max int `json:"max"`
} `json:"players"`
}
if err := json.Unmarshal([]byte(jsonData), &status); err != nil {
return ""
}
desc := ""
switch v := status.Description.(type) {
case string:
desc = v
case map[string]interface{}:
if text, ok := v["text"].(string); ok {
desc = text
}
}
return fmt.Sprintf("%s | %d/%d players | %s", status.Version.Name, status.Players.Online, status.Players.Max, desc)
}
func scanPort(ip string, port int, wg *sync.WaitGroup) { func scanPort(ip string, port int, wg *sync.WaitGroup) {
printStatusLine(ip, fmt.Sprintf("scanning port %d...", port)) printStatusLine(ip, fmt.Sprintf("scanning port %d...", port))
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 500*time.Millisecond) conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 500*time.Millisecond)
@ -114,7 +195,9 @@ func scanPort(ip string, port int, wg *sync.WaitGroup) {
hostname = strings.TrimSuffix(host[0], ".") hostname = strings.TrimSuffix(host[0], ".")
} }
fingerprint := identifyServiceAndOS(ip, port) fingerprint := identifyServiceAndOS(ip, port)
if port == 25565 {
minecraftServers = append(minecraftServers, ip)
}
openPortsLock.Lock() openPortsLock.Lock()
openPorts = append(openPorts, OpenPort{ip, port, hostname, fingerprint}) openPorts = append(openPorts, OpenPort{ip, port, hostname, fingerprint})
line := fmt.Sprintf(" - %s : port %d open - hostname: %s", ip, port, hostname) line := fmt.Sprintf(" - %s : port %d open - hostname: %s", ip, port, hostname)
@ -269,4 +352,16 @@ func main() {
summaryFile.WriteString("[+] scan summary: open ports found with fingerprints\n") summaryFile.WriteString("[+] scan summary: open ports found with fingerprints\n")
} }
fmt.Println("[+] scan summary written to summary.txt") fmt.Println("[+] scan summary written to summary.txt")
if len(minecraftServers) > 0 {
safePrintln("[*] querying Minecraft servers on port 25565...")
for _, ip := range minecraftServers {
status := queryMinecraftServer(ip, 25565)
if status != "" {
safePrintln("[MC] Server at", ip, "responded.")
summaryFile.WriteString("[MC] " + ip + ":25565 " + status + "\n")
} else {
summaryFile.WriteString("[MC] " + ip + ":25565 no response or malformed\n")
}
}
}
} }