【驱动系列】最简单的X64驱动

[复制链接]
查看: 1295   回复: 3

45

主题

45

帖子

381

积分

超级版主

Rank: 8Rank: 8

积分
381
发表于 2021-7-1 09:27:49 | 显示全部楼层 |阅读模式
本帖最后由 飞郁乄九州寒 于 2021-7-1 10:08 编辑

PE结构图:
PE结构图_1.jpg

在游戏外挂和反外挂的对抗中
驱动有其重要的作用
但是随着Windows 系统的升级  很多东西出现了局限性,不过我们还是需要了解学习一下
其最基础的知识

创建驱动设备对象的符号链接
//环境设置:
//属性页->C / C++->警告等级 : 等级3 / W3
//属性页->C / C++->将警告视为错误 : 否 / WX -
//属性页->Inf2Cat->Run Inf2Cat : 否
//属性页->Driver Settings->Target Os Version : 设置版本 Windows 7 Windows 10任选
//属性页->Driver Settings->Target PlatForm : Desktop
//属性页->StampInf->Endable ArchiteCture : 否


  1. //KdPrint类似于 控制台的printf
  2. //DriverEntry类似于 C / C++里的main
  3. #include <ntifs.h>

  4. #pragma code_seg("PAGE")
  5. //创建驱动设备对象
  6. NTSTATUS CreateDevice(PDRIVER_OBJECT driver)
  7. {
  8.         NTSTATUS status;
  9.         UNICODE_STRING uzDriverName;
  10.         PDEVICE_OBJECT device;
  11.         RtlInitUnicodeString(&uzDriverName, L"\\DEVICE\\uzDriverName001");
  12.         //创建驱动设备
  13.         status = IoCreateDevice(driver, sizeof(driver->DriverExtension), &uzDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &device);


  14.         if (status == STATUS_SUCCESS)
  15.         {
  16.                 KdPrint(("yjx:驱动设备对象 %wZ 创建成功,OK -----------\n", &uzDriverName));
  17.                 //为设备对象绑定一个符号链接
  18.                 UNICODE_STRING uzSymbolName; //符号链接名字                 
  19.                 RtlInitUnicodeString(&uzSymbolName, L"\\??\\uzDriverName001"); //CreateFile
  20.                 status = IoCreateSymbolicLink(&uzSymbolName, &uzDriverName);
  21.                 if (status==STATUS_SUCCESS)
  22.                 {
  23.                         KdPrint(("yjx:创建符号链接 %wZ 成功 ", &uzSymbolName));
  24.                 }
  25.                 else
  26.                 {
  27.                         KdPrint(("yjx:创建符号链接 %wZ 失败 ", &uzSymbolName));
  28.                 }
  29.         }
  30.         else
  31.         {

  32.                 KdPrint(("yjx:驱动设备对象 %wZ 创建失败,准备删除Device -----------\n", &uzDriverName));
  33.                 IoDeleteDevice(device);
  34.         }
  35.         return status;
  36. }
  37. //驱动卸载例程
  38. void UnLoad(PDRIVER_OBJECT driver)
  39. {
  40.         NTSTATUS status = 0;
  41.         IoDeleteDevice(driver->DeviceObject); //删除设备对象,如果此处不删除 卸载不干净 再次用IoCreateDevice创建同名驱动 会蓝屏
  42.         //删除符号链接
  43.         UNICODE_STRING uzSymbolName; //符号链接名字
  44.         RtlInitUnicodeString(&uzSymbolName, L"\\??\\uzDriverName001");
  45.         status=IoDeleteSymbolicLink(&uzSymbolName);
  46.         if (!status) //if(status == STATUS_SUCCESS)
  47.         {
  48.                 KdPrint(("yjx:删除符号链接 %wZ 成功 ",&uzSymbolName));
  49.         }
  50.         else
  51.         {
  52.                 KdPrint(("yjx:删除符号链接 %wZ 失败 ", &uzSymbolName));
  53.         }
  54.         KdPrint(("yjx:驱动卸载成功\n"));
  55. }

  56. NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PVOID szReg) //main
  57. {
  58.         KdPrint(("yjx:进入了我们的驱动 \n")); //printf
  59.         driver->DriverUnload = UnLoad;
  60.         NTSTATUS status=CreateDevice(driver);//创建了设备对象

  61.         return STATUS_SUCCESS;
  62. }



  63. IRP 派遣函数


  64. driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceIrpCtl;//DeviceIoControl
  65. driver->MajorFunction[IRP_MJ_CREATE] = DeviceIrpCtl; //CreateFile
  66. driver->MajorFunction[IRP_MJ_CLOSE] = DeviceIrpCtl;//卸载驱动 CloseHandle


  67. NTSTATUS DeviceIrpCtl(PDEVICE_OBJECT device,PIRP pirp)
  68. {
  69.         KdPrint(("yjx:进入派遣函数"));
  70.         PIO_STACK_LOCATION irpStackL;
  71.         ULONG CtlCode;
  72.         ULONG InputBuffLength;


  73.         irpStackL=IoGetCurrentIrpStackLocation(pirp); //获取应用层传来的参数

  74.         switch(irpStackL->MajorFunction)
  75.          {
  76.           IRP_MJ_DEVICE_CONTROL;
  77.           IRP_MJ_CREATE;
  78.           IRP_MJ_CLOSE;
  79.          }

  80.         pirp->IoStatus.Status = STATUS_SUCCESS;
  81.         pirp->IoStatus.Information = 4;//返回给DeviceIoControl中的 倒数第二个参数lpBytesReturned
  82.         IoCompleteRequest(pirp, IO_NO_INCREMENT);//调用方已完成所有I/O请求处理操作 并且不增加优先级
  83.         KdPrint(("yjx:离开派遣函数"));
  84.         return STATUS_SUCCESS;
  85. }



  86. //打开驱动设备
  87. void CIoControlIrpDlg::OnBnClickedCreate()
  88. {
  89.         // TODO: 在此添加控件通知处理程序代码
  90.         DeviceHandle = CreateFileW(
  91.                 L"\\??\\uzDriverName001",
  92.                 GENERIC_READ | GENERIC_WRITE,
  93.                 FILE_SHARE_READ | FILE_SHARE_WRITE,
  94.                 NULL,
  95.                 OPEN_EXISTING,
  96.                 FILE_ATTRIBUTE_NORMAL,
  97.                 NULL);

  98. }


  99. void CIoControlIrpDlg::OnBnClickedButtonClose()
  100. {
  101.         // TODO: 在此添加控件通知处理程序代码
  102.         if (DeviceHandle)
  103.         {
  104.                 CloseHandle(DeviceHandle);
  105.                 DeviceHandle = NULL;
  106.         }
  107. }


  108. R3应用层与R0驱动层简单通信

  109. #define IO_IS_OK_TEST   CTL_CODE(FILE_DEVICE_UNKNOWN,         0x803,         METHOD_BUFFERED,FILE_ANY_ACCESS) //测试

  110. //WriteFile ReadFile
  111. BOOL DeviceIoControl(
  112.   HANDLE hDevice,              // 设备驱动的句柄 由CreateFile获取
  113.   DWORD dwIoControlCode,       // 操作控制码
  114.   LPVOID lpInBuffer,           // 输入缓冲区指针 要传入驱动的 参数
  115.   DWORD nInBufferSize,         // 输入缓冲区大小
  116.   LPVOID lpOutBuffer,          // 输出缓冲区指针
  117.   DWORD nOutBufferSize,        // 输出缓冲区大小
  118.   LPDWORD lpBytesReturned,     // 存放返回的字节数的指针
  119.   LPOVERLAPPED lpOverlapped    // 异步结构指针,同步或者异步
  120. );


  121. BOOL  WINAPI IoControlIsOK()
  122. {
  123.         DWORD nTypeCode = IO_IS_OK_TEST;
  124.         ULONG64 BufferInData = 0;;
  125.         DWORD NumberOfBytesRead = 0;
  126.         BOOL IsOK = DeviceIoControl(
  127.                 GetDeviceHandle(), //CreateFile函数打开的设备句柄
  128.                 nTypeCode,//自定义的控制码
  129.                 &BufferInData,//输入缓冲区
  130.                 sizeof(BufferInData),//输入缓冲区大小
  131.                 &BufferInData,////输出缓冲区
  132.                 sizeof(BufferInData),//输出缓冲区的大小
  133.                 &NumberOfBytesRead,//实际返回的字节数,对应驱动程序中pIrp->IoStatus.Information。
  134.                 NULL); ////重叠操作结构指针。同步设为NULL,DeviceIoControl将进行阻塞调用;否则,应在编程时按异步操作设计
  135.         DbgPrintA("yjx:IsOK=%d,NumberOfBytesRead=%d  BufferInData=%d", IsOK, NumberOfBytesRead, BufferInData);
  136.         return NumberOfBytesRead;
  137. }

  138. #include
  139. #define IO_IS_OK_TEST   CTL_CODE(FILE_DEVICE_UNKNOWN,         0x803,         METHOD_BUFFERED,FILE_ANY_ACCESS) //测试
  140. void CMFCIRPCTRLDlg::OnBnClickedButtonIoCtl()
  141. {
  142.         // TODO: 在此添加控件通知处理程序代码
  143.         INT64 InBuf[3] = { 0x123456,0x123456789ABCDEF,0x888888ABC }; //输入缓冲区
  144.         INT64 OutBuf[6] = { 0 };
  145.         DWORD dwSize = 0;
  146.         DeviceIoControl(
  147.                 DeviceHandle,
  148.                 IO_IS_OK_TEST,
  149.                 InBuf,//输入缓冲区指针
  150.                 sizeof(InBuf),//2*8,//输入缓冲区大小
  151.                 OutBuf,//输出缓冲区
  152.                 sizeof(OutBuf), //输出缓冲区大小 6*8 =48
  153.                 &dwSize,//返回 字节数 pIrp->IoStatus.Information //IRP.IOStatus.InforMation
  154.                 NULL //同步异步
  155.         );
  156.         CString csStr;
  157.         csStr.Format(L"yjx:EXE:%llx,%llx,%llx,%llx,%llx,%llx dwSize=%llx .....OK\n", OutBuf[0], OutBuf[1], OutBuf[2], OutBuf[3], OutBuf[4], OutBuf[5], dwSize);
  158.         OutputDebugStringW(csStr);
  159. }


  160. //驱动层 获取用户层参数
  161. Irp->AssociatedIrp.SystemBuffer;
  162. driver->Flags |= DO_BUFFERED_IO; //IO访问方式  重要 对应 METHOD_BUFFERED
  163.         inBufLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
  164.         outBufLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
  165.         ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

