找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5169|回复: 5

谁有这样的代码?保护进程的

  [复制链接]

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-8-16 18:42:08 | 显示全部楼层 |阅读模式
就是一部分是VB的
一部分是驱动的
在VB里输入要保护进程的pid
通过调用驱动,也就是sys
就能保护这个进程
我想知道驱动的代码
谢谢大家
头像被屏蔽

27

主题

136

回帖

2

精华

铂金会员

积分
2257
发表于 2010-8-16 21:43:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-8-16 22:28:35 | 显示全部楼层
  1. #include "ntddk.h"


  2. ULONG pid;

  3. #define IOCTL_TEST2 CTL_CODE(\
  4. FILE_DEVICE_UNKNOWN, \
  5. 0x801, \
  6. METHOD_BUFFERED, \
  7. FILE_ANY_ACCESS)

  8. #define IOCTL_TEST1 CTL_CODE(\
  9. FILE_DEVICE_UNKNOWN, \
  10. 0x800, \
  11. METHOD_BUFFERED, \
  12. FILE_ANY_ACCESS)

  13. VOID Unload(IN PDRIVER_OBJECT DriverObject)
  14. {

  15. }

  16. NTSTATUS MyDispatch(IN PDEVICE_OBJECT device,IN PIRP irp)
  17. {
  18. PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(irp);

  19. irp->IoStatus.Status = STATUS_SUCCESS;
  20. irp->IoStatus.Information = 0;

  21. if (stack->MajorFunction==IRP_MJ_CREATE)
  22. {
  23. KdPrint(("IRP_MJ_CREATE\n"));
  24. }
  25. if (stack->MajorFunction==IRP_MJ_CLOSE)
  26. {
  27. KdPrint(("IRP_MJ_CLOSE\n"));
  28. }

  29. IoCompleteRequest( irp, IO_NO_INCREMENT );

  30. return STATUS_SUCCESS;
  31. }
  32. NTSTATUS CreateDevice (
  33. IN PDRIVER_OBJECT DriverObject)
  34. {
  35. NTSTATUS status;
  36. PDEVICE_OBJECT pDevObj;

  37. UNICODE_STRING devName;
  38. UNICODE_STRING symLinkName;

  39. RtlInitUnicodeString(&devName,L"\\Device\\ok100fen");
  40. RtlInitUnicodeString(&symLinkName,L"\\??\\ok100fen");

  41. status = IoCreateDevice( DriverObject,
  42. 0,
  43. &devName,
  44. FILE_DEVICE_UNKNOWN,
  45. 0, TRUE,
  46. &pDevObj );
  47. if (!NT_SUCCESS(status))
  48. {
  49. return status;
  50. }
  51. pDevObj->Flags |= DO_BUFFERED_IO;

  52. status = IoCreateSymbolicLink( &symLinkName,&devName );
  53. if (!NT_SUCCESS(status))
  54. {
  55. IoDeleteDevice( pDevObj );
  56. return status;
  57. }
  58. return STATUS_SUCCESS;
  59. }

  60. NTSTATUS MyIOCTL(IN PDEVICE_OBJECT pDevObj,
  61. IN PIRP pIrp)
  62. {
  63. NTSTATUS status = STATUS_SUCCESS;
  64. UCHAR* OutputBuffer=NULL;
  65. ULONG info = 0;

  66. PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
  67. ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
  68. ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
  69. ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
  70. pid=*(PULONG)pIrp->AssociatedIrp.SystemBuffer;
  71. switch (code)
  72. { // process request
  73. case IOCTL_TEST2:
  74. {
  75. KdPrint(("IOCTL_TEST1\n"));
  76. OutputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
  77. memset(OutputBuffer,0x8,cbout);
  78. info = cbout;
  79. break;
  80. }


  81. case IOCTL_TEST1:
  82. {
  83. DbgPrint(("IOCTL_TEST1\n"));
  84. DbgPrint("输入缓冲数据内容:%u 输入缓冲数据长度:%u",pid,cbin);
  85. break;
  86. }
  87. default:
  88. status = STATUS_INVALID_VARIANT;
  89. }

  90. pIrp->IoStatus.Status = status;
  91. pIrp->IoStatus.Information = info; // bytes xfered
  92. IoCompleteRequest( pIrp, IO_NO_INCREMENT );

  93. return status;
  94. }




  95. #pragma pack(1)
  96. typedef struct ServiceDescriptorEntry {
  97. unsigned int *ServiceTableBase;
  98. unsigned int *ServiceCounterTableBase; //Used only in checked build
  99. unsigned int NumberOfServices;
  100. unsigned char *ParamTableBase;
  101. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
  102. #pragma pack()


  103. __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
  104. #define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
  105. #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
  106. #define HOOK_SYSCALL(_Function, _Hook, _Orig ) _Orig = (PVOID) InterlockedExchange( (PLONG) &m_Mapped[SYSCALL_INDEX(_Function)], (LONG) _Hook)
  107. PMDL m_MDL;
  108. PVOID *m_Mapped;


  109. NTSYSAPI NTSTATUS NTAPI ZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
  110. NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);

  111. typedef NTSTATUS (*ZWOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
  112. typedef NTSTATUS (*ZWTERMINATEPROCESS)(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);

  113. NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
  114. NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);

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

  116. ZWOPENPROCESS OldZwOpenProcess = NULL;
  117. ZWTERMINATEPROCESS OldZwTerminateProcess = NULL;

  118. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
  119. {
  120. PVOID Oldfun = NULL;

  121. UNICODE_STRING symLinkName;
  122. RtlInitUnicodeString(&symLinkName,L"\\??\\ok100fen");
  123. IoDeleteSymbolicLink(&symLinkName);
  124. IoDeleteDevice(DriverObject->DeviceObject);
  125. KdPrint(("Device Delete Success\n"));

  126. HOOK_SYSCALL(ZwOpenProcess,OldZwOpenProcess,Oldfun);
  127. HOOK_SYSCALL(ZwTerminateProcess,OldZwTerminateProcess,Oldfun);

  128. if(m_MDL){
  129. MmUnmapLockedPages(m_Mapped,m_MDL);
  130. IoFreeMdl(m_MDL);
  131. }

  132. KdPrint(("驱动卸载完毕.\n"));
  133. }

  134. NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL)
  135. {
  136. if((long)ClientId->UniqueProcess == pid)
  137. {
  138. KdPrint(("保护进程,打开操作 PID:%ld\n",pid));
  139. return STATUS_ACCESS_DENIED;
  140. }
  141. return OldZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
  142. }

  143. NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
  144. {
  145. NTSTATUS nStatus = STATUS_SUCCESS;
  146. PEPROCESS EPROCESSPROTECT = NULL;
  147. PEPROCESS EPROCESSKILL = NULL;

  148. PsLookupProcessByProcessId((ULONG)pid,&EPROCESSPROTECT);


  149. if (ObReferenceObjectByHandle(ProcessHandle,GENERIC_READ,NULL,KernelMode,&EPROCESSKILL,0) == STATUS_SUCCESS)
  150. {
  151. if (EPROCESSPROTECT== EPROCESSKILL)
  152. {
  153. if (EPROCESSPROTECT != PsGetCurrentProcess())
  154. KdPrint(("[-]进程保护,外部程序试图关闭保护进程\n"));
  155. nStatus = STATUS_ACCESS_DENIED;
  156. }else{

  157. KdPrint(("[-]进程保护,程序自身退出请求!\n"));
  158. }

  159. }
  160. }

  161. if (nStatus != STATUS_SUCCESS)
  162. return nStatus;
  163. else
  164. return OldZwTerminateProcess(ProcessHandle,ExitStatus);
  165. }

  166. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
  167. {
  168. NTSTATUS ntStatus = STATUS_SUCCESS;
  169. PDEVICE_OBJECT deviceObject = NULL;

  170. DriverObject->DriverUnload = OnUnload;
  171. //DriverObject->DriverUnload = Unload;

  172. DriverObject->MajorFunction[IRP_MJ_CREATE] = MyDispatch;
  173. DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyDispatch;
  174. DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyIOCTL;

  175. CreateDevice(DriverObject);


  176. m_MDL = MmCreateMdl(NULL,KeServiceDescriptorTable.ServiceTableBase,KeServiceDescriptorTable.NumberOfServices*4);
  177. if(!m_MDL)
  178. {
  179. return STATUS_UNSUCCESSFUL;
  180. }


  181. MmBuildMdlForNonPagedPool(m_MDL);

  182. m_MDL->MdlFlags = m_MDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;


  183. m_Mapped = MmMapLockedPages(m_MDL, KernelMode);

  184. HOOK_SYSCALL(ZwOpenProcess,NewZwOpenProcess,OldZwOpenProcess);
  185. HOOK_SYSCALL(ZwTerminateProcess,NewZwTerminateProcess,OldZwTerminateProcess);

  186. return STATUS_SUCCESS;
  187. }
