mic.git


mic

~ proxy for JA4-TLS fingerprinting evasion
git clone https://github.com/djnnvx/mic.git
log | files | refs | archive | README | LICENSE

commit 71efed9579fab3237ca9ea7a0ff701155d226581
parent c5b8b85327254acde22bc67d815cbeedd63df3da
Author: djnn <[email protected]>
Date: Mon, 7 Jul 2025 23:31:25 +0900

proxy: adding generic implementation

Diffstat:
M.gitignore | 1+
Mcmd/root.go | 3+++
Mgo.mod | 6++++++
Mgo.sum | 12++++++++++++
Dmic | 0
Mproxy/backend.go | 27+++++++++++++++++++++++++++
Mproxy/httpconnect.go | 22++++++++++++++++++++++
Mproxy/proxy.go | 44++++++++++++++++++++++++++++++++++++++++++++
Mproxy/socks5.go | 25+++++++++++++++++++++++++

9 files changed, 140 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
@@ -30,3 +30,4 @@ go.work.sum
 # Editor/IDE
 # .idea/
 # .vscode/
+mic
diff --git a/cmd/root.go b/cmd/root.go
@@ -9,6 +9,9 @@ import (
 
 var SKID_ASCII_ART = `
 
+
+
+
         ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣤⣤⣤⣤⣤⣄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
     ⠀              ⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠻⠿⢿⣿⣿⣿⣿⣿⣶⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                ⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣿⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
diff --git a/go.mod b/go.mod
@@ -5,6 +5,12 @@ go 1.24.4
 require github.com/spf13/cobra v1.9.1
 
 require (
+	github.com/andybalholm/brotli v1.0.6 // indirect
+	github.com/cloudflare/circl v1.5.0 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
+	github.com/klauspost/compress v1.17.4 // indirect
+	github.com/refraction-networking/utls v1.7.3 // indirect
 	github.com/spf13/pflag v1.0.6 // indirect
+	golang.org/x/crypto v0.36.0 // indirect
+	golang.org/x/sys v0.31.0 // indirect
 )
diff --git a/go.sum b/go.sum
@@ -1,10 +1,22 @@
+github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
+github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
+github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
+github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
+github.com/refraction-networking/utls v1.7.3 h1:L0WRhHY7Oq1T0zkdzVZMR6zWZv+sXbHB9zcuvsAEqCo=
+github.com/refraction-networking/utls v1.7.3/go.mod h1:TUhh27RHMGtQvjQq+RyO11P6ZNQNBb3N0v7wsEjKAIQ=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
 github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
 github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
 github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/mic b/mic
Binary files differ.
diff --git a/proxy/backend.go b/proxy/backend.go
@@ -0,0 +1,27 @@
+package proxy
+
+import (
+	"bufio"
+	"log"
+	"net"
+)
+
+func backendHandler(conn net.Conn, p *Proxy) {
+	defer conn.Close()
+	reader := bufio.NewReader(conn)
+
+	/* peek to determine protocol */
+	peek, err := reader.Peek(1)
+	if err != nil {
+		log.Printf("[-] peek failed: %s\n", err.Error())
+		return
+	}
+
+	if isSocks5(peek) {
+
+	}
+}
+
+func init() {
+	RegisterHandler(backendHandler)
+}
diff --git a/proxy/httpconnect.go b/proxy/httpconnect.go
@@ -0,0 +1,22 @@
+package proxy
+
+import (
+	"bufio"
+	"net"
+	"strings"
+)
+
+func httpConnectHandler(conn net.Conn, p *Proxy) {
+	reader := bufio.NewReader(conn)
+	line, err := reader.Peek(7)
+
+	if err != nil || !strings.HasPrefix(string(line), "CONNECT") {
+		return /* not HTTP, let next handler deal with it */
+	}
+
+	conn.Close()
+}
+
+func init() {
+	RegisterHandler(httpConnectHandler)
+}
diff --git a/proxy/proxy.go b/proxy/proxy.go
@@ -0,0 +1,44 @@
+package proxy
+
+import (
+	"crypto/x509"
+	"net"
+)
+
+type Proxy struct {
+	ListenAddr string
+	CAPool *x509.CertPool
+}
+
+// function is a function that processes an incoming client connection
+type Handler func(conn net.Conn, p *Proxy)
+
+// registry for all protocol handlers
+var handlers []Handler
+
+// adds a handler to the orchestrator
+func RegisterHandler(h Handler) {
+	handlers = append(handlers, h)
+}
+
+// Run starts the proxy server and orchestrates all protocol handlers
+func (p *Proxy) Run() error {
+	ln, err := net.Listen("tcp", p.ListenAddr)
+	if err != nil {
+		return err
+	}
+
+	for {
+		c, err := ln.Accept()
+		if err != nil {
+			return err
+		}
+
+		conn := c
+		go func() {
+			for _, h := range handlers {
+				h(conn, p)
+			}
+		}()
+	}
+}
diff --git a/proxy/socks5.go b/proxy/socks5.go
@@ -0,0 +1,25 @@
+package proxy
+
+import (
+	"bufio"
+	"net"
+)
+
+func isSocks5(peek []byte) bool {
+	return peek != nil || peek[0] == 0x05
+}
+
+func socks5Handler(conn net.Conn, p *Proxy) {
+	reader := bufio.NewReader(conn)
+	peek, err := reader.Peek(1)
+
+	if err != nil || peek[0] != 0x05 {
+		return /* not SOCKS5, let next handler deal with it */
+	}
+
+	conn.Close()
+}
+
+func init() {
+	RegisterHandler(socks5Handler)
+}