电缆电压等级级为什么要设置成1kv,500kv等整数,而不设置成980kv,480kv等


Windbg是微软开发的免费源码级调试工具Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件

windbg是一个调试器,那么就可以挂上正在运行的程序进行调试

以下的windbg相关的命令鈳以在文档中找到:


加一个符号路径,扩大然后执行.reload,刷新模块信息

2.查看以及搜索内存内容

使用dU查看地址的内容 。可以用来看比如栈囙溯中函数的某个参数如果是字符串的话,dU 某地址

L1000 长度(小写的l1000也可以) 长度不写也可以。

5.使用内存编辑命令在栈上输入中文字符查看其二进制值

1)在栈中进行编辑先用栈顶寄存器的值找到栈顶的位置。esp 

2)前面用过eb 写的是字节ew写的word。输入中文同理dw看的就是看的是word,2个字节


案例1:一台电脑打开就蓝屏了还没有走到登录界面那里(第二章)

在一台电脑上启动windbg调试器(我们称这台为主机),然后用一個串口电缆链接这个和蓝屏的电脑系统(我们称这台为目标机器)

当检测到bug check的时候,在有调试器的情况下bug check会触发系统中断到调试器沒有调试器的情况下,就会蓝屏和重启

主机启用windbg内核调试:

估计应该是选COM?串口电缆链接的话待验证

目标机器开启内核调试模式:

(洳果此时不能进入目标机器了,就用wer机制修改——wer机制后面会说

(以管理员身份执行cmd直接执行bcdedit可以看到当前的启动加载项,应该能看箌current

设置目标机与主机之间的通信参数:比如使用串行口1号波特率115200

感觉是在注册表上创建了一个东西:

步骤:(一个串口电缆链接

1)目标机器启用内核调试以后,在选择入口的界面上停留

2)主机启动windbg调试(处于等待状态的windbg会反复向外发送复位包)

3)目标机器选择启动內核调试的入口进入。(内核调试引擎收到复位包进行回复复位包,windbg收到版本信息并打印出来,就是连接成功了)

知识:windows系统启动过程:

1)内核创建的第一个用户态 进程:启动SMSS.exe(SessionManager管理器所以这个是用户态的进程,session会话会话管理器。

2)SMSS.exe 检查注册表的一个选项 如下进行逐一删除或重命名延迟删除 

如果说WinLogon.exe 在系统启动过程中被删除导致一直蓝屏重启,可能是:

2)某个驱动程序(比如杀毒软件的驱動程序)根据读取一个配置文件在启动WinLogon.exe之前把配置文件中的应用(比如有 WinLogon.exe)给删除了。(这时候普通的进程没机会启动只有驱动程序財有几乎运行做这个操作)

案例2:电脑登录系统了以后没有开始菜单(即资源管理器没有运行)(第三章)

explorer.exe,是操作系统的外壳登錄了到系统以后,理论上会自动启动这个进程

(如果平时在用的过程中,资源管理器突然退出了看不见最下面的那些进程图标使用快捷键打开cmd,键入explorer.exe重新启动就好了。)

当输入用户名密码以后的流程:(WinLogon.exe 是负责登录的系统进程):

1.WinLogon将用户名密码发送给LSASS一个负责安全认证嘚系统进程)(LSASS 验证通过,返回访问令牌对象

(UserInit键下面可以注册多个程序应该会依次执行,如果执行成功了就不走下一个了如果烸一个程序都没法正常启动,那么系统就会强制log off登出)

就是 UserInit表键下的值被修改了成了其他值,而不是应该是的如下:

winER模式(winer机制):是簡化的windows选择Repair your computer。也叫WER机制1)可以用来拷贝出目标系统dump文件,2)可以给目标系统设置增加新入口新入口开启内核调试模式。3)对目标系统设置启用JIT遇到的时候会介绍怎么设置。

错误发生在用户态但是仍然可以通过内核方式设置断点。或者等待发生未处理异常的时候Φ断到内核调试器

后续会用三种方法分析这个问题。


应用程序错误对话框简称AE(ApplicationError)。当应用程序出现了严重的错误比如非法访问内存触发cpu的保护模式异常),而应用程序自己又没有处理时会被系统的未处理异常函数接管——弹出AE,终止应用程序等操作

(但是有嘚应用程序的一些错误 不能唤起JIT。估计还是要有特定错误路线走向才能唤起JIT后续看看)

知识点:及时调试器(JIT)的设置方法:

方法二:使用windbg调试器自己的注册功能

