为什么试图闯入NT 3.1内核重新启动我的486DX4机器?

2021-04-22 13:05:45

我在Compaq Prosignia 3080系统上安装了Windows NT 3.1,因为有几个原因:我知道这台机器正在运行Windows NT 3.1在生产性使用时。我认为这台机器是Microsoft明确定位Windows NT的机器之一。为了提高性能,我在128MB时将RAM最大限度地缩小,并在电压适配器插座中通过AMD增强的486DX4-SV8B(回写缓存和SMM)交换了插座的Intel 486DX-33。我推迟处理BIOS支持486DX4处理器,并将处理器跳到2倍乘数。如果没有芯片组支持L1回写和2倍乘法器,则处理器应该是Intel 80486DX2-66兼容的软件,这是该系统的支持选项。

安装Windows NT 3.1完全工作时,我真的很想用我的复古的东西修补。 Windows NT 3.1 CD附带了全套调试符号,我很想调查NetDDE在事件日志中将错误投入错误,并且系统崩溃与特定的EISA以太网卡(可能是由于硬件故障导致的系统崩溃),所以我决定潜入核心调试。设置内核调试直截了当,一旦您实现了使用Windows NT 3.1提供的I386KD可执行文件,而不是来自当前Windows 10 DevelepMont套件的KD / NTKD。

一旦我想打破(在I386KD中使用Ctrl-C),目标机器重新启动而不是提供KD>迅速的。

在内核中断进行调试时,没有硬件看门狗活动将重新启动计算机

USB-to-erial适配器我在主机中使用(似乎是伪造PL2301)正常通信。它没有错误地发送一些调试器命令作为"重启系统"命令(KD协议提供一个,但是!)

Windows NT 3.1内核与增强型486处理器不兼容。具体地,它与提供CPUID指令的486个处理器不兼容。内核调试与最初安装在机器中的486dx-33,以及在无线电的写入am486dx4-nv8t中的旧的非增强核心。

如果您的目标只是用NT 3.1内核调试进行Toing,您可能希望使用与框中的Windows NT 3.1兼容的处理器。如果你和我一样好奇,你可能想要修复Windows NT。在这种情况下继续阅读。

不兼容是由于KisaveProcessorControlstate的错误(以及对应于kirestoreProcessorControlState的类似错误),从Ntoskrnl.exe中的三个位置调用:

当使用kdptrap反映在内核调试器中(如果我使用ctrl-c打入内核调试器时,断点异常从计时器滴答中断中的断开轮询功能引发了一个断点异常)

当调用KisaveProcessorState时。如果NTOSKRNL.EXE中的IDA控制流分析穷举,则此功能似乎不会导出,也不是从NTOSKRNL中的导出,而不是从NTOSKRNL中调用。

该功能应该将处理器控制寄存器保存到扩展的上下文结构中。它的拆卸看起来像这样:

.text:80106740; __stdcall kisaveprocessorcontrolstate(x).text:80106740 public [email protected]:80106740 _kisaveProcessorControlstate @ 4 Proc yourt.text:80106740.Text:80106740.Text:80106740.Text:80106740 Mov EDX,[ESP + Dest ] .Text:80106744 XOR ECX,ECX.Text:80106746 MOV EAX,CR0.Text:80106749 MOV [EDX + 0CCH],EAX.Text:8010674F Mov EAX,CR2.Text:80106752 Mov [EDX + 0D0H],EAX。文本:80106758 MOV EAX,CR3.Text:8010675B MOV [EDX + 0D4H],EAX.Text:80106761 MOV [EDX + 0D8H],ECX.Text:80106767 CMP DS:Word_FFDFF138,5.Text:8010676F JB Short @@ Breat_pentium .text:80106771 mov eax,cr4.text:80106774 mov [edx + 0d8h],eax.text:8010677a @@ breat_pentium:.text:8010677a mov eax,dr0.text:8010677d mov [edx + 0dch],eax.text :80106783 MOV EAX,DR1.Text:80106786 MOV [EDX + 0E0H],EAX.Text:8010678C MOV EAX,DR2.Text:8010678F MOV [EDX + 0E4H],EAX.Text:80106795 Mov EAX,DR3.Text:80106798 mov [edx + 0e8h],eax.text:8010679e mov eax,dr6.text:801067a1 mov [edx + 0ch],eax.text:801067a7 mov eax,dr7.text:80106 7aa mov dr7,ecx.text:801067AD mov [edx + 0f0h],eax.text:801067b3 sgdt fword ptr [edx + 0f6h] .text:801067ba sidt fword ptr [edx + 0feh] .text:801067c1 str word ptr [edx + 104h] .text:801067C8 SLDT Word PTR [EDX + 106H] .text:801067CF retn 4.text:801067CF _KisaveProcessorControlstate @ 4 EPEP

该功能应该保存所有控制寄存器(CR0,CR2,CR3和CR4上的Pentium和更高版本处理器),所有调试寄存器(DR0-DR3,DR6,DR7)和各种全局保护模式设置(GDT的地址, IDT的地址,活动TS的选择器和LDT的选择器)。要检测处理器类型,它使用KPRCB(内核处理器控制块)的值。 KPRCB是KPCR(内核处理器控制区域)的一部分。用于引导处理器的KPRCB(或单处理器系统上的唯一处理器)位于虚拟地址FFDFF120,其硬编码为此方法。 Geoff Chappell在NT 3.1中写下了KPRCB的相关部分:

KPCRB的这些成员被KisetProcessorType初始化,它正确标识了相关处理器(但请注意,它不信任报告高于3的CPUID功能级别的处理器,并将其视为"通用非CPUID的586兼容处理器&#34 ;。偏移量18的字节设置为4个486处理器,5用于Pentium Pro和Pentium II / III处理器的6个。偏移量19的字节是一个布尔标志,指示处理器是否支持CPUID并表现"合理"

一个非常细心的读者可能已经注意到了错误:CMP指令使用地址FFDFF138(18h字节进入KPRCB),而不是该地址的字节。这意味着KPRCB中的偏移量19h的字节被认为是型号的一部分。如果处理器支持CPUID,则其型号被认为是比实际更大的256。这意味着Windows NT 3.1将CPUID处理80-4-86处理器视为80-260-86处理器。随着260的方式大于5(奔腾),该处理器更好地具有CR4。

一旦识别出错误,修复很明显。指令cmp ds:word_ffdff138,5仅在Ntoskrnl.exe中显示两次,特别是在KisaveProcessorControlstate和KirestoreProcessorControlstate中,并且需要修补为字节比较而不是单词比较。使用您最喜爱的六十三38 f1 df 05至90 34 f1 df 05,两次。此修复程序从原始NT 3.1高级服务器分发以及NT 3.1 SP3应用NTOSKRNL.EXE。

8我看到你的NOP(90h),并提高了一个明确的DS前缀(3eh)。它'所有关于风格的点! :-)具有内存操作数的任何指令都可以具有段前缀。在这种情况下,DS前缀是隐式/暗示的,但可以在不改变指令的含义的情况下明确指定它。这两种方式都可以解决额外的剩余空间的剩余字节,但显式DS前缀不会改变指令和#39; S执行速度,而NOP实际上需要1个时间循环以执行(加上可能的解码)。 - Cody Gray.

点击“发布答案”,您同意我们的服务条款,隐私政策和Cookie政策

不是答案你和#39;寻找?浏览其他标记的问题或提出您自己的问题。