吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6523|回复: 38
收起左侧

[系统底层] Windows驱动关闭Debugview实时更新的信息

[复制链接]
aswcy815174418 发表于 2022-3-21 18:21
本帖最后由 aswcy815174418 于 2022-3-23 14:38 编辑

干了一下午,解决了DebugView犯人的弹窗,但没解决掉Windbg里面这串英文:Invalid parameter passed to C runtime function.希望有知道的大大给说说
代码为两个版本:
一丶通过开关WP来过掉写保护
二丶通过重映射过掉写保护(强烈推荐)
原理:vDbgPrintExWithPrefix函数修改rax = 0xC000000D(STATUS_INVALID_PARAMETER),并且ret返回

开关WP版本:

#include "ntifs.h"

VOID DriverUnload(PDRIVER_OBJECT driver) {
        DbgPrint("Bye Wolrd\r\n");
}

KIRQL  WPOFFx64() {
        KIRQL  irql = KeRaiseIrqlToDpcLevel();
        UINT64  cr0 = __readcr0();
        cr0 &= 0xfffffffffffeffff;
        _disable();
        __writecr0(cr0);
        return  irql;
}

void  WPONx64(KIRQL  irql) {
        UINT64  cr0 = __readcr0();
        cr0 |= 0x10000;
        _enable();
        __writecr0(cr0);
        KeLowerIrql(irql);
}

void CloseInfo() {
        KIRQL OldIrql = WPOFFx64();
        *(size_t*)vDbgPrintExWithPrefix = 0xc3c000000db8;
        WPONx64(OldIrql);
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
        driver->Flags |= 0x20;
        driver->DriverUnload = DriverUnload;

        DbgPrint("Hello Wolrd!\n");

        //DbgBreakPoint();

        CloseInfo();

        return STATUS_SUCCESS;
}

下面为重映射版本头文件:


#ifndef PAGE_HEADER

#ifndef NTIHEADER
#define NTIHEADER
#include "ntifs.h"
#endif

#define PAGE_HEADER
typedef union CR3_ {
    UINT64 value;
    struct {
        UINT64 ignored_1 : 3;
        UINT64 write_through : 1;
        UINT64 cache_disable : 1;
        UINT64 ignored_2 : 7;
        UINT64 pml4_p : 40;
        UINT64 reserved : 12;
    };
} PTE_CR3;
typedef union VIRT_ADDR_ {
    UINT64 value;
    void* pointer;
    struct {
        UINT64 offset : 12;
        UINT64 pt_index : 9;
        UINT64 pd_index : 9;
        UINT64 pdpt_index : 9;
        UINT64 pml4_index : 9;
        UINT64 reserved : 16;
    };
} VIRT_ADDR;
typedef UINT64 PHYS_ADDR;
typedef union PML4E_ {
    UINT64 value;
    struct {
        UINT64 present : 1;
        UINT64 rw : 1;
        UINT64 user : 1;
        UINT64 write_through : 1;
        UINT64 cache_disable : 1;
        UINT64 accessed : 1;
        UINT64 ignored_1 : 1;
        UINT64 reserved_1 : 1;
        UINT64 ignored_2 : 4;
        UINT64 pdpt_p : 40;
        UINT64 ignored_3 : 11;
        UINT64 xd : 1;
    };
} PML4E;
typedef union PDPTE_ {
    UINT64 value;
    struct {
        UINT64 present : 1;
        UINT64 rw : 1;
        UINT64 user : 1;
        UINT64 write_through : 1;
        UINT64 cache_disable : 1;
        UINT64 accessed : 1;
        UINT64 dirty : 1;
        UINT64 page_size : 1;
        UINT64 ignored_2 : 4;
        UINT64 pd_p : 40;
        UINT64 ignored_3 : 11;
        UINT64 xd : 1;
    };
} PDPTE;
typedef union PDE_ {
    UINT64 value;
    struct {
        UINT64 present : 1;
        UINT64 rw : 1;
        UINT64 user : 1;
        UINT64 write_through : 1;
        UINT64 cache_disable : 1;
        UINT64 accessed : 1;
        UINT64 dirty : 1;
        UINT64 page_size : 1;
        UINT64 ignored_2 : 4;
        UINT64 pt_p : 40;
        UINT64 ignored_3 : 11;
        UINT64 xd : 1;
    };
} PDE;
typedef union PTE_ {
    UINT64 value;
    VIRT_ADDR vaddr;
    struct {
        UINT64 present : 1;
        UINT64 rw : 1;
        UINT64 user : 1;
        UINT64 write_through : 1;
        UINT64 cache_disable : 1;
        UINT64 accessed : 1;
        UINT64 dirty : 1;
        UINT64 pat : 1;
        UINT64 global : 1;
        UINT64 ignored_1 : 3;
        UINT64 page_frame : 40;
        UINT64 ignored_3 : 11;
        UINT64 xd : 1;
    };
} PTE;
#endif // !1

下面为重映射代码

#include "ntifs.h"
#include "head.h"

UINT64 PTE_BASE;
UINT64 PDE_BASE;
UINT64 PPE_BASE;
UINT64 PXE_BASE;

VOID DriverUnload(PDRIVER_OBJECT driver) {
        DbgPrint("Bye Wolrd\r\n");
}

