找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 220|回复: 0

[笔记]Ring0恢复SSDTShadow主要源码

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-10 22:20:18 | 显示全部楼层 |阅读模式
[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;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-2 01:33 , Processed in 0.073065 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表