吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4032|回复: 2
收起左侧

[其他转载] 获取ntfs的dispatch

[复制链接]
NewbieCoder 发表于 2009-5-31 12:30
BOOLEAN
MapNtfsDriver()
{
        CHAR KernelPath[256];
        PVOID KernelBase=NULL;
        NTSTATUS st;
        UNICODE_STRING ustrKernelPath;
        ANSI_STRING astrKernelPath;

        KernelBase=GetKernelModuleBase("ntfs.sys");
        g_NtfsBase=KernelBase;
        if (!KernelBase)
        {
                return FALSE;
        }

        if (!NT_SUCCESS(GetSystemRoot(KernelPath,256)))
        {
                return FALSE;
        }

        strncat (KernelPath,"system32\\drivers\\",255);
        strncat (KernelPath,"ntfs.sys",255);

        RtlInitAnsiString(&astrKernelPath,KernelPath);
        if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&ustrKernelPath,&astrKernelPath,TRUE))) return FALSE;

        g_MappedNtfsBase=MapViewOfImage(ustrKernelPath.Buffer,KernelBase);
        RtlFreeUnicodeString(&ustrKernelPath);
        if (!g_MappedNtfsBase) return FALSE;

        return TRUE;
}

BOOLEAN
GetDispatchTable(
                                 PVOID ModuleBase,
                                 PVOID *DispatchTableBuffer
                                 )
{
        UCHAR *cPtr, *pOpcode;
        ULONG Length;
        PVOID ModuleGsDriverEntry;
        PIMAGE_NT_HEADERS NtHeaders=(PIMAGE_NT_HEADERS)(((PIMAGE_DOS_HEADER)ModuleBase)->e_lfanew+(ULONG)ModuleBase);

        ModuleGsDriverEntry=(PVOID)(NtHeaders->OptionalHeader.AddressOfEntryPoint+(ULONG)ModuleBase);

        for (cPtr = (PUCHAR)ModuleGsDriverEntry;
                cPtr < (PUCHAR)ModuleGsDriverEntry + SizeOfProc(ModuleGsDriverEntry);
                cPtr += Length)
        {
                LONG MajorFunctionIndex;
                PVOID MajorFunction;
                ULONG RegEax;
                Length = SizeOfCode(cPtr, &pOpcode);

                if (!Length)
                {
                        DbgPrint("[EDHelper] GetDispatchTable: Unknwon opcode length.\n");
                        break;        
                }
                if (*(PUSHORT)cPtr == 0x46C7) // mov dword ptr [esi+0xXX(8Bit)]
                {
                        MajorFunctionIndex=((LONG)(*(cPtr+2))-FIELD_OFFSET(DRIVER_OBJECT,MajorFunction))/4;
                        if (MajorFunctionIndex<0 || MajorFunctionIndex>IRP_MJ_MAXIMUM_FUNCTION)
                                continue;
                        MajorFunction=*(PVOID *)(cPtr+3);
                }
                else if (*(PUSHORT)cPtr == 0x86C7) // mov dword ptr [esi+0xXXXXXXXX(32Bit)]
                {
                        MajorFunctionIndex=(*((PLONG)(cPtr+2))-FIELD_OFFSET(DRIVER_OBJECT,MajorFunction))/4;
                        if (MajorFunctionIndex<0 || MajorFunctionIndex>IRP_MJ_MAXIMUM_FUNCTION)
                                continue;
                        MajorFunction=*(PVOID *)(cPtr+6);
                }
                else if (*(PUCHAR)cPtr == 0xB8) // mov eax, 0xXXXXXXXX(32Bit)
                {
                        RegEax=*(PULONG)(cPtr+1);
                        continue;
                }
                else if ((*(PUSHORT)cPtr == 0x4689) || (*(PUSHORT)cPtr == 0x8689))
                {
                        MajorFunctionIndex=((LONG)*((PUCHAR)(cPtr+2))-FIELD_OFFSET(DRIVER_OBJECT,MajorFunction))/4;
                        if (MajorFunctionIndex<0 || MajorFunctionIndex>IRP_MJ_MAXIMUM_FUNCTION)
                        {
                                continue;
                        }
                        MajorFunction=(PVOID)RegEax;
                }
                else
                {
                        continue;
                }
                DispatchTableBuffer[MajorFunctionIndex]=MajorFunction;
        }

        return TRUE;
}


        if (g_NtfsDriverObject)
        {
                if (!GetDispatchTable(
                        g_MappedNtfsBase,
                        (PVOID *)&NtfsDriverDispatch
                        ))
                {
                        DriverTerminate();
                        return STATUS_UNSUCCESSFUL;

                }
        }

免费评分

参与人数 1威望 +1 收起 理由
zapline + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zapline 发表于 2009-5-31 12:53
炉子的东西
看不懂
 楼主| NewbieCoder 发表于 2009-5-31 18:48
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 04:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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