ringfinger
驱动牛犊
驱动牛犊
  • 注册日期2009-06-18
  • 最后登录2010-06-15
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2977回复:3

求助:读取NtRemoveProcessDebug代码所在地址蓝屏,检测发现时内存未分配

楼主#
更多 发布于:2010-05-04 13:06
我从SSDT表里读取NtRemoveProcessDebug所在地址,然后读取该函数的代码。在有些机器上会导致系统蓝屏,用kerneldetective检测发现时好像内存未分配,导致蓝屏,请问是怎么回事呀
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
沙发#
发布于:2010-05-04 16:56
用户被禁言,该主题自动屏蔽!
ringfinger
驱动牛犊
驱动牛犊
  • 注册日期2009-06-18
  • 最后登录2010-06-15
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-05-06 19:54
谢谢楼上的回复
NtRemoveProcessDebug 是SSDT的一个函数,序号191,我想通过这个函数找它的子函数

ULONG GetDbgkpMarkProcessPeb()
{
    //g_orgNtRemoveProcessDebug是SSDT里 序号191的函数的地址
    if (g_orgNtRemoveProcessDebug)
    {
        ULONG dwDbgkClearProcessDebugObject = 0;
        ULONG cAbs = (ULONG)g_orgNtRemoveProcessDebug;

        for (ULONG i = 0, osize = 0; i < 0x100;
            i += osize, cAbs += osize)
        {
           //计算代码长度
            if (C_ERROR == GetInstLenght((PVOID)cAbs, &osize))------------就在这个函数里读取cAbs时蓝屏,我用kerneldetective,到SSDT页里,右键转到地址这个地址,发现它不能读,应该是内存页不存在。NtRemoveProcessDebug应该是系统自己都会用到的函数吧,怎么内存地址不能读取呢,谁知道怎么回事???
            {
                DebugPrint("Get error opCode @0X%08X", cAbs);
                return 0;
            }
            if (*(PBYTE)cAbs == 0xC2)
            {
                return 0;
            }
            if (*(PBYTE)cAbs == 0xE8 &&
                *(PWORD)(cAbs-3) == 0x75FF &&
                *(PWORD)(cAbs-6) == 0x75FF)
            {
                dwDbgkClearProcessDebugObject = *(PLONG)(cAbs + 1) + cAbs + 5;
                break;
            }
        }

        if (dwDbgkClearProcessDebugObject)
        {DebugPrint("at %08X", cAbs);
            ULONG cAbs = (ULONG)dwDbgkClearProcessDebugObject;
            for (ULONG i = 0, osize = 0; i < 0x100;
                i += osize, cAbs += osize)
            {
                if (C_ERROR == GetInstLenght((PVOID)cAbs, &osize))
                {
                    DebugPrint("Get error opCode @0X%08X", cAbs);
                    return 0;
                }
                if (*(PBYTE)cAbs == 0xC2)
                {
                    return 0;
                }
                if (*(PBYTE)cAbs == 0xE8 && *(PDWORD)(cAbs-5) == 0x75FF087C)
                {
                    return *(PLONG)(cAbs + 1) + cAbs + 5;
                }
            }
        }
    }
    return 0;
}
ringfinger
驱动牛犊
驱动牛犊
  • 注册日期2009-06-18
  • 最后登录2010-06-15
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-05-18 21:38
在intel双核系统下没问题,但在amd双核系统里就会发现代码页无效
游客

返回顶部