From fb68666fe95c438ae6eb4abeffb4d19f9b5ad0c5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 6 Feb 2019 08:19:54 +0100 Subject: [PATCH] Create first test integration for new windows kext --- firewall/interception/kexttest/main.go | 21 +++++++ firewall/interception/windivert/windivert.go | 6 +- firewall/interception/windowskext/kext.go | 62 ++++++++++++++++++++ 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 firewall/interception/kexttest/main.go create mode 100644 firewall/interception/windowskext/kext.go diff --git a/firewall/interception/kexttest/main.go b/firewall/interception/kexttest/main.go new file mode 100644 index 00000000..9ef3aa3f --- /dev/null +++ b/firewall/interception/kexttest/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "fmt" + + "github.com/Safing/portmaster/firewall/interception/windowskext" +) + +func main() { + kext, err := windowskext.New("./WinDivert.dll") + if err != nil { + panic(err) + } + + vR, err := kext.RecvVerdictRequest() + if err != nil { + panic(err) + } + + fmt.Printf("verdictRequest: %+v", vR) +} diff --git a/firewall/interception/windivert/windivert.go b/firewall/interception/windivert/windivert.go index c1110cd5..2c931692 100644 --- a/firewall/interception/windivert/windivert.go +++ b/firewall/interception/windivert/windivert.go @@ -205,8 +205,8 @@ func (wd *WinDivert) GetParam(param uintptr) (uint64, error) { var value uint64 r1, _, lastErr := wd.getParam.Call( - wd.handle, // __in HANDLE handle - param, // __in WINDIVERT_PARAM param + wd.handle, // __in HANDLE handle + param, // __in WINDIVERT_PARAM param uintptr(unsafe.Pointer(&value)), // __out UINT64 *pValue ) if r1 == rvFalse { @@ -220,7 +220,7 @@ func (wd *WinDivert) HelperCalcChecksums(packetData []byte, address *WinDivertAd byteSliceToPtr(packetData), // __inout PVOID pPacket uintptr(len(packetData)), // __in UINT packetLen uintptr(unsafe.Pointer(address)), // __in_opt PWINDIVERT_ADDRESS pAddr - flags, // __in UINT64 flags + flags, // __in UINT64 flags ) if r1 == rvFalse { return lastErr diff --git a/firewall/interception/windowskext/kext.go b/firewall/interception/windowskext/kext.go new file mode 100644 index 00000000..be4486b2 --- /dev/null +++ b/firewall/interception/windowskext/kext.go @@ -0,0 +1,62 @@ +package windowskext + +import ( + "fmt" + "unsafe" + + "golang.org/x/sys/windows" + + "github.com/tevino/abool" +) + +type WinKext struct { + dll *windows.DLL + + recvVerdictRequest *windows.Proc + + valid *abool.AtomicBool +} + +type VerdictRequest struct { + ID uint32 + ProcessID uint32 + Direction bool + IPv6 bool + SrcIP [4]uint32 + DstIP [4]uint32 + SrcPort uint16 + DstPort uint16 + Protocol uint8 +} + +func New(dllLocation string) (*WinKext, error) { + + new := &WinKext{} + var err error + + // load dll + new.dll, err = windows.LoadDLL(dllLocation) + if err != nil { + return nil, err + } + + // load functions + new.recvVerdictRequest, err = new.dll.FindProc("PortmasterRecvVerdictRequest") + if err != nil { + return nil, fmt.Errorf("could not find proc PortmasterRecvVerdictRequest: %s", err) + } + + return new, nil +} + +func (kext *WinKext) RecvVerdictRequest() (*VerdictRequest, error) { + new := &VerdictRequest{} + + rc, _, lastErr := kext.recvVerdictRequest.Call( + uintptr(unsafe.Pointer(new)), + ) + if rc != 0 { + return nil, lastErr + } + return new, nil +}