pkg/generator/winlog/random.go (73 lines of code) (raw):
package winlog
import (
"fmt"
"math/rand"
"strconv"
"sync"
"time"
)
var (
mapMu sync.Mutex
serviceSIDMap = map[string]string{}
userSIDMap = map[string]string{}
)
// RandomUser generates a random user name.
func RandomUser() string {
return "user" + strconv.Itoa(rand.Intn(100))
}
// RandomComputerName generates a random computer name. If domain is provided,
// it will be app.
func RandomComputerName(domain string) string {
name := "COMPUTER-" + strconv.Itoa(rand.Intn(1000))
if domain != "" {
name += "." + domain
}
return name
}
// RandomDomain generates a random domain.
func RandomDomain() string {
return "DOMAIN-" + strconv.Itoa(rand.Intn(10))
}
// RandomSID generates a random SID.
func RandomSID() string {
return fmt.Sprintf(
"S-1-5-21-%d-%d-%d-%d",
rand.Intn(1<<32),
rand.Intn(1<<32),
rand.Intn(1<<32),
rand.Intn(1<<16),
)
}
// RandomServiceSID generates a random SID for a service with name. If a SID
// has already been generated for this name, it will be returned.
func RandomServiceSID(name string) string {
mapMu.Lock()
defer mapMu.Unlock()
if sid, ok := serviceSIDMap[name]; ok {
return sid
}
sid := RandomSID()
serviceSIDMap[name] = sid
return sid
}
// RandomUserSID generates a random SID for a user with name. If a SID
// has already been generated for this name, it will be returned.
func RandomUserSID(name string) string {
mapMu.Lock()
defer mapMu.Unlock()
if sid, ok := userSIDMap[name]; ok {
return sid
}
sid := RandomSID()
userSIDMap[name] = sid
return sid
}
func RandomEvent(eventID uint32, now time.Time) Event {
return Event{
EventID: EventID{
ID: eventID,
},
Task: uint16(rand.Intn(65536)),
Keywords: 0x8020000000000000,
TimeCreated: TimeCreated{
SystemTime: now,
},
RecordID: rand.Uint64(),
Correlation: Correlation{},
Execution: Execution{
ProcessID: uint32(rand.Intn(65536)),
ThreadID: uint32(rand.Intn(65536)),
},
}
}