fix sending update verdict info

This commit is contained in:
Vladimir
2022-11-08 16:39:26 +01:00
parent 7a639be526
commit 8b8755458e
3 changed files with 42 additions and 16 deletions

View File

@@ -8,6 +8,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"net" "net"
"unsafe"
"github.com/tevino/abool" "github.com/tevino/abool"
@@ -68,6 +69,10 @@ type VersionInfo struct {
build uint8 build uint8
} }
func (v *VersionInfo) String() string {
return fmt.Sprintf("%d.%d.%d.%d", v.major, v.minor, v.revision, v.build)
}
// Handler transforms received packets to the Packet interface. // Handler transforms received packets to the Packet interface.
func Handler(packets chan packet.Packet) { func Handler(packets chan packet.Packet) {
defer close(packets) defer close(packets)
@@ -167,6 +172,27 @@ func convertIPv6(input [4]uint32) net.IP {
return net.IP(addressBuf) return net.IP(addressBuf)
} }
func (v *VersionInfo) String() string { func ipAddressToArray(ip net.IP, isIPv6 bool) [4]uint32 {
return fmt.Sprintf("%d.%d.%d.%d", v.major, v.minor, v.revision, v.build) array := [4]uint32{0}
if isIPv6 {
for i := 0; i < 4; i++ {
binary.BigEndian.PutUint32(asByteArrayWithLength(&array[i], 4), getUInt32Value(&ip[i]))
}
} else {
binary.BigEndian.PutUint32(asByteArrayWithLength(&array[0], 4), getUInt32Value(&ip[0]))
}
return array
}
func asByteArray[T any](obj *T) []byte {
return unsafe.Slice((*byte)(unsafe.Pointer(obj)), unsafe.Sizeof(*obj))
}
func asByteArrayWithLength[T any](obj *T, size uint32) []byte {
return unsafe.Slice((*byte)(unsafe.Pointer(obj)), size)
}
func getUInt32Value[T any](obj *T) uint32 {
return *(*uint32)(unsafe.Pointer(obj))
} }

View File

@@ -13,6 +13,7 @@ import (
"github.com/safing/portbase/log" "github.com/safing/portbase/log"
"github.com/safing/portmaster/network" "github.com/safing/portmaster/network"
"github.com/safing/portmaster/network/packet"
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
) )
@@ -217,24 +218,27 @@ func UpdateVerdict(conn *network.Connection) error {
defer kextLock.RUnlock() defer kextLock.RUnlock()
// Check if driver is initialized // Check if driver is initialized
if !ready.IsSet() { if kextHandle == winInvalidHandleValue {
log.Error("kext: failed to clear the cache: kext not ready") log.Error("kext: failed to clear the cache: kext not ready")
return ErrKextNotReady return ErrKextNotReady
} }
var isIpv6 uint8 = 0
if conn.IPVersion == packet.IPv6 {
isIpv6 = 1
}
// initialize variables // initialize variables
info := &VerdictUpdateInfo{ info := VerdictUpdateInfo{
ipV6: uint8(conn.IPVersion), ipV6: isIpv6,
protocol: uint8(conn.IPProtocol), protocol: uint8(conn.IPProtocol),
localIP: ipAddressToArray(conn.LocalIP, isIpv6 == 1),
localPort: conn.LocalPort, localPort: conn.LocalPort,
remoteIP: ipAddressToArray(conn.Entity.IP, isIpv6 == 1),
remotePort: conn.Entity.Port, remotePort: conn.Entity.Port,
verdict: uint8(conn.Verdict.Active), verdict: uint8(conn.Verdict.Active),
} }
// copy ip addresses
copy(asByteArray(&info.localIP[0]), conn.LocalIP)
copy(asByteArray(&info.remoteIP[0]), conn.Entity.IP)
// Make driver request // Make driver request
data := asByteArray(&info) data := asByteArray(&info)
err := deviceIoControlDirect(kextHandle, IOCTL_UPDATE_VERDICT, data) err := deviceIoControlDirect(kextHandle, IOCTL_UPDATE_VERDICT, data)
@@ -246,7 +250,7 @@ func GetVersion() (*VersionInfo, error) {
defer kextLock.RUnlock() defer kextLock.RUnlock()
// Check if driver is initialized // Check if driver is initialized
if !ready.IsSet() { if kextHandle == winInvalidHandleValue {
log.Error("kext: failed to clear the cache: kext not ready") log.Error("kext: failed to clear the cache: kext not ready")
return nil, ErrKextNotReady return nil, ErrKextNotReady
} }
@@ -267,10 +271,6 @@ func GetVersion() (*VersionInfo, error) {
return version, nil return version, nil
} }
func asByteArray[T any](obj *T) []byte {
return unsafe.Slice((*byte)(unsafe.Pointer(obj)), unsafe.Sizeof(*obj))
}
func openDriver(filename string) (windows.Handle, error) { func openDriver(filename string) (windows.Handle, error) {
u16filename, err := syscall.UTF16FromString(filename) u16filename, err := syscall.UTF16FromString(filename)
if err != nil { if err != nil {

View File

@@ -15,13 +15,13 @@ const (
) )
var ( var (
IOCTL_VERSION = ctlCode(SIOCTL_TYPE, 0x800, METHOD_NEITHER, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) IOCTL_VERSION = ctlCode(SIOCTL_TYPE, 0x800, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA)
IOCTL_RECV_VERDICT_REQ_POLL = ctlCode(SIOCTL_TYPE, 0x801, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) // Not used IOCTL_RECV_VERDICT_REQ_POLL = ctlCode(SIOCTL_TYPE, 0x801, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) // Not used
IOCTL_RECV_VERDICT_REQ = ctlCode(SIOCTL_TYPE, 0x802, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) IOCTL_RECV_VERDICT_REQ = ctlCode(SIOCTL_TYPE, 0x802, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA)
IOCTL_SET_VERDICT = ctlCode(SIOCTL_TYPE, 0x803, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) IOCTL_SET_VERDICT = ctlCode(SIOCTL_TYPE, 0x803, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA)
IOCTL_GET_PAYLOAD = ctlCode(SIOCTL_TYPE, 0x804, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) IOCTL_GET_PAYLOAD = ctlCode(SIOCTL_TYPE, 0x804, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA)
IOCTL_CLEAR_CACHE = ctlCode(SIOCTL_TYPE, 0x805, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) IOCTL_CLEAR_CACHE = ctlCode(SIOCTL_TYPE, 0x805, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA)
IOCTL_UPDATE_VERDICT = ctlCode(SIOCTL_TYPE, 0x806, METHOD_NEITHER, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA) IOCTL_UPDATE_VERDICT = ctlCode(SIOCTL_TYPE, 0x806, METHOD_BUFFERED, windows.FILE_READ_DATA|windows.FILE_WRITE_DATA)
) )
func ctlCode(device_type, function, method, access uint32) uint32 { func ctlCode(device_type, function, method, access uint32) uint32 {