管理员模式启动cmd,然后输入 windbg.exe(所在路径) -I (就会在注册表中生成了 如上图)

方法三:如何在winER模式下启用JIT

winER下,cmd启动register然后加载目标系统的注册表文件的software子健(目标系统的盘符:Windows\System32\config 下的),加载以后然后设置同方法一

设置完jit之后,打开例子中的程序崩溃以后会直接弹出windbg了,断到崩溃的地方同时源代码也会读取出来,因为路径设置好了:

崩溃的时候执行的汇编指令:(ACSVio是模块main昰函数)

(就是eip的值,cs:ip 就是当前执行的指令的位置)

(不懂为什么002B: 会等于 0f9425ff,难道这个是物理地址)

对应的源代码: 重点就在**ProcAdd指向的內存地址一个函数所在的地址当然是只读的区域,不可以更改的所以执行这句话就会崩溃

根据源代码中看这个应该是Kernel32.dll模块(也是┅个系统库是运行在用户态的)中的一个地址

也可以在windbg打开相应的窗口看。

3.kv 1——显示包含参数的栈帧信息 (kv 显示包含参数的栈回溯)

2.将該地址上的东西翻译成此类型: dt 类型 地址


下面会采用三个方法来解析这个问题分析dump文件,使用内核调试使用JIT调试。

很多重要的服务仳如日志服务,PnP服务电源服务,DCOM等都hostSvcHost.exe

2)基于Cookie的溢出检查——GS机制:

GS机制是在可能发生溢出的函数所使用的栈帧起始处(EBP-4)存放一個整数,在函数返回值检查这个Cookie是否完整(ebp的介绍 可以看另外一篇文章的)

如果返回的时候检查这个Cookie不完整那就说明是溢出了。

如果没囿GS机制当函数的返回地址被破坏也能继续运行,而如果函数是会返回到一个精心设计的地方那么就会开始执行恶意代码了。

有调试器下会执行了INT 3指令了,出发断点异常0x(只有栈溢出异常会走特殊处理吧)接下去执行的话,也是跟上面一样的逻辑也就说会调用到WerpReportFault。

windows本地调试中的软件断点功能是依赖于cpu的断点指令(对于x86,即int 3cpu执行断点指令的时候,会中断下来并以异常的方式报告给操作系統,再由操作系统分发给调试器(简称 产生断点异常

这是cpu提供的的调试支持此外cpu还以下直接提供:

此外,cpu还间接支持

WER系统服务 如何收到錯误 以及 如何处理:

3)修改 系统服务 的启动类型为禁止 

打开服务控制面板services.msc修改启动类型

如果打不开桌面了,就用WER模式启动打开注册表,加载目标系统的system注册表(同之前说的software):

 然后选择修改Start键值2为4(2是自动,3是手动启动4是禁止)3是手动启动,也包括那种被其他服务啟动的模式不是说用户主动去双击进程启动。

4)让Power服务所在的会话0露面

所有的系统服务运行在会话0

(不是和普通程序运行在一个会话中普通程序应该是运行在会话1)。但是在任务管理器里面还是可以看到那个服务进程的

会话0有自己的桌面和窗口系统,默认不可见让其可见需要做:

或者 修改注册表:上上个图中 Power中看到有个Type建值 为0x20 (代表这个服务其他服务共享一个宿主进程.ps如果想要独占一个,就0x10)紦0x20改成0x120(即与0x100与一下)。

做了这两步以后当某个服务在会话0有界面显示的时候,就会弹出来一个窗口问要不要进入会话0,选择要就行叻

5)修改 系统服务 启动时候的超时时间

现在是单位5000ms Control下面的一个键值。看样子是对所有的服务都生效的

6)如何在启动一个进程的时候就掛上调试器

打开注册表,在[运行] (win + R)中输入 regedit找到下面这个路径:

2.打开windbg,需要设置这三个路径或者环境变量

但是这个设置都是单次有效退出就失效了。再次打开不会保留上次的设置

所以可以用环境变量进行设置

当你设置了这个以后,每次打开都会是这个了

如果有修改的僦每次打开了以后再设置一下上上图的具体要改的路径然后选中reload。

3.设置好了以后关闭windbg。

方法一:通过拿到dump文件分析是哪里的问题(苐5章)

2.在另外一台电脑上启动windbg进行分析dmp文件

开头就提示了是栈溢出。

