3828|4

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

调用驱动内的函数? [复制链接]

  1. /*

  2.   jhxxs.C

  3.   Author:
  4.   Last Updated: 2006-03-23

  5.   This framework is generated by EasySYS 0.3.0
  6.   This template file is copying from QuickSYS 0.3.0 written by Chunhua Liu

  7. */

  8. #include "dbghelp.h"
  9. #include "jhxxs.h"
  10. #include

  11. #include
  12. #include
  13. #include
  14. //
  15. // A structure representing the instance information associated with
  16. // a particular device
  17. //

  18. typedef struct _DEVICE_EXTENSION
  19. {
  20.     ULONG  StateVariable;

  21. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;

  22. typedef struct _KAPC_STATE{
  23.         LIST_ENTRY        ApcListHead[2];
  24.         PEPROCESS        Process;
  25.         UCHAR                KernelApcInProgress;
  26.         UCHAR                KernelApcPending;
  27.         UCHAR                UserApcPending;
  28. }KAPC_STATE,*PKAPC_STATE;

  29. NTKERNELAPI void KeStackAttachProcess(IN PEPROCESS Process, OUT PKAPC_STATE ApcState);


  30. NTKERNELAPI void KeUnstackDetachProcess(IN PKAPC_STATE ApcState);


  31. NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId,OUT PEPROCESS * pEProcess);

  32. NTKERNELAPI NTSTATUS ObOpenObjectByPointer(
  33.     IN PVOID Object,                                            
  34.     IN ULONG HandleAttributes,                                 
  35.     IN PACCESS_STATE PassedAccessState OPTIONAL,               
  36.     IN ACCESS_MASK DesiredAccess OPTIONAL,                     
  37.     IN POBJECT_TYPE ObjectType OPTIONAL,                        
  38.     IN KPROCESSOR_MODE AccessMode,                              
  39.     OUT PHANDLE Handle                                          
  40.         );
  41. //
  42. // Device driver routine declarations.
  43. //

  44. NTSTATUS
  45. DriverEntry(
  46.         IN PDRIVER_OBJECT                DriverObject,
  47.         IN PUNICODE_STRING                RegistryPath
  48.         );

  49. NTSTATUS
  50. JhxxsDispatchCreate(
  51.         IN PDEVICE_OBJECT                DeviceObject,
  52.         IN PIRP                                        Irp
  53.         );

  54. NTSTATUS
  55. JhxxsDispatchClose(
  56.         IN PDEVICE_OBJECT                DeviceObject,
  57.         IN PIRP                                        Irp
  58.         );

  59. NTSTATUS
  60. JhxxsDispatchDeviceControl(
  61.         IN PDEVICE_OBJECT                DeviceObject,
  62.         IN PIRP                                        Irp
  63.         );

  64. VOID
  65. JhxxsUnload(
  66.         IN PDRIVER_OBJECT                DriverObject
  67.         );


  68. #ifdef ALLOC_PRAGMA
  69. #pragma alloc_text(INIT, DriverEntry)
  70. #pragma alloc_text(PAGE, JhxxsDispatchCreate)
  71. #pragma alloc_text(PAGE, JhxxsDispatchClose)
  72. #pragma alloc_text(PAGE, JhxxsDispatchDeviceControl)
  73. #pragma alloc_text(PAGE, JhxxsUnload)
  74. #endif // ALLOC_PRAGMA

  75. NTSTATUS
  76. MyWriteMemory(IN HANDLE hProcess,OUT PVOID BaseAddress,IN PVOID Pbuff,IN ULONG BufferSize)
  77. {
  78. PEPROCESS EProcess;
  79. KAPC_STATE ApcState;
  80. PVOID writebuffer=NULL;
  81. NTSTATUS status;

  82. status = ObReferenceObjectByHandle(
  83.                   hProcess,
  84.                   PROCESS_VM_WRITE|PROCESS_VM_READ,
  85.                   NULL,
  86.                   KernelMode,
  87.                   &EProcess,
  88.                   NULL
  89.                   );
  90.                   
  91. if(!NT_SUCCESS(status))
  92. {
  93. ObDereferenceObject(EProcess);
  94. return STATUS_UNSUCCESSFUL;
  95. }
  96. writebuffer = ExAllocatePoolWithTag (NonPagedPool, BufferSize, 'Sys');

  97. if(writebuffer==NULL)
  98. {
  99. ObDereferenceObject(EProcess);
  100. ExFreePool (writebuffer);
  101. return STATUS_UNSUCCESSFUL;
  102. }
  103. *(ULONG*)writebuffer=(ULONG)0x1;

  104. if (MmIsAddressValid(Pbuff))
  105. {
  106.    __try
  107.    {
  108.    ProbeForRead ((CONST PVOID)Pbuff, BufferSize, sizeof(CHAR));
  109.    RtlCopyMemory (writebuffer, Pbuff, BufferSize);
  110.    }
  111.    __except(EXCEPTION_EXECUTE_HANDLER)
  112.    {
  113.    status = STATUS_UNSUCCESSFUL;
  114.    }
  115. }
  116. else
  117. {
  118.    status = STATUS_UNSUCCESSFUL;
  119. }

  120. if (NT_SUCCESS(status))
  121. {
  122.   KeStackAttachProcess (EProcess, &ApcState);
  123.   if (MmIsAddressValid(BaseAddress))
  124.   {
  125.    __try
  126.    {
  127.    ProbeForWrite ((CONST PVOID)BaseAddress, BufferSize, sizeof(CHAR));
  128.    RtlCopyMemory (BaseAddress,writebuffer, BufferSize);
  129.    }
  130.    __except(EXCEPTION_EXECUTE_HANDLER)
  131.    {
  132.    status = STATUS_UNSUCCESSFUL;
  133.    }
  134.   }
  135.   else
  136.   {
  137.    status = STATUS_UNSUCCESSFUL;
  138.   }
  139.   KeUnstackDetachProcess (&ApcState);
  140. }

  141. ObDereferenceObject(EProcess);
  142. ExFreePool (writebuffer);
  143. return status;
  144. }


  145. NTSTATUS
  146. MyReadMemory(IN HANDLE hProcess,IN PVOID BaseAddress,OUT PVOID Pbuff,IN ULONG BufferSize)
  147. {
  148. PEPROCESS EProcess;
  149. KAPC_STATE ApcState;
  150. PVOID readbuffer=NULL;
  151. NTSTATUS status;


  152. status = ObReferenceObjectByHandle(
  153.                   hProcess,
  154.                   PROCESS_VM_WRITE|PROCESS_VM_READ,
  155.                   NULL,
  156.                   KernelMode,
  157.                   &EProcess,
  158.                   NULL
  159.                   );


  160. if(!NT_SUCCESS(status))
  161. {
  162. ObDereferenceObject(EProcess);
  163. return STATUS_UNSUCCESSFUL;
  164. }

  165. readbuffer = ExAllocatePoolWithTag (NonPagedPool, BufferSize, 'Sys');

  166. if(readbuffer==NULL)
  167. {
  168. ObDereferenceObject(EProcess);
  169. ExFreePool (readbuffer);
  170. return STATUS_UNSUCCESSFUL;
  171. }
  172. *(ULONG*)readbuffer=(ULONG)0x1;


  173. KeStackAttachProcess (EProcess, &ApcState);
  174. if (MmIsAddressValid(BaseAddress))
  175. {
  176.    __try
  177.    {
  178.    ProbeForRead ((CONST PVOID)BaseAddress, BufferSize, sizeof(CHAR));
  179.    RtlCopyMemory (readbuffer, BaseAddress, BufferSize);
  180.    }
  181.    __except(EXCEPTION_EXECUTE_HANDLER)
  182.    {
  183.    status = STATUS_UNSUCCESSFUL;
  184.    }
  185. }
  186. else
  187. {
  188.   status = STATUS_UNSUCCESSFUL;
  189. }
  190. KeUnstackDetachProcess (&ApcState);


  191.    if(NT_SUCCESS(status))
  192.    {
  193.         if (MmIsAddressValid(Pbuff))
  194.         {
  195.          __try
  196.          {
  197.          ProbeForWrite(Pbuff, BufferSize, sizeof(CHAR));
  198.          RtlCopyMemory (Pbuff, readbuffer, BufferSize);
  199.          }
  200.          __except(EXCEPTION_EXECUTE_HANDLER)
  201.          {
  202.          status = STATUS_UNSUCCESSFUL;
  203.          }
  204.         }
  205.         else
  206.         {
  207.         status = STATUS_UNSUCCESSFUL;
  208.         }
  209.    }



  210. ObDereferenceObject(EProcess);
  211. ExFreePool (readbuffer);
  212. return status;
  213. }



  214. NTSTATUS MyOpenProcess(ULONG PID, PHANDLE pHandle)
  215. {
  216.   NTSTATUS  status;
  217.   PEPROCESS  EProcess = NULL;
  218.   HANDLE    handle = NULL;
  219.   UNICODE_STRING y;
  220.   PULONG    PsProcessType;

  221.   status = PsLookupProcessByProcessId(PID, &EProcess);
  222.   if (NT_SUCCESS(status))
  223.   {
  224.     handle = 0;
  225.     RtlInitUnicodeString(&y, L"PsProcessType");
  226.     PsProcessType = MmGetSystemRoutineAddress(&y);
  227.     if (PsProcessType)
  228.     {
  229.       status = ObOpenObjectByPointer(EProcess, 0, 0, PROCESS_ALL_ACCESS, (PVOID)*PsProcessType, UserMode, &handle);
  230.       if (NT_SUCCESS(status))
  231.       {
  232.                 *pHandle = handle;
  233.       }
  234.     }
  235.     ObfDereferenceObject(EProcess);
  236.   }
  237.   return status;
  238. }
  239. //帖子超长了,请续看1楼
