Skip to content

Commit 37aa45b

Browse files
committed
Driver: native way to get handle object pointer
1 parent 9b565f4 commit 37aa45b

File tree

6 files changed

+114
-27
lines changed

6 files changed

+114
-27
lines changed

src/BlackBoneDrv/Imports.h

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,13 @@ BOOLEAN
124124
NTAPI
125125
PsIsProtectedProcess( IN PEPROCESS Process );
126126

127-
typedef VOID( NTAPI *PKNORMAL_ROUTINE )
128-
(
127+
typedef VOID( NTAPI *PKNORMAL_ROUTINE )(
129128
PVOID NormalContext,
130129
PVOID SystemArgument1,
131130
PVOID SystemArgument2
132131
);
133132

134-
typedef VOID( NTAPI* PKKERNEL_ROUTINE)
135-
(
133+
typedef VOID( NTAPI* PKKERNEL_ROUTINE)(
136134
PRKAPC Apc,
137135
PKNORMAL_ROUTINE *NormalRoutine,
138136
PVOID *NormalContext,
@@ -180,3 +178,30 @@ RtlImageDirectoryEntryToData(
180178
USHORT DirectoryEntry,
181179
PULONG Size
182180
);
181+
182+
183+
typedef BOOLEAN ( *EX_ENUMERATE_HANDLE_ROUTINE )(
184+
#if !defined(_WIN7_)
185+
IN PHANDLE_TABLE HandleTable,
186+
#endif
187+
IN PHANDLE_TABLE_ENTRY HandleTableEntry,
188+
IN HANDLE Handle,
189+
IN PVOID EnumParameter
190+
);
191+
192+
NTKERNELAPI
193+
BOOLEAN
194+
ExEnumHandleTable(
195+
IN PHANDLE_TABLE HandleTable,
196+
IN EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,
197+
IN PVOID EnumParameter,
198+
OUT PHANDLE Handle
199+
);
200+
201+
NTKERNELAPI
202+
VOID
203+
FASTCALL
204+
ExfUnblockPushLock (
205+
IN OUT PEX_PUSH_LOCK PushLock,
206+
IN OUT PVOID WaitBlock
207+
);

src/BlackBoneDrv/NativeStructs10.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,12 @@ typedef struct _HANDLE_TABLE
171171
ULONG NextHandleNeedingPool;
172172
long ExtraInfoPages;
173173
LONG_PTR TableCode;
174+
PEPROCESS QuotaProcess;
175+
LIST_ENTRY HandleTableList;
176+
ULONG UniqueProcessId;
177+
ULONG Flags;
178+
EX_PUSH_LOCK HandleContentionEvent;
179+
EX_PUSH_LOCK HandleTableLock;
174180
// More fields here...
175181
} HANDLE_TABLE, *PHANDLE_TABLE;
176182

src/BlackBoneDrv/NativeStructs7.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ typedef struct _HANDLE_TABLE
185185
HANDLE UniqueProcessId;
186186
void* HandleLock;
187187
struct _LIST_ENTRY HandleTableList;
188-
void* HandleContentionEvent;
188+
EX_PUSH_LOCK HandleContentionEvent;
189189
struct _HANDLE_TRACE_DEBUG_INFO *DebugInfo;
190190
int ExtraInfoPages;
191191
ULONG Flags;

src/BlackBoneDrv/NativeStructs8.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@ typedef struct _HANDLE_TABLE
166166
ULONG NextHandleNeedingPool;
167167
long ExtraInfoPages;
168168
ULONG_PTR TableCode;
169+
struct _EPROCESS * QuotaProcess;
170+
LIST_ENTRY HandleTableList;
171+
ULONG UniqueProcessId;
172+
ULONG Flags;
173+
EX_PUSH_LOCK HandleContentionEvent;
174+
EX_PUSH_LOCK HandleTableLock;
169175
// More fields here...
170176
} HANDLE_TABLE, *PHANDLE_TABLE;
171177

src/BlackBoneDrv/NativeStructs81.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,12 @@ typedef struct _HANDLE_TABLE
167167
ULONG NextHandleNeedingPool;
168168
long ExtraInfoPages;
169169
LONG_PTR TableCode;
170-
PEPROCESS QuotaProcess;
170+
struct _EPROCESS * QuotaProcess;
171171
LIST_ENTRY HandleTableList;
172+
ULONG UniqueProcessId;
173+
ULONG Flags;
174+
EX_PUSH_LOCK HandleContentionEvent;
175+
EX_PUSH_LOCK HandleTableLock;
172176
// More fields here...
173177
} HANDLE_TABLE, *PHANDLE_TABLE;
174178

src/BlackBoneDrv/Routines.c

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "BlackBoneDrv.h"
22
#include "Routines.h"
3+
#include "Utils.h"
34
#include <Ntstrsafe.h>
45

56
LIST_ENTRY g_PhysProcesses;
@@ -14,9 +15,18 @@ LONG g_trIndex = 0; // Trampoline global index
1415
/// <returns>Found entry, NULL if not found</returns>
1516
PMEM_PHYS_ENTRY BBLookupPhysMemEntry( IN PLIST_ENTRY pList, IN PVOID pBase );
1617
VOID BBWriteTrampoline( IN PUCHAR place, IN PVOID pfn );
18+
BOOLEAN BBHandleCallback(
19+
#if !defined(_WIN7_)
20+
IN PHANDLE_TABLE HandleTable,
21+
#endif
22+
IN PHANDLE_TABLE_ENTRY HandleTableEntry,
23+
IN HANDLE Handle,
24+
IN PVOID EnumParameter
25+
);
1726