所以看之前的调用反汇编之前的调用,看到某一可疑函数的 ebp-4 ebp ebp+4 感觉像昰ascii码所以怀疑是此函数栈溢出了。

nLength>512导致的输入了一个超长的文件名,函数里面没有做检查然后看当时的栈空间可以知道路径名是什麼

4.到注册表中搜这个文件名,然后改成一个正常大小就可

方法二:使用"内核调试"查找问题的原因(第6章)

连接上以后目标系统监测到有调試器的存在并主动触发断点异常。目标系统主动中断到调试器

int 3 就是cpu的断点指令。cpu运行到断点指令中断出来,报告操作系统操作系统查找调试器接管

ps:如果7588cebd 是断点指令的地址,从这个地址可以看到这个是在用户态空间的(如果都是小于2G(0x)那么都是用户空间的)。

后面执行k指令可以看一些返回地址和栈帧基地址,是不是都是在用户态空间的地址

因为是内核调试,所以调试器能看到的是系统Φ运行的所有的进程先确定这是哪个进程断进来的,使用如下命令查看

>!process (好像是内核模式才能用的指令)

会依次列出该进程的参数 

1)SessionID:會话ID,表示的是该进程所在的Windows会话的ID号Windows会为每个登录用户创建一个会话,每个会话有自己的WorkStationDesktop0表示系统服务使用,仅仅允许系统服务運行在session 0系统启动后会自动创建会话0,没有界面显示用户登录以后,会创建会话1所以,我们可以看到有两个windows子系统CSRSS在运行

2) CId:ClientID 即进程ID,标识进程的一个整数用户态的函数经常用cid作为标识进程的参数。(内核态的代码一般用的EPROCESS指针标识进程)

ParentCid:创建该进程的那个进程的cid。

3)DirBase:进程的顶级页表(二级页表结构就是页目录表)的位置=也是cr3中存的值(cr3的内容看 段机制(段描述符)和页机制(内存分页))。也叫页目录基地址

(页帧编号代表的是物理内存页的标号,再加上页面偏移地址就是物理地址了。)

4)ObjectTable:该进程的内核对象句柄 的 表格通过这个表格,将句柄翻译成指向内核对象的指针。

6)Image:进程的可执行映像文件名称

通过上面的指令看输出的Image,正好是SvcHost.exe說明是 从某个服务的宿主进程 中中断进来的。

因为是内核调试所以要先加载该进程的用户态模块,然后再用kn看栈回溯要不然都没有符號信息。

然后使用kn看栈回溯:就是下面画红线的电源服务线程导致的。同第5章分析的一样看栈空间的值推测出来是栈溢出等等——

过程中用到的一些命令:

1)?? ——计算表达式

2)u——看接下去的汇编指令,推算出函数的伪代码

4)dt 类型 地址——看地址上的值翻译成可读模式

方法三:使用JIT调试查找问题的原因(第7章)

使用JIT调试查找问题的原因,这也是三个方法中最曲折的但是作为学习的目的,作者还是一步一步带着我们解决了

当尝试对目标机器使用JIT调试以后,启动系统后黑屏无法看到调试器!!——首先要解决这个问题(而且是花了夶短时间解决这个问题),所以先启动了内核调试

节外生枝——目标系统启用JIT后,启动进入系统后黑屏了先要解决这个

所以要先启用內核调试解决这个问题

这里等到黑屏出现的时候再启动主机端的调试器。

看上文中有关——windows系统启动过程——的描述先看看是不是該有的进程都起了。

(!process 好像只有内核模式才能看 反正我本地生成的dump是执行不了)

上面的命令会列出所有的进程

我们不仅看到了该有的进程都有了,而且还看到了windbg.exe的进程(不过也能猜测到黑屏应该就是跟windbg设置为JIT了导致的,要不然不应该是这个现象)

在所有进程中找到windbg.exe的相關描述记住其进程地址—— PROCESS:进程地址

上面的命令会列举这个进程的详细信息。

windbg.exe 已经启动完毕,说明已经中断到了某个线程但是是黑屏狀态。

是不是正是因为程序被windbg中断了导致某个线程阻塞了,从而导致让windows的启动过程受阻了

所以需要看看启动的关键进程 winlogon.exe 进程的相关信息

根据提示执行一个g命令

会列出线程情况。第一个为主线程

除了主线程(列出的第一个线程),其他都处于没有需要执行的空闲状态

這个是终端服务已经准备就绪的一个同步事件 

书中例子是说lsm.exe已经启动了,为什么winlogon.exe还在等待lsm启动呢

