@@ -39,7 +39,7 @@ import (
3939)
4040
4141// systemRootRegexp is the regular expression for detecting path with unexpanded SystemRoot environment variable
42- var systemRootRegexp = regexp .MustCompile (`%SystemRoot%|\\SystemRoot` )
42+ var systemRootRegexp = regexp .MustCompile (`%SystemRoot%|^ \\SystemRoot|%systemroot% ` )
4343
4444// procYaraScans stores the total count of yara process scans
4545var procYaraScans = expvar .NewInt ("yara.proc.scans" )
@@ -72,29 +72,37 @@ func newPsInterceptor(snap ps.Snapshotter, yara yara.Scanner) KstreamInterceptor
7272
7373func (ps psInterceptor ) Intercept (kevt * kevent.Kevent ) (* kevent.Kevent , bool , error ) {
7474 switch kevt .Type {
75- case ktypes .CreateProcess , ktypes .TerminateProcess , ktypes .EnumProcess :
76- comm , err := kevt .Kparams .GetString (kparams .Comm )
75+ case ktypes .CreateProcess ,
76+ ktypes .TerminateProcess ,
77+ ktypes .EnumProcess :
78+ cmdline , err := kevt .Kparams .GetString (kparams .Comm )
7779 if err != nil {
7880 return kevt , true , err
7981 }
82+ // if leading/trailing quotes are found, get rid of them
83+ if cmdline [0 ] == '"' && cmdline [len (cmdline )- 1 ] == '"' {
84+ cmdline = cmdline [1 : len (cmdline )- 1 ]
85+ }
86+ // expand all variations of the SystemRoot env variable
87+ if systemRootRegexp .MatchString (cmdline ) {
88+ cmdline = systemRootRegexp .ReplaceAllString (cmdline , os .Getenv ("SystemRoot" ))
89+ }
8090 // some system processes are reported without the path in command line
81- if ! strings .Contains (comm , `\\:` ) {
82- _ , ok := sysProcs [comm ]
91+ if strings .Index (cmdline , `:\\` ) != 1 {
92+ proc , _ := kevt .Kparams .GetString (kparams .ProcessName )
93+ _ , ok := sysProcs [proc ]
8394 if ok {
84- _ = kevt . Kparams . Set ( kparams . Comm , filepath .Join (os .Getenv ("SystemRoot" ), comm ), kparams . UnicodeString )
95+ cmdline = filepath .Join (os .Getenv ("SystemRoot" ), "System32" , cmdline )
8596 }
8697 }
87- // to compose the full executable string we extract the path
88- // from the process's command line by expanding the `SystemRoot`
89- // env variable accordingly and also removing rubbish characters
90- i := strings .Index (comm , ".exe" )
98+ // append executable path parameter
99+ i := strings .Index (strings .ToLower (cmdline ), ".exe" )
91100 if i > 0 {
92- exe := strings .Replace (comm [0 :i + 4 ], "\" " , "" , - 1 )
93- if strings .Contains (exe , "SystemRoot" ) {
94- exe = systemRootRegexp .ReplaceAllString (exe , os .Getenv ("SystemRoot" ))
95- }
101+ exe := cmdline [0 : i + 4 ]
96102 kevt .Kparams .Append (kparams .Exe , kparams .UnicodeString , exe )
97103 }
104+ _ = kevt .Kparams .SetValue (kparams .Comm , cmdline )
105+
98106 // convert hexadecimal PID values to integers
99107 pid , err := kevt .Kparams .GetHexAsUint32 (kparams .ProcessID )
100108 if err != nil {
@@ -116,10 +124,9 @@ func (ps psInterceptor) Intercept(kevt *kevent.Kevent) (*kevent.Kevent, bool, er
116124 // get the process's start time and append it to the parameters
117125 started , err := getStartTime (pid )
118126 if err != nil {
119- log .Warnf ("couldn't get process (%d) start time: %v" , pid , err )
120- } else {
121- _ = kevt .Kparams .Append (kparams .StartTime , kparams .Time , started )
127+ started = kevt .Timestamp
122128 }
129+ _ = kevt .Kparams .Append (kparams .StartTime , kparams .Time , started )
123130 }
124131 if ps .yara != nil && kevt .Type == ktypes .CreateProcess {
125132 // run yara scanner on the target process
@@ -133,10 +140,10 @@ func (ps psInterceptor) Intercept(kevt *kevent.Kevent) (*kevent.Kevent, bool, er
133140 }
134141 return kevt , false , ps .snap .Write (kevt )
135142 }
136-
137143 return kevt , false , ps .snap .Remove (kevt )
138-
139- case ktypes .CreateThread , ktypes .TerminateThread , ktypes .EnumThread :
144+ case ktypes .CreateThread ,
145+ ktypes .TerminateThread ,
146+ ktypes .EnumThread :
140147 pid , err := kevt .Kparams .GetHexAsUint32 (kparams .ProcessID )
141148 if err != nil {
142149 return kevt , true , err
@@ -151,43 +158,40 @@ func (ps psInterceptor) Intercept(kevt *kevent.Kevent) (*kevent.Kevent, bool, er
151158 if err := kevt .Kparams .Set (kparams .ThreadID , tid , kparams .TID ); err != nil {
152159 return kevt , true , err
153160 }
154-
155161 if kevt .Type != ktypes .TerminateThread {
156162 return kevt , false , ps .snap .Write (kevt )
157163 }
158-
159164 return kevt , false , ps .snap .Remove (kevt )
160-
161- case ktypes . OpenProcess , ktypes .OpenThread :
165+ case ktypes . OpenProcess ,
166+ ktypes .OpenThread :
162167 pid , err := kevt .Kparams .GetUint32 (kparams .ProcessID )
163168 if err != nil {
164169 return kevt , true , err
165170 }
171+
166172 proc := ps .snap .Find (pid )
167173 if proc != nil {
168- kevt .Kparams .Append (kparams .Exe , kparams .UnicodeString , proc .Exe )
169- kevt . Kparams . Append (kparams .ProcessName , kparams .UnicodeString , proc .Name )
174+ kevt .Kparams .Append (kparams .Exe , kparams .UnicodeString , proc .Exe ).
175+ Append (kparams .ProcessName , kparams .UnicodeString , proc .Name )
170176 }
171177 _ = kevt .Kparams .Set (kparams .ProcessID , pid , kparams .PID )
178+
172179 // format the status code
173- status , err := kevt .Kparams .GetUint32 (kparams .NTStatus )
174- if err == nil {
175- _ = kevt .Kparams .Set (kparams .NTStatus , formatStatus (status , kevt ), kparams .UnicodeString )
176- }
180+ status := kevt .Kparams .MustGetUint32 (kparams .NTStatus )
181+ _ = kevt .Kparams .Set (kparams .NTStatus , formatStatus (status , kevt ), kparams .UnicodeString )
182+
177183 // convert desired access mask to hex value and transform
178184 // the access mask to a list of symbolical names
179- desiredAccess , err := kevt .Kparams .GetUint32 (kparams .DesiredAccess )
180- if err == nil {
181- _ = kevt .Kparams .Set (kparams .DesiredAccess , toHex (desiredAccess ), kparams .AnsiString )
182- }
185+ access := kevt .Kparams .MustGetUint32 (kparams .DesiredAccess )
186+ _ = kevt .Kparams .Set (kparams .DesiredAccess , toHex (access ), kparams .AnsiString )
187+
183188 if kevt .Type == ktypes .OpenProcess {
184- kevt .Kparams .Append (kparams .DesiredAccessNames , kparams .Slice , process .DesiredAccess (desiredAccess ).Flags ())
189+ kevt .Kparams .Append (kparams .DesiredAccessNames , kparams .Slice , process .DesiredAccess (access ).Flags ())
185190 } else {
186- kevt .Kparams .Append (kparams .DesiredAccessNames , kparams .Slice , thread .DesiredAccess (desiredAccess ).Flags ())
191+ kevt .Kparams .Append (kparams .DesiredAccessNames , kparams .Slice , thread .DesiredAccess (access ).Flags ())
187192 }
188193 return kevt , false , nil
189194 }
190-
191195 return kevt , true , nil
192196}
193197
0 commit comments