龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 1960|回复: 0

Ring3与Ring0通信源码

[复制链接]

8

主题

1

回帖

15

积分

编程入门

Rank: 1

龙马币
56

ring0程序:

  1. #include <ntddk.h>

  2. #define DEVICE_NAME L"\\Device\\KillHDDGMon"
  3. #define LINK_NAME L"\\DosDevices\\KillHDDGMon"

  4. #define IOCTL_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_BUFFERED, FILE_ANY_ACCESS)
  5. #define IOCTL_READ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801,METHOD_BUFFERED, FILE_ANY_ACCESS)

  6. NTSTATUS DispatchCreateClose(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
  7. NTSTATUS DispatchIoctl(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
  8. VOID DriverUnload(PDRIVER_OBJECT DriverObject);

  9. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  10. {
  11.         NTSTATUS status = STATUS_SUCCESS;
  12.         UNICODE_STRING ustrDevName;
  13.         UNICODE_STRING ustrLinkName;
  14.         PDEVICE_OBJECT pDevObj = NULL;

  15.         DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
  16.         DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
  17.         DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
  18.         DriverObject->DriverUnload = DriverUnload;

  19.         RtlInitUnicodeString(&amp;ustrDevName, DEVICE_NAME);
  20.         status = IoCreateDevice(DriverObject, 0, &amp;ustrDevName,
  21.                                         FILE_DEVICE_UNKNOWN, 0, FALSE, &amp;pDevObj);

  22.         if(!NT_SUCCESS(status))
  23.         {        return status;                }

  24.         RtlInitUnicodeString(&amp;ustrLinkName, LINK_NAME);
  25.         status = IoCreateSymbolicLink(&amp;ustrLinkName, &amp;ustrDevName);

  26.         if(!NT_SUCCESS(status))
  27.         {
  28.                 IoDeleteDevice(pDevObj);
  29.                 return status;
  30.         }

  31.         return STATUS_SUCCESS;
  32. }

  33. VOID DriverUnload(PDRIVER_OBJECT DriverObject)
  34. {
  35.         UNICODE_STRING ustrLinkName;

  36.         RtlInitUnicodeString(&amp;ustrLinkName, LINK_NAME);
  37.         IoDeleteSymbolicLink(&amp;ustrLinkName);

  38.         IoDeleteDevice(DriverObject->DeviceObject);
  39. }

  40. NTSTATUS DispatchCreateClose(PDEVICE_OBJECT DeviceObject, PIRP pIrp)
  41. {
  42.         pIrp->IoStatus.Status = STATUS_SUCCESS;

  43.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  44.         return STATUS_SUCCESS;
  45. }

  46. NTSTATUS DispatchIoctl(PDEVICE_OBJECT DeviceObject, PIRP pIrp)
  47. {
  48.         NTSTATUS status = STATUS_NOT_SUPPORTED;
  49.         PVOID pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
  50.         PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  51.         ULONG outSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
  52.         ULONG IoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

  53.         switch(IoControlCode)
  54.         {
  55.         case IOCTL_WRITE:
  56.                 __asm
  57.                 {
  58.                         push eax
  59.                         push edx
  60.                         //---------------------------------------------------
  61.                         // 以下代码用I/O端口来写主引导区

  62.                         mov dx,1f6h        // 要读入的磁盘号及磁头号
  63.                         mov al,0a0h        // 磁盘0,磁头0
  64.                         out dx,al

  65.                         mov dx,1f2h        // 要写的扇区数量
  66.                         mov al,1        // 写一个扇区
  67.                         out dx,al

  68.                         mov dx,1f3h        // 要写的扇区号
  69.                         mov al,1        // 写到1扇区
  70.                         out dx,al

  71.                         mov dx,1f4h        // 要写的柱面的低8位
  72.                         mov al,0        // 低8位为0
  73.                         out dx,al

  74.                         mov dx,1f5h        // 要写的柱面的高2位
  75.                         mov al,0        // 高2位为0
  76.                         out dx,al

  77.                         mov dx,1f7h        // 命令端口
  78.                         mov al,30h        // 尝试着写扇区
  79.                         out dx,al

  80.                         still_going_1:
  81.                         in al,dx
  82.                         test al,8        // 如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行
  83.                         jz still_going_1

  84.                         pop edx
  85.                         pop eax
  86.                 }

  87.                 WRITE_PORT_BUFFER_USHORT((PUSHORT)0x1f0, (PUSHORT)pIoBuffer, 256);
  88.                 status = STATUS_SUCCESS;
  89.                 break;

  90.         case IOCTL_READ:
  91.                 if(outSize >= 512)
  92.                 {
  93.                         __asm
  94.                         {
  95.                                 push eax
  96.                                 push edx
  97.                                 //---------------------------------------------------
  98.                                 // 以下代码用I/O端口来读主引导区

  99.                                 mov dx,1f6h        // 要读入的磁盘号及磁头号
  100.                                 mov al,0a0h        // 磁盘0,磁头0
  101.                                 out dx,al

  102.                                 mov dx,1f2h        // 要读入的扇区数量
  103.                                 mov al,1        // 读一个扇区
  104.                                 out dx,al

  105.                                 mov dx,1f3h        // 要读的扇区号
  106.                                 mov al,1        // 扇区号为1
  107.                                 out dx,al

  108.                                 mov dx,1f4h        // 要读的柱面的低8位
  109.                                 mov al,0        // 柱面低8位为0
  110.                                 out dx,al

  111.                                 mov dx,1f5h        // 柱面高2位
  112.                                 mov al,0        // 柱面高2位为0(通过1F4H和1F5H端口我们可以确定用来读的柱面号是0)
  113.                                 out dx,al

  114.                                 mov dx,1f7h        // 命令端口
  115.                                 mov al,20h        // 尝试读取扇区
  116.                                 out dx,al

  117.                                 still_going_2:
  118.                                 in al,dx        // 扇区缓冲是否准备好
  119.                                 test al,8        // 如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行。
  120.                                 jz still_going_2        

  121.                         /*        mov cx,512/2        // 设置循环次数(512/2次)
  122.                                 mov di,offset buffer
  123.                                 mov dx,1f0h        // 将要传输的一个字节的数据
  124.                                 rep insw        // 传输数据                */

  125.                                 //---------------------------------------------------
  126.                                 pop edx
  127.                                 pop eax
  128.                         }

  129.                         //RtlCopyMemory(pIoBuffer, (PVOID)&amp;g_swNiceToMeetYouToo[0], 512);
  130.                         READ_PORT_BUFFER_USHORT((PUSHORT)0x1f0, (PUSHORT)pIoBuffer, 256);
  131.                         pIrp->IoStatus.Information = 512;
  132.                         status = STATUS_SUCCESS;
  133.                 }
  134.                 else
  135.                 {
  136.                         pIrp->IoStatus.Information = 0;
  137.                         status = STATUS_BUFFER_TOO_SMALL;
  138.                 }
  139.                 break;
  140.         }
  141.         
  142.         pIrp->IoStatus.Status = status;
  143.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  144.         return status;
  145. }
复制代码




ring3:
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <winioctl.h>

  4. #define IOCTL_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_BUFFERED, FILE_ANY_ACCESS)
  5. #define IOCTL_READ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801,METHOD_BUFFERED, FILE_ANY_ACCESS)

  6. int main(int argc, char* argv[])
  7. {        
  8.         DWORD dwBytesReturned = 0;
  9.         BYTE bytBuffer_1[512];
  10.         BYTE bytBuffer_2[512];
  11.         CHAR string[2048];
  12.         HANDLE hDevice, hDriver;
  13.         BOOL bRet;

  14.         hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
  15.                 NULL, OPEN_EXISTING, 0, NULL);

  16.         if(hDevice == INVALID_HANDLE_VALUE)
  17.         {
  18.                 printf("\nFailed - CreateFile - Open the PhysicalDrive0.\n");
  19.                 return 0;
  20.         }

  21.         bRet = ReadFile(hDevice, (LPVOID)bytBuffer_1, 512, &amp;dwBytesReturned, NULL);

  22.         if(bRet == FALSE)
  23.         {
  24.                 printf("\nFailed - ReadFile - the first one.\n");
  25.                 return 0;
  26.         }

  27.         printf("\nRead MBR using the ReadFile function...\n");
  28.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  29.         sprintf(string, "\n");

  30.         for(DWORD i = 0; i < 512; i++)
  31.         {
  32.                 sprintf(string, "%s %02X", string, bytBuffer_1[i]);

  33.                 if(((i + 1) % 16) == 0)
  34.                         sprintf(string, "%s\n", string);

  35.                 if(((i + 1) % 16) == 8)
  36.                         sprintf(string, "%s -", string);
  37.         }

  38.         printf("%s", string);

  39.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  40.         hDriver = CreateFile("\\\\.\\KillHDDGMon", GENERIC_READ|GENERIC_WRITE,
  41.                 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  42.         if(hDriver == INVALID_HANDLE_VALUE)
  43.         {
  44.                 printf("\nFailed - CreateFile - Open the Driver.\n");
  45.                 return 0;
  46.         }

  47.         bRet = DeviceIoControl(hDriver, IOCTL_READ, NULL, 0, (LPVOID)bytBuffer_2, 512,
  48.                 &amp;dwBytesReturned, NULL);
  49.         if(bRet == FALSE)
  50.         {
  51.                 printf("\nFailed - DeviceIoControl - IOCTL_READ - the first one.\n");
  52.                 return 0;
  53.         }

  54.         printf("\nRead MBR using I/O port operations...\n");
  55.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  56.         sprintf(string, "\n");

  57.         for(DWORD m = 0; m < 512; m++)
  58.         {
  59.                 sprintf(string, "%s %02X", string, bytBuffer_2[m]);

  60.                 if(((m + 1) % 16) == 0)
  61.                         sprintf(string, "%s\n", string);

  62.                 if(((m + 1) % 16) == 8)
  63.                         sprintf(string, "%s -", string);
  64.         }

  65.         printf("%s", string);

  66.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  67.         bRet = DeviceIoControl(hDriver, IOCTL_WRITE, (LPVOID)bytBuffer_1, 512,
  68.                 NULL, 0, &amp;dwBytesReturned, NULL);
  69.         if(bRet == FALSE)
  70.         {
  71.                 printf("\nFailed - DeviceIoControl - IOCTL_WRITE.\n");
  72.                 return 0;
  73.         }

  74.         printf("\nWrite MBR using I/O port operations...\n");

  75.         bRet = ReadFile(hDevice, (LPVOID)bytBuffer_1, 512, &amp;dwBytesReturned, NULL);

  76.         if(bRet == FALSE)
  77.         {
  78.                 printf("\nFailed - ReadFile - the second one.\n");
  79.                 return 0;
  80.         }

  81.         printf("\nRead MBR using the ReadFile function...\n");
  82.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  83.         sprintf(string, "\n");

  84.         for(DWORD n = 0; n < 512; n++)
  85.         {
  86.                 sprintf(string, "%s %02X", string, bytBuffer_1[n]);

  87.                 if(((n + 1) % 16) == 0)
  88.                         sprintf(string, "%s\n", string);

  89.                 if(((n + 1) % 16) == 8)
  90.                         sprintf(string, "%s -", string);
  91.         }

  92.         printf("%s", string);

  93.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  94.         bRet = DeviceIoControl(hDriver, IOCTL_READ, NULL, 0, (LPVOID)bytBuffer_2, 512,
  95.                 &amp;dwBytesReturned, NULL);
  96.         if(bRet == FALSE)
  97.         {
  98.                 printf("\nFailed - DeviceIoControl - IOCTL_READ - the second one.\n");
  99.                 return 0;
  100.         }

  101.         printf("\nRead MBR using I/O port operations...\n");
  102.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  103.         sprintf(string, "\n");

  104.         for(DWORD t = 0; t < 512; t++)
  105.         {
  106.                 sprintf(string, "%s %02X", string, bytBuffer_2[t]);

  107.                 if(((t + 1) % 16) == 0)
  108.                         sprintf(string, "%s\n", string);

  109.                 if(((t + 1) % 16) == 8)
  110.                         sprintf(string, "%s -", string);
  111.         }

  112.         printf("%s", string);

  113.         printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -");

  114.         printf("\nSucceed - Kill HDDGMon.\n");
  115.         return 1;
  116. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表