@@ -11,14 +11,12 @@ NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING registr
11
11
NTSTATUS BBInitDynamicData ( IN OUT PDYNAMIC_DATA pData );
12
12
NTSTATUS BBGetBuildNO ( OUT PULONG pBuildNo );
13
13
NTSTATUS BBScanSection ( IN PCCHAR section , IN PCUCHAR pattern , IN UCHAR wildcard , IN ULONG_PTR len , OUT PVOID * ppFound );
14
- NTSTATUS BBLocatePageTables ( IN OUT PDYNAMIC_DATA pData );
15
14
VOID BBUnload ( IN PDRIVER_OBJECT DriverObject );
16
15
17
16
#pragma alloc_text(INIT, DriverEntry)
18
17
#pragma alloc_text(INIT, BBInitDynamicData)
19
18
#pragma alloc_text(INIT, BBGetBuildNO)
20
19
#pragma alloc_text(INIT, BBScanSection)
21
- #pragma alloc_text(INIT, BBLocatePageTables)
22
20
23
21
/*
24
22
*/
@@ -32,6 +30,7 @@ NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING Registr
32
30
UNREFERENCED_PARAMETER ( RegistryPath );
33
31
34
32
// Get OS Dependant offsets
33
+ InitializeDebuggerBlock ( & g_KdBlock );
35
34
status = BBInitDynamicData ( & dynData );
36
35
if (!NT_SUCCESS ( status ))
37
36
{
@@ -373,8 +372,6 @@ NTSTATUS BBInitDynamicData( IN OUT PDYNAMIC_DATA pData )
373
372
pData -> MiAllocPage = 0 ;
374
373
if (NT_SUCCESS ( BBScanSection ( "PAGE" , (PCUCHAR )"\x48\x8D\x7D\x18\x48\x8B" , 0xCC , 6 , (PVOID )& pData -> ExRemoveTable ) ))
375
374
pData -> ExRemoveTable -= 0x60 ;
376
-
377
- status = BBLocatePageTables ( pData );
378
375
break ;
379
376
}
380
377
else if (verInfo .dwBuildNumber == 15063 )
@@ -392,8 +389,6 @@ NTSTATUS BBInitDynamicData( IN OUT PDYNAMIC_DATA pData )
392
389
pData -> MiAllocPage = 0 ;
393
390
if (NT_SUCCESS ( BBScanSection ( "PAGE" , (PCUCHAR )"\x48\x8B\x47\x20\x48\x83\xC7\x18" , 0xCC , 8 , (PVOID )& pData -> ExRemoveTable ) ))
394
391
pData -> ExRemoveTable -= 0x34 ;
395
-
396
- status = BBLocatePageTables ( pData );
397
392
break ;
398
393
}
399
394
else if (verInfo .dwBuildNumber == 16299 )
@@ -411,8 +406,6 @@ NTSTATUS BBInitDynamicData( IN OUT PDYNAMIC_DATA pData )
411
406
pData -> MiAllocPage = 0 ;
412
407
if (NT_SUCCESS ( BBScanSection ( "PAGE" , (PCUCHAR )"\x48\x83\xC7\x18\x48\x8B\x17" , 0xCC , 7 , (PVOID )& pData -> ExRemoveTable ) ))
413
408
pData -> ExRemoveTable -= 0x34 ;
414
-
415
- status = BBLocatePageTables ( pData );
416
409
break ;
417
410
}
418
411
else if (verInfo .dwBuildNumber == 17134 )
@@ -430,8 +423,6 @@ NTSTATUS BBInitDynamicData( IN OUT PDYNAMIC_DATA pData )
430
423
pData -> MiAllocPage = 0 ;
431
424
if (NT_SUCCESS ( BBScanSection ( "PAGE" , (PCUCHAR )"\x48\x83\xC7\x18\x48\x8B\x17" , 0xCC , 7 , (PVOID )& pData -> ExRemoveTable ) ))
432
425
pData -> ExRemoveTable -= 0x34 ;
433
-
434
- status = BBLocatePageTables ( pData );
435
426
break ;
436
427
}
437
428
else if (verInfo .dwBuildNumber == 17763 )
@@ -449,8 +440,6 @@ NTSTATUS BBInitDynamicData( IN OUT PDYNAMIC_DATA pData )
449
440
pData -> MiAllocPage = 0 ;
450
441
if (NT_SUCCESS ( BBScanSection ( "PAGE" , (PCUCHAR )"\x48\x83\xC7\x18\x48\x8B\x17" , 0xCC , 7 , (PVOID )& pData -> ExRemoveTable ) ))
451
442
pData -> ExRemoveTable -= 0x34 ;
452
-
453
- status = BBLocatePageTables ( pData );
454
443
break ;
455
444
}
456
445
else
@@ -464,114 +453,27 @@ NTSTATUS BBInitDynamicData( IN OUT PDYNAMIC_DATA pData )
464
453
if (pData -> ExRemoveTable != 0 )
465
454
pData -> correctBuild = TRUE;
466
455
467
- DPRINT (
468
- "BlackBone: Dynamic search status: SSDT - %s, ExRemoveTable - %s\n" ,
469
- GetSSDTBase () != NULL ? "SUCCESS" : "FAIL" ,
456
+ DPRINT ( "BlackBone: Dynamic search status: SSDT - %s, ExRemoveTable - %s\n" ,
457
+ GetSSDTBase () != NULL ? "SUCCESS" : "FAIL" ,
470
458
pData -> ExRemoveTable != 0 ? "SUCCESS" : "FAIL"
471
459
);
472
-
473
- return (pData -> VadRoot != 0 ? status : STATUS_INVALID_KERNEL_INFO_VERSION );
474
- }
475
-
476
- return status ;
477
- }
478
-
479
- /// <summary>
480
- /// PDE/PTE dynamic code offsets
481
- /// </summary>
482
- typedef struct _TABLE_OFFSETS
483
- {
484
- int PDE ;
485
- int PTE ;
486
- } TABLE_OFFSETS , * PTABLE_OFFSETS ;
487
-
488
- /// <summary>
489
- /// Pre/Post 'meltdown' patch offsets
490
- /// </summary>
491
- typedef struct _TABLE_OFFSETS_MELT
492
- {
493
- // selector[0] - offsets for builds before 'meltdown' patch
494
- // selector[1] - offsets for builds after 'meltdown' patch
495
- TABLE_OFFSETS selector [2 ];
496
- } TABLE_OFFSETS_MELT , * PTABLE_OFFSETS_MELT ;
497
-
498
- /// <summary>
499
- /// Get relocated PTE and PDE bases
500
- /// </summary>
501
- /// <param name="pData">Dynamic data</param>
502
- /// <returns>Status code</returns>
503
- NTSTATUS BBLocatePageTables ( IN OUT PDYNAMIC_DATA pData )
504
- {
505
- ASSERT ( pData -> ver >= WINVER_10_RS1 );
506
460
507
- if (pData -> ver >= WINVER_10_RS4 )
508
- {
509
- const int index = pData -> ver - WINVER_10_RS4 + (pData -> ver >= WINVER_10_RS4 && pData -> buildNo >= 195 ? 1 : 0 );
510
- TABLE_OFFSETS offsets [] = {
511
- { 0x32D , 0x6A9 },
512
- { 0x82E , 0x1C82 },
513
- { 0x10A9 , 0x1158 },
514
- };
515
-
516
- UNICODE_STRING uName = RTL_CONSTANT_STRING ( L"ExFreePoolWithTag" );
517
- PUCHAR pExFreePoolWithTag = MmGetSystemRoutineAddress ( & uName );
518
- if (pExFreePoolWithTag )
461
+ if (pData -> ver >= WINVER_10_RS1 )
519
462
{
520
- pData -> DYN_PDE_BASE = * (PULONG_PTR )(pExFreePoolWithTag + offsets [index ].PDE + 2 );
521
- pData -> DYN_PTE_BASE = * (PULONG_PTR )(pExFreePoolWithTag + offsets [index ].PTE + 2 );
522
-
523
- DPRINT ( "BlackBone: PDE_BASE: %p, PTE_BASE: %p\n" , pData -> DYN_PDE_BASE , pData -> DYN_PTE_BASE );
524
- if (pData -> DYN_PDE_BASE < MI_SYSTEM_RANGE_START || pData -> DYN_PTE_BASE < MI_SYSTEM_RANGE_START )
525
- {
526
- DPRINT ( "BlackBone: Invalid PDE/PTE base, aborting\n" );
527
- return STATUS_UNSUCCESSFUL ;
528
- }
529
-
530
- return STATUS_SUCCESS ;
463
+ ULONGLONG mask = (1ll << (PHYSICAL_ADDRESS_BITS - 1 )) - 1 ;
464
+ dynData .DYN_PTE_BASE = (ULONG_PTR )g_KdBlock -> PteBase ;
465
+ dynData .DYN_PDE_BASE = (ULONG_PTR )((g_KdBlock -> PteBase & ~mask ) | ((g_KdBlock -> PteBase >> 9 ) & mask ));
531
466
}
532
- }
533
- else
534
- {
535
- const int index = pData -> ver & 0xFF ;
536
- const TABLE_OFFSETS_MELT offsets [] =
537
- {
538
- { 0 , 0 , 0 , 0 }, // No updates
539
- { 0x49 , 0x56 , 0x52 , 0x5F }, // WINVER_10_RS1
540
- { 0x43 , 0x50 , 0x4B , 0x58 }, // WINVER_10_RS2
541
- { 0x41 , 0x4E , 0x4B , 0x58 } // WINVER_10_RS3
542
- };
543
467
544
- const ULONG patchThreshold [] =
468
+ DPRINT ( "BlackBone: PDE_BASE: %p, PTE_BASE: %p\n" , pData -> DYN_PDE_BASE , pData -> DYN_PTE_BASE );
469
+ if (pData -> DYN_PDE_BASE < MI_SYSTEM_RANGE_START || pData -> DYN_PTE_BASE < MI_SYSTEM_RANGE_START )
545
470
{
546
- 0 , // No updates
547
- 2007 , // WINVER_10_RS1
548
- 850 , // WINVER_10_RS2
549
- 192 // WINVER_10_RS3
550
- };
551
-
552
- UNICODE_STRING uName = RTL_CONSTANT_STRING ( L"MmGetPhysicalAddress" );
553
- PUCHAR pMmGetPhysicalAddress = MmGetSystemRoutineAddress ( & uName );
554
- if (pMmGetPhysicalAddress )
555
- {
556
- PUCHAR pMiGetPhysicalAddress = * (PLONG )(pMmGetPhysicalAddress + 0xE + 1 ) + pMmGetPhysicalAddress + 0xE + 5 ;
557
-
558
- // Meltdown fix check
559
- const int melt = (pData -> buildNo >= patchThreshold [index ]) ? 1 : 0 ;
560
-
561
- pData -> DYN_PDE_BASE = * (PULONG_PTR )(pMiGetPhysicalAddress + offsets [index ].selector [melt ].PDE + 2 );
562
- pData -> DYN_PTE_BASE = * (PULONG_PTR )(pMiGetPhysicalAddress + offsets [index ].selector [melt ].PTE + 2 );
563
-
564
- DPRINT ( "BlackBone: PDE_BASE: %p, PTE_BASE: %p\n" , pData -> DYN_PDE_BASE , pData -> DYN_PTE_BASE );
565
- if (pData -> DYN_PDE_BASE < MI_SYSTEM_RANGE_START || pData -> DYN_PTE_BASE < MI_SYSTEM_RANGE_START )
566
- {
567
- DPRINT ( "BlackBone: Invalid PDE/PTE base, aborting\n" );
568
- return STATUS_UNSUCCESSFUL ;
569
- }
570
-
571
- return STATUS_SUCCESS ;
471
+ DPRINT ( "BlackBone: Invalid PDE/PTE base, aborting\n" );
472
+ return STATUS_UNSUCCESSFUL ;
572
473
}
474
+
475
+ return (pData -> VadRoot != 0 ? status : STATUS_INVALID_KERNEL_INFO_VERSION );
573
476
}
574
477
575
- DPRINT ( "BlackBone: PDE_BASE/PTE_BASE not found \n" );
576
- return STATUS_NOT_FOUND ;
478
+ return status ;
577
479
}
0 commit comments