1. 首页
  2. 电子数码
  3. 重装Win7系统提示0xc000000d错误怎么修复(几步教你轻松解决)

重装Win7系统提示0xc000000d错误怎么修复(几步教你轻松解决)

简介:关于重装Win7系统提示0xc000000d错误怎么修复(几步教你轻松解决)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于电子数码技术大全及相关资讯,可以多多关注茶馆百科网。

遇到一些难以解决的电脑故障,一般都会采用系统重装的方法,但是重装系统也会遇到错误,比如重装系统提示0xc000000d错误,怎么办?让我们来看看具体的解决方案。

原因分析:

重装win7系统就是这样,因为win7并不真正支持UEFI,需要修改一些参数。

解决教程:

1. 1 .按BIOS键进入BIOS界面。不同类型的电脑u盘启动快捷键,我们可以从下面的表格中看到自己电脑u盘的启动键。

2. 向右移动Startup选项卡。您可以看到UEFI/Legacy Boot默认为UEFI Only。

3.在该项上按Enter键,可以看到有三个选项。您可以选择两者或仅遗留。

4. 按“F10”选择退出。重启你的电脑。

所涉及的内容如下:内核对象和内核对象管理;2. 2. 过程的回调;3.内核调试;4. 双击Windbg进行调试;1进程回调原理分析1.1安装和卸载的反向分析1.2操作系统回调例程分析1.3触发调用的调用链分析2实验2.1观察系统中安装的回调例程3结论

逆向工程IDA

过去很多安全软件使用Hook技术拦截关键系统调用,实现对恶意软件创建进程的拦截。但是,在x64架构下,系统内核做了大量的安全检测措施,特别是KDP等技术,使得Hook方法不再有效。因此,OS引入了一种基于回调的行为监控方案。本文利用IDA对该技术的实现原理进行了逆向分析,给出了关键的数据结构和调用链,并通过双机内核调试验证了数据结构和调用链的正确性。

主要内容

涉及到的内容如下:

1、内核对象及内核对象管理;

2、进程回调;

3、内核调试;

4、Windbg双击调试;

,近年来出现了各种新型恶意软件变种,攻击方法、手段多种多样,造成了巨大的经济损失。防御的第一步是能够识别恶意进程创建的行为,而进程创建监视技术的设计目的是为安全软件提供拦截此行为的机会。安全软件根据匹配算法决定是否允许创建进程,以保护用户数据的安全。

我是一名渗透测试工作者,已经编写了多年的渗透测试学习文档。需要逆向工程文档关注我,私信回复“逆向工程”接收,还有更多渗透测试、攻防架构数据!

本文基于逆向工程和内核调试技术,分析了该技术的具体实现以及系统的附加数据检测机制。借助逆向工具IDA静态逆向分析内部动作和具体实现的系统关键API、相关数据结构,得到实际调用源触发的技术和整个调用链。借助VMWare搭建双机调试环境,使用Windbg动态调试系统内核,查看系统涉及的关键数据,并与PCHunter给出的数据进行对比分析,验证分析结论的正确性。此外,通过堆栈跟踪技术,打破调用链中的关键函数,动态观察整个调用链和触发时间。通过分析得到的关键数据结构以及系统对该数据做出的检测验证算法,可用于检测病毒、木马等软件构造的恶意条目。

:

引言

1 进程回调原理分析

根据微软官方技术文档MSDN,通过PsSetCreateProcessNotifyRoutine、PsSetCreateProcessNotifyRoutineEx和PsSetCreateProcessNotifyRoutineEx2这三个api来安装进程来创建、退出称为回调例程,当进程创建或退出时,系统将回调参数中指定的函数。以PsSetCreateProcessNotifyRoutine为例,基于IDA反向分析的API的具体实现。如图1所示,图中显示,内部只是一个简单的API调用另一个函数,它自己只是一个存根,具体实现在PspSetCreateProcessNotifyRoutine中,该函数的关键是安装回调例程实现如图所示。

调用ExAllocateCallBack,创建回调对象,并传递pNotifyRoutine和bRemovel作为参数来初始化回调对象,如图所示。pNotifyRoutine是需要回调的函数例程,其中bRemovel为false,表明它是当前安装回调例程。

然后调用ExCompareExchangeCallBack初始化好回调对象被添加到由全局数组维护的PspCreateProcessNotifyRoutine中。值得注意的是,ExCompareExchangeCallBack在安装回调例程时,回调例程有一个特殊的操作,如图所示。