复制代码




来亦何哀, 去亦何苦?
回复

使用道具 举报

1

主题

15

帖子

120

积分

亲传弟子

Rank: 7Rank: 7Rank: 7

积分
120
QQ
发表于 2021-11-4 10:18:20 | 显示全部楼层
回复

使用道具 举报

0

主题

3

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 昨天 14:26 | 显示全部楼层
震惊!美国对中国的十条禁令,欲和平演变中国!(今日特刊)
十条jieling和平演变中国
在美国中央情报局极其机密的“行事手册”中,关于对付中华人民共和国的部分最初撰写于中美严重对立的1951年,以后随着中美关系的变化不断修改,至今共成十项,内部代号称为《十条jieling》。直到最近才被揭密。我们看完后简直大吃一惊!美国和平演变的阴谋太可怕了!
十条jieling转述如下
一、尽量用物质来引诱和败坏他们的青年,鼓励他们藐视、鄙视、进一步公开反对他们原来所受的思想教育,特别是gongchan主义教条。替他们制造对奔放的兴趣和机会,进而鼓励他们进行性的lanjiao。让他们不以肤浅、虚荣为羞耻。一定要毁掉他们强调过的刻苦耐劳精神。
二、一定要尽一切可能,做好传播工作,包括电影、书籍、电视、无线电波……和新式的宗教传播。只要他们向往我们的衣、食、住、行、娱乐和教育的方式,就是成功的一半。
三、一定要把他们青年的注意力,从以zhengfu为中心的传统引开来。让他们的头脑集中于:体育表演、书籍、享乐、游戏、犯罪性的电影,以及宗教迷信。
四、时常制造一些无事之事,让他们的人民公开讨论。这样就在他们的潜意识中种下了fenlie的种子。特别要在他们的少数民族里找好机会,fenlie他们地区,fenlie他们的民族,fenlie他们的感情,在他们之间制造新仇旧恨,这是完全不能忽视的策略。
五、要不断制造消息,丑化他们的领导。我们的记者应该找机会采访他们,然后组织他们自己的言辞来攻击他们自己。
六、在任何情况下都要宣扬minzhu。一有机会,不管是大型小型,有形无形,都要抓紧发动minzhu运动。无论在什么场合,什么情况下,我们都要不断对他们(zhengfu)要求minzhu和人权。只要我们每一个人都不断地说同样的话,他们的人民就一定会相信我们所说的是真理。我们抓住一个人是一个人,我们占住一个地盘是一个地盘。
七、要尽量鼓励他们(zhengfu)花费,鼓励他们向我们借贷。这样我们就有十足的把握来摧毁他们的信用,使他们的货币贬值,通货膨胀。只要他们对物价失去了控制,他们在人民心目中就会完全垮台。
八、要以我们的经济和技术优势,有形无形地打击他们的工业。只要他们的工业在不知不觉中瘫痪下去,我们就可以鼓励社会动乱。不过我们必须表面上非常慈爱地去帮助和援助他们,这样他们(zhengfu)就显得疲软。一个疲软的zhengfu,就会带来更大的动乱。
九、要利用所有的资源,甚至举手投足,一言一笑,都足以破坏他们的传统价值。我们要利用一切来毁灭他们的道德人心。摧毁他们的自尊自信的钥匙,就是尽量打击他们刻苦耐劳的精神。
十、暗地运送各种wuqi,装备他们的一切diren,以及可能成为他们diren的人们。
警惕西方国家的糖衣paodan
美国尼克松总统写下这样一本书《不战而胜》,理论来自中国的孙子兵法。
他在书中,这样说:"当有一天,中国的年轻人,已经不再相信,他们老祖宗的教导和他们的传统文化,我们美国人,就不战而胜了……”
美国在预谋,和平演变中国。他们没动一抢一炮,只用了中国老祖宗的智慧,就想把我们打败。冷静想想,他们教会我们xing解放,他们却在反对堕胎。他们让中国人,丧失了家庭责任,但是他们强调一夫一妻,伦理道德。堂堂的美国总统克林顿,他只有一个外遇,都要遭到严厉的弹劾,这说明什么?他们让中国孩子,很快进入了电子时代,我们的父母措手不及,立刻变成文盲。独生子女们,不用辛苦赚钱,就能活的潇洒自由。他们穿名牌,吃饭店,睡酒店,除了朋友,谁都不需要。
毛主席早就预料到了美国会有此意图,在《毛主席语录》中他曾说过:我们取得了胜利,但是我们不能骄傲。因为胜利,资产阶级也有可能出来捧场。事实证明diren的武力不能征服我们,有些同志不曾被带qiang的diren征服,他们在diren面前不愧英雄的称号;但是他们经不起人们糖衣paodan的攻击,他们在糖弹面前会打败仗。
回复

