1// Copyright 2016 Keybase, Inc. All rights reserved. Use of 2// this source code is governed by the included BSD license. 3 4package libkb 5 6import ( 7 "errors" 8 "syscall" 9 "unsafe" 10) 11 12const loadLibrarySearchSystem32 = 0x800 13 14// SaferDLLLoading sets DLL load path to be safer. 15func SaferDLLLoading() error { 16 kernel32, err := syscall.LoadDLL("kernel32.dll") 17 if err != nil { 18 return err 19 } 20 21 procSetDllDirectoryW, err := kernel32.FindProc("SetDllDirectoryW") 22 if err != nil { 23 return err 24 } 25 var zero uint16 26 r1, _, e1 := syscall.Syscall(procSetDllDirectoryW.Addr(), 1, 27 uintptr(unsafe.Pointer(&zero)), 0, 0) 28 29 procSetDefaultDllDirectories, err := kernel32.FindProc("SetDefaultDllDirectories") 30 if err == nil && procSetDefaultDllDirectories.Addr() != 0 { 31 r1, _, e1 = syscall.Syscall(procSetDefaultDllDirectories.Addr(), 1, 32 loadLibrarySearchSystem32, 0, 0) 33 if r1 == 0 { 34 return e1 35 } 36 } else { 37 return errors.New("SetDefaultDllDirectories not found - please install KB2533623 for safer DLL loading") 38 } 39 40 return nil 41} 42