mirror of
https://github.com/FalconOpsLLC/goexec
synced 2026-06-06 15:44:27 +00:00
60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
package dcomexec
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/oiweiwei/go-msrpc/msrpc/dcom"
|
|
)
|
|
|
|
type contextKey string
|
|
|
|
const (
|
|
// contextKeyComVersion (dcom.COMVersion) carries the effective COM version
|
|
contextKeyComVersion contextKey = "ComVersion"
|
|
contextDefaultComVersionMajor uint16 = 5
|
|
contextDefaultComVersionMinor uint16 = 7
|
|
|
|
// contextKeyGetComVersion (bool) determines whether to call getComVersion (ServerAlive2) to determine the COM version.
|
|
// If this is false, defaultComVersionMajor, contextDefaultComVersionMinor will be used.
|
|
contextKeyGetComVersion contextKey = "GetComVersion"
|
|
contextDefaultGetComVersion = true
|
|
|
|
contextKeyCreateInstanceMethod contextKey = "CreateInstanceMethod"
|
|
contextDefaultCreateInstanceMethod = OptRemoteCreateInstance
|
|
)
|
|
|
|
func contextGetComVersion(ctx context.Context) bool {
|
|
if v := ctx.Value(contextKeyGetComVersion); v != nil {
|
|
if g, ok := v.(bool); ok {
|
|
return g
|
|
}
|
|
}
|
|
return contextDefaultGetComVersion
|
|
}
|
|
|
|
// contextComVersion will return the effective COM version (*dcom.COMVersion) from a context.
|
|
// If no COM Version is set and GetComVersion is true, nil is returned
|
|
func contextComVersion(ctx context.Context) *dcom.COMVersion {
|
|
if v := ctx.Value(contextKeyComVersion); v != nil {
|
|
if g, ok := v.(dcom.COMVersion); ok {
|
|
return &g
|
|
}
|
|
}
|
|
if !contextGetComVersion(ctx) {
|
|
return &dcom.COMVersion{
|
|
MajorVersion: contextDefaultComVersionMajor,
|
|
MinorVersion: contextDefaultComVersionMinor,
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func contextCreateInstanceMethod(ctx context.Context) string {
|
|
if v := ctx.Value(contextKeyCreateInstanceMethod); v != nil {
|
|
if g, ok := v.(string); ok {
|
|
return g
|
|
}
|
|
}
|
|
return contextDefaultCreateInstanceMethod
|
|
}
|