复制代码

评分

参与人数 1水晶币 +10 +20 收起 理由
马大哈 + 10 + 20

查看全部评分

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-8-16 22:45:37 | 显示全部楼层
VB的,不过有点问题
好像卸载驱动有点问题
需要重启,才能重新加载


Dim c_drv As New cls_Driver

Private Sub Command1_Click()
    Dim Canshu As Long
    Canshu = Val(Text1.Text)
   
    With c_drv

     .IoControl .CTL_CODE_GEN(&H800), VarPtr(Canshu), 4, 0, 0

    End With

End Sub

Private Sub Command2_Click()
Dim Canshu As Long
   
   
    With c_drv

     .IoControl .CTL_CODE_GEN(&H801), 0, 0, VarPtr(Canshu), 4

    End With
    Text2.Text = Canshu
End Sub

Private Sub Form_Load()
    With c_drv
        .szDrvFilePath = App.Path & "\ok100fen.sys"
        .szDrvLinkName = "ok100fen"
        .szDrvSvcName = "ok100fen"
        .szDrvDisplayName = "ok100fen"
        .InstDrv
        .StartDrv
        .OpenDrv
    End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
    With c_drv
        .StopDrv
        .DelDrv
    End With
End Sub

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-8-16 22:49:36 | 显示全部楼层
本帖最后由 ok100fen 于 2010-8-16 23:01 编辑

尽管代码东拼西凑
但是基本上明白了其中的代理
俺也很高兴~~

vb.rar

8.27 KB, 下载次数: 5960

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-8-17 09:11:09 | 显示全部楼层
呃.....拦截了ZwOpenProcess与ZwTerminateProcess呀.....

普通的结束法就确实无效了.

支持一下!
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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