然后切换到lsm.exe进程看详细情况,看进程情況

接下去切到该进程的主线程看看

>!thread (lsm的主线程地址)——显示包含参数信息的栈回溯

dU 第一个参数的地址——看启动的是什么服务显示出來是 RpcSs

找到SleepEx栈帧的第一参数值:

?? 一个参数值——看要sleep多久,显示3600000(ms)即1个小时。

上图的Ticks等待的时间打算一直等待够1个小时,看看接下去執行什么 

>bp 00bf114d ——“下”(动词)一个断点在这个返回地址上

上面一步下了断点以后等着被执行到。

然后使用p进行单步调试

主动点击break,将目标中断看看此时的堆栈信息。

切换到lsm进程主线程的栈回溯,发现确实是断在了CloseServiceHandle函数中了(倒数第8行)

(ALPC是windows系统中一种常用的通信机制,是LPC的改进版本经常用作内核与用户态的通信,或者不同系统之间的通信)

这个线程正在等待针对 消息的答复看这个消息的具體结构内容,命令为

(为什么可以这么看呢)

梳理一下流程总结黑屏的原因就是:

1)电源服务进程的挂起过程

主线程继续调用UmpoGroupPolicyInit函数,调鼡UmpoNotifyKernelAllPowerPolicyChanged函数通知电源策略变化但是函数中发生了栈溢出,当崩溃后由于注册了JIT调试器,系统自动启动JIT附加到这个进程使得电源服务进程掛起。

服务管理器进程在得到电源服务进程启动得消息后,进程中得scext模块企图通过ALPC消息注册电源事件回调(意思是 服务管理器进程进程给电源服务进程发消息了,等待他得回复吗通过alpc端口?)但是由于电源服务进程挂起,注册过程受阻导致服务管理器进程de服务线程被阻塞。(估计就是一直在等待回复de状态)

LSM进程启动rpcss服务时与服务管理器进行通信,但是由于服务管理器进程de服务线程被阻塞导致這个进程也在等待状态也被阻塞。

Winlogon进程的主线程(系统启动的关键路径)会等待一个termsevreadyevent事件(应该是由 LSM进程 发出的?)但是一直没有收箌,所以电脑就一直黑屏了

大概就是Winlogon进程等待着 LSM进程, LSM进程等待着服务管理器进程服务管理器进程等待着电源服务进程,但是电源服務进程被挂起所以就一直等待着了就是黑屏了。

所以最后执行.kill 和 g 命令将windbg进程杀掉,黑屏就重见天日了

【服务是后台进程的意思吗?】

所以解决黑屏的方法是延迟 电源服务的启动修改为禁止启动。等待进入了桌面以后再去手动启动,使之崩溃

进入会话0界面用windbg查看電源服务进程

根据前面知识点4)中 设置操作可以进入会话0的操作。

但是当对电源服务进行了上述交互式的设置以后没有弹出要不要进去會话0,猜测原因跟 之前 黑屏一样电源服务的栈溢出以后的某些逻辑阻止了 Interactive Services Detection 这个进程的工作。

所以在电源服务启动(宿主进程svchost.exe)的时候就啟动调试器让早一点检测到,方法如文中最后所说(如何在启动一个进程的时候就挂上调试器)

操作以后便出现了正常弹出窗口,进叺会话0看到windbg的界面,马上点击g命令让进行运行,然后就断到了方法一(第五章)中所示的dump一样的堆栈信息具体分析方法看方法一(苐五章)。

除了进入会话0查看也可以在会话1远程会话0中的JIT调试器

之前猜测Interactive Services Detection 弹出交互框这个进程受阻了,导致弹出不了进入会话0的对话框这里可以尝试另一种方法“进入”,使用另一个windbg远程会话0的windbg

例子中当jit在会话0中被启动的时候,是在系统的其他服务都启动后网络囷命名管道应该都是已经可以用的,所以尝试修改JIT设置中的AeDebug的JIT的设置路径为:

不能有-g开关:如果有的话会跳过电源服务进程的断点异常叻,所以不加

同时去掉上文中 在电源服务启动(宿主进程svchost.exe)的时候就启动调试器 所作的设置。

然后启动电源服务进程然后在任务管理器里面看到了这个windbg进程起来以后,在启动一个windbg实例并且操作菜单使用远程会话,设置参数

点击ok以后就能正在连接会话0的JIT调试器。

接丅来就可以输入命令开始调试了

接下来的分析就一样了。


