win10 ntoskrnl.exe蓝屏错误代码0x0000003b怎么办
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win10 ntoskrnl.exe蓝屏错误代码0x0000003b怎么办相关的知识,希望对你有一定的参考价值。
网上的 chkdsk c: /f 后回车也没用,还有powercfg -h off后回车也没用,驱动都在神舟官网更新了也没用。重置此电脑也没用。依旧蓝屏,求大神解决
1、首先蓝屏代码0x0000003b的意思是:网络发生意外错误。这个代码原因比较模糊,我们还是要一步一步来着手。
2、重启电脑,在启动画面反复按下F8键,看看能否进入安全模式菜单,选择“最近一次的正确配置”启动系统。
3、如果选择“最近一次的正确配置”启动无效的话,我们尝试进入安全模式,在系统IE浏览器上,点击菜单栏上的“工具”-“Internet选项”,然后点击“删除”历史记录,将系统IE浏览器上的历史记录进行清空,看看是不是因为浏览器的缓存导致的系统蓝屏。
4、如果清空浏览器的缓存也没有好转,或者干脆进不去安全模式的话,我们就要考虑通过u盘重装系统了。
参考技术A1、通过蓝屏代码查询器得知该代码的出现原因为网络发生意外错误。
2、想要修复这个蓝屏问题,我们可以尝试在开机的时候选择进入安全模式。
3、在安全模式内打开IE浏览器点击菜单栏上的“工具”→“Internet选项”,然后点击“删除”历史记录,将Win7系统IE浏览器上的历史记录进行清空。
4、完成上述操作重启后还是不能进入系统的话,也可以选择重装系统。
参考技术B 1)您的电脑蓝屏的时候,您在电脑干什么呢,能说说吗?我会跟据您说的较为准确的回答您。蓝屏代码或事件查看器里面的内容普通人是看不懂的,请将你在蓝屏前电脑的表现,和你操作说的详细些(我跟据你提供的信息重新回答你)。
一般蓝屏是自己不正确操作引起的,记住容易引起蓝屏的操作不做。电脑不要满负荷操作,就是在玩游戏、看视频时、下载时、看网页的同时在干别的操作最容易死机、蓝屏,因此在玩游戏、看视频、下载时、看网页时不要在操作别的东西了。
不管您在干什么,只要一有卡的迹象时就赶紧停止手头的操作退出在试,这样就不会蓝屏,如果还是这样就不要玩了或是不要看了。
硬件方面:如果内存小请加内存条,硬盘是否有坏道,硬件是否不兼容或是故障,在用鲁大师测试一下CPU等硬件的温度是否高。
2)如果您说的是开机蓝屏是与您关机前的不当操作有关系吧?比如:玩游戏、看视频、操作大的东西、使用电脑时间长造成的卡引起的吧?或下载了不合适的东西、或删除了系统文件、或断电关机等,故障不会无缘无故的发生吧?
反复开关机试试,放一段时间试试,确实不可以就重装系统吧,如果自己重装不了,到维修那里找维修的人帮助您。
只要注意自己的电脑不卡机、蓝屏、突然关机,开机就不会这样了。
3)有问题请您追问我。追问
蓝屏半个月了,蓝屏时通常是在玩dnf。别的游戏好像不会。电脑8g内存,硬盘软件检测好几遍说没有坏,蓝屏时cpu温度大多是60度
追答玩游戏是最爱出现蓝屏、死机、断电关机的了,这您承认吧?玩游戏不出事或少出事,一个是配置要足够用,另一个是玩游戏也是要有点操作技术和技巧的,我不在现场看您操作,没有办法指出您具体哪里做的不对。
追问昨天找人重装系统今天又蓝屏了,是不是硬件坏了?
追答我的电脑用了12年了,没有出过大的问题,不是说我的电脑好,是容易引起故障的操作不做。我的实践是,有好的操作电脑水平,有较强的驾驭电脑的能力,电脑就会少出或不出问题,电脑上90%的故障是与我们操作和使用电脑的人的不当操作是有关系的,电脑是不会自己出问题的,也不是出了问题就是硬件问题。
本回答被提问者采纳 参考技术C其实,如果只是偶然一次,没有必要在意,如果经常蓝屏,而且还是同一个程序导致的,你可以试试找一个来覆盖它试试,实在不行,那就只能重装系统
望采纳
参考技术D 这种情况没有办法,只能重做系统了。一般盗版系统可能出现错误代码,某硬件驱动出现问题,也可能出现,或者应用软件卸载不彻底,冲突的时候,出现蓝屏错误代码!ring0 ShadowSSDTHook
SSDT:主要处理 Kernel32.dll中的系统调用,如openProcess,ReadFile等,主要在ntoskrnl.exe中实现(微软有给出 ntoskrnl源代码)
ShadowSSDT: 1.主要处理,user32.dll,GDI32.dll中调用的函数,如postMessage,SendMessage,FindWindow,主要在win32k.sys中实现.(微软未给出win32k代码)
2.需要注意的是shadowSSDT并未导出,可用ida在win32k.sys中的导出表搜索,且结构与ssdt相似,但是不能通过windbg dd命令查看值
3.ShadowSSDT表只能在GUI(即有界面的程序进程)环境下才有值,故我们需要调用KeAttachProcess来切换到GUI线程里。
4.用windbg 命令 .process 861ff020 (861ff020 是通过 命令 !process 0 0得到的)切换到GUI线程上下文
过程:1)(输入windbg命令 ) !process 0 0得到其中一个有 图形界面的程序
(数据如下)
PROCESS 861ff020 SessionId: 0 Cid: 0b58 Peb: 7ffde000 ParentCid: 05e4
DirBase: 10080380 ObjectTable: e1dd2808 HandleCount: 73.
Image: windbg.exe
2) (输入命令)
lkd> .process 861ff020
Implicit process is now 861ff020
(切换成功 )
3) 切换成功后,使用dd KeServiceDescriptorTableShadow即可得到该表数据,否则无法得到,得到数据如下
lkd> dd KeServiceDescriptorTableShadow
80553f60 80502b8c 00000000 0000011c 80503000--〉SSDT
80553f70 bf999b80 00000000 0000029b bf99a890 --〉ShadowSSDT
80553f80 00000000 00000000 00000000 00000000
80553f90 00000000 00000000 00000000 00000000
80553fa0 80502b8c 00000000 0000011c 80503000
80553fb0 00000000 00000000 00000000 00000000
80553fc0 00000000 00000000 00000000 00000000
80553fd0 00000000 00000000 00000000 00000000
其实KeServiceDescriptorTableShadow 包含4个系统服务表,但是我们只用前2个(SSDT,ShadowSSDT)
4) 总结:
1) ShadowSSDT在KeServiceDescriptorTableShadow[1]中,而KeServiceDescriptorTableShadow[0]为ssdt
2)如果要查看win32k服务,必须要切换到GUI线程上下文
5.如何得到ShadowSSDT地址:在insight source中可查询到wrk中有KeAddSystemServiceTable函数,里面有对KeServiceDescriptorTableShadow 的调用
思路:利用搜索特征码的方式搜索KeAddSystemServiceTable,取出KeServiceDescriptorTableShadow
64位
HOOK 和 UNHOOK SHADOW SSDT 跟之前的 HOOK/UNHOOK SSDT 类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了。
一、获得 w KeServiceDescriptorTableShadow的地址
这个跟获得 KeServiceDescriptorTable 差不多,唯一不同就是特征码:
#include "ShadowSSDTHook.h" int NtUserFindWindowExIndex = 378; pfnNtUserFindWindowEx OldNtUserFindWindowEx = NULL; //ShadowSSDT PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorShadowTable; NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegisterPath) { PDEVICE_OBJECT DeviceObject; NTSTATUS Status; int i = 0; PEPROCESS EProcess; UNICODE_STRING DeviceName; UNICODE_STRING LinkName; RtlInitUnicodeString(&DeviceName,DEVICE_NAME); RtlInitUnicodeString(&LinkName,LINK_NAME); //创建设备对象; Status = IoCreateDevice(DriverObject,0, &DeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject); if (!NT_SUCCESS(Status)) { return Status; } Status = IoCreateSymbolicLink(&LinkName,&DeviceName); for (i = 0; i<IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction[i] = DefaultPassThrough; } DriverObject->DriverUnload = UnloadDriver; KeServiceDescriptorShadowTable = GetShadowTableAddress(); if (KeServiceDescriptorShadowTable) { if (LookupProcessByName("explorer.exe", &EProcess) == STATUS_SUCCESS) { KeAttachProcess(EProcess);//附加到目标进程 HookShadowSSDTTable(&KeServiceDescriptorShadowTable[1], &NtUserFindWindowExIndex, &(ULONG_PTR)OldNtUserFindWindowEx, (ULONG_PTR)FakeNtUserFindWindowEx); KeDetachProcess();//解除附加 } } #ifdef WIN64 // __asm // { // xchg rax,rbx // } DbgPrint("WIN64: ShadowSSDTHook IS RUNNING!!!"); #else // __asm // { // xor eax,eax // } DbgPrint("WIN32: ShadowSSDTHook SIS RUNNING!!!"); #endif return STATUS_SUCCESS; } NTSTATUS DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp,IO_NO_INCREMENT); return STATUS_SUCCESS; } VOID UnloadDriver(PDRIVER_OBJECT DriverObject) { PEPROCESS EProcess; UNICODE_STRING LinkName; PDEVICE_OBJECT NextDeviceObject = NULL; PDEVICE_OBJECT CurrentDeviceObject = NULL; RtlInitUnicodeString(&LinkName,LINK_NAME); IoDeleteSymbolicLink(&LinkName); CurrentDeviceObject = DriverObject->DeviceObject; while (CurrentDeviceObject != NULL) { NextDeviceObject = CurrentDeviceObject->NextDevice; IoDeleteDevice(CurrentDeviceObject); CurrentDeviceObject = NextDeviceObject; } KeServiceDescriptorShadowTable = GetShadowTableAddress(); if (KeServiceDescriptorShadowTable) { //获取一个gui线程的进程对象。 if (LookupProcessByName("explorer.exe", &EProcess) == STATUS_SUCCESS) { KeAttachProcess(EProcess);//附加到目标进程 UnHookShadowSSDTTable(&KeServiceDescriptorShadowTable[1], &NtUserFindWindowExIndex, (ULONG_PTR)OldNtUserFindWindowEx); KeDetachProcess();//解除附加 } } DbgPrint("ShadowSSDTHook IS STOPPED!!!"); } PVOID GetShadowTableAddress() { ULONG_PTR ulData = 0; ULONG_PTR i = 0; PUCHAR Temp = (PUCHAR)KeAddSystemServiceTable; //类似王艳萍的内存修改器做法 //扫描特征码 for (i = 0; i<4096; i++, Temp++) { __try { ulData = *(ULONG_PTR*)Temp; } __except (EXCEPTION_EXECUTE_HANDLER) { return FALSE; } if (MmIsAddressValid((PVOID)ulData)) { if (memcmp((PVOID)ulData, KeServiceDescriptorTable, 16) == 0) { if ((PVOID)ulData == KeServiceDescriptorTable) //排除SSDT { continue; } return (PVOID)ulData; } } } return FALSE; } NTSTATUS LookupProcessByName( IN PCHAR ProcessName, OUT PEPROCESS *EProcess ) { NTSTATUS status; ULONG uCount = 0; ULONG uLength = 0; PLIST_ENTRY ListActiveProcess; PEPROCESS CurrentEProcess = NULL; ULONG ulNextProcess = 0; ULONG g_Offset_Eprocess_Flink = 0x88; //XP操作系统 char lpszProName[100]; char *lpszAttackProName = NULL; uLength = strlen(ProcessName); CurrentEProcess = PsGetCurrentProcess(); ulNextProcess = (ULONG)CurrentEProcess; __try { memset(lpszProName, 0, sizeof(lpszProName)); if (uLength > 15) { strncat(lpszProName, ProcessName, 15); } while (1) { lpszAttackProName = NULL; lpszAttackProName = (char *)PsGetProcessImageFileName(CurrentEProcess); if (uLength > 15) { if (lpszAttackProName && strlen(lpszAttackProName) == uLength) { if (_strnicmp(lpszProName, lpszAttackProName, uLength) == 0) { *EProcess = CurrentEProcess; status = STATUS_SUCCESS; break; } } } else { if (lpszAttackProName && strlen(lpszAttackProName) == uLength) { if (_strnicmp(ProcessName, lpszAttackProName, uLength) == 0) { *EProcess = CurrentEProcess; status = STATUS_SUCCESS; break; } } } if ((uCount >= 1) && (ulNextProcess == (ULONG)CurrentEProcess)) { *EProcess = 0x00000000; status = STATUS_NOT_FOUND; break; } ListActiveProcess = (LIST_ENTRY *)((ULONG)CurrentEProcess + g_Offset_Eprocess_Flink); (ULONG)CurrentEProcess = (ULONG)ListActiveProcess->Flink; (ULONG)CurrentEProcess = (ULONG)CurrentEProcess - g_Offset_Eprocess_Flink; uCount++; } } __except (EXCEPTION_EXECUTE_HANDLER) { KdPrint(("LookupProcessByName:%08x\\r\\n", GetExceptionCode())); status = STATUS_NOT_FOUND; } return status; } BOOLEAN HookShadowSSDTTable(PSERVICE_DESCRIPTOR_TABLE ServiceDescriptorShadowSSDTTable, int *Index, ULONG_PTR *OldFuctionAddress, ULONG_PTR FakeFuctionAddress) { BOOLEAN bRetOK = FALSE; __try { //检查 if (MmIsAddressValid(ServiceDescriptorShadowSSDTTable) && MmIsAddressValid(ServiceDescriptorShadowSSDTTable->ServiceTable)) { //检查*index是否在表的有效范围 if (*Index >= 0 && *Index <(int)ServiceDescriptorShadowSSDTTable->TableSize) { //保存原始函数,因为我们的hook过滤函数需要用到。 *OldFuctionAddress = ServiceDescriptorShadowSSDTTable->ServiceTable[*Index]; WPOFF(); InterlockedExchange(&ServiceDescriptorShadowSSDTTable->ServiceTable[*Index], FakeFuctionAddress); bRetOK = TRUE; WPON(); } } } __except (EXCEPTION_EXECUTE_HANDLER) { } return bRetOK; } NTSTATUS FakeNtUserFindWindowEx(ULONG_PTR hWndParent, ULONG_PTR hWndChild, PUNICODE_STRING uniClassName, PUNICODE_STRING uniWindowName, ULONG_PTR Type) { char* ProcessName = NULL; PEPROCESS EProcess; EProcess = IoGetCurrentProcess(); ProcessName = PsGetProcessImageFileName(EProcess); //进行过滤 if (strstr(ProcessName, "Test.exe") != NULL) { DbgPrint("HookFindWindow\\r\\n"); return STATUS_SUCCESS; } return OldNtUserFindWindowEx(hWndParent, hWndChild, uniClassName, uniWindowName, Type); } //去掉内存保护 void WPOFF() { __asm { cli mov eax, cr0 and eax, not 10000h mov cr0, eax } } //恢复内存保护 void WPON() { __asm { mov eax, cr0 or eax, 10000h mov cr0, eax sti } } BOOLEAN UnHookShadowSSDTTable(PSERVICE_DESCRIPTOR_TABLE ServiceDescriptorShadowSSDTTable, int *Index, ULONG_PTR OldFuctionAddress) { BOOLEAN bRetOK = FALSE; __try { //检查 if (MmIsAddressValid(ServiceDescriptorShadowSSDTTable) && MmIsAddressValid(ServiceDescriptorShadowSSDTTable->ServiceTable)) { //检查*index是否在表的有效范围 if (*Index >= 0 && *Index <(int)ServiceDescriptorShadowSSDTTable->TableSize) { WPOFF(); InterlockedExchange(&ServiceDescriptorShadowSSDTTable->ServiceTable[*Index], OldFuctionAddress); bRetOK = TRUE; WPON(); } } } __except (EXCEPTION_EXECUTE_HANDLER) { } return bRetOK; }
#include <ntifs.h> #ifndef CXX_ShadowSSDTHook_H #define CXX_ShadowSSDTHook_H #define DEVICE_NAME L"\\\\Device\\\\ShadowSSDTHookDevice" #define LINK_NAME L"\\\\??\\\\ShadowSSDTHookLink" typedef struct _SERVICE_DESCRIPTOR_TABLE { PULONG ServiceTable; PULONG CounterTable; ULONG TableSize; PUCHAR ArgumentTable; } SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE; //SSDT表 extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable; extern UCHAR *PsGetProcessImageFileName(PEPROCESS eprocess); typedef NTSTATUS(*pfnNtUserFindWindowEx)(ULONG_PTR hWndParent, ULONG_PTR hWndChild, PUNICODE_STRING uniClassName, PUNICODE_STRING uniWindowName, ULONG_PTR Type); __declspec(dllimport) _stdcall KeAddSystemServiceTable(PVOID, PVOID, PVOID, PVOID, PVOID); VOID UnloadDriver(PDRIVER_OBJECT DriverObject); PVOID GetShadowTableAddress(); NTSTATUS LookupProcessByName(IN PCHAR ProcessName, OUT PEPROCESS * EProcess); BOOLEAN HookShadowSSDTTable(PSERVICE_DESCRIPTOR_TABLE ServiceDescriptorShadowSSDTTable, int * Index, ULONG_PTR * OldFuctionAddress, ULONG_PTR FakeFuctionAddress); NTSTATUS FakeNtUserFindWindowEx(ULONG_PTR hWndParent, ULONG_PTR hWndChild, PUNICODE_STRING uniClassName, PUNICODE_STRING uniWindowName, ULONG_PTR Type); void WPOFF(); void WPON(); BOOLEAN UnHookShadowSSDTTable(PSERVICE_DESCRIPTOR_TABLE ServiceDescriptorShadowSSDTTable, int * Index, ULONG_PTR OldFuctionAddress); NTSTATUS DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp); #endif
以上是关于win10 ntoskrnl.exe蓝屏错误代码0x0000003b怎么办的主要内容,如果未能解决你的问题,请参考以下文章
笔记本蓝屏啊,分析代码如下:Probably caused by : ntoskrnl.exe ( nt+70740 ) 。请高手帮忙,说清楚了,
电脑蓝屏,死机严重 0X0000001A 崩溃地址ntoskrnl.exe ,怎么解决
电脑蓝屏,死机严重 0X0000001A 崩溃地址ntoskrnl.exe ,怎么解决