1827
#pragma alloc_text(PAGE, BBDisableDEP)
1928
#pragma alloc_text(PAGE, BBSetProtection)
29+
#pragma alloc_text(PAGE, BBHandleCallback)
2030
#pragma alloc_text(PAGE, BBGrantAccess)
2131
#pragma alloc_text(PAGE, BBCopyMemory)
2232
#pragma alloc_text(PAGE, BBAllocateFreeMemory)
@@ -136,18 +146,64 @@ NTSTATUS BBSetProtection( IN PSET_PROC_PROTECTION pProtection )
136146
return status;
137147
}
138148

149+
/// <summary>
150+
/// Handle enumeration callback
151+
/// </summary>
152+
/// <param name="HandleTable">Process handle table</param>
153+
/// <param name="HandleTableEntry">Handle entry</param>
154+
/// <param name="Handle">Handle value</param>
155+
/// <param name="EnumParameter">User context</param>
156+
/// <returns>TRUE when desired handle is found</returns>
157+
BOOLEAN BBHandleCallback(
158+
#if !defined(_WIN7_)
159+
IN PHANDLE_TABLE HandleTable,
160+
#endif
161+
IN PHANDLE_TABLE_ENTRY HandleTableEntry,
162+
IN HANDLE Handle,
163+
IN PVOID EnumParameter
164+
)
165+
{
166+
167+
BOOLEAN result = FALSE;
168+
ASSERT( EnumParameter );
169+
170+
if (EnumParameter != NULL)
171+
{
172+
PHANDLE_GRANT_ACCESS pAccess = (PHANDLE_GRANT_ACCESS)EnumParameter;
173+
if (Handle == (HANDLE)pAccess->handle)
174+
{
175+
if (ExpIsValidObjectEntry( HandleTableEntry ))
176+
{
177+
// Update access
178+
HandleTableEntry->GrantedAccessBits = pAccess->access;
179+
result = TRUE;
180+
}
181+
else
182+
DPRINT( "BlackBone: %s: 0x%X:0x%X handle is invalid\n. HandleEntry = 0x%p",
183+
__FUNCTION__, pAccess->pid, pAccess->handle, HandleTableEntry
184+
);
185+
}
186+
}
187+
188+
#if !defined(_WIN7_)
189+
// Release implicit locks
190+
_InterlockedExchangeAdd8( (char*)&HandleTableEntry->VolatileLowValue, 1 ); // Set Unlocked flag to 1
191+
if (HandleTable != NULL && HandleTable->HandleContentionEvent)
192+
ExfUnblockPushLock( &HandleTable->HandleContentionEvent, NULL );
193+
#endif
194+
195+
return result;
196+
}
197+
139198
/// <summary>
140199
/// Change handle granted access
141200
/// </summary>
142201
/// <param name="pAccess">Request params</param>
143202
/// <returns>Status code</returns>
144203
NTSTATUS BBGrantAccess( IN PHANDLE_GRANT_ACCESS pAccess )
145204
{
146-
NTSTATUS status = STATUS_SUCCESS;
205+
NTSTATUS status = STATUS_SUCCESS;
147206
PEPROCESS pProcess = NULL;
148-
PHANDLE_TABLE pTable = NULL;
149-
PHANDLE_TABLE_ENTRY pHandleEntry = NULL;
150-
EXHANDLE exHandle;
151207

152208
// Validate dynamic offset
153209
if (dynData.ObjTable == 0)
@@ -157,25 +213,15 @@ NTSTATUS BBGrantAccess( IN PHANDLE_GRANT_ACCESS pAccess )
157213
}
158214

159215
status = PsLookupProcessByProcessId( (HANDLE)pAccess->pid, &pProcess );
216+
if (NT_SUCCESS( status ) && BBCheckProcessTermination( pProcess ))
217+
status = STATUS_PROCESS_IS_TERMINATING;
218+
160219
if (NT_SUCCESS( status ))
161220
{
162-
pTable = *(PHANDLE_TABLE*)((PUCHAR)pProcess + dynData.ObjTable);
163-
exHandle.Value = (ULONG_PTR)pAccess->handle;
164-
165-
if (pTable)
166-
pHandleEntry = ExpLookupHandleTableEntry( pTable, exHandle );
167-
168-
if (ExpIsValidObjectEntry( pHandleEntry ))
169-
{
170-
pHandleEntry->GrantedAccessBits = pAccess->access;
171-
}
172-
else
173-
{
174-
DPRINT( "BlackBone: %s: 0x%X:0x%X handle is invalid. HandleEntry = 0x%p\n",
175-
__FUNCTION__, pAccess->pid, pAccess->handle, pHandleEntry );
176-
177-
status = STATUS_UNSUCCESSFUL;
178-
}
221+
PHANDLE_TABLE pTable = *(PHANDLE_TABLE*)((PUCHAR)pProcess + dynData.ObjTable);
222+
BOOLEAN found = ExEnumHandleTable( pTable, &BBHandleCallback, pAccess, NULL );
223+
if (found == FALSE)
224+
status = STATUS_NOT_FOUND;
179225
}
180226
else
181227
DPRINT( "BlackBone: %s: PsLookupProcessByProcessId failed with status 0x%X\n", __FUNCTION__, status );

0 commit comments

Comments
 (0)