复制代码

最新回复

我把这个驱动的源文件使用[VS2008+DDK2600]编译了一下,编译出的驱动文件在虚拟机里[WinXP SP2]加载,虚拟机蓝屏了... 源文件下载:[/url] 只有源文件和编译过的sys文件,绝对无毒!可以放心下载=.= 然后去找了几篇文章,想自己调试调试看是哪里出了问题,参考文章:[url=http://hi.baidu.com/1ian9yu/blog/item/96e29bb357acbfa2d8335a25.html] 结果搞成这样: 驱动source文件里这么写的TARGETNAME=jhxxs,所以试着用"bu jhxxs!driverentry"下断点,也不知道下对没。。。(DeviceIoControl调用驱动内函数的时候"驱动程序创建的设备"可能也是"jhxxs"?现在还没机会测试...) 加载jhxxs.sys这个驱动以后,虚拟机就死了,WinDbg最后的输出如下[看样子似乎是没断下...]: SXS: BasepCreateActCtx() NtOpenFile(\??\C:\??\C:\WINDOWS\system32\winlogon.exe) failed *** ERROR: Module load completed but symbols could not be loaded for jhxxs.sys Breakpoint 0's offset expression evaluation failed. Check for invalid symbols or bad syntax. WaitForEvent失败 nt!DebugService2+0x11: 8052e681 5d              pop     ebp  详情 回复 发表于 2009-4-9 12:29
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. NTSTATUS
  2. DriverEntry(
  3.         IN PDRIVER_OBJECT                DriverObject,
  4.         IN PUNICODE_STRING                RegistryPath
  5.         )
  6. {
  7.         NTSTATUS                        status = STATUS_SUCCESS;   
  8.     UNICODE_STRING                ntDeviceName;
  9.         UNICODE_STRING                dosDeviceName;
  10.     PDEVICE_EXTENSION        deviceExtension;
  11.         PDEVICE_OBJECT                deviceObject = NULL;
  12.         BOOLEAN                                fSymbolicLink = FALSE;

  13.         KdBreakPoint();
  14.         RtlInitUnicodeString(&ntDeviceName, JHXXS_DEVICE_NAME_W);
  15.     status = IoCreateDevice(
  16.                 DriverObject,
  17.                 sizeof(DEVICE_EXTENSION),
  18.                 &ntDeviceName,
  19.                 FILE_DEVICE_JHXXS,
  20.                 0,
  21.                 TRUE,
  22.                 &deviceObject
  23.                 );

  24.     if (!NT_SUCCESS(status))
  25.         {
  26.                 goto __failed;
  27.         }

  28.         deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
  29.         RtlInitUnicodeString(&dosDeviceName, JHXXS_DOS_DEVICE_NAME_W);
  30.         status = IoCreateSymbolicLink(&dosDeviceName, &ntDeviceName);
  31.     if (!NT_SUCCESS(status))
  32.         {
  33.                 goto __failed;
  34.     }

  35.         fSymbolicLink = TRUE;

  36.     DriverObject->MajorFunction[IRP_MJ_CREATE]         = JhxxsDispatchCreate;
  37.     DriverObject->MajorFunction[IRP_MJ_CLOSE]          = JhxxsDispatchClose;
  38.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = JhxxsDispatchDeviceControl;
  39.     DriverObject->DriverUnload                         = JhxxsUnload;

  40.     if (NT_SUCCESS(status))
  41.             return status;

  42. __failed:
  43.         if (fSymbolicLink)
  44.                 IoDeleteSymbolicLink(&dosDeviceName);
  45.         if (deviceObject)
  46.                 IoDeleteDevice(deviceObject);
  47.         return status;
  48. }

  49. NTSTATUS
  50. JhxxsDispatchCreate(
  51.         IN PDEVICE_OBJECT                DeviceObject,
  52.         IN PIRP                                        Irp
  53.         )
  54. {
  55.         NTSTATUS status = STATUS_SUCCESS;

  56.         Irp->IoStatus.Information = 0;
  57.     Irp->IoStatus.Status = status;
  58.     IoCompleteRequest(Irp, IO_NO_INCREMENT);

  59.     return status;
  60. }

  61. NTSTATUS
  62. JhxxsDispatchClose(
  63.         IN PDEVICE_OBJECT                DeviceObject,
  64.         IN PIRP                                        Irp
  65.         )
  66. {
  67.         NTSTATUS status = STATUS_SUCCESS;
  68.     Irp->IoStatus.Information = 0;
  69.         Irp->IoStatus.Status = status;
  70.     IoCompleteRequest(Irp, IO_NO_INCREMENT);

  71.     return status;
  72. }

  73. NTSTATUS
  74. JhxxsDispatchDeviceControl(
  75.         IN PDEVICE_OBJECT                DeviceObject,
  76.         IN PIRP                                        Irp
  77.         )
  78. {
  79.         NTSTATUS                        status = STATUS_SUCCESS;
  80.     PIO_STACK_LOCATION        irpStack;
  81.     PDEVICE_EXTENSION        deviceExtension;
  82.         PVOID                                ioBuf;
  83.     ULONG                                inBufLength, outBufLength;
  84.         ULONG                                ioControlCode;

  85.         UCHAR               *buff =0;
  86.         ULONG               OutByteCount =0;

  87.         HANDLE              Writehandel;
  88.         PVOID               WriteDstAddr;
  89.         PVOID               WriteSrcAddr;
  90.         ULONG               WriteSize;
  91.         NTSTATUS            WriteReturn;

  92.         HANDLE              Readhandel;
  93.         PVOID               ReadBaseAddr;
  94.         PVOID               ReadBuffer;
  95.         ULONG               ReadSize;
  96.         NTSTATUS            ReadReturn;

  97.         ULONG               OpenPid;
  98.         PHANDLE             PProcessHandle;
  99.         NTSTATUS            OpenReturn;

  100.     irpStack = IoGetCurrentIrpStackLocation(Irp);
  101.     deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
  102.         Irp->IoStatus.Information = 0;
  103.         ioBuf = Irp->AssociatedIrp.SystemBuffer;
  104.         inBufLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
  105.     outBufLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
  106.     ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

  107.     switch (ioControlCode)
  108.         {
  109.         case  0X0022E004:
  110.                 {
  111.                  buff=(UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
  112.                  memmove(&Writehandel,&buff[0],4);
  113.                  memmove(&WriteDstAddr,&buff[4],4);
  114.                  memmove(&WriteSrcAddr,&buff[8],4);
  115.                  memmove(&WriteSize,&buff[12],4);

  116.                  WriteReturn=MyWriteMemory(Writehandel,WriteDstAddr,WriteSrcAddr,WriteSize);
  117.                  memmove(Irp->AssociatedIrp.SystemBuffer,&WriteReturn,4);
  118.                  OutByteCount=4;
  119.                  break;
  120.                 }

  121.         case  0X0022E008:
  122.                 {
  123.                  buff=(UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
  124.                  memmove(&Readhandel,&buff[0],4);
  125.                  memmove(&ReadBaseAddr,&buff[4],4);
  126.                  memmove(&ReadBuffer,&buff[8],4);
  127.                  memmove(&ReadSize,&buff[12],4);

  128.                  ReadReturn=MyReadMemory(Readhandel,ReadBaseAddr,ReadBuffer,ReadSize);
  129.                  memmove(&buff[0],&ReadReturn,4);
  130.                  OutByteCount=4;
  131.                  break;
  132.                 }

  133.         case  0X0022E000:
  134.                 {
  135.                  OpenReturn = MyOpenProcess(*(PULONG)ioBuf,ioBuf);
  136.                  buff=(UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
  137.                  memmove(&buff[4],&OpenReturn,4);
  138.                  OutByteCount=8;
  139.                  break;
  140.                 }
  141.                
  142.         case IOCTL_JHXXS_HELLO:
  143.                 {
  144.             break;
  145.                 }

  146.     default:
  147.         status = STATUS_INVALID_PARAMETER;
  148.                 break;
  149.         }
  150.         Irp->IoStatus.Status = status;
  151.         Irp->IoStatus.Information = OutByteCount;
  152.         IoCompleteRequest(Irp, IO_NO_INCREMENT);
  153.     return status;
  154. }

  155. VOID
  156. JhxxsUnload(
  157.         IN PDRIVER_OBJECT                DriverObject
  158.         )
  159. {
  160.     UNICODE_STRING dosDeviceName;
  161.         RtlInitUnicodeString(&dosDeviceName, JHXXS_DOS_DEVICE_NAME_W);
  162.     IoDeleteSymbolicLink(&dosDeviceName);
  163.         IoDeleteDevice(DriverObject->DeviceObject);
  164. }
复制代码


以上代码应该是重写了自己的ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory,这个在自己的程序里该如何调用呢?并希望高人能简单的对上面的代码进行下注释,谢谢!

-------------------------------------------------------------------------------------
看的另外一个HOOK ZwTerminateProcess代码里,有如下部分,但在试验的时候出现了问题,还望高人能一并解答
附上原文地址http://bbs.pediy.com/showthread.php?t=78218
  1. NTSTATUS NewZwTerminateProcess(
  2.                 IN HANDLE ProcessHandle OPTIONAL,
  3.                 IN NTSTATUS ExitStatus
  4.                 )
  5. {
  6.         //return STATUS_SUCCESS;         //原文是这句,但是在用"任务管理器"结束"纪事本"进程时,会没有任何反映,并cpu占用100%
  7.         return STATUS_UNSUCCESSFUL;      //后来改成了这个,用"任务管理器"结束进程时,会提示"无法完成操作 连接到系统上的设备没有发挥作用",HOOK的目的达到了。但是纪事本使用"文件->退出"这样的方法结束程序,cpu还是会变成100%
  8. }
复制代码
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
貌似有点儿长,顶一下先!
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(中级)

4
 
如果是驱动程序,调用MyReadMemory、MyWriteMemory、MyOpenProcess函数;
如果是应用程序,先打开驱动程序创建的设备(上面没有贴出名称),然后用DeviceIoControl,控制码就是上面的三个case,最后再CloseHandle。

代码太长,没时间帮你加注释,这段代码没什么难度,自己慢慢看吧。

如果驱动程序没有做正常的处理,不能随便返回成功,这样会影响程序的后续操作。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
我把这个驱动的源文件使用[VS2008+DDK2600]编译了一下,编译出的驱动文件在虚拟机里[WinXP SP2]加载,虚拟机蓝屏了...
源文件下载:[/url]
只有源文件和编译过的sys文件,绝对无毒!可以放心下载=.=


然后去找了几篇文章,想自己调试调试看是哪里出了问题,参考文章:[url=http://hi.baidu.com/1ian9yu/blog/item/96e29bb357acbfa2d8335a25.html]

结果搞成这样:

驱动source文件里这么写的TARGETNAME=jhxxs,所以试着用"bu jhxxs!driverentry"下断点,也不知道下对没。。。(DeviceIoControl调用驱动内函数的时候"驱动程序创建的设备"可能也是"jhxxs"?现在还没机会测试...)
加载jhxxs.sys这个驱动以后,虚拟机就死了,WinDbg最后的输出如下[看样子似乎是没断下...]:
SXS: BasepCreateActCtx() NtOpenFile(\??\C:\??\C:\WINDOWS\system32\winlogon.exe) failed
*** ERROR: Module load completed but symbols could not be loaded for jhxxs.sys
Breakpoint 0's offset expression evaluation failed.
Check for invalid symbols or bad syntax.
WaitForEvent失败
nt!DebugService2+0x11:
8052e681 5d              pop     ebp
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表