使用道具 举报

0

主题

3

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 昨天 14:35 | 显示全部楼层
《美国中情局“中国十诫”》
第一,尽量用物质来引诱和败坏他们的青年,鼓励他们藐视、鄙视并进一步公开反对他们原来所受的思想教育,特别是gongchanzhuyi教育。为他们制造对产生兴趣的机会,进而鼓励他们进行性的lanjiao。让他们不以肤浅、虚荣为耻。一定要毁掉他们一直强调的刻苦耐劳精神。
  
   第二,一定要尽一切可能做好宣传工作,包括电影、书籍、电视、无线电波和新式的宗教传布。只要让他们向往我们的衣、食、住、行、娱乐和教育的方式,就是成功的一半。
  
   第三,一定要把他们青年的注意力从以政府为中心的传统引开来。让他们的头脑集中于体育表演、书籍、享乐、游戏、犯罪性的电影,以及宗教迷信。
  
   第四,时常制造一些无事之事,让他们的公民公开讨论。这样就在他们的潜意识中种下了fenlie的种子。特别要在他们的少数民族里找到好机会,fenlie他们的地区,fenlie他们的民族,fenlie他们的感情,在他们之间制造新仇旧恨。
  
   第五,要不断制造新闻,丑化他们的领导人。我们的记者应该找机会采访他们,然后利用他们自己的言辞来攻击他们自己。
  
   第六,在任何情况下都要传扬minzhu。一有机会,不管是大型小型,有形无形,就要抓紧发动minzhu运动。无论在什么场合下,什么情况下,我们都要不断对他们(政府)要求minzhu和人权。
  
   第七,要尽量鼓励他们(政府)花费,鼓励他们向我们借款。这样我们就有十足的把握来摧毁他们的信用,使它们的货币贬值,发生通货膨胀。只要他们对物价失去了控制,他们在人民的心目中就会完全垮台。
  
   第八,要以我们的经济和技术优势,有形无形的打击他们的工业。只要他们的工业在不知不觉中瘫痪下去,我们就可以鼓励社会dongluan。不过我们表面上必须非常慈善的去帮助和援助他们,这样他们(政府)就显得疲软。一个疲软的政府,就会带来更大的dongluan。
  
   第九,要利用所有的资源,甚至举手投足,一言一笑,来破坏他们的传统价值。我们要利用一切来毁灭他们的道德人心。摧毁他们自尊自信的钥匙, 就是尽量打击他们的刻苦耐劳的精神。
  
   第十,暗地运送各种wuqi,装备他们的一切敌人,以及可能成为他们敌人的人们。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X3.4 © 2001-2018 Comsenz Inc.