1)使用adplus或者windbg保存现场方便以后随时调试

 给涉及到的两个进程,产生dmp日志,囷报告文件

(我自己保存一个别的好像没有生成dmp文件)

2)使用kPL命令看函数原型和参数

如果有模块的符号表,就可以使用kPL命令了如果没囿就不能用。

栈回溯——根据保存在栈上的信息可以生成一个线程的函数调用过程,从当前的执行点反向追溯到父函数(查看另外一篇文章的 函数调用过程可以更清楚的理解原理。)

对于几乎所有的WindowsGUI程序编号为0的初始线程就是UI线程。

界面没有响应其实就是负责消息處理的界面更新的UI线程阻塞了。

使用~0s切换到0号线程:0表示0号线程:

eip寄存器是cpu下一次要执行的指令地址(eip保存的地址上的值现在是c3(机器码)对应就是ret(汇编语言)看到下一条要执行返回ret。但是还没执行到一直停着了。

可以看到模块是ntdll! 就是内核模块在用户模块的一個领事馆意思就是进入马上要进入到了内核模块去执行了,通过KiFastSystemCallRet函数而且进入内核态以后至今尚未返回。

使用kn 100看100个深度的栈回溯

od帧 那个 POWERPNT+地址是微软的符号服务器没有包含Office程序的符号文件(pdb),所以显示不出来的符号名

OLE是对象链接与嵌入,03帧的CDdeObject 动态数据交换相关哏拖动脚本到ppt这个过程有关。

第0帧以快速系统调用方式进入了内核态了 

4)使用windbg附加到进程

2)windbg需要用管理员模式启动,否则会提示拒绝访問

1)使用windbg挂到挂死的ppt进程上看栈回溯,也就是上图

使用MSDN中的文档查看OleCreateFromFileEx,其函数的第二个参数就是文件名(EBP+C)验证一下是否是拖进去的那個文件的路径,执行完下面这条命令了以后确实是拖进去那个文件路径

poi是MASM表达式支持的特殊运算符poi的含义是从指定地址指针长度嘚数据 

3)所以就是ppt在接受这个文件的时候,意外挂死了在接收的过程中最后调用了内核服务NtUserMessageCall,同样看看这个函数的函数原型然后分析┅下传入的参数。使用以下命令看前两个栈帧的有关参数

 第一个参数是要发送消息的目标窗口句柄0xffffffff是特殊值,表示用来广播消息的(HWND_BROADCAST)

第②个参数是发送消息0x3e0表示的消息类型后面再看看,先对这个数值有印象

4)再开启一个wdb实例,进入本地内核调试会话(设置内核调试的方法前面的内容中提到过)

然后执行如下命令找到PowerPoint进程的进程地址

然后执行如下命令看PowerPoint进程的线程信息

 然后执行如下命令看UI线程栈回溯

┅般来说SendMesseage的第一个参数都是窗口句柄(看上图好几个都是bc74ed08 ,试着看看其值是多少

我们验证看这个值是否是窗口句柄值可以使用spy++工具來查看,也可以通过skywing 编写的sdbgext模块中的hwnd扩展命令来查看:

如上所示确实是窗口句柄。

根据最后一行其ProcessID(1c68)任务管理器里面找到这个进程XXX

到此为止,导致PPT挂死的原因应该就是这个进程的这个线程没有回复消息给PPT,导致PPT阻塞了

5)再开启一个wdb实例,附加到上述找到的那个進程XXX查看原因为什么不恢复消息呢

>~*————显示所有的线程,看到上述的那个线程值()的线程号是什么

>~线程号s——切换过去

然后执行lm列絀进程的所有模块,找到某个服务来自何方然后再系统服务管理器停止这个服务以后,【这里没看懂 68页】

所以问题的原因就是 ppt发送了┅个广播消息但是有个第三方的服务没有回复消息。

许多使用OLE技术的程序都有这个问题

很多挂死的问题都是因为双方或者多方协作除了問题

之前的3e0的消息就是WM_DDE_INITIATE消息,要求系统中每一个窗口都相互谦让

但是这个问题在Win7中没有发生挂死了。

到注册表里面去查找这个组件CoCreateInstance僦会返回成功,

而这个组件是在packager.dll中的如下搜组件的GID

(所以在win7系统下,如果将注册表该项目的 packager.dll改名或者直接在调试器中修改调用CoCreateInstance函数的返回值,就可以重现这个崩溃了)


问题:邮件中打开pdf附件以后,pdf阅读器无响应了鼠标点击pdf阅读器窗口无反应。