PULONG64 GetPxeAddress(PVOID addr) {
        return (PULONG64)((((((ULONG64)addr & 0xffffffffffff) >> 39)) << 3) + PXE_BASE);
}

PULONG64 GetPpeAddress(PVOID addr) {
        return (PULONG64)((((((ULONG64)addr & 0xffffffffffff) >> 30)) << 3) + PPE_BASE);
}

PULONG64 GetPdeAddress(PVOID addr) {
        return (PULONG64)((((((ULONG64)addr & 0xffffffffffff) >> 21)) << 3) + PDE_BASE);
}

PULONG64 GetPteAddress(PVOID addr) {
        return (PULONG64)((((((ULONG64)addr & 0xffffffffffff) >> 12)) << 3) + PTE_BASE);
}

size_t MmGetVirtalPteBase() {
        size_t pte_base = 0;
        PHYSICAL_ADDRESS cr3_pa = { __readcr3() & 0xfffffffffffffff0 };
        PTE* page_directory_va = MmGetVirtualForPhysical(cr3_pa);

        if (page_directory_va) {
                for (size_t index = 0; index < 512; index++) {
                        if (page_directory_va[index].page_frame == (cr3_pa.QuadPart >> 12)) {
                                pte_base = (index + 0x1FFFE00) << 39;
                                PTE_BASE = pte_base;
                                break;
                        }
                }
        }
        return pte_base;
}

void InitializePageBase() {
        PDE_BASE = (SIZE_T)GetPteAddress((PVOID)MmGetVirtalPteBase());
        PPE_BASE = (SIZE_T)GetPteAddress((PVOID)PDE_BASE);
        PXE_BASE = (SIZE_T)GetPteAddress((PVOID)PPE_BASE);
}

void CloseInfo() {

        size_t Address = ExAllocatePoolWithTag(PagedPool, 0x1000,"Tag");
        if (Address) {
            RtlZeroBytes(Address, 0x1000);

            size_t* OldPte = GetPteAddress(Address);
            size_t* TargetPte = GetPteAddress(vDbgPrintExWithPrefix);
            size_t ReserveOldPte = *OldPte;
            //mov eax,0xC000000D
            //ret;
            size_t TargetOpCode = 0xc3c000000db8;
            size_t OldOpCode = *(size_t*)vDbgPrintExWithPrefix;
            size_t offset = (size_t)vDbgPrintExWithPrefix & 0xFFF;

            *OldPte = (*TargetPte & 0xFFFFFFFFF000) | (*OldPte & 0xFFF);

            //DbgPrint("%x\n", *OldPte);
            //DbgPrint("%x\n", *TargetPte);
            //DbgPrint("%x\n", offset);

            while (*(size_t*)vDbgPrintExWithPrefix == OldOpCode && *(size_t*)vDbgPrintExWithPrefix != TargetOpCode) {
                InterlockedExchange64(Address + offset, TargetOpCode);
                YieldProcessor();
            }

            DbgPrint("成功去除垃圾信息\n");
            *OldPte = ReserveOldPte;

            ExFreePoolWithTag(Address, "Tag");
        }
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
        driver->Flags |= 0x20;
        driver->DriverUnload = DriverUnload;
        InitializePageBase();

        DbgPrint("Hello Wolrd!\n");

        if (PTE_BASE) {
            CloseInfo();
        }

        return STATUS_SUCCESS;
}
效果图.png

免费评分

参与人数 16威望 +1 吾爱币 +32 热心值 +16 收起 理由
Tsense + 1 + 1 我很赞同!
wasyg + 1 + 1 我很赞同!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
tongliye + 1 + 1 热心回复!
Pilence + 1 + 1 我很赞同!
qiwenchun + 1 + 1 谢谢@Thanks!
xiaomomeihuashe + 1 + 1 牛啊,学费了
timeni + 1 + 1 谢谢@Thanks!
TuanBao226 + 1 + 1 谢谢@Thanks!
fengse + 1 + 1 鼓励转贴优秀软件安全工具和文档!
elevo + 1 + 1 我很赞同!
woyucheng + 1 + 1 谢谢@Thanks!
lgc81034 + 1 谢谢@Thanks!
孺子韫 + 1 + 1 我很赞同!
zcchk135820 + 1 我很赞同!
头铁又刚 + 1 热心回复!

查看全部评分

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

 楼主| aswcy815174418 发表于 2022-3-21 21:03
wangxiaohu104 发表于 2022-3-21 20:42
驱动能用VS2015编译么,楼主建的是MFC工程么

我用VS2019编译的,这是驱动呀,那来的MFC
头像被屏蔽
hipojie 发表于 2022-9-11 07:04
qzhh 发表于 2022-3-21 20:31
wangxiaohu104 发表于 2022-3-21 20:42
驱动能用VS2015编译么,楼主建的是MFC工程么
xjbM 发表于 2022-3-21 22:08
厉害厉害
coderwaves 发表于 2022-3-21 22:20
今晚试试
jt0124 发表于 2022-3-21 22:28
很实用的技巧!!!!
sola2011 发表于 2022-3-21 22:49
很实用 也很复杂
chase001 发表于 2022-3-21 23:25
收藏下,以后备用
ilvjyw 发表于 2022-3-21 23:51
感谢分享  谢谢大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-22 01:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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