Skip to content

Commit 26c2c34

Browse files
committed
New feature, hiding hv presence
1 parent 255b537 commit 26c2c34

File tree

10 files changed

+93
-53
lines changed

10 files changed

+93
-53
lines changed

HyperHide/HyperHideDrv.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ HyperHideDrv::HyperHideDrv()
99

1010
HyperHideDrv::~HyperHideDrv()
1111
{
12+
SetHyperVisorVisibility(TRUE);
1213
if (this->DriverHandle != 0 && this->DriverHandle != INVALID_HANDLE_VALUE)
1314
CloseHandle(this->DriverHandle);
1415
}
@@ -37,6 +38,19 @@ BOOLEAN HyperHideDrv::CallDriver(size_t Ioctl)
3738
);
3839
}
3940

41+
void HyperHideDrv::SetHyperVisorVisibility(BOOLEAN Value)
42+
{
43+
DWORD BytesReturned = 0;
44+
DeviceIoControl
45+
(
46+
this->DriverHandle,
47+
IOCTL_SET_HYPERVISOR_VISIBILITY,
48+
&Value, sizeof(BOOLEAN),
49+
0, 0,
50+
&BytesReturned, NULL
51+
);
52+
}
53+
4054
BOOLEAN HyperHideDrv::Hide(HIDE_INFO& HideInfo)
4155
{
4256
if (this->Pid == NULL)

HyperHide/HyperHideDrv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class HyperHideDrv
5454
BOOLEAN CallDriver(size_t Ioctl);
5555
BOOLEAN Hide(HIDE_INFO& HideInfo);
5656
void SetTargetPid(UINT32 Pid);
57+
void SetHyperVisorVisibility(BOOLEAN Value);
5758
HANDLE GetDriverHandleValue();
5859

5960
private:

HyperHide/Ioctl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
#define IOCTL_HIDE_PROCESS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x904, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
88
#define IOCTL_REMOVE_HIDER_ENTRY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x905, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
99
#define IOCTL_PROCESS_STOPPED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x906, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
10-
#define IOCTL_PROCESS_RESUMED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x907, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
10+
#define IOCTL_PROCESS_RESUMED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x907, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
11+
#define IOCTL_SET_HYPERVISOR_VISIBILITY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x908, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)

HyperHide/pluginmain.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
enum MenuItems
1212
{
13-
MENU_HIDER,
13+
MENU_OPTIONS,
14+
MENU_HYPERVISOR_VISIBLE,
1415
};
1516

1617
HINSTANCE hinst;
@@ -294,7 +295,7 @@ void MenuEntry(CBTYPE cbType, void* CallbackInfo)
294295
PLUG_CB_MENUENTRY* Info = (PLUG_CB_MENUENTRY*)CallbackInfo;
295296
switch (Info->hEntry)
296297
{
297-
case MENU_HIDER:
298+
case MENU_OPTIONS:
298299
{
299300
if (g_HyperHideDrv->GetDriverHandleValue() == INVALID_HANDLE_VALUE)
300301
{
@@ -308,6 +309,16 @@ void MenuEntry(CBTYPE cbType, void* CallbackInfo)
308309
DialogBox(hinst, MAKEINTRESOURCE(DLG_MAIN), NULL, HiderDialog);
309310
break;
310311
}
312+
313+
case MENU_HYPERVISOR_VISIBLE:
314+
{
315+
static BOOLEAN HypervisorPresent = TRUE;
316+
HypervisorPresent = !HypervisorPresent;
317+
318+
g_HyperHideDrv->SetHyperVisorVisibility(HypervisorPresent);
319+
break;
320+
}
321+
311322
default:
312323
{
313324
break;
@@ -348,7 +359,9 @@ PLUG_EXPORT void plugsetup(PLUG_SETUPSTRUCT* setupStruct)
348359
g_Settings = new Settings();
349360
g_Settings->Load(g_HyperHideIniPath);
350361

351-
_plugin_menuaddentry(hMenu, MENU_HIDER, "&Options");
362+
_plugin_menuaddentry(hMenu, MENU_OPTIONS, "&Options");
363+
_plugin_menuaddentry(hMenu, MENU_HYPERVISOR_VISIBLE, "&Hypervisor not visible");
364+
_plugin_menuentrysetchecked(pluginHandle, MENU_HYPERVISOR_VISIBLE, 0);
352365

353366
HRSRC Icon = FindResourceW(hinst, MAKEINTRESOURCEW(IDB_ICON), L"PNG");
354367
if (Icon != NULL)

HyperHideDrv/Dispatcher.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "KuserSharedData.h"
77
#include "GlobalData.h"
88
#include "Peb.h"
9+
#include "HypervisorGateway.h"
910

1011
extern HYPER_HIDE_GLOBAL_DATA g_HyperHide;
1112

@@ -82,6 +83,14 @@ NTSTATUS DrvIOCTLDispatcher(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
8283
Status = STATUS_UNSUCCESSFUL;
8384
break;
8485
}
86+
87+
case IOCTL_SET_HYPERVISOR_VISIBILITY:
88+
{
89+
BOOLEAN Value = *(BOOLEAN*)Irp->AssociatedIrp.SystemBuffer;
90+
hv::hypervisor_visible(Value);
91+
break;
92+
}
93+
8594
}
8695

8796
Irp->IoStatus.Status = Status;

HyperHideDrv/HypervisorGateway.cpp

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66

77
#define IOCTL_POOL_MANAGER_ALLOCATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x900, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
88

9-
enum __vmcall_reason
9+
enum vm_call_reasons
1010
{
1111
VMCALL_TEST,
1212
VMCALL_VMXOFF,
1313
VMCALL_EPT_HOOK_FUNCTION,
1414
VMCALL_EPT_UNHOOK_FUNCTION,
15-
VMCALL_UNHOOK_ALL_PAGES,
1615
VMCALL_INVEPT_CONTEXT,
16+
VMCALL_DUMP_POOL_MANAGER,
17+
VMCALL_DUMP_VMCS_STATE,
18+
VMCALL_HIDE_HV_PRESENCE,
19+
VMCALL_UNHIDE_HV_PRESENCE
1720
};
1821

1922
enum invept_type
@@ -24,8 +27,6 @@ enum invept_type
2427

2528
namespace hv
2629
{
27-
PDEVICE_OBJECT AirHvDeviceObject = NULL;
28-
2930
void broadcast_vmoff(KDPC* Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
3031
{
3132
UNREFERENCED_PARAMETER(DeferredContext);
@@ -93,6 +94,18 @@ namespace hv
9394
else KeGenericCallDpc(broadcast_invept_single_context, NULL);
9495
}
9596

97+
/// <summary>
98+
/// Set/Unset presence of hypervisor
99+
/// </summary>
100+
/// <param name="value"> If false, hypervisor is not visible via cpuid interface, If true, it become visible</param>
101+
void hypervisor_visible(bool value)
102+
{
103+
if (value == true)
104+
__vm_call(VMCALL_UNHIDE_HV_PRESENCE, 0, 0, 0);
105+
else
106+
__vm_call(VMCALL_HIDE_HV_PRESENCE, 0, 0, 0);
107+
}
108+
96109
/// <summary>
97110
/// Hook function via ept and invalidate ept entries in tlb
98111
/// </summary>
@@ -111,7 +124,6 @@ namespace hv
111124
return status;
112125
}
113126

114-
115127
/// <summary>
116128
/// Hook function via ept and invalidate ept entries in tlb
117129
/// </summary>
@@ -136,62 +148,50 @@ namespace hv
136148
return __vm_call(VMCALL_TEST, 0, 0, 0);
137149
}
138150

139-
BOOLEAN PerformAllocation()
151+
bool send_irp_perform_allocation()
140152
{
141-
NTSTATUS Status;
142-
KEVENT Event;
143-
PIRP Irp;
144-
IO_STATUS_BLOCK ioStatus = { 0 };
153+
PDEVICE_OBJECT airhv_device_object;
154+
NTSTATUS status;
155+
KEVENT event;
156+
PIRP irp;
157+
IO_STATUS_BLOCK io_status = { 0 };
158+
UNICODE_STRING airhv_name;
159+
PFILE_OBJECT file_object;
145160

146-
if (AirHvDeviceObject == NULL)
147-
{
148-
UNICODE_STRING AirHvName;
149-
PFILE_OBJECT FileObject;
150-
RtlInitUnicodeString(&AirHvName, L"\\Device\\airhv");
161+
RtlInitUnicodeString(&airhv_name, L"\\Device\\airhv");
151162

152-
Status = IoGetDeviceObjectPointer(&AirHvName, NULL, &FileObject, &AirHvDeviceObject);
163+
status = IoGetDeviceObjectPointer(&airhv_name, 0, &file_object, &airhv_device_object);
153164

154-
if (NT_SUCCESS(Status) == FALSE)
155-
{
156-
LogError("Couldn't get hypervisor device object pointer");
157-
return FALSE;
158-
}
159-
}
165+
ObReferenceObjectByPointer(airhv_device_object, FILE_ALL_ACCESS, 0, KernelMode);
160166

161-
KeInitializeEvent(&Event, NotificationEvent, FALSE);
162-
__try
163-
{
164-
Irp = IoBuildDeviceIoControlRequest(IOCTL_POOL_MANAGER_ALLOCATE, AirHvDeviceObject, NULL, NULL, NULL, NULL, FALSE, &Event, &ioStatus);
165-
}
166-
__except (EXCEPTION_EXECUTE_HANDLER)
167+
// We don't need this so we instantly dereference file object
168+
ObDereferenceObject(file_object);
169+
170+
if (NT_SUCCESS(status) == false)
167171
{
168-
ASSERT(FALSE);
169-
return FALSE;
172+
LogError("Couldn't get hypervisor device object pointer");
173+
return false;
170174
}
171175

176+
KeInitializeEvent(&event, NotificationEvent, 0);
177+
irp = IoBuildDeviceIoControlRequest(IOCTL_POOL_MANAGER_ALLOCATE, airhv_device_object, 0, 0, 0, 0, 0, &event, &io_status);
172178

173-
if (Irp == NULL)
179+
if (irp == NULL)
174180
{
175181
LogError("Couldn't create Irp");
176-
return FALSE;
182+
ObDereferenceObject(airhv_device_object);
183+
return false;
177184
}
178185

179186
else
180187
{
181-
Status = IofCallDriver(AirHvDeviceObject, Irp);
188+
status = IofCallDriver(airhv_device_object, irp);
182189

183-
if (Status == STATUS_PENDING)
184-
{
185-
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
186-
Status = ioStatus.Status;
187-
}
190+
if (status == STATUS_PENDING)
191+
KeWaitForSingleObject(&event, Executive, KernelMode, 0, 0);
188192

189-
return TRUE;
193+
ObDereferenceObject(airhv_device_object);
194+
return true;
190195
}
191196
}
192-
193-
VOID CloseHandle()
194-
{
195-
ObDereferenceObject(AirHvDeviceObject);
196-
}
197197
}

HyperHideDrv/HypervisorGateway.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
#include <ntddk.h>
33
namespace hv
44
{
5-
extern PDEVICE_OBJECT AirHvDeviceObject;
6-
75
bool hook_function(void* target_address, void* hook_function, void* trampoline, void** origin_function);
86

97
bool hook_function(void* target_address, void* hook_function, void** origin_function);
108

9+
void hypervisor_visible(bool value);
10+
1111
bool test_vmcall();
1212

1313
bool unhook_all_functions();
1414

1515
bool unhook_function(unsigned __int64 function_address);
1616

17-
BOOLEAN PerformAllocation();
17+
bool send_irp_perform_allocation();
1818
}

HyperHideDrv/Ioctl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
#define IOCTL_HIDE_PROCESS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x904, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
99
#define IOCTL_REMOVE_HIDER_ENTRY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x905, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1010
#define IOCTL_PROCESS_STOPPED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x906, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
11-
#define IOCTL_PROCESS_RESUMED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x907, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
11+
#define IOCTL_PROCESS_RESUMED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x907, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
12+
#define IOCTL_SET_HYPERVISOR_VISIBILITY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x908, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)

HyperHideDrv/Log.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#define _NO_CRT_STDIO_INLINE
12
#include <ntifs.h>
23
#include <stdarg.h>
34
#include <ntstrsafe.h>

0 commit comments

Comments
 (0)