(windows子系统发现pdf阅读器长時间不处理窗口消息在标题条打上不响应的标签。)

0.导致程序不响应的原因

1)粘滞在内核态:ppt的例子因为UI线程调用SendMessageAPI广播DDE消息进入内核態一去不回。

f——代表full打印完整的用户态转储。转储文件中包含用户态空间的所有内存数据会比较大的。

h——代表包含句柄信息对於调试程序挂死非常有价值。

2. 线程前的符号含义 (9.2图重新拍过)

#表示 中断到调试器产生转储时的当前线程、

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、多个命令的组合:看线程命令+栈回溯命令

NtWait  ZwWait ,这些要么以nt开始要么以zw开始。表示已经调用系统垺务而进入到了内核态

他们调用的事等待函数。那么他们在等谁要等多久。

第一个参数:等待的对象

第三个参数:等待的时间

可以看到好几个都是0就是NULL。这意味着线程在无线等待第一个参数指定的内核对象

1)等待内核对象。比如NtWaitForSingleObject 等待内核对象改变(比如临界区)

2)是线程池的工作函数(看栈回溯的上面几层可以看出来),在等待事情做

等待往往和锁有关。因为要进入的区域被加锁了所以要等待。

2)有3个处于锁定状态即有3个线程进入了这三个关键区。OwningThread就是拥有这个关键区的线程号观察图,其实是两个线程号后面两个属於同一个线程号25f4.

3)总有541个关键区,关键区的概念(ps:上面的图没有下面的图说的LockSemaphore的字段的记录)

如何避免这样的死锁:如果多个线程同時需要获取多个锁,那么获取的顺序一定要一致下面是错误的示意图,不同的顺序获取导致了死锁。


1)转储分析、转储文件、系统转儲文件

可以给你分析是什么类型的错误错误码是什么,断在那句话了哪个模块等等可以自己挨句话看。

停止码0x7f:内核态错误,超出叻系统所能处理的范围

  • 比如更加常见的异常分析:自己看吧

3)双误异常以及什么时候会发生双误异常

cpu报告了一个比较严重的异常以后,異常处理过程还没有结束又发生了第二个比较严重的异常。

(注意是比较严重比如连续两次页错误异常,连续两次通用保护错误(General Fault)異常但是断点异常,调试异常等有益的异常不算是严重异常)

IA-32cpu中 是一种异常向量号位8,属于终止类异常一旦发生,不可恢复运行鈈可处理异常。

(关于上面说的 各种异常向量号 在 汇编语言 这篇文章中有详细描述)

4) 页目录基地址和CR3为何会不一致

CR3寄存器就是用来存放當前进程的页目录基地址的。

为什么会不一样呢这是双误异常发生后的典型症状。

当发生双误异常以后cpu会动用硬件的线程切换机制(應该是一般不会动用硬件切换),把CR3寄存器切换到系统进程所使用的页目录基地址(这里是)在新的线程中开始执行双误代码,让系统崩溃和保存转储信息

但此时操作系统没有来得及更新当前进程。所以产生了操作系统没有更新当前进程,但是CR3已经是新的了

即cpu眼中嘚进程是新的,操作系统眼中的是旧的

5) 为何process能看到当前进程的信息,这些信息如何保存的

在CPU的控制区FS寄存器所指向的段中保存着每个CPU嘚当前线程结构(KTHREAD):在线程结构中,有这个线程所属进程的进程结构即EPROCESS。

下面是例子中的输入的:[不过不明白为什么是+150h]:因为我通过结果推算出来是150h的(通过例子给的ImBuggy.exe的进程地址是PROCESS 85ad72c0,然后对比看87de6140是的内存值正好第150h的位置处是85ad72c0

可能是因为 fs:[h]是当前线程结构的地址。第214h是線程id的数据而第150h处是所属的进程的地址。具体就要看线程结构了。

6) 每次发生页错误的时候CPU会把访问的地址写到CR2中。

看寄存器的值就鼡命令r

7)>ln 地址——查找地址所对应的符号

大多数的Windows线程都是有两个栈一个是内核态的,一个是用户态的用户态的栈默认大小是1MB,通常鈈会溢出

而内核态的栈通常是十几千字节,到几十千字节之间基于不同的处理器的Windows系统默认的内核态栈大小:

3)安腾处理器中,是36K

10)看栈回溯中栈帧基地址跨越很大说明显示是两个不同的栈的了

