@@ -37,7 +37,7 @@ def ZwAccessCheck(dp: Dumpulator,
37
37
GrantedAccess : Annotated [P (ACCESS_MASK ), SAL ("_Out_" )],
38
38
AccessStatus : Annotated [P (NTSTATUS ), SAL ("_Out_" )]
39
39
):
40
- return STATUS_SUCCESS
40
+ raise NotImplementedError ()
41
41
42
42
@syscall
43
43
def ZwAccessCheckAndAuditAlarm (dp : Dumpulator ,
@@ -333,7 +333,7 @@ def ZwAllocateVirtualMemory(dp: Dumpulator,
333
333
dp .memory .reserve (base , size , protect )
334
334
dp .memory .commit (base , size )
335
335
else :
336
- assert False
336
+ raise NotImplementedError ()
337
337
return STATUS_SUCCESS
338
338
339
339
@syscall
@@ -634,7 +634,7 @@ def ZwCancelTimer(dp: Dumpulator,
634
634
TimerHandle : Annotated [HANDLE , SAL ("_In_" )],
635
635
CurrentState : Annotated [P (BOOLEAN ), SAL ("_Out_opt_" )]
636
636
):
637
- return STATUS_SUCCESS
637
+ raise NotImplementedError ()
638
638
639
639
@syscall
640
640
def ZwCancelTimer2 (dp : Dumpulator ,
@@ -775,6 +775,7 @@ def ZwContinue(dp: Dumpulator,
775
775
ContextRecord : Annotated [P (CONTEXT ), SAL ("_In_" )],
776
776
TestAlert : Annotated [BOOLEAN , SAL ("_In_" )]
777
777
):
778
+ # Trigger a context switch
778
779
assert not TestAlert
779
780
exception = ExceptionInfo ()
780
781
exception .type = ExceptionType .ContextSwitch
@@ -784,6 +785,12 @@ def ZwContinue(dp: Dumpulator,
784
785
data = dp .read (ContextRecord .ptr , context_size )
785
786
context = context_type .from_buffer (data )
786
787
context .to_regs (dp .regs )
788
+ # Modifying fs/gs also appears to reset fs_base/gs_base
789
+ if dp .x64 :
790
+ dp .regs .gs_base = dp .teb
791
+ else :
792
+ dp .regs .fs_base = dp .teb
793
+ dp .regs .gs_base = dp .teb - 2 * PAGE_SIZE
787
794
exception .context = dp ._uc .context_save ()
788
795
return exception
789
796
@@ -857,8 +864,14 @@ def ZwCreateEvent(dp: Dumpulator,
857
864
InitialState : Annotated [BOOLEAN , SAL ("_In_" )]
858
865
):
859
866
assert DesiredAccess == 0x1f0003
860
- assert ObjectAttributes == 0
861
- event = EventObject (EventType , InitialState )
867
+ if ObjectAttributes != 0 :
868
+ attributes = ObjectAttributes [0 ]
869
+ assert attributes .ObjectName == 0
870
+ assert attributes .RootDirectory == 0
871
+ assert attributes .SecurityDescriptor == 0
872
+ assert attributes .SecurityQualityOfService == 0
873
+ assert attributes .Attributes == 2 # OBJ_INHERIT
874
+ event = EventObject (EventType , InitialState != 0 )
862
875
handle = dp .handles .new (event )
863
876
EventHandle .write_ptr (handle )
864
877
return STATUS_SUCCESS
@@ -2465,7 +2478,7 @@ def ZwOpenProcessToken(dp: Dumpulator,
2465
2478
assert ProcessHandle == dp .NtCurrentProcess ()
2466
2479
assert DesiredAccess == 0x20
2467
2480
# TODO: TokenHandle should be -6 or something
2468
- handle = dp .handles .new (ProcessTokenHandle (ProcessHandle ))
2481
+ handle = dp .handles .new (ProcessTokenObject (ProcessHandle ))
2469
2482
print (f"process token: { hex (handle )} " )
2470
2483
TokenHandle .write_ptr (handle )
2471
2484
return STATUS_SUCCESS
@@ -2495,7 +2508,7 @@ def ZwOpenSection(dp: Dumpulator,
2495
2508
DesiredAccess : Annotated [ACCESS_MASK , SAL ("_In_" )],
2496
2509
ObjectAttributes : Annotated [P (OBJECT_ATTRIBUTES ), SAL ("_In_" )]
2497
2510
):
2498
- return STATUS_NOT_IMPLEMENTED
2511
+ raise NotImplementedError ()
2499
2512
2500
2513
@syscall
2501
2514
def ZwOpenSemaphore (dp : Dumpulator ,
@@ -2953,13 +2966,19 @@ def ZwQueryInformationProcess(dp: Dumpulator,
2953
2966
ProcessInformationLength : Annotated [ULONG , SAL ("_In_" )],
2954
2967
ReturnLength : Annotated [P (ULONG ), SAL ("_Out_opt_" )]
2955
2968
):
2956
- assert ( ProcessHandle == dp .NtCurrentProcess () )
2957
- if ProcessInformationClass in [ PROCESSINFOCLASS .ProcessDebugPort , PROCESSINFOCLASS . ProcessDebugObjectHandle ] :
2969
+ assert ProcessHandle == dp .NtCurrentProcess ()
2970
+ if ProcessInformationClass == PROCESSINFOCLASS .ProcessDebugPort :
2958
2971
assert ProcessInformationLength == dp .ptr_size ()
2959
2972
dp .write_ptr (ProcessInformation .ptr , 0 )
2960
2973
if ReturnLength != 0 :
2961
2974
dp .write_ulong (ReturnLength .ptr , dp .ptr_size ())
2962
2975
return STATUS_SUCCESS
2976
+ elif ProcessInformationClass == PROCESSINFOCLASS .ProcessDebugObjectHandle :
2977
+ assert ProcessInformationLength == dp .ptr_size ()
2978
+ dp .write_ptr (ProcessInformation .ptr , 0 )
2979
+ if ReturnLength != 0 :
2980
+ dp .write_ulong (ReturnLength .ptr , dp .ptr_size ())
2981
+ return STATUS_PORT_NOT_SET
2963
2982
elif ProcessInformationClass == PROCESSINFOCLASS .ProcessDefaultHardErrorMode :
2964
2983
assert ProcessInformationLength == 4
2965
2984
dp .write_ulong (ProcessInformation .ptr , 1 )
@@ -2972,6 +2991,33 @@ def ZwQueryInformationProcess(dp: Dumpulator,
2972
2991
if ReturnLength .ptr :
2973
2992
dp .write_ulong (ReturnLength .ptr , 4 )
2974
2993
return STATUS_SUCCESS
2994
+ elif ProcessInformationClass == PROCESSINFOCLASS .ProcessImageInformation :
2995
+ sii = SECTION_IMAGE_INFORMATION (dp )
2996
+ assert ProcessInformationLength == ctypes .sizeof (sii )
2997
+ module = dp .modules [dp .modules .main ]
2998
+ pe = module .pe
2999
+ opt = pe .OPTIONAL_HEADER
3000
+ sii .TransferAddress = module .entry
3001
+ sii .ZeroBits = 0
3002
+ sii .MaximumStackSize = opt .SizeOfStackReserve
3003
+ sii .CommittedStackSize = opt .SizeOfStackCommit # TODO: more might be committed, check PEB
3004
+ sii .SubSystemType = opt .Subsystem
3005
+ sii .SubSystemMinorVersion = opt .MinorSubsystemVersion
3006
+ sii .SubSystemMajorVersion = opt .MajorSubsystemVersion
3007
+ sii .MinorOperatingSystemVersion = opt .MinorOperatingSystemVersion
3008
+ sii .MajorOperatingSystemVersion = opt .MajorOperatingSystemVersion
3009
+ sii .ImageCharacteristics = pe .FILE_HEADER .Characteristics # TODO
3010
+ sii .DllCharacteristics = opt .DllCharacteristics # TODO
3011
+ sii .Machine = pe .FILE_HEADER .Machine
3012
+ sii .ImageContainsCode = 1
3013
+ sii .ImageFlags = 1 # TODO
3014
+ sii .LoaderFlags = 0 # TODO
3015
+ sii .ImageFileSize = module .size # TODO: best we can do?
3016
+ sii .CheckSum = opt .CheckSum
3017
+ ProcessInformation .write (bytes (sii ))
3018
+ if ReturnLength .ptr :
3019
+ dp .write_ulong (ReturnLength .ptr , ctypes .sizeof (sii ))
3020
+ return STATUS_SUCCESS
2975
3021
raise NotImplementedError ()
2976
3022
2977
3023
@syscall
@@ -4437,7 +4483,7 @@ def ZwTerminateThread(dp: Dumpulator,
4437
4483
ExitStatus : Annotated [NTSTATUS , SAL ("_In_" )]
4438
4484
):
4439
4485
assert ThreadHandle == dp .NtCurrentThread ()
4440
- return STATUS_NOT_IMPLEMENTED
4486
+ raise NotImplementedError ()
4441
4487
4442
4488
@syscall
4443
4489
def ZwTestAlert (dp : Dumpulator
0 commit comments