Does或0x0F,这相当于将所有后4位都设置为1;如果ExCompareExchangeCallBack执行失败,则继续执行下一轮循环。从图2中的第66行,我们知道循环的最大数量是0x40。如果继续失败,可以调用ExFreePoolWithTag来释放pCallBack使用的内存,并返回错误代码0xC000000D。

然后,v3值用于确定使用三个API安装中的哪一个回调来更新相应的全局变量。PspCreateProcessNotifyRoutineExCount和PspCreateProcessNotifyRoutineCount分别由PsSetCreateProcessNotifyRoutineEx和PsSet current记录CreateProcessNotifyRoutine安装回调例程的个数。

PspNotifyEnableMask指示回调例程是否安装在当前数组中。当系统遍历回调数组并执行回调例程时,该值用于判断该数组是否为空,从而加快程序的执行效率。

除了能够安装回调例程之外,这三个api还可以卸载指定的回调例程。例如,PsSetCreateProcessNotifyRoutine是其实现分析的关键部分,如所示。

通过while循环遍历PspCreateProcessNotifyRoutine数组,调用ExReferenceCallBackBlock取出数组中的每个项,API将执行一些内部测试动作,并对返回的数据进行特殊处理,如图所示。在图6中,*pCallBackObj是回调对象中回调例程的函数地址,通过判断下4位是否为1来验证一些数据,如第17行所示。

系统这样做还可以防止恶意构造填充表并劫持正常的系统调用流。此外,图中第33行的代码,在将回调例程返回给父调用时,还将回调例程的所有低4位归零,否则返回地址不正确,调用立即触发CPU异常。

ExGetCallBackBlockRoutine调用ExReferenceCallBackBlock成功返回后由回调对象返回的回调例程,并判断是否对所取的指定项需要卸载,如果是调用递减的ExDereferenceCallBackBlock引用计数,然后调用ExFreePoolWithTag释放内存由回调。将在PspCreateProcessNotifyRoutineExCount或PspCreateProcessNotifyRoutineCount值期间更新。根据源代码,数组总共有64个条目,这意味着只能安装64个回调例程。如果没有找到数组中的64项,则返回错误代码0xC000007A。

在安装

1.1 安装与卸载逆向分析

回调例程之后,如果创建或退出了一个新进程,内核将遍历数组以执行每个已安装的回调例程。通过IDA的交叉引用函数,可以分析内核其他部分对PspCreateProcessNotifyRoutine的交叉引用,如图所示

有五个地方涉及到这个变量。PspCallProcessNotifyRoutines是直接调用回调例程的函数,是函数的关键部分,如图所示。

通过while循环,遍历安装在所有回调例程中的PspCreateProcessNotifyRoutine数组,按顺序执行。

PspNotifyEnableMask 2操作确定当前数组是否安装了回调例程,以加快程序的执行效率,此变量的值在PsSetCreateProcessNotifyRoutine安装回调例程时设置。BRemove 2这个if分支,是用来确定当前的回调例程是通过PsSetCreateProcessNotifyRoutine还是PsSetCreateProcessNotifyRoutineEx安装的,因为两个api安装的回调例程的原型是不同的,在实际调用过程中传入的参数是不同的。两者的原始回调例程是:

无效PcreateProcessNotifyRoutine (HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create)和无效PcreateProcessNotifyRoutineEx (PEPROCESS Process, HANDLE ProcessId, PPS_CREATE_NOTIFY_INFO CreateInfo)。另外,图8中IDA给出的伪c代码RoutineFun((unsigned __int64)RoutineFun)显然是错误的,因为回调例程有三个参数,而IDA只解析了一个。直接查看反汇编代码,如图所示

根据x64下的调用约定,函数的前四个参数通过rcx、rdx、r8和r9这四个寄存器传递。图中显示了回调例程的前三个参数。_guard_dispatch_icall将使用rax的值直接调用。而rax值由回调例程函数ExGetCallBackBlockRoutine address返回。

上图中第二个涉及到PspCreateProcessNotifyRoutine数组是PspEnumerateCallback函数,该函数是系统内的函数,不能导出,其实现如图所示。

该函数根据dwEnumType确定要枚举的数组。从代码分析可知,系统内核维护了三个与回调相关的数组,即镜像加载回调数组,进程创建退出回调数组,线程创建退出回调数组。与前面的函数检查一样,它检查索引是否大于0x40,如果大于则返回0,表示失败。

上一节分析了回调例程对上级函数的直接调用。本节分析了整个调用链,主要分析了调用源和调用过程中涉及的关键功能。根据IDA的交叉参考图如下图所示。

涉及的函数调用数量非常多,包含了许多不相关的函数调用,不容易分析。在对调用链进行人工分析和排序后,链接中的关键API如图所示。

