@@ -20,6 +20,7 @@ package etw
2020import (
2121 "context"
2222 "fmt"
23+ "github.com/rabbitstack/fibratus/internal/evasion"
2324 "github.com/rabbitstack/fibratus/pkg/config"
2425 "github.com/rabbitstack/fibratus/pkg/event"
2526 "github.com/rabbitstack/fibratus/pkg/event/params"
@@ -41,6 +42,7 @@ import (
4142 "net"
4243 "net/http"
4344 "os"
45+ "os/exec"
4446 "path/filepath"
4547 "runtime"
4648 "strings"
@@ -1294,6 +1296,127 @@ func testCallstackEnrichment(t *testing.T, hsnap handle.Snapshotter, psnap ps.Sn
12941296 }
12951297}
12961298
1299+ func containsEvasion (e * event.Event , evasion string ) bool {
1300+ m := e .GetMeta (event .EvasionsKey )
1301+ evas , ok := m .([]string )
1302+ if ! ok {
1303+ return false
1304+ }
1305+ for _ , eva := range evas {
1306+ if eva == evasion {
1307+ return true
1308+ }
1309+ }
1310+ return false
1311+ }
1312+
1313+ func TestEvasionScanner (t * testing.T ) {
1314+ var tests = []* struct {
1315+ name string
1316+ gen func () error
1317+ want func (e * event.Event ) bool
1318+ completed bool
1319+ }{
1320+ {
1321+ "direct syscall" ,
1322+ func () error {
1323+ cmd := exec .Command ("_fixtures/direct-syscall/direct-syscall.exe" )
1324+ return cmd .Run ()
1325+ },
1326+ func (e * event.Event ) bool {
1327+ if strings .Contains (strings .ToLower (e .Callstack .String ()), strings .ToLower ("direct-syscall.exe" )) && e .Type == event .SetThreadContext {
1328+ log .Info (e , e .Callstack )
1329+ return containsEvasion (e , "direct_syscall" )
1330+ }
1331+ return false
1332+ },
1333+ false ,
1334+ },
1335+ }
1336+
1337+ evsConfig := config.EventSourceConfig {
1338+ EnableThreadEvents : true ,
1339+ EnableImageEvents : true ,
1340+ EnableFileIOEvents : false ,
1341+ EnableVAMapEvents : true ,
1342+ EnableNetEvents : true ,
1343+ EnableRegistryEvents : false ,
1344+ EnableMemEvents : false ,
1345+ EnableHandleEvents : false ,
1346+ EnableDNSEvents : false ,
1347+ EnableAuditAPIEvents : true ,
1348+ StackEnrichment : true ,
1349+ }
1350+ evsConfig .Init ()
1351+
1352+ hsnap := new (handle.SnapshotterMock )
1353+ hsnap .On ("FindByObject" , mock .Anything ).Return (htypes.Handle {}, false )
1354+ hsnap .On ("FindHandles" , mock .Anything ).Return ([]htypes.Handle {}, nil )
1355+ hsnap .On ("Write" , mock .Anything ).Return (nil )
1356+ hsnap .On ("Remove" , mock .Anything ).Return (nil )
1357+
1358+ cfg := & config.Config {EventSource : evsConfig , Filters : & config.Filters {}}
1359+
1360+ psnap := ps .NewSnapshotter (hsnap , cfg )
1361+
1362+ evs := NewEventSource (psnap , hsnap , cfg , nil )
1363+
1364+ l := & MockListener {}
1365+ evs .RegisterEventListener (l )
1366+
1367+ symbolizer := symbolize .NewSymbolizer (symbolize .NewDebugHelpResolver (cfg ), psnap , cfg , true )
1368+ defer symbolizer .Close ()
1369+ evs .RegisterEventListener (symbolizer )
1370+
1371+ scanner := evasion .NewScanner (evasion.Config {Enabled : true , EnableDirectSyscall : true })
1372+ evs .RegisterEventListener (scanner )
1373+
1374+ require .NoError (t , evs .Open (cfg ))
1375+ defer evs .Close ()
1376+
1377+ time .Sleep (time .Second * 2 )
1378+
1379+ for _ , tt := range tests {
1380+ gen := tt .gen
1381+ if gen != nil {
1382+ log .Infof ("executing [%s] evasion test generator" , tt .name )
1383+ require .NoError (t , gen (), tt .name )
1384+ }
1385+ }
1386+
1387+ ntests := len (tests )
1388+ timeout := time .After (time .Duration (ntests ) * time .Minute )
1389+
1390+ for {
1391+ select {
1392+ case e := <- evs .Events ():
1393+ for _ , tt := range tests {
1394+ if tt .completed {
1395+ continue
1396+ }
1397+ pred := tt .want
1398+ if pred (e ) {
1399+ t .Logf ("PASS: %s" , tt .name )
1400+ tt .completed = true
1401+ ntests --
1402+ }
1403+ if ntests == 0 {
1404+ return
1405+ }
1406+ }
1407+ case err := <- evs .Errors ():
1408+ t .Fatalf ("FAIL: %v" , err )
1409+ case <- timeout :
1410+ for _ , tt := range tests {
1411+ if ! tt .completed {
1412+ t .Logf ("FAIL: %s" , tt .name )
1413+ }
1414+ }
1415+ t .Fatal ("FAIL: TestEvasionScanner" )
1416+ }
1417+ }
1418+ }
1419+
12971420var (
12981421 modadvapi32 = windows .NewLazySystemDLL ("advapi32.dll" )
12991422 kernel32 = windows .NewLazySystemDLL ("kernel32.dll" )
0 commit comments