@@ -26,7 +26,6 @@ import (
26
26
"github.com/rabbitstack/fibratus/pkg/network"
27
27
psnap "github.com/rabbitstack/fibratus/pkg/ps"
28
28
"github.com/rabbitstack/fibratus/pkg/util/cmdline"
29
- "github.com/rabbitstack/fibratus/pkg/util/loldrivers"
30
29
"github.com/rabbitstack/fibratus/pkg/util/signature"
31
30
"net"
32
31
"path/filepath"
@@ -539,73 +538,167 @@ func newThreadAccessor() Accessor {
539
538
return & threadAccessor {}
540
539
}
541
540
542
- func (t * threadAccessor ) Get (f Field , kevt * kevent.Kevent ) (kparams.Value , error ) {
541
+ func (t * threadAccessor ) Get (f Field , e * kevent.Kevent ) (kparams.Value , error ) {
543
542
switch f .Name {
544
543
case fields .ThreadBasePrio :
545
- return kevt .Kparams .GetUint8 (kparams .BasePrio )
544
+ return e .Kparams .GetUint8 (kparams .BasePrio )
546
545
case fields .ThreadIOPrio :
547
- return kevt .Kparams .GetUint8 (kparams .IOPrio )
546
+ return e .Kparams .GetUint8 (kparams .IOPrio )
548
547
case fields .ThreadPagePrio :
549
- return kevt .Kparams .GetUint8 (kparams .PagePrio )
548
+ return e .Kparams .GetUint8 (kparams .PagePrio )
550
549
case fields .ThreadKstackBase :
551
- return kevt .GetParamAsString (kparams .KstackBase ), nil
550
+ return e .GetParamAsString (kparams .KstackBase ), nil
552
551
case fields .ThreadKstackLimit :
553
- return kevt .GetParamAsString (kparams .KstackLimit ), nil
552
+ return e .GetParamAsString (kparams .KstackLimit ), nil
554
553
case fields .ThreadUstackBase :
555
- return kevt .GetParamAsString (kparams .UstackBase ), nil
554
+ return e .GetParamAsString (kparams .UstackBase ), nil
556
555
case fields .ThreadUstackLimit :
557
- return kevt .GetParamAsString (kparams .UstackLimit ), nil
556
+ return e .GetParamAsString (kparams .UstackLimit ), nil
558
557
case fields .ThreadEntrypoint , fields .ThreadStartAddress :
559
- return kevt .GetParamAsString (kparams .StartAddress ), nil
558
+ return e .GetParamAsString (kparams .StartAddress ), nil
560
559
case fields .ThreadPID :
561
- return kevt .Kparams .GetUint32 (kparams .ProcessID )
560
+ return e .Kparams .GetUint32 (kparams .ProcessID )
562
561
case fields .ThreadTEB :
563
- return kevt .GetParamAsString (kparams .TEB ), nil
562
+ return e .GetParamAsString (kparams .TEB ), nil
564
563
case fields .ThreadAccessMask :
565
- if kevt .Type != ktypes .OpenThread {
564
+ if e .Type != ktypes .OpenThread {
566
565
return nil , nil
567
566
}
568
- return kevt .Kparams .GetString (kparams .DesiredAccess )
567
+ return e .Kparams .GetString (kparams .DesiredAccess )
569
568
case fields .ThreadAccessMaskNames :
570
- if kevt .Type != ktypes .OpenThread {
569
+ if e .Type != ktypes .OpenThread {
571
570
return nil , nil
572
571
}
573
- return kevt .GetFlagsAsSlice (kparams .DesiredAccess ), nil
572
+ return e .GetFlagsAsSlice (kparams .DesiredAccess ), nil
574
573
case fields .ThreadAccessStatus :
575
- if kevt .Type != ktypes .OpenThread {
574
+ if e .Type != ktypes .OpenThread {
576
575
return nil , nil
577
576
}
578
- return kevt .GetParamAsString (kparams .NTStatus ), nil
577
+ return e .GetParamAsString (kparams .NTStatus ), nil
579
578
case fields .ThreadCallstackSummary :
580
- return kevt .Callstack .Summary (), nil
579
+ return e .Callstack .Summary (), nil
581
580
case fields .ThreadCallstackDetail :
582
- return kevt .Callstack .String (), nil
581
+ return e .Callstack .String (), nil
583
582
case fields .ThreadCallstackModules :
584
- return kevt .Callstack .Modules (), nil
583
+ // return the module at the given frame level
584
+ if f .Arg != "" {
585
+ n , err := strconv .Atoi (f .Arg )
586
+ if err != nil {
587
+ return nil , err
588
+ }
589
+
590
+ if n > e .Callstack .Depth () {
591
+ return "" , nil
592
+ }
593
+
594
+ return e .Callstack .FrameAt (n ).Module , nil
595
+ }
596
+
597
+ return e .Callstack .Modules (), nil
585
598
case fields .ThreadCallstackSymbols :
586
- return kevt .Callstack .Symbols (), nil
599
+ // return the symbol at the given frame level
600
+ if f .Arg != "" {
601
+ n , err := strconv .Atoi (f .Arg )
602
+ if err != nil {
603
+ return nil , err
604
+ }
605
+
606
+ if n > e .Callstack .Depth () {
607
+ return "" , nil
608
+ }
609
+
610
+ return e .Callstack .FrameAt (n ).Symbol , nil
611
+ }
612
+
613
+ return e .Callstack .Symbols (), nil
587
614
case fields .ThreadCallstackAllocationSizes :
588
- return kevt .Callstack .AllocationSizes (kevt .PID ), nil
615
+ return e .Callstack .AllocationSizes (e .PID ), nil
589
616
case fields .ThreadCallstackProtections :
590
- return kevt .Callstack .Protections (kevt .PID ), nil
617
+ return e .Callstack .Protections (e .PID ), nil
591
618
case fields .ThreadCallstackCallsiteLeadingAssembly :
592
- return kevt .Callstack .CallsiteInsns (kevt .PID , true ), nil
619
+ return e .Callstack .CallsiteInsns (e .PID , true ), nil
593
620
case fields .ThreadCallstackCallsiteTrailingAssembly :
594
- return kevt .Callstack .CallsiteInsns (kevt .PID , false ), nil
621
+ return e .Callstack .CallsiteInsns (e .PID , false ), nil
595
622
case fields .ThreadCallstackIsUnbacked :
596
- return kevt .Callstack .ContainsUnbacked (), nil
623
+ return e .Callstack .ContainsUnbacked (), nil
597
624
case fields .ThreadCallstack :
598
- return kevt .Callstack , nil
625
+ return e .Callstack , nil
599
626
case fields .ThreadStartAddressSymbol :
600
- if kevt .Type != ktypes .CreateThread {
627
+ if e .Type != ktypes .CreateThread {
601
628
return nil , nil
602
629
}
603
- return kevt .GetParamAsString (kparams .StartAddressSymbol ), nil
630
+ return e .GetParamAsString (kparams .StartAddressSymbol ), nil
604
631
case fields .ThreadStartAddressModule :
605
- if kevt .Type != ktypes .CreateThread {
632
+ if e .Type != ktypes .CreateThread {
606
633
return nil , nil
607
634
}
608
- return kevt .GetParamAsString (kparams .StartAddressModule ), nil
635
+ return e .GetParamAsString (kparams .StartAddressModule ), nil
636
+ case fields .ThreadCallstackAddresses :
637
+ return e .Callstack .Addresses (), nil
638
+ case fields .ThreadCallstackFinalUserModuleName , fields .ThreadCallstackFinalUserModulePath :
639
+ frame := e .Callstack .FinalUserFrame ()
640
+ if frame != nil {
641
+ if f .Name == fields .ThreadCallstackFinalUserModuleName {
642
+ return filepath .Base (frame .Module ), nil
643
+ }
644
+ return frame .Module , nil
645
+ }
646
+ return nil , nil
647
+ case fields .ThreadCallstackFinalUserSymbolName :
648
+ frame := e .Callstack .FinalUserFrame ()
649
+ if frame != nil {
650
+ return frame .Symbol , nil
651
+ }
652
+ return nil , nil
653
+ case fields .ThreadCallstackFinalKernelModuleName , fields .ThreadCallstackFinalKernelModulePath :
654
+ frame := e .Callstack .FinalKernelFrame ()
655
+ if frame != nil {
656
+ if f .Name == fields .ThreadCallstackFinalKernelModuleName {
657
+ return filepath .Base (frame .Module ), nil
658
+ }
659
+ return frame .Module , nil
660
+ }
661
+ return nil , nil
662
+ case fields .ThreadCallstackFinalKernelSymbolName :
663
+ frame := e .Callstack .FinalKernelFrame ()
664
+ if frame != nil {
665
+ return frame .Symbol , nil
666
+ }
667
+ return nil , nil
668
+ case fields .ThreadCallstackFinalUserModuleSignatureIsSigned , fields .ThreadCallstackFinalUserModuleSignatureIsTrusted :
669
+ frame := e .Callstack .FinalUserFrame ()
670
+ if frame == nil || (frame != nil && frame .ModuleAddress .IsZero ()) {
671
+ return nil , nil
672
+ }
673
+
674
+ sign := getSignature (frame .ModuleAddress , frame .Module , false )
675
+ if sign == nil {
676
+ return nil , nil
677
+ }
678
+
679
+ if f .Name == fields .ThreadCallstackFinalUserModuleSignatureIsSigned {
680
+ return sign .IsSigned (), nil
681
+ }
682
+
683
+ return sign .IsTrusted (), nil
684
+ case fields .ThreadCallstackFinalUserModuleSignatureCertIssuer , fields .ThreadCallstackFinalUserModuleSignatureCertSubject :
685
+ frame := e .Callstack .FinalUserFrame ()
686
+ if frame == nil || (frame != nil && frame .ModuleAddress .IsZero ()) {
687
+ return nil , nil
688
+ }
689
+
690
+ sign := getSignature (frame .ModuleAddress , frame .Module , true )
691
+ if sign == nil {
692
+ return nil , nil
693
+ }
694
+
695
+ if sign .HasCertificate () && f .Name == fields .ThreadCallstackFinalUserModuleSignatureCertIssuer {
696
+ return sign .Cert .Issuer , nil
697
+ }
698
+
699
+ if sign .HasCertificate () {
700
+ return sign .Cert .Subject , nil
701
+ }
609
702
}
610
703
611
704
return nil , nil
@@ -1244,42 +1337,3 @@ func (*dnsAccessor) Get(f Field, kevt *kevent.Kevent) (kparams.Value, error) {
1244
1337
1245
1338
return nil , nil
1246
1339
}
1247
-
1248
- // isLOLDriver interacts with the loldrivers client to determine
1249
- // whether the loaded/dropped driver is malicious or vulnerable.
1250
- func isLOLDriver (f fields.Field , kevt * kevent.Kevent ) (kparams.Value , error ) {
1251
- var filename string
1252
-
1253
- if kevt .Category == ktypes .File {
1254
- filename = kevt .GetParamAsString (kparams .FilePath )
1255
- } else {
1256
- filename = kevt .GetParamAsString (kparams .ImagePath )
1257
- }
1258
-
1259
- isDriver := filepath .Ext (filename ) == ".sys" || kevt .Kparams .TryGetBool (kparams .FileIsDriver )
1260
- if ! isDriver {
1261
- return nil , nil
1262
- }
1263
- ok , driver := loldrivers .GetClient ().MatchHash (filename )
1264
- if ! ok {
1265
- return nil , nil
1266
- }
1267
- if (f == fields .FileIsDriverVulnerable || f == fields .ImageIsDriverVulnerable ) && driver .IsVulnerable {
1268
- return true , nil
1269
- }
1270
- if (f == fields .FileIsDriverMalicious || f == fields .ImageIsDriverMalicious ) && driver .IsMalicious {
1271
- return true , nil
1272
- }
1273
- return false , nil
1274
- }
1275
-
1276
- // initLOLDriversClient initializes the loldrivers client if the filter expression
1277
- // contains any of the relevant fields.
1278
- func initLOLDriversClient (flds []Field ) {
1279
- for _ , f := range flds {
1280
- if f .Name == fields .FileIsDriverVulnerable || f .Name == fields .FileIsDriverMalicious ||
1281
- f .Name == fields .ImageIsDriverVulnerable || f .Name == fields .ImageIsDriverMalicious {
1282
- loldrivers .InitClient (loldrivers .WithAsyncDownload ())
1283
- }
1284
- }
1285
- }
0 commit comments