2 逆向系统管理中断(SMI)句柄 或许有人认为应该动用“硬件分析器”来参与我们的宏伟计划,其实这是一种误解。SMI处理程序是BIOS固件的一部分,和普通的BIOS代码一样,也可以类似的从中将其反汇编出来。Pinczakko的《BIOS Disassembly Ninjutsu Uncovered 》和《Guide to Award BIOS Reverse Engineering》二书,讲述了Award and AMI BIOS逆向方面的详细情况,有兴趣的读者可以到此参考。在这里,从BIOS中转储SMI处理函数,我们有两种方法可供选择。
“2.5.4 60/64端口模拟(emulation) 该选项可以开启或者关闭60h/64h端口的陷阱功能。60h/64h端口陷阱允许BIOS为USB键盘和鼠标提供基于PS/2的完全支持,在Microsoft Windows NT操作系统和支持多语言键盘上尤为有用。该选项还为USB键盘提供了诸如键盘锁定,密码设置和扫描码选择等各项PS/2键盘的功能。”
该机制由硬件系统来完成,所以我们还要查看一下具体的硬件配置情况。好在Intel和AMD的CPU中都有I/O陷阱的相关机制。AMD开发手册《BIOS and Kernel's Developer's Guide for AMD Athlon 64 and AMD Opteron Processors》中的“SMM I/O Trap and I/O Restart”一节,和Intel手册《Intel IA-32 Architecture Software Developer's Manual》中的“I/O State Implementation and I/O INSTRUCTION RESTART”一节对该机制都有详细的介绍。 I/O陷阱机制允许陷入SMI后,在SMI处理程序内部使用IN和OUT指令来访问系统的任意I/O端口。之所以设计该机制的目的是为了在断电时,通过I/O端口来开启(power on)某些设备。除此之外,I/O陷阱当然也可以用于在SMI句柄中模拟60h/64h的键盘端口。在某种程度上说,它和上述的调试陷阱机制有些类似,用陷阱捕获对I/O端口的访问,但是并非调用OS内核的调试陷阱处理句柄,而是产生一个SMI中断,让CPU进入SMM模式,执行I/O陷阱的SMI处理函数。 当处理器陷入I/O指令,进入SMM模式时,它会将I/O指令陷入时的所有信息保存在SMM存储状态映射区(Saved State Map)的I/O状态域(I/O State Field)中,位于SMBASE+0x8000+0x7FA4的位置。图4是该区域的数据分布情况,待会儿我们的记录程序将会用到。