Bootkit----------HOOK IVT
鬼影HOOK xp系统 INT 13的代码。
根据IVT在BIOS中存储区域,中断向量计算方法:向量号*4+0h(一般都是0h)。
计算得出INT 13的IVT表基地址是0x4C地址。
INT13本来的地址是CB00:0117h。
mov es:73h,eax
先把INT13的IVT表基地址存放到ES:73h地址处,以便恢复。
mov word ptr [bx+4c],66h 填充一个字0066h到bx+4c地址处。
mov word ptr [bx+4e],es 填充es的值9EC0h到bx+4e地址处。
这两处分别更改了INT 13在IVT向量表中存储的CS和IP地址。更改为9EC0:0066h。
至此HOOK INT13完毕。
Bootkit----------HOOK IVT
HOOK完INT13后,每次INT13进入的代码如上图所示。
INT13读操作分为AH=2和AH=42扩展读两种操作。
MS在加载NTLDR的时候使用的是42H的扩展读。通过Hook int13中断,后续在加载NTLDR的时候,会扫描NTLDR找到OsLoader.exe指定指令序列,在进行后续对OsLoader.exe的Hook。
上图指令地址刚好执行到9EC0:0072地址处。除去一个jmp字节E9。该处刚好是刚才偷走的正常INT13应该执行的地址CB00:0117h。
至此HOOK 13h完美表演完毕。

该图为bochs调试Icelord样本的dropper,该dropper进行了IVT HOOK。
Bootkit----------HOOK IVT
再看下IceLord.exe的代码patch IVT情况,用CS:0014H地址path INT19,把INT13原地址存放在CS:0010地址处。用CS:00D1h来patch INT13。双重HOOK。
Bootkit----------HOOK IVT
同样在完成特征码的搜索后,会返回到原来中断保留的地址处。

Now来总结一下,INT N中断,反汇编函数入口代码。
代码结构不应该出现 mov dword es:0x(N*4),eax 这样结构的一句汇编,这一句表明该INT 中断被HOOK。
有连续三句汇编是mov操作要注意是不是HOOK。

相关文章: