飞郁乄九州寒 发表于 2021-7-1 09:27:49

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

本帖最后由 飞郁乄九州寒 于 2021-7-1 10:08 编辑

PE结构图:


在游戏外挂和反外挂的对抗中
驱动有其重要的作用
但是随着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 : 否


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

#pragma code_seg("PAGE")
//创建驱动设备对象
NTSTATUS CreateDevice(PDRIVER_OBJECT driver)
{
      NTSTATUS status;
      UNICODE_STRING uzDriverName;
      PDEVICE_OBJECT device;
      RtlInitUnicodeString(&uzDriverName, L"\\DEVICE\\uzDriverName001");
      //创建驱动设备
      status = IoCreateDevice(driver, sizeof(driver->DriverExtension), &uzDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &device);


      if (status == STATUS_SUCCESS)
      {
                KdPrint(("yjx:驱动设备对象 %wZ 创建成功,OK -----------\n", &uzDriverName));
                //为设备对象绑定一个符号链接
                UNICODE_STRING uzSymbolName; //符号链接名字               
                RtlInitUnicodeString(&uzSymbolName, L"\\??\\uzDriverName001"); //CreateFile
                status = IoCreateSymbolicLink(&uzSymbolName, &uzDriverName);
                if (status==STATUS_SUCCESS)
                {
                        KdPrint(("yjx:创建符号链接 %wZ 成功 ", &uzSymbolName));
                }
                else
                {
                        KdPrint(("yjx:创建符号链接 %wZ 失败 ", &uzSymbolName));
                }
      }
      else
      {

                KdPrint(("yjx:驱动设备对象 %wZ 创建失败,准备删除Device -----------\n", &uzDriverName));
                IoDeleteDevice(device);
      }
      return status;
}
//驱动卸载例程
void UnLoad(PDRIVER_OBJECT driver)
{
      NTSTATUS status = 0;
      IoDeleteDevice(driver->DeviceObject); //删除设备对象,如果此处不删除 卸载不干净 再次用IoCreateDevice创建同名驱动 会蓝屏
      //删除符号链接
      UNICODE_STRING uzSymbolName; //符号链接名字
      RtlInitUnicodeString(&uzSymbolName, L"\\??\\uzDriverName001");
      status=IoDeleteSymbolicLink(&uzSymbolName);
      if (!status) //if(status == STATUS_SUCCESS)
      {
                KdPrint(("yjx:删除符号链接 %wZ 成功 ",&uzSymbolName));
      }
      else
      {
                KdPrint(("yjx:删除符号链接 %wZ 失败 ", &uzSymbolName));
      }
      KdPrint(("yjx:驱动卸载成功\n"));
}

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

      return STATUS_SUCCESS;
}



IRP 派遣函数


driver->MajorFunction = DeviceIrpCtl;//DeviceIoControl
driver->MajorFunction = DeviceIrpCtl; //CreateFile
driver->MajorFunction = DeviceIrpCtl;//卸载驱动 CloseHandle


NTSTATUS DeviceIrpCtl(PDEVICE_OBJECT device,PIRP pirp)
{
      KdPrint(("yjx:进入派遣函数"));
      PIO_STACK_LOCATION irpStackL;
      ULONG CtlCode;
      ULONG InputBuffLength;


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

      switch(irpStackL->MajorFunction)
         {
          IRP_MJ_DEVICE_CONTROL;
          IRP_MJ_CREATE;
          IRP_MJ_CLOSE;
         }

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



//打开驱动设备
void CIoControlIrpDlg::OnBnClickedCreate()
{
      // TODO: 在此添加控件通知处理程序代码
      DeviceHandle = CreateFileW(
                L"\\??\\uzDriverName001",
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);

}


void CIoControlIrpDlg::OnBnClickedButtonClose()
{
      // TODO: 在此添加控件通知处理程序代码
      if (DeviceHandle)
      {
                CloseHandle(DeviceHandle);
                DeviceHandle = NULL;
      }
}


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

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

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


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

#include
#define IO_IS_OK_TEST   CTL_CODE(FILE_DEVICE_UNKNOWN,         0x803,         METHOD_BUFFERED,FILE_ANY_ACCESS) //测试
void CMFCIRPCTRLDlg::OnBnClickedButtonIoCtl()
{
      // TODO: 在此添加控件通知处理程序代码
      INT64 InBuf = { 0x123456,0x123456789ABCDEF,0x888888ABC }; //输入缓冲区
      INT64 OutBuf = { 0 };
      DWORD dwSize = 0;
      DeviceIoControl(
                DeviceHandle,
                IO_IS_OK_TEST,
                InBuf,//输入缓冲区指针
                sizeof(InBuf),//2*8,//输入缓冲区大小
                OutBuf,//输出缓冲区
                sizeof(OutBuf), //输出缓冲区大小 6*8 =48
                &dwSize,//返回 字节数 pIrp->IoStatus.Information //IRP.IOStatus.InforMation
                NULL //同步异步
      );
      CString csStr;
      csStr.Format(L"yjx:EXE:%llx,%llx,%llx,%llx,%llx,%llx dwSize=%llx .....OK\n", OutBuf, OutBuf, OutBuf, OutBuf, OutBuf, OutBuf, dwSize);
      OutputDebugStringW(csStr);
}


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





艾鱼 发表于 2021-11-4 10:18:20

:lol:lol:lol

杨枝乱露 发表于 昨天 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的攻击,他们在糖弹面前会打败仗。

达咩达咩 发表于 昨天 14:35

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