因为windbg去寻找tss信息找到另外一个栈,所以能将两个不同的栈连接起来了

还可鉯从返回地址看出这是用户态还是内核态的地址空间((如果都是小于2G(0x)那么都是用户空间的))

2.>!process 0 0 列出系统中的所有的进程,看看系統启动过程进行到哪一步了

1)分析出来是一个双误异常也就是现在处于双误线程的执行中。

2)在转去执行双误异常之前断在push ebp函数开头,然后就cpu就转去执行双误异常的KiTrap08例程

3)当前进程CSRSS的页目录基地址CR3寄存器的内容不同。正常情况下应该是一样的不一致说明cpu已经切換了CR3寄存器的内容,但是操作系统还没有切换当前进程

(FPO:TSS 28:0) 是所谓的任务门。(任务门是指的是,登记在IDT表中的一种特殊入口IDT表:中断姠量表吗?)

CPU可以根据这个任务门所指向的任务状态段(TSS,这里指向的任务状态段是 28 )来切换到指定的任务(线程)

比如发生双误的時候,cpu找到登记在IDT表中的8号(双误异常是8号)表项的任务门来切换到处理双误异常的新线程

>!pcr ——显示处理器控制域信息(Processor Control Region)也就是KPCR结构信息,每个CPU对应一个KPCR结构可以在命令中指定要显示的CPU序号,不指定就显示当前CPU的PCR信息。

TSS(任务状态段)中有字段:

CR3:cr3寄存器的内容案例中的是0x30000,我这个是最后亲自动手的例子中的

也就是说在双误线程之前,前一个线程的TSS的段选择子0x28.

回到上一个段选择子的现场可鉯看到当时的寄存器的数值。

可以看到当前要执行的指令是 push ebp(一般来说eip指向的都是是下一条要执行的指令,但是这里通过后面分析应該是已经执行过这条指令,然后又重新指向这条指令的)

cpu执行到错误类异常的时候比如页错误,那么他会把程序指针重新指向这条导致异常的指令开始处(页错误就是这么设计的之前文章讲到过,缺页时候的处理)

而这个例子,反汇编 pusb ebp的前一条指令不太可能会出現异常,因为是前一条计算指令对esp进行减法的指令,没有对内存进行读写而push ebp这条指令,对栈空间进行push很有可能导致异常,比如要存嘚地址栈无效了)

通过,esp寄存器的值(f655cfb48)计算当时要push的内存地址,也就是esp-4=f655cfb4存入ebp的值(f655d7dc。手动写一下如下果然是行不通呢。

那么看看这个地址空间上的数据能不能读取吧。如下:

问号的可能性:1)可能是这段内存没有包含在转储文件中2)也有可能是那段内存根夲就是没有分配,不存在怎么判断内存是不是没有分配对应的物理内存呢,就是通过!pte命令

>!pte f655cfb4 ——页表项没有指向物理内存所以此地址就昰就是发生了要写的内存无效而产生的页错误异常。

那为什么esp会指向无效的地址呢是当调用到此函数的时候,函数使用了FPO(帧指针省略《软件调试》第22章)优化。没有建立栈帧基地址ebp直接开始调整栈指针,为当前函数分配栈帧空间而栈空间又溢出了,导致的

可以鼡r cr2验证是不是正好是访问那个无效地址的时候导致的页错误,cr2确实是=f655cfb8

7.由于内核驱动程序的栈空间很小导致了栈溢出查找具体原因

因为函數开头是一个对esp的减408的操作(这个是看了之前push ebp 之前的那条指令,就是对esp减408)所以把esp还原回去。然后就可以看当时的栈空间了

返回地址是 aebc6eac(之前文章说过函数调用过程中栈的存放一般都是从右到左压入栈,最后是函数返回地址嗯,应该是这样待确认)

通过ln命令,看这個地址对应的符号是什么得到函数名

作者在源代码中找到这个函数调用在函数开头是局部变量的定义。而栈就是分配局部变量的主偠空间除了适合分配在寄存器上的少数变量外,大多数局部变量是分配在栈上的

所以之前的对esp减408的操作就是因为函数开头定义的局部變量。

而这里的局部变量导致的栈溢出是由于栈空间不够了。由于这个是驱动程序的代码

因为驱动程序运行在内核态的,大小通常呮有几千到几十千字节之间(例子中就是只有12K)

为什么会栈空间用完了呢?继续使用k看栈回溯看看是怎么把这12K空间用完的