虚线上方的部分是用户模式程序,虚线下方的部分是内核模式程序,红色标记的部分是标准导出api。

如图12所示,当用户模式进程调用RtlCreateUserProcess、RtlCreateUserProcesersEx或RtlExitUserProcess、Kernel遍历PspCreateProcessNotifyRoutine数组时(PspCreateProcessNotifyRoutine数组反过来执行回调例程),通知驱动程序进行相应的处理。

驱动程序接管后,可以执行安全验证、分析进程的父进程或进一步分析进程链。此外,还可以对被拉起的子进程执行特征码匹配、PE指纹识别、导入表检测等防御措施。

图12中的NtCreateUserProcess调用PspInsertThread,因为该进程的主线程是在创建该进程的API中创建的。将遍历回调例程工作统一到PspInsertThread数组,调用较低的PspCallProcessNotifyRoutines更为合理。

实验环境如表1所示。双机调试是在VMWare的帮助下进行的。

Guest OS Build 10.0.16299.125Host OS Build 10.0.17134.885Windbg version 10.0.17134.1VMWare 14.1.1 Build -7528167pchunter V1.56在Windbg PspCreateProcessNotifyRoutine数组中观察,共有14个有效数据,如下所示;

1: kd dd PspCreateProcessNotifyRoutineCount l1fffff802 ' 151f4e78 000000091: kd dd PspCreateProcessNotifyRoutineExCount l1fffff802 ' 151f4e7c 000000051:dq PspCreateProcessNotifyRoutine l40fffffff802 ' 14da2a80 ffffcc8b' d884b9bf ffffcc8b' d939975f ffffcc8b' da00044ffffffff802 ' 14da2a0 ffffcc8b' da53815f ffffcc8b' da53815f ffffcc8b' da5ca8bffffff802 ' 14da2ac0 ffffcc8b' dac5178f ffffcc8b' dbef624ffffff802 ' 14da2ad0 ffffcc8b' dce333af ffffcc8b' dcec67dffffffcc8b ' dc735def ffffcc8b' dcabd32f分离第一个项并查找其对应的回调例程如下:

1: kd dq ffffcc8b' d884b9b0 l3ffffcc8b' d884b9b0 00000000' 00000020 fffff802' 13fd6268ffffcc8b 'd884b9c0 00000000' 00000000已安装的回调例程从fffff802' 13fd6268开始,并且还知道Remove为0,这已经安装。找到回调例程对应的驱动模块,如下所示:

1: kd u fffff802 ' 13fd6268360qpesv64+0x26268:fffff802 ' 13fd626d mov qword ptr [rsp+08h],rbxfffff802 ' 13fd626d mov qword ptr [rsp+10h],rbpfffff802 ' 13fd6272 mov qword ptr [rsp+18h],rsifffff802 ' 13fd6277 push rdi1: kd lmvm 360qpesv64start end module namefffff802 ' 13fb0000 fffff802 ' 14002000 360qpesv64加载的符号图像文件:360qpesv64。sysImage路径:360qpesv64。sysImage名称:360qpesv64。sysTimestamp: Wed May 27 20:13:22 2020 (5ECF2C52)CheckSum: 00054A2AImageSize: 00052000此回调例程由360正式提供。将其与PCHunter进行比较,其数据如下图所示

2.2动态调试回调例程以第14项为例:

1: kd dq ffffcc8b ' dcabd320 l3ffffcc8b ' dcabd320 00000000 ' 00000020 fffff802 ' 13d795b4ffffcc8b ' dcabd330 00000000 ' 000000061: kd bp fffff802 '13d795b41: kd g的断点被命中。查看父进程信息如下:

断点0 hitfffff802 ' 13d795b4 48895c2408 mov qword ptr [rsp+8],rbx1: kd dt _EPROCESS @$proc -yn ImageFileNament!可以看到父进程svchost.exe创建或销毁了一个子进程。具体如下:检查当前上下文;

