Bitdefender Hypervisor Memory Introspection
hook_gva.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Bitdefender
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #include "hook.h"
6 #include "hook_gva.h"
7 #include "alerts.h"
8 #include "memcloak.h"
9 
10 
11 static INTSTATUS
13  _In_ HOOK_GVA *Hook
14  )
26 {
28 
29  if (NULL == Hook->GpaHook)
30  {
32  }
33 
34  Hook->Hash = 0;
35 
36  if (Hook->IsIntegrityOn)
37  {
38  status = IntMemClkHashRegion(Hook->GvaPage + Hook->Offset,
39  Hook->GpaHook->GpaPage + Hook->Offset,
40  Hook->Length,
41  &Hook->Hash);
42  if (!INT_SUCCESS(status))
43  {
44  ERROR("[ERROR] IntMemClkHashPage failed: 0x%08x\n", status);
45  }
46  }
47 
48  status = IntHookGpaRemoveHook(&Hook->GpaHook, 0);
49  if (!INT_SUCCESS(status))
50  {
51  ERROR("[ERROR] IntHookGpaRemoveHook failed: 0x%08x\n", status);
52  }
53 
54  return status;
55 }
56 
57 
58 static INTSTATUS
60  _In_ HOOK_GVA *Hook,
61  _In_ QWORD NewGpaPage
62  )
75 {
76  INTSTATUS status;
77  DWORD crc;
78 
79  status = IntHookGpaSetHook(NewGpaPage + Hook->Offset,
80  Hook->Length,
81  Hook->Header.EptHookType,
82  Hook->Callback.Access,
83  Hook->Header.Context,
84  Hook,
85  0,
86  &Hook->GpaHook);
87  if (!INT_SUCCESS(status))
88  {
89  ERROR("[ERROR] IntHookGpaSetHook failed: 0x%08x\n", status);
90  }
91 
92  // Compute the hash on the given entity, to make sure it hasn't changed.
93  if (Hook->IsIntegrityOn)
94  {
95  crc = 0;
96 
97  status = IntMemClkHashRegion(Hook->GvaPage + Hook->Offset,
98  NewGpaPage + Hook->Offset,
99  Hook->Length,
100  &crc);
101  if (!INT_SUCCESS(status))
102  {
103  ERROR("[ERROR] IntMemClkHashPage failed: 0x%08x\n", status);
104  return status;
105  }
106 
107  if (0 == Hook->Hash)
108  {
109  Hook->Hash = crc;
110  }
111  else if (crc != Hook->Hash)
112  {
114 
115  WARNING("[WARNING] Integrity validation failed on page 0x%016llx/0x%016llx (length: %x, offset: %x), "
116  "computed hash is 0x%08x, stored hash is 0x%08x!\n",
117  NewGpaPage,
118  Hook->GvaPage,
119  Hook->Length,
120  Hook->Offset,
121  crc,
122  Hook->Hash);
123 
124  memzero(pTrViol, sizeof(*pTrViol));
125 
126  pTrViol->Header.Action = introGuestAllowed;
128  pTrViol->Header.MitreID = idRootkit;
129 
130  pTrViol->WriteInfo.NewValue[0] = NewGpaPage + Hook->Offset;
131  pTrViol->WriteInfo.OldValue[0] = 0;
132  pTrViol->WriteInfo.Size = sizeof(QWORD);
133 
134  pTrViol->Victim.VirtualAddress = Hook->GvaPage + Hook->Offset;
136 
138 
140 
142  {
143  pTrViol->Header.Flags |= ALERT_FLAG_BETA;
144  }
145 
147  {
148  EXCEPTION_KM_ORIGINATOR originator;
149 
150  memzero(&originator, sizeof(originator));
151 
153 
154  status = IntExceptKernelGetOriginator(&originator, 0);
155  if (!INT_SUCCESS(status))
156  {
157  WARNING("[WARNING] Failed to get originator on translation violation, RIP: %llx\n",
158  pTrViol->Header.CpuContext.Rip);
159  }
160 
163  }
164  else
165  {
166  pTrViol->Header.CurrentProcess.Valid = FALSE;
167  }
168 
169  IntAlertFillVersionInfo(&pTrViol->Header);
170 
171  status = IntNotifyIntroEvent(introEventTranslationViolation, pTrViol, sizeof(*pTrViol));
172  if (!INT_SUCCESS(status))
173  {
174  WARNING("[WARNING] IntNotifyIntroEvent failed: 0x%08x\n", status);
175  }
176  }
177  }
178 
179  return status;
180 }
181 
182 
183 static INTSTATUS
185  _In_ HOOK_GVA *Hook,
186  _In_ DWORD Flags
187  )
202 {
203  INTSTATUS status;
204 
205  if (0 != (Hook->Header.Flags & HOOK_FLG_REMOVE))
206  {
208  }
209 
210  if (NULL != Hook->GpaHook)
211  {
212  status = IntHookGpaRemoveHook(&Hook->GpaHook, HOOK_FLG_CHAIN_DELETE);
213  if (!INT_SUCCESS(status))
214  {
215  ERROR("[ERROR] IntHookGpaRemoveHook failed: 0x%08x\n", status);
216  }
217  }
218 
219  // Remove the PT hook, if any. There may be cases when the PT entry is not hooked; this happens
220  // when the PT is not present (the PD entry is invalid).
221  if (NULL != Hook->PtsHook)
222  {
223  status = IntHookPtsRemoveHook((HOOK_PTS **)&Hook->PtsHook, HOOK_FLG_CHAIN_DELETE);
224  if (!INT_SUCCESS(status))
225  {
226  ERROR("[ERROR] IntHookPtsRemoveHook failed: 0x%08x\n", status);
227  }
228  }
229 
230  Hook->Header.Flags |= (HOOK_FLG_DISABLED | HOOK_FLG_REMOVE);
231 
232  if (0 != (Flags & HOOK_FLG_CHAIN_DELETE))
233  {
234  Hook->Header.Flags |= HOOK_FLG_CHAIN_DELETE;
235  }
236 
237  RemoveEntryList(&Hook->Link);
238 
240 
242 
243  gHooks->Dirty = TRUE;
244 
245  return INT_STATUS_SUCCESS;
246 }
247 
248 
249 static INTSTATUS
251  _In_ HOOK_GVA *Hook,
252  _In_ QWORD VirtualAddress,
253  _In_ QWORD OldEntry,
254  _In_ QWORD NewEntry,
255  _In_ QWORD OldPageSize,
256  _In_ QWORD NewPageSize
257  )
274 {
275  INTSTATUS status;
276  QWORD newValue, oldValue, newGpaPage;
277  BOOLEAN disableHook, enableHook;
278 
279  UNREFERENCED_PARAMETER(VirtualAddress);
280  UNREFERENCED_PARAMETER(OldPageSize);
282 
283  if (NULL == Hook)
284  {
286  }
287 
288  status = INT_STATUS_SUCCESS;
289  newValue = NewEntry;
290  oldValue = OldEntry;
291  newGpaPage = 0;
292  disableHook = enableHook = FALSE;
293 
294  // And actually handle the swap operation.
295  if ((((oldValue & 1) == 1)) && (((newValue & 1) == 0)))
296  {
297  // Transition from present to non-present -> disable GVA hooks on this page.
298  // The page was just swapped out.
299  disableHook = TRUE;
300  }
301  else if ((((oldValue & 1) == 0)) && (((newValue & 1) == 1)))
302  {
303  // Transition from non-present to present -> enable GVA hooks on this page.
304  // The page was just swapped in.
305  enableHook = TRUE;
306  }
307  else if (((oldValue & 1) == 1) && ((newValue & 1) == 1) &&
308  (CLEAN_PHYS_ADDRESS64(oldValue) != CLEAN_PHYS_ADDRESS64(newValue)))
309  {
310  // Transition from present to present, but with different GPA -> disable & re-enable the GVA hooks on this page.
311  // This usually happens on COW (Copy On Write) inside user space, but may also happen with other reasons,
312  // depending on the OSs mm policies.
313  disableHook = enableHook = TRUE;
314  }
315 
316  if (disableHook)
317  {
318  status = IntHookGvaDisableHooks(Hook);
319  if (!INT_SUCCESS(status))
320  {
321  ERROR("[ERROR] IntHookGvaDisableHooks failed: 0x%08x\n", status);
322  }
323  }
324 
325  if (!!(newValue & PT_P))
326  {
327  newGpaPage = (CLEAN_PHYS_ADDRESS64(newValue) & (~(NewPageSize - 1))) + (Hook->GvaPage & (NewPageSize - 1));
328  Hook->IsPageWritable = !!(newValue & PT_RW);
329  }
330 
331  if (enableHook)
332  {
333  status = IntHookGvaEnableHooks(Hook, newGpaPage);
334  if (!INT_SUCCESS(status))
335  {
336  ERROR("[ERROR] IntHookGvaEnableHooks failed: 0x%08x\n", status);
337  }
338  }
339 
340  return status;
341 }
342 
343 
344 INTSTATUS
346  _In_ QWORD Cr3,
347  _In_ QWORD Gva,
348  _In_ DWORD Length,
349  _In_ BYTE Type,
350  _In_ void *Callback,
351  _In_opt_ void *Context,
352  _In_opt_ void *ParentHook,
353  _In_opt_ DWORD Flags,
354  _Out_opt_ HOOK_GVA **GvaHook
355  )
397 {
398  INTSTATUS status, status2;
399  PHOOK_GVA pGvaHook;
400 
401  pGvaHook = NULL;
402 
403  if ((Gva & PAGE_MASK) != ((Gva + Length - 1) & PAGE_MASK))
404  {
406  }
407 
408  Flags &= HOOK_FLG_GLOBAL_MASK;
409 
410  if (0 == Cr3)
411  {
412  Cr3 = gGuest.Mm.SystemCr3;
413  }
414 
415  pGvaHook = HpAllocWithTag(sizeof(*pGvaHook), IC_TAG_GVAH);
416  if (NULL == pGvaHook)
417  {
419  }
420 
421  pGvaHook->Header.Flags = Flags;
422  pGvaHook->Header.Context = Context;
423  pGvaHook->Header.ParentHook = ParentHook;
424  pGvaHook->Header.HookType = hookTypeGva;
425  pGvaHook->Header.EptHookType = Type;
426 
427  if (Type == IG_EPT_HOOK_NONE)
428  {
429  pGvaHook->Callback.Swap = Callback;
430  }
431  else
432  {
433  pGvaHook->Callback.Access = Callback;
434  }
435 
436  pGvaHook->GvaPage = Gva & PAGE_MASK;
437  pGvaHook->Offset = Gva & PAGE_OFFSET;
438  pGvaHook->Length = (WORD)Length; // Safe cast, Length is never > PAGE_SIZE
439  pGvaHook->IsIntegrityOn = (Type == IG_EPT_HOOK_WRITE) && (gGuest.Mm.SystemCr3 == Cr3);
440  pGvaHook->IsPageWritable = FALSE;
441 
442  InsertTailList(&gHooks->GvaHooks.GvaHooks, &pGvaHook->Link);
443 
444  if (IG_EPT_HOOK_NONE != Type)
445  {
446  status = IntHookPtsSetHook(Cr3, Gva, IntHookGvaHandleSwap, pGvaHook, pGvaHook, Flags, &pGvaHook->PtsHook);
447  if (!INT_SUCCESS(status))
448  {
449  ERROR("[ERROR] IntHookPtsSetHook failed: 0x%08x\n", status);
450  pGvaHook->PtsHook = NULL;
451  goto cleanup_and_exit;
452  }
453 
454  // If the page is present and the type is not none, we set the actual GPA hook on the page.
455  if (!!(pGvaHook->PtsHook->CurEntry & PT_P))
456  {
457  status = IntHookGvaHandleSwap(pGvaHook,
458  pGvaHook->GvaPage,
459  0,
460  pGvaHook->PtsHook->CurEntry,
461  0,
462  pGvaHook->PtsHook->CurPageSize);
463  if (!INT_SUCCESS(status))
464  {
465  ERROR("[ERROR] IntHookGvaHandleSwap failed: 0x%08x\n", status);
466  goto cleanup_and_exit;
467  }
468  }
469  }
470  else
471  {
472  // If EPT_HOOK_NONE is used as a type, then this is a swap-in callback. Note that for these hooks, a
473  // higher priority will be used.
474  status = IntHookPtsSetHook(Cr3, Gva, Callback, Context, pGvaHook, Flags, &pGvaHook->PtsHook);
475  if (!INT_SUCCESS(status))
476  {
477  ERROR("[ERROR] IntHookPtsSetHook failed: 0x%08x\n", status);
478  pGvaHook->PtsHook = NULL;
479  goto cleanup_and_exit;
480  }
481  }
482 
483  if (NULL != GvaHook)
484  {
485  *GvaHook = pGvaHook;
486  }
487 
488  status = INT_STATUS_SUCCESS;
489 
490 cleanup_and_exit:
491  if (!INT_SUCCESS(status))
492  {
493  status2 = IntHookGvaRemoveHookInternal(pGvaHook, 0);
494  if (!INT_SUCCESS(status2))
495  {
496  ERROR("[ERROR] IntHookGvaRemoveHookInternal failed: 0x%08x\n", status2);
497  }
498  }
499 
500  gHooks->Dirty = TRUE;
501 
502  return status;
503 }
504 
505 
506 INTSTATUS
508  _Inout_ HOOK_GVA **Hook,
509  _In_ DWORD Flags
510  )
524 {
525  INTSTATUS status;
526 
527  if (NULL == Hook)
528  {
530  }
531 
532  if (NULL == *Hook)
533  {
535  }
536 
537  Flags &= HOOK_FLG_GLOBAL_MASK;
538 
539  status = IntHookGvaRemoveHookInternal(*Hook, Flags);
540  if (!INT_SUCCESS(status))
541  {
542  ERROR("[ERROR] IntHookGvaRemoveHookInternal failed: 0x%08x\n", status);
543  }
544 
545  if (!(Flags & HOOK_FLG_CHAIN_DELETE))
546  {
547  *Hook = NULL;
548  }
549 
550  return status;
551 }
552 
553 
554 static INTSTATUS
556  _In_ HOOK_GVA *Hook,
557  _In_ DWORD Flags
558  )
570 {
571  INTSTATUS status;
572 
573  UNREFERENCED_PARAMETER(Flags);
574 
575  if (0 == (Hook->Header.Flags & HOOK_FLG_REMOVE))
576  {
577  ERROR("[ERROR] Trying to delete a non-removed hook!\n");
579  }
580 
582 
583  if (NULL != Hook->GpaHook)
584  {
585  status = IntHookGpaDeleteHook(&Hook->GpaHook, 0);
586  if (!INT_SUCCESS(status))
587  {
588  ERROR("[ERROR] IntHookGpaDeleteHook failed: 0x%08x\n", status);
589  }
590  }
591 
592  if (NULL != Hook->PtsHook)
593  {
594  status = IntHookPtsDeleteHook((HOOK_PTS **)&Hook->PtsHook, 0);
595  if (!INT_SUCCESS(status))
596  {
597  ERROR("[ERROR] IntHookPtsDeleteHook failed: 0x%08x\n", status);
598  }
599  }
600 
601  RemoveEntryList(&Hook->Link);
602 
604 
606 
607  return INT_STATUS_SUCCESS;
608 }
609 
610 
611 INTSTATUS
613  _Inout_ HOOK_GVA **Hook,
614  _In_ DWORD Flags
615  )
627 {
628  INTSTATUS status;
629 
630  UNREFERENCED_PARAMETER(Flags);
631 
632  if (NULL == Hook)
633  {
635  }
636 
637  if (NULL == *Hook)
638  {
640  }
641 
642  Flags &= HOOK_FLG_GLOBAL_MASK;
643 
644  status = IntHookGvaDeleteHookInternal(*Hook, 0);
645  if (!INT_SUCCESS(status))
646  {
647  ERROR("[ERROR] IntHookGvaDeleteHookInternal failed: 0x%08x\n", status);
648  }
649 
650  *Hook = NULL;
651 
652  return status;
653 }
654 
655 
656 INTSTATUS
658  void
659  )
669 {
670  LIST_ENTRY *list;
671 
673  {
674  return INT_STATUS_SUCCESS;
675  }
676 
678  while (list != &gHooks->GvaHooks.RemovedHooksList)
679  {
680  HOOK_GVA *pGvaHook = CONTAINING_RECORD(list, HOOK_GVA, Link);
681 
682  list = list->Flink;
683 
684  // Chain-delete means that the hook will be remove by its parent, directly. We don't have to do anything
685  // with it.
686  if (0 != (pGvaHook->Header.Flags & HOOK_FLG_CHAIN_DELETE))
687  {
688  continue;
689  }
690 
691  if (pGvaHook->Header.Flags & HOOK_FLG_REMOVE)
692  {
693  INTSTATUS status = IntHookGvaDeleteHookInternal(pGvaHook, 0);
694  if (!INT_SUCCESS(status))
695  {
696  ERROR("[ERROR] IntHookGvaDeleteHookInternal failed: 0x%08x\n", status);
697  }
698  }
699  else
700  {
701  ERROR("[ERROR] Invalid hook state: %x for hook at GVA 0x%016llx\n",
702  pGvaHook->Header.Flags, pGvaHook->GvaPage);
704  }
705  }
706 
708 
709  return INT_STATUS_SUCCESS;
710 }
711 
712 
713 INTSTATUS
715  void
716  )
722 {
724 
726 
727  return INT_STATUS_SUCCESS;
728 }
#define _In_opt_
Definition: intro_sal.h:16
_Bool BOOLEAN
Definition: intro_types.h:58
#define CONTAINING_RECORD(List, Type, Member)
Definition: introlists.h:36
BOOLEAN Valid
Set to True if the information in the structure is valid, False otherwise.
Definition: intro_types.h:904
WORD Length
Definition: hook_gva.h:34
BOOLEAN Dirty
Set whenever hooks are added or removed.
Definition: hook.h:97
void * Context
User-defined data that will be supplied to the callback.
Definition: hook.h:74
QWORD IntAlertCoreGetFlags(QWORD ProtectionFlag, INTRO_ACTION_REASON Reason)
Returns the flags for an alert.
Definition: alerts.c:366
DWORD Size
The size of the access.
Definition: intro_types.h:982
BOOLEAN IsPageWritable
True if the page is writable, false otherwise.
Definition: hook_gva.h:40
uint8_t BYTE
Definition: intro_types.h:47
HOOK_GVA_STATE GvaHooks
GVA hooks state.
Definition: hook.h:93
#define _In_
Definition: intro_sal.h:21
MITRE_ID MitreID
The Mitre ID that corresponds to this attack.
Definition: intro_types.h:1199
INTSTATUS IntHookGpaRemoveHook(HOOK_GPA **Hook, DWORD Flags)
Remove a GPA hook.
Definition: hook_gpa.c:738
LIST_ENTRY Link
List entry element.
Definition: hook_gva.h:21
#define CLEAN_PHYS_ADDRESS64(x)
Definition: pgtable.h:119
QWORD SystemCr3
The Cr3 used to map the kernel.
Definition: guests.h:211
#define INT_STATUS_SUCCESS
Definition: introstatus.h:54
uint16_t WORD
Definition: intro_types.h:48
QWORD NewValue[8]
The written value. Only the first Size bytes are valid.
Definition: intro_types.h:981
static INTSTATUS IntHookGvaEnableHooks(HOOK_GVA *Hook, QWORD NewGpaPage)
Enable a GVA hook.
Definition: hook_gva.c:59
#define STATS_EXIT(id)
Definition: stats.h:160
#define IntEnterDebugger()
Definition: introcore.h:373
struct _LIST_ENTRY * Flink
Definition: introlists.h:20
static INTSTATUS IntHookGvaDisableHooks(HOOK_GVA *Hook)
Deactivates a GVA hook.
Definition: hook_gva.c:12
#define INT_SUCCESS(Status)
Definition: introstatus.h:42
#define HOOK_FLG_DISABLED
If flag is set, the hook is disabled, therefore ignored on EPT violations.
Definition: hook.h:46
BOOLEAN IsIntegrityOn
True if integrity checks are enabled for this page. Integrity checks are enabled if the this is a wri...
Definition: hook_gva.h:39
QWORD Flags
A combination of ALERT_FLAG_* values describing the alert.
Definition: intro_types.h:1198
WORD Offset
Offset inside the 4K page, interval [0, 4095].
Definition: hook_gva.h:33
LIST_HEAD RemovedHooksList
IntHookGvaCommitHooks function is called.
Definition: hook_gva.h:50
static INTSTATUS IntHookGvaDeleteHookInternal(HOOK_GVA *Hook, DWORD Flags)
Completely delete a GVA hook.
Definition: hook_gva.c:555
#define PAGE_OFFSET
Definition: pgtable.h:32
Used by GVA hooks.
Definition: hook.h:18
BOOLEAN KernelBetaDetections
True if the kernel protection is in beta (log-only) mode.
Definition: guests.h:303
INTRO_VIOLATION_HEADER Header
The alert header.
Definition: intro_types.h:1542
BYTE EptHookType
The type of the hook in EPT (see IG_EPT_HOOK_TYPE)
Definition: hook.h:69
struct _EVENT_TRANSLATION_VIOLATION::@301 Victim
#define INT_STATUS_NOT_NEEDED_HINT
Definition: introstatus.h:317
#define ERROR(fmt,...)
Definition: glue.h:62
KERNEL_DRIVER * Driver
The driver that's modifying the memory.
Definition: exceptions.h:949
#define HpAllocWithTag(Len, Tag)
Definition: glue.h:516
int INTSTATUS
The status data type.
Definition: introstatus.h:24
QWORD GvaPage
Guest virtual page base address, aligned to 4K.
Definition: hook_gva.h:32
HOOK_STATE * gHooks
Global hooks state.
Definition: hook.c:8
QWORD VirtualAddress
The Virtual Address whose translation is being modified.
Definition: intro_types.h:1552
Event structure for illegal paging-structures modifications.
Definition: intro_types.h:1540
QWORD Rip
The value of the guest RIP register when the event was generated.
Definition: intro_types.h:968
Rootkit.
Definition: intro_types.h:1144
Describes a kernel-mode originator.
Definition: exceptions.h:943
union _HOOK_GVA::@85 Callback
EVENT_TRANSLATION_VIOLATION Translation
Definition: alerts.h:22
INTRO_GUEST_TYPE OSType
The type of the guest.
Definition: guests.h:278
void IntAlertFillCpuContext(BOOLEAN CopyInstruction, INTRO_CPUCTX *CpuContext)
Fills the current CPU context for an alert.
Definition: alerts.c:492
struct _EXCEPTION_KM_ORIGINATOR::@63 Return
INTSTATUS IntHookGvaDeleteHook(HOOK_GVA **Hook, DWORD Flags)
Completely delete a GVA hook.
Definition: hook_gva.c:612
INTSTATUS IntHookGpaSetHook(QWORD Gpa, DWORD Length, BYTE Type, PFUNC_EptViolationCallback Callback, void *Context, void *ParentHook, DWORD Flags, HOOK_GPA **Hook)
Places an EPT hook on the indicated memory range.
Definition: hook_gpa.c:193
QWORD CurPageSize
Current page size.
Definition: hook_pts.h:92
INTSTATUS IntHookPtsSetHook(QWORD Cr3, QWORD VirtualAddress, PFUNC_SwapCallback Callback, void *Context, void *Parent, DWORD Flags, PHOOK_PTS *Hook)
Start monitoring translation modifications for the given VirtualAddress.
Definition: hook_pts.c:1535
void IntAlertFillVersionInfo(INTRO_VIOLATION_HEADER *Header)
Fills version information for an alert.
Definition: alerts.c:327
INTSTATUS IntHookGvaInit(void)
Initialize the GVA hooks system.
Definition: hook_gva.c:714
TRANS_VIOLATION_TYPE ViolationType
Definition: intro_types.h:1562
INTRO_ACTION_REASON Reason
The reason for which Action was taken.
Definition: intro_types.h:1195
BOOLEAN HooksRemoved
True if at least one hook has been removed since the last commit.
Definition: hook_gva.h:52
BYTE HookType
The type of the hook structure (see _HOOK_TYPE)
Definition: hook.h:68
#define ALERT_FLAG_BETA
If set, the alert is a BETA alert. No action was taken.
Definition: intro_types.h:671
GENERIC_ALERT gAlert
Global alert buffer.
Definition: alerts.c:27
#define PT_RW
Definition: pgtable.h:84
#define _Inout_
Definition: intro_sal.h:20
#define HOOK_FLG_GLOBAL_MASK
Global flags must be defined here and must be handled by each hooks layer (even if it ignores them...
Definition: hook.h:35
#define _Out_opt_
Definition: intro_sal.h:30
#define INT_STATUS_NOT_INITIALIZED
Definition: introstatus.h:266
#define STATS_ENTER(id)
Definition: stats.h:153
INTRO_CPUCTX CpuContext
The context of the CPU that triggered the alert.
Definition: intro_types.h:1196
INTSTATUS IntNotifyIntroEvent(INTRO_EVENT_TYPE EventClass, void *Param, size_t EventSize)
Notifies the integrator about an introspection alert.
Definition: glue.c:1042
static BOOLEAN RemoveEntryList(LIST_ENTRY *Entry)
Definition: introlists.h:87
#define memzero(a, s)
Definition: introcrt.h:35
#define PT_P
Definition: pgtable.h:83
unsigned long long QWORD
Definition: intro_types.h:53
QWORD CurEntry
Current page-table entry.
Definition: hook_pts.h:90
void * ParentHook
The parent hook. For a GPA hook, for example, a GVA hook or a PagedHook will be the parent hook...
Definition: hook.h:73
#define HOOK_FLG_CHAIN_DELETE
If flag is set, then we won't remove the hook on commit phase; we'll let the parent hook handle the d...
Definition: hook.h:48
HOOK_HEADER Header
The hook header.
Definition: hook_gva.h:20
#define TRUE
Definition: intro_types.h:30
INTRO_WRITE_INFO WriteInfo
The original and new address to which VirtualAddress translates.
Definition: intro_types.h:1560
#define HpFreeAndNullWithTag(Add, Tag)
Definition: glue.h:517
INTSTATUS IntHookPtsRemoveHook(HOOK_PTS **Hook, DWORD Flags)
Remove a PTS hook.
Definition: hook_pts.c:1944
#define INT_STATUS_INVALID_INTERNAL_STATE
Definition: introstatus.h:272
#define IC_TAG_GVAH
GVA hook object.
Definition: memtags.h:35
Sent for virtual address translation alerts. See EVENT_TRANSLATION_VIOLATION.
Definition: intro_types.h:94
INTSTATUS IntHookGpaDeleteHook(HOOK_GPA **Hook, DWORD Flags)
Permanently delete a GPA hook.
Definition: hook_gpa.c:830
LIST_HEAD GvaHooks
The list of GVA hooks.
Definition: hook_gva.h:49
void IntAlertFillWinProcessCurrent(INTRO_PROCESS *EventProcess)
Saves information about the current Windows process inside an alert.
Definition: alerts.c:781
static void InsertTailList(LIST_ENTRY *ListHead, LIST_ENTRY *Entry)
Definition: introlists.h:135
#define WARNING(fmt,...)
Definition: glue.h:60
static void InitializeListHead(LIST_ENTRY *ListHead)
Definition: introlists.h:69
#define UNREFERENCED_PARAMETER(P)
Definition: introdefs.h:29
uint32_t DWORD
Definition: intro_types.h:49
INTSTATUS IntHookPtsDeleteHook(HOOK_PTS **Hook, DWORD Flags)
Permanently delete the PTS hook.
Definition: hook_pts.c:1993
static INTSTATUS IntHookGvaHandleSwap(HOOK_GVA *Hook, QWORD VirtualAddress, QWORD OldEntry, QWORD NewEntry, QWORD OldPageSize, QWORD NewPageSize)
Handle a swap event on a hooked guest virtual page.
Definition: hook_gva.c:250
QWORD OldValue[8]
The original value. Only the first Size bytes are valid.
Definition: intro_types.h:980
No access type. This can be used for swap hooks.
Definition: glueiface.h:297
MM Mm
Guest memory information, such as paging mode, system Cr3 value, etc.
Definition: guests.h:374
INTRO_MODULE Module
The module that modified the translation.
Definition: intro_types.h:1546
GUEST_STATE gGuest
The current guest state.
Definition: guests.c:50
PFUNC_EptViolationCallback Access
The read/write/execute access callback. Valid if Type != IG_EPT_HOOK_NONE.
Definition: hook_gva.h:25
INTRO_MODULE ReturnModule
The module to which the current code return to.
Definition: intro_types.h:1547
struct _EXCEPTION_KM_ORIGINATOR::@64 Original
INTRO_ACTION Action
The action that was taken as the result of this alert.
Definition: intro_types.h:1194
PHOOK_PTS PtsHook
The page tables hook.
Definition: hook_gva.h:31
struct _EVENT_TRANSLATION_VIOLATION::@300 Originator
#define INT_STATUS_INVALID_PARAMETER_1
Definition: introstatus.h:62
#define INT_STATUS_NOT_SUPPORTED
Definition: introstatus.h:287
INTRO_PROCESS CurrentProcess
The current process.
Definition: intro_types.h:1197
INTSTATUS IntHookGvaRemoveHook(HOOK_GVA **Hook, DWORD Flags)
Remove a GVA hook.
Definition: hook_gva.c:507
The action was blocked because there was no exception for it.
Definition: intro_types.h:189
After a page was swapped-in, its hash no longer matches the one it had when it was swapped-out...
Definition: intro_types.h:1529
DWORD Flags
Generic flags. Check out EPT Hook flags.
Definition: hook.h:67
void IntAlertFillWinKmModule(const KERNEL_DRIVER *Driver, INTRO_MODULE *EventModule)
Saves kernel module information inside an alert.
Definition: alerts.c:617
INTSTATUS IntHookGvaCommitHooks(void)
Commit all the modified GVA hooks.
Definition: hook_gva.c:657
Write-access hook.
Definition: glueiface.h:299
#define PAGE_MASK
Definition: pgtable.h:35
INTSTATUS IntExceptKernelGetOriginator(EXCEPTION_KM_ORIGINATOR *Originator, DWORD Options)
This function is used to get the information about the kernel-mode originator.
INTSTATUS IntHookGvaSetHook(QWORD Cr3, QWORD Gva, DWORD Length, BYTE Type, void *Callback, void *Context, void *ParentHook, DWORD Flags, HOOK_GVA **GvaHook)
Set a read, write, execute or swap hook on a guest virtual address.
Definition: hook_gva.c:345
static INTSTATUS IntHookGvaRemoveHookInternal(HOOK_GVA *Hook, DWORD Flags)
Remove a GVA hook.
Definition: hook_gva.c:184
Measures the deletion of HOOK_GVA objects.
Definition: stats.h:40
INTSTATUS IntMemClkHashRegion(QWORD VirtualAddress, QWORD PhysicalAddress, DWORD Size, DWORD *Crc32)
Hashes the contents of a cloaked memory page.
Definition: memcloak.c:1005
#define HOOK_FLG_REMOVE
If flag is set, the hook has been removed, and waits the next commit to be actually deleted...
Definition: hook.h:44
PFUNC_SwapCallback Swap
The swap callback. Valid if Type == IG_EPT_HOOK_NONE.
Definition: hook_gva.h:26
#define FALSE
Definition: intro_types.h:34
#define INT_STATUS_INSUFFICIENT_RESOURCES
Definition: introstatus.h:281