|
|
[bgcolor=#ffffff]//Ring0恢复SSDTShadow主要源码 By VirusWizard[/bgcolor]
[bgcolor=#ffffff]//主要思路和恢复SSDT是一样的。不多说了[/bgcolor]
[bgcolor=#ffffff]NTSTATUS GetOrigShadowTable([/bgcolor]
[bgcolor=#ffffff] )[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] NTSTATUS status = STATUS_UNSUCCESSFUL;[/bgcolor]
[bgcolor=#ffffff] HANDLE hFile = 0;[/bgcolor]
[bgcolor=#ffffff] OBJECT_ATTRIBUTES ObjAttr = {0};[/bgcolor]
[bgcolor=#ffffff] UNICODE_STRING ustrWin32k = {0};[/bgcolor]
[bgcolor=#ffffff] IO_STATUS_BLOCK ioStatus = {0};[/bgcolor]
[bgcolor=#ffffff] FILE_POSITION_INFORMATION fpi = {0};[/bgcolor]
[bgcolor=#ffffff] ULONG ulOffsetOfShadow = 0;[/bgcolor]
[bgcolor=#ffffff] PIMAGE_NT_HEADERS pNtHdr = NULL;[/bgcolor]
[bgcolor=#ffffff] LARGE_INTEGER Offset = {0};[/bgcolor]
[bgcolor=#ffffff] if (!KeServiceDescriptorTableShadow)[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] return STATUS_UNSUCCESSFUL;[/bgcolor]
[bgcolor=#ffffff] }[/bgcolor]
[bgcolor=#ffffff] dprintf("CountOfSSDTShadow : %d\n", KeServiceDescriptorTableShadow[1].Limit + 1);[/bgcolor]
[bgcolor=#ffffff] g_pOrigSSDTShadow = ExAllocatePool([/bgcolor]
[bgcolor=#ffffff] PagedPool,[/bgcolor]
[bgcolor=#ffffff] (KeServiceDescriptorTableShadow[1].Limit + 1) * sizeof(ULONG));[/bgcolor]
[bgcolor=#ffffff] if ( !g_pOrigSSDTShadow )[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] dprintf("[GetOrigShadowTable] AllocateMemory Error.\n");[/bgcolor]
[bgcolor=#ffffff] return STATUS_UNSUCCESSFUL;[/bgcolor]
[bgcolor=#ffffff] }[/bgcolor]
[bgcolor=#ffffff] RtlInitUnicodeString(&ustrWin32k, L"\\SystemRoot\\System32\\win32k.sys");[/bgcolor]
[bgcolor=#ffffff] dprintf("ustrWin32k : %S.\n", ustrWin32k.Buffer);[/bgcolor]
[bgcolor=#ffffff] InitializeObjectAttributes([/bgcolor]
[bgcolor=#ffffff] &ObjAttr,[/bgcolor]
[bgcolor=#ffffff] &ustrWin32k,[/bgcolor]
[bgcolor=#ffffff] OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,[/bgcolor]
[bgcolor=#ffffff] NULL,[/bgcolor]
[bgcolor=#ffffff] NULL[/bgcolor]
[bgcolor=#ffffff] );[/bgcolor]
[bgcolor=#ffffff] status = ZwCreateFile([/bgcolor]
[bgcolor=#ffffff] &hFile,[/bgcolor]
[bgcolor=#ffffff] GENERIC_READ,[/bgcolor]
[bgcolor=#ffffff] &ObjAttr,[/bgcolor]
[bgcolor=#ffffff] &ioStatus,[/bgcolor]
[bgcolor=#ffffff] NULL,[/bgcolor]
[bgcolor=#ffffff] FILE_ATTRIBUTE_NORMAL,[/bgcolor]
[bgcolor=#ffffff] FILE_SHARE_READ,[/bgcolor]
[bgcolor=#ffffff] FILE_OPEN,[/bgcolor]
[bgcolor=#ffffff] FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS | FILE_SYNCHRONOUS_IO_NONALERT,[/bgcolor]
[bgcolor=#ffffff] NULL,[/bgcolor]
[bgcolor=#ffffff] 0[/bgcolor]
[bgcolor=#ffffff] );[/bgcolor]
[bgcolor=#ffffff] if ( !NT_SUCCESS(status) )[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] dprintf("ZwCreateFile Error.status = 0x%08X.\n", status);[/bgcolor]
[bgcolor=#ffffff] goto __exit;[/bgcolor]
[bgcolor=#ffffff] }[/bgcolor]
[bgcolor=#ffffff] pNtHdr = RtlImageNtHeader(g_pWin32kBase);[/bgcolor]
[bgcolor=#ffffff] ulOffsetOfShadow = RvaToOffset(pNtHdr, (ULONG)KeServiceDescriptorTableShadow[1].Base - (ULONG)g_pWin32kBase);[/bgcolor]
[bgcolor=#ffffff] dprintf("ulOffsetOfSSDT : 0x%08X.\n", ulOffsetOfShadow);[/bgcolor]
[bgcolor=#ffffff] if (ulOffsetOfShadow)[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] Offset.LowPart = ulOffsetOfShadow;[/bgcolor]
[bgcolor=#ffffff] Offset.HighPart = 0;[/bgcolor]
[bgcolor=#ffffff] status = ZwReadFile ([/bgcolor]
[bgcolor=#ffffff] hFile,[/bgcolor]
[bgcolor=#ffffff] NULL,[/bgcolor]
[bgcolor=#ffffff] NULL,[/bgcolor]
[bgcolor=#ffffff] NULL,[/bgcolor]
[bgcolor=#ffffff] &ioStatus,[/bgcolor]
[bgcolor=#ffffff] g_pOrigSSDTShadow,[/bgcolor]
[bgcolor=#ffffff] KeServiceDescriptorTableShadow[1].Limit * sizeof(ULONG),[/bgcolor]
[bgcolor=#ffffff] &Offset,[/bgcolor]
[bgcolor=#ffffff] NULL[/bgcolor]
[bgcolor=#ffffff] );[/bgcolor]
[bgcolor=#ffffff] if ( NT_SUCCESS(status) )[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] ULONG i;[/bgcolor]
[bgcolor=#ffffff] dprintf("ReadOrigShadowSuccess.\n");[/bgcolor]
[bgcolor=#ffffff] for (i = 0;i < KeServiceDescriptorTableShadow[1].Limit;i++)[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] dprintf("Index : 0x%03X,ShadowRoutineAddr : 0x%08X\n", i,((ULONG *)g_pOrigSSDTShadow)[/bgcolor]);
}
}
}
__exit:
if (hFile)
{
ZwClose(hFile);
}
return status;
} |
|