1:kd rrax=fffff80213d795b4 rbx=ffffcb8050526c80 rcx=ffffcc8bdd67e080rdx=0000000000001f28 rsi=000000000000000d rdi=ffffcc8bdd67e080rip=fffff80213d795b4 rsp=ffffcb8050526c38 rbp=ffffcb8050526ca9r8=ffffcb8050526c80 r9=ffffcc8bdc735de0 r10=ffff9401cdcc2760r11=0000000000000000 r12=0000000000000001 r13=0000000000000000r14=ffffcc8bdcabd320 r15=fffff80214da2ae8iopl=0 nv up ei pl zr na po nccs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000246rcx寄存器存储EPROCESS对象指针,该对象指针存储了要创建的子进程的信息。用于识别或安全检测的关键信息如下:1:kd dt _EPROCESS ffffcc8bdd67e080-yn ImageFilentdll!_EPROCESS +0x448 ImageFilePointer:0xffffcc8b ' dc97c5c0 _FILE_OBJECT +0x450 ImageFileName: [15] 'UpdateAssistan'1: kd dt0xffffcc8b ' dc97c5c0 _FILE_OBJECT -yn FileNamentdll!_文件对象+0x058 FileName: _UNICODE_STRING '\Windows\UpdateAssistant\UpdateAssistant.exe'1: kd .process /p ffffcc8bdd67e080; peb 186ef07000隐式进程现在是ffffcc8b 'dd67e080。cache forcedecodeuser donePEB at 000000186ef07000 CurrentDirectory: 'C:\Windows\system32\' WindowTitle: 'C:\Windows\UpdateAssistant\UpdateAssistant.exe' ImageFile: 'C:\Windows\UpdateAssistant\UpdateAssistant.exe' commandline: 'C:\Windows\UpdateAssistant .exe /ClientID Win10Upgrade:VNL:NHV19:/CalendarRun `可以获得该进程的EXE路径、创建时的命令行参数、父进程的PID等等,这些足以让安全软件检测到。父进程的完整调用堆栈如下所示:

1: kd k# Child-SP RetAddr Call Site00 ffffcb80 ' 50526c38 fffff802 ' 14ef4ae50xfffff802 ' 13d795b401 ffffcb80 ' 50526c40 fffff802 ' 14ef752c nt!PspCallProcessNotifyRoutines+0x24902 ffffcb80 ' 50526d10 fffff802 ' 14f2797bnt !PspInsertThread+0x5a403 ffffcb80 ' 50526dd0 fffff802 ' 14b79553 nt!NtCreateUserProcess+0x9c704 ffffcb80 ' 50527a10 00007ffe ' 547d1654 nt!KiSystemServiceCopyEnd+0x1305 0000002f ' 4b67d258 00007ffe ' 50b406df ntdll!NtCreateUserProcess+0x1406 0000002f ' 4b67d260 00007ffe ' 50b3d013 KERNELBASE!CreateProcessInternalW+0x1b3f07 0000002f ' 4b67dec0 00007ffe ' 5216ee0f KERNELBASE!CreateProcessAsUserW+0x6308 0000002f ' 4b67df30 00007ffe ' 4ce0a136 KERNEL32!CreateProcessAsUserWStub+0x5f09 0000002f ' 4b67dfa0 00007ffe ' 4ce0bdd9 UBPM!ubpmplunchaction +0xb360a 0000002f ' 4b67e280 00007ffe ' 4ce08ee0 UBPM!UbpmLaunchTaskExe+0x2790b 0000002f ' 4b67e490 00007ffe ' 4ce10a86 UBPM!UbpmpLaunchOneTask+0x6c00c 0000002f ' 4b67e8f0 00007ffe ' 4ce0b8bc UBPM!UbpmpHandleGroupSid+0x2360d 0000002f ' 4b67ea10 00007ffe ' 4ce0b78b UBPM!UbpmpLaunchExeAction+0xec0e 0000002f ' 4b67eaf0 00007ffe ' 4ce0b5a3 UBPM!UbpmpTakeAction+0xeb0f 0000002f ' 4b67eb50 00007ffe ' 4ce0b193 UBPM!UbpmpPerformTriggerActions+0x29310 0000002f ' 4b67eca0 00007ffe ' 4ce1316c UBPM!UbpmpHandleTriggerArrived+0x56311 0000002f ' 4b67ef50 00007ffe ' 508c32d0 UBPM!UbpmpRepetitionArrived+0x1c12 0000002f ' 4b67ef90 00007ffe ' 508c3033 EventAggregation!EaiSignalAggregateEvent+0x16c13 0000002f ' 4b67f060 00007ffe ' 508c27aa EventAggregation!EaiSignalCallback+0xe714 0000002f ' 4b67f140 00007ffe ' 508c253e EventAggregation!EaiProcessNotification+0x1aa15 0000002f ' 4b67f270 00007ffe ' 508caef8 EventAggregation!WnfEventCallback+0x50616 0000002f ' 4b67f3a0 00007ffe ' 5476769f EventAggregation!AggregateEventWnfCallback+0x3817 0000002f ' 4b67f3f0 00007ffe ' 54767a51 ntdll!RtlpWnfWalkUserSubscriptionList+0x29b18 0000002f ' 4b67f4e0 00007ffe ' 5476b510 ntdll!RtlpWnfProcessCurrentDescriptor+0x10519 0000002f ' 4b67f560 00007ffe ' 54766b59 ntdll!RtlpWnfNotificationThread+0x801a 0000002f ' 4b67f5c0 00007ffe ' 54764b70 ntdll!TppExecuteWaitCallback+0xe11b 0000002f ' 4b67f600 00007ffe ' 52171fe4 ntdll!TppWorkerThread+0x8d01c 0000002f ' 4b67f990 00007ffe ' 5479ef91 KERNEL32!BaseThreadInitThunk+0x141d 0000002f ' 4b67f9c0 00000000 ' 00000000 ntdll!由于前四个参数是通过寄存器传递的,

1: kd ub 00007ffe ' 50b406dfKERNELBASE!CreateProcessInternalW+0x1b11:00007ffe ' 50b406b1 488b842440040000 mov rax,qword ptr [rsp+440h]00007ffe ' 50b406b9 4889442420 mov qword ptr [rsp+20h],rax00007ffe ' 50b406be b800000002 mov eax,2000000h00007ffe ' 50b406c6 448bc0 mov r9d,eax00007ffe ' 50b406c9 448bc0 mov r8d,eax00007ffe ' 50b406c9 488d942448010000 lea rdx,[rsp+ 0E0h]00007ffe ' 50b406d1 488d8c24e0000000 lea rcx,[rsp+0E0h]00007ffe ' 50b406d1 488d8c24e0000000 lea rcx,[rsp+0E0h]00007ffe ' 50b406b1 488b406d9 ff1521901600 call qword ptr [KERNELBASE!]_imp_NtCreateUserProcess (00007ffe '50ca9700)] NtCreateUserProcess的第一个和第二个参数分别为rsp+0xE0和rsp+0x148。检查以下数据:1:kd dpu 0000002 f ' 4 b67d260 + E0 0000002 f ' 4 b67d260 + 148 0000002 4 b67d340 00000000的000000000000002 f ' 4 b67d348 00000000 ' 000000040000002 f ' 4 b67d350 00000100 ' 000000040000002 ' 4 b67d358 00000000 000000200000002 f的4 b67d360 000001 f2'd9b87cc0 C: \ Windows \ UpdateAssistant \ UpdateAssistant.exe ' 0000002 f ' 4 b67d368 00000000 ' 000000000000002 f ' 4 b67d370 00000000 ' 000000000000002 f ' 4 b67d378 0000002 f 000000000000002 f的4 b67d380 0000002 f2'd8d43580“C: \ Windows \ UpdateAssistant \ UpdateAssistant.exe /性能的0000002 f ' 4 b67d38800000000' 000000000000002f' 4b67d390 00000000' 000086640000002f ' 4b67d398 000001f2'd9d73c40 'ALLUSERSPROFILE=C:\ProgramData'0000002f ' 4b67d3a0 00000000' 000000000000002f' 4b67d3a8 00000000' 00000000' 00000000' 00000000可以看出,svchost的子进程是UpdateAssistant.exe,这与前面分析的参数一致。根据调用堆栈,它是一个回调例程,当svchost创建子进程UpdateAssistant.exe并通知驱动程序软件相应地处理它时,该回调例程将被遍历。

我是一名渗透测试工作者,已经编写了多年的渗透测试学习文档。需要逆向工程文档关注我,私信回复“逆向工程”接收,还有更多渗透测试、攻防架构数据!

本文详细分析了系统实现过程回调安全机制的内部原理,使用IDA工具对系统镜像文件进行了反向,分析了实现的关键代码部分,得到了系统的关键数据结构和附加数据检测与验证算法。文中还详细说明了关键全局变量的作用。

此外,通过逆向分析,给出了整个机制的调用源和调用链。最后,基于双机调试环境,动态查看内核维护过程回调例程表,而断点实际上是动态调试整个过程。

对于驱动程序的开发,内核安全相关研究人员提供了技术实现原理和机制。基于关键数据结构和系统数据检测保护算法,对关键字段进行解密后可以检测到条目中的恶意代码,还可以利用恶意代码供安全厂商在对抗过程中完全脱离系统提供的API手动构建条目,从而监控系统行为。

本文主要介绍了关于重装Win7系统提示0xc000000d错误怎么修复(几步教你轻松解决)的相关养殖或种植技术,电子数码栏目还介绍了该行业生产经营方式及经营管理,关注电子数码发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解电子数码技术怎么管理的要点,是您电子数码致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/1446782.html