首页
社区
课程
招聘
[求助]这个论坛下载的驱动源码怎么编译加载啊
2016-2-5 06:06 3806

[求助]这个论坛下载的驱动源码怎么编译加载啊

2016-2-5 06:06
3806
求助啊,本人小白,听不太懂各位前辈的术语,也没有师傅
我玩游戏VS运行调试不能用,我下载了一个驱动源码调试权限恢复
就只想写回权限,驱动编译加载不上不知道为什么,谁可以帮我看看
或者教教我

我是WIN764位系统
VS2013+wdk8.1编译驱动

驱动加载失败,求各位大牛行行好教教我
我已经一个星期也没弄出来,实在不懂来求助了
这是源代码和编译的成品,到底怎么错误了

MyDriver1.rar

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 24
活跃值: (1348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lukarl 2016-2-5 09:14
2
0
ULONG_PTR ul_ValidAccessMask_Addr = 0; // 调试对象权限地址
ULONG_PTR ul_DebugObjectType_Addr = 0; // 调试对象地址

KTIMER Timer = { 0 };                        // 用于全局调试对象权限的计时器
KDPC myDpc = { 0 };                                // 用于全局调试对象权限的计时器

//////////////////////////////////////////////////////////////////////////
// 以下全是win7 64 硬编码 相对于内核基址
// 虚拟机:DbgkDebugObjectType 0x45de1c   本机:DbgkDebugObjectType 0045a5fc
ULONG_PTR ul_DebugObjectType_offset = 0x45de1c;

// ValidAccessMask +0x040+0x01c
ULONG_PTR ul_ValidAccessMask_offset = 0x5c;

/********************************************************************/
/*        创建:        2015/03/11
/*        函数名:         驱动开始例程
/*        参数1:
/*        参数2:
/*
/*        返回值:
/*********************************************************************/
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pReg)
{
        NTSTATUS state = STATUS_SUCCESS;
        LDR_DATA_TABLE_ENTRY        *pLdrDataTableEntry;

        UNREFERENCED_PARAMETER(pReg);

        pDriverObject->DriverUnload = DriverUnload;

        InitKillThread();

        DbgPrint("驱动加载成功\n");

        // 获取内核模块基址
        pLdrDataTableEntry = SearchDriver(pDriverObject, L"ntoskrnl.exe");
        if (pLdrDataTableEntry)
        {
                ul_KernelBase = (ULONG_PTR)pLdrDataTableEntry->DllBase;
                DbgPrint("内核基址:%p\n", ul_KernelBase);
        }

        pMyDriverObject = pDriverObject;

        // 获取调试对象地址
        ul_DebugObjectType_Addr = GetDbgkDebugobjectAddr();
        DbgPrint("DbgkDebugObjectType:%p\n", ul_DebugObjectType_Addr);
        ul_ValidAccessMask_Addr = *(PULONG_PTR)ul_DebugObjectType_Addr + ul_ValidAccessMask_offset;
        DbgPrint("调试对象地址:%p\n", ul_DebugObjectType_Addr);
        DbgPrint("调试对象权限地址:%p\n", ul_ValidAccessMask_Addr);

        SetDPCTimerByDbgAccess();

        return state;
}

/********************************************************************/
/*        创建:        2015/03/11
/*        函数名: 驱动卸载例程
/*        参数1:
/*        参数2:
/*
/*        返回值:
/*********************************************************************/
void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
        UNREFERENCED_PARAMETER(pDriverObject);
        BOOLEAN bTimer = FALSE;
        bTimer = KeCancelTimer(&Timer);
        if (bTimer)
        {
                DbgPrint("DPC定时器卸载成功\n");
        }

        DbgPrint("驱动卸载完成\n");
}

// 用于全局调试对象权限的计时器   500ms写一次
VOID TimerRoutine(
        _In_      struct _KDPC *Dpc,
        _In_opt_  PVOID DeferredContext,
        _In_opt_  PVOID SystemArgument1,
        _In_opt_  PVOID SystemArgument2
        )
{
        UNREFERENCED_PARAMETER(Dpc);
        UNREFERENCED_PARAMETER(DeferredContext);
        UNREFERENCED_PARAMETER(SystemArgument1);
        UNREFERENCED_PARAMETER(SystemArgument2);

        LARGE_INTEGER lTime = { 0 };
        ULONG ulMicroSecond = 0;

        //将定时器的时间设置为500ms
        ulMicroSecond = 500000;
        //将32位整数转化成64位整数
        lTime = RtlConvertLongToLargeInteger(-10 * ulMicroSecond);

        DbgPrint("dpc Timer...\n");
        KIRQL irql;
        irql = WPOFF();
        *(PULONG_PTR)ul_ValidAccessMask_Addr = 0x1f000f;
        WPON(irql);

        KeSetTimer(&Timer, lTime, &myDpc);
}
游客
登录 | 注册 方可回帖
返回