0

ミニフィルター コールバック関数の実行中に、スレッドのユーザー モード スタックをバックトレースしようとしています。
呼び出し元のスレッドと同じコンテキストにいると仮定すると、TEB/TIB からスレッド スタック アドレスを取得し、そのスタック上のアドレスを処理することで、そのスタックをバックトレースできるはずです。

私が取得しているアドレスは、システム コールを呼び出している予想されるユーザー モード モジュールではないため、何か問題があるに違いありません。

正しい方向に向けていただければ幸いです。

前もって感謝します。


以下は、スタック コンテンツを読み取るコードです。

    pTEB = (PVOID *)((char *)pThread + 0x20);

    // Read TIB
    pTib = (NT_TIB*)pTEB;
    stackBottom = (PVOID*)pTib->StackLimit;
    stackTop = (PVOID*)pTib->StackBase;

    LogDbgView(("stackBottom=%p,  stackTop=%p",stackBottom, stackTop));

    if (!MyReadMemory(IoGetCurrentProcess(), stackBottom, buf, stackTop-stackBottom))
    {
        LogDbgView(("Read Memory = %x",buf));
        LogDbgView(("Read Memory = %x",buf+8));
        LogDbgView(("Read Memory = %x",buf+16));
        LogDbgView(("Read Memory = %x",buf+24));
    }

以下は、モジュール名とアドレスを取得する関数です。

    PVOID LoadModulesInformation()
    {
        PVOID pSystemInfoBuffer = NULL;

     __try
        {
            NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;
            ULONG    SystemInfoBufferSize = 0;

            status = ZwQuerySystemInformation(SystemModuleInformation,
                &SystemInfoBufferSize,
                0,
                &SystemInfoBufferSize);

            if (!SystemInfoBufferSize)
                return NULL;

            pSystemInfoBuffer = (PVOID)ExAllocatePool(NonPagedPool, SystemInfoBufferSize*2);

            if (!pSystemInfoBuffer)
                return NULL;

            memset(pSystemInfoBuffer, 0, SystemInfoBufferSize*2);

            status = ZwQuerySystemInformation(SystemModuleInformation,
                pSystemInfoBuffer,
                SystemInfoBufferSize*2,
                &SystemInfoBufferSize);

            if (NT_SUCCESS(status))
            {
                return pSystemInfoBuffer;
            }

        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
        }

        return NULL;
    }


    PUNICODE_STRING findModuleName(PVOID addr, PVOID pSystemInfoBuffer, ULONG Tag FILE_AND_LINE_ARGS)
    {
        PVOID pModuleBase = NULL;
        PCHAR pCharRet=NULL;
        PUNICODE_STRING pus = NULL;

        __try
        {
            if (pSystemInfoBuffer != NULL && MmIsAddressValid(addr))
            {
                PSYSTEM_MODULE_ENTRY pSysModuleEntry = ((PSYSTEM_MODULE_INFORMATION)(pSystemInfoBuffer))->Module;
                ULONG i;

                for (i = 0; i <((PSYSTEM_MODULE_INFORMATION)(pSystemInfoBuffer))->Count; i++)
                {
                    if ((pSysModuleEntry[i].Base <= addr) && (pSysModuleEntry[i].Size < ((ULONG)addr - (ULONG)pSysModuleEntry[i].Base)))
                    {
                        pCharRet = pSysModuleEntry[i].ImageName+pSysModuleEntry[i].PathLength;
                        break;
                    }
                }
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            pCharRet = NULL;
        }

        if (pCharRet)
        {
            pus = UtlpCharToUnicode(pCharRet, TRUE, TRUE, Tag FILE_AND_LINE_PARAMS);
        }
        else
        {
            pus = UtlpCharToUnicode("UNKNOWN", TRUE, TRUE, Tag FILE_AND_LINE_PARAMS);
        }

        return pus;
    }
4

1 に答える 1