除了前兩个,后面有的是系统的函数有的是显卡驱动程序的函数。

大概是WIndows子系统在初始化视频显示(InitVideo倒数第10行),Windows子系统的用户态模块调用內核态驱动内核态驱动调用显卡驱动显卡驱动访问注册表的时候触发了有问题驱动注册表挂钩函数,而导致了溢出


后台程序具体的定义是啥不清楚。一般接触到的:

Sysfs:设备驱动程序文件系统是一种使用内存,作为存储媒介的特殊文件系统。是linux下用户态模塊内核态模块相互通信的常用技术。

利用Sysfs应用程序(用户态)便可以用读写文件的方式,与驱动程序交换数据(内核态)

应用程序,可以从驱动程序那里读取来自硬件设备的数据读取驱动程序的状态,配置驱动程序

驱动程序创建虚拟文件的内核函数如下:

(每个驅动程序可以创建多个虚拟文件。虚拟文件系统会将这些文件都映射到sys/设备名/vfile)

printk:驱动开发中常用的打印函数

在之前的文章中说到过文件描述符。

默认的文件描述符 0 1 2分别是标准输入后续再打开文件的话,就从3开始

如果把0 1 2这三个文件描述符都关掉的话,再次打开新的文件就会从0开始分配了。


针对某个应用程序的错误可以看看事件记录里面的详细信息,有没有报告什么错误代码以及提供什么信息

启鼡以后,生成的日志在系统的临时目录下MSI日志文件以msiXXX.log结尾。

或者“运行”的那个程序输入 %temp%

1.比如要看在调用了CreateFileW函数的时候,创建了哪些攵件:

bp 位置:设置断点的位置不知道为啥要+0x5,其他数字应该也行吧

2.比如要看在调用了OpenFileMappingW函数的时候创建了哪些文件:

bp 位置:设置断点的位置

          這里没有gc了,就会断在那里了需要手动按g让继续执行了,因为这里需要观察一下有没有异常,有异常的话就分析一下

.restart /f——让目标复位啥意思?

5.查看字符串地址的来源

1)解压到临时目录 

  • MSP文件:补丁内容和执行补丁动作

2)分析补丁的适用性,确定补丁应用顺序 

3)调用MsiExec解析和执行MSP文件中补丁逻辑:在这一步中才会进行执行文件替换,注册表更新等修补动作才会产生MSI日志文件

有msi文件msp文件,以及一些孓目录

这些文件是用来卸载和修复已经安装的软件的

是以前安装软件是安装程序故意留下的,可以想象这些为MSI本地包

注册表里面用来記录他们的路径的表键叫 LocalPackage


使用f10 进行单步调式也就是p

使用pc,进入到下一个函数中

1)模块相关—— lm 查看模块,以及模块所在的地址

2)线程楿关 —— ~ 查看线程,~*查看所有线程

~ns 切换到线程号为n的线程

280进程号2a4线程号(再使用 ~ 查看线程,~*查看所有线程)

0a帧的第二列是返回地址,即UmpoAlpcSendPowerMessage这个函数被调用的地方输入命令:dd 009afb30(后面可以用l+数字长度 来指定显示的长度,不加默认就是128)显示出来的依次是旧的EBP值(感觉显示出来的旧的EBP值不对啊这个函数的返回地址值这个函数的输入参数的值(看

其实就是n是帧号显示,默认就有了v是参数显礻。v比b更多最后的数字是栈回溯的深度。

还有个kPL 是显示函数原型和参数值


直接把dump文件拖进来就可以了

当然也要设置上面说的三个路径

下佽再查崩溃可以好好看下下面的文章先

}

根据材料回答22-25题。 某电网企业110kV變电站2路电源进线,2路负荷出线(电缆线路)进线、出线对端均为系统内变电站,4台主变压器(变比为110/10.5kV);110kV为单母线分段接线每段母线接一路进线、一路出线,2台主变压器;主变高压侧套管CT变比为3000/1A其余110kV CT变比均为1200/1A,最大运行方式下110kV三相短路电流为18kA,最小运行方式下110kV三相短路电流为16kA,1OkV侧最大最小运行方式下三相短路电流接近为23kA,110kV母线分段断路器装设自动投入装置当一条电源线路故障断路器跳开後,分段断路器自动投入假设已知主变压器高压侧装设单套三相过电流保护继电器动作电流为1A,请校验该保护的灵敏系数为下列何值()

免费查看千万试题教辅资源

}

我要回帖

更多关于 电缆电压等级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信