阅读:2977回复:3
求助:读取NtRemoveProcessDebug代码所在地址蓝屏,检测发现时内存未分配
我从SSDT表里读取NtRemoveProcessDebug所在地址,然后读取该函数的代码。在有些机器上会导致系统蓝屏,用kerneldetective检测发现时好像内存未分配,导致蓝屏,请问是怎么回事呀
|
|
禁止发言
|
沙发#
发布于:2010-05-04 16:56
用户被禁言,该主题自动屏蔽! |
板凳#
发布于: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; } |
|
地板#
发布于:2010-05-18 21:38
在intel双核系统下没问题,但在amd双核系统里就会发现代码页无效
|
|