找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 10750|回复: 12

[开源]驱动里挂起进程

 火.. [复制链接]

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-5-29 02:12:17 | 显示全部楼层 |阅读模式
既然有人问到,就把代码发出来吧,反正留着没用。。。
寻找PsSuspendProcess,然后调用这个函数就可以了。
主要代码:

  1. typedef NTSTATUS (*PSSUSPENDPROCESS)(PEPROCESS Process);
  2. PSSUSPENDPROCESS MySuspendProcess;
  3. ULONG AddressOfPsSuspendProcess=0;
  4. VOID GetPsSuspendProcess()
  5. {
  6. UCHAR *cPtr, *pOpcode;
  7. ULONG Length, CallCount=0;
  8. ULONG AddressOfNtSuspendProcess=0;
  9. AddressOfNtSuspendProcess=GetSSDTRealAddr(GetSysCallIndex("NtSuspendProcess"));
  10. if (AddressOfNtSuspendProcess==0) return;
  11. for (cPtr = (PUCHAR)AddressOfNtSuspendProcess; cPtr < (PUCHAR)AddressOfNtSuspendProcess + PAGE_SIZE; cPtr += Length)
  12. {
  13.   Length = SizeOfCode(cPtr, &pOpcode);
  14.   if (!Length) return;
  15.   if (*pOpcode == 0xE8)
  16.   {
  17.    CallCount=CallCount+1;
  18.    if (CallCount==2)
  19.    {
  20.     AddressOfPsSuspendProcess=(*(PULONG)(pOpcode+1)+(ULONG)cPtr + 5);
  21.     return;
  22.    }
  23.   }
  24. }
  25. }

  26. VOID SuspendProcess(PEPROCESS Process)
  27. {
  28. if (AddressOfPsSuspendProcess==0) GetPsSuspendProcess();
  29. if (AddressOfPsSuspendProcess!=0)
  30. {
  31.   MySuspendProcess=(PSSUSPENDPROCESS)AddressOfPsSuspendProcess;
  32.   MySuspendProcess(Process);
  33. }
  34. }
复制代码


顺便把ssdt.h也发出来吧(这个不是我写的)。。。

  1. #include <NTDDK.H>

  2. typedef struct _System_Service_Table{
  3. PVOID  ServiceTableBase;
  4. PVOID  ServiceCounterTableBase;
  5. ULONG  NumberOfServices;
  6. PVOID  ParamTableBase;
  7. } SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;

  8. typedef struct _SERVICE_DESCRIPTOR_TABLE{
  9. SYSTEM_SERVICE_TABLE ntoskrnl;  // ntoskrnl.exe (native api)
  10. SYSTEM_SERVICE_TABLE win32k;    // win32k.sys   (gdi/user)
  11. SYSTEM_SERVICE_TABLE Table3;    // not used
  12. SYSTEM_SERVICE_TABLE Table4;    // not used
  13. }SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;

  14. extern  PSYSTEM_SERVICE_TABLE KeServiceDescriptorTable;

  15. //------------------------------------函数------------------------------------------
  16. typedef enum _SYSTEM_INFORMATION_CLASS     //    Q S
  17. {
  18. SystemBasicInformation,                // 00 Y N
  19. SystemProcessorInformation,            // 01 Y N
  20. SystemPerformanceInformation,          // 02 Y N
  21. SystemTimeOfDayInformation,            // 03 Y N
  22. SystemNotImplemented1,                 // 04 Y N
  23. SystemProcessesAndThreadsInformation,  // 05 Y N
  24. SystemCallCounts,                      // 06 Y N
  25. SystemConfigurationInformation,        // 07 Y N
  26. SystemProcessorTimes,                  // 08 Y N
  27. SystemGlobalFlag,                      // 09 Y Y
  28. SystemNotImplemented2,                 // 10 Y N
  29. SystemModuleInformation,               // 11 Y N
  30. SystemLockInformation,                 // 12 Y N
  31. SystemNotImplemented3,                 // 13 Y N
  32. SystemNotImplemented4,                 // 14 Y N
  33. SystemNotImplemented5,                 // 15 Y N
  34. SystemHandleInformation,               // 16 Y N
  35. SystemObjectInformation,               // 17 Y N
  36. SystemPagefileInformation,             // 18 Y N
  37. SystemInstructionEmulationCounts,      // 19 Y N
  38. SystemInvalidInfoClass1,               // 20
  39. SystemCacheInformation,                // 21 Y Y
  40. SystemPoolTagInformation,              // 22 Y N
  41. SystemProcessorStatistics,             // 23 Y N
  42. SystemDpcInformation,                  // 24 Y Y
  43. SystemNotImplemented6,                 // 25 Y N
  44. SystemLoadImage,                       // 26 N Y
  45. SystemUnloadImage,                     // 27 N Y
  46. SystemTimeAdjustment,                  // 28 Y Y
  47. SystemNotImplemented7,                 // 29 Y N
  48. SystemNotImplemented8,                 // 30 Y N
  49. SystemNotImplemented9,                 // 31 Y N
  50. SystemCrashDumpInformation,            // 32 Y N
  51. SystemExceptionInformation,            // 33 Y N
  52. SystemCrashDumpStateInformation,       // 34 Y Y/N
  53. SystemKernelDebuggerInformation,       // 35 Y N
  54. SystemContextSwitchInformation,        // 36 Y N
  55. SystemRegistryQuotaInformation,        // 37 Y Y
  56. SystemLoadAndCallImage,                // 38 N Y
  57. SystemPrioritySeparation,              // 39 N Y
  58. SystemNotImplemented10,                // 40 Y N
  59. SystemNotImplemented11,                // 41 Y N
  60. SystemInvalidInfoClass2,               // 42
  61. SystemInvalidInfoClass3,               // 43
  62. SystemTimeZoneInformation,             // 44 Y N
  63. SystemLookasideInformation,            // 45 Y N
  64. SystemSetTimeSlipEvent,                // 46 N Y
  65. SystemCreateSession,                   // 47 N Y
  66. SystemDeleteSession,                   // 48 N Y
  67. SystemInvalidInfoClass4,               // 49
  68. SystemRangeStartInformation,           // 50 Y N
  69. SystemVerifierInformation,             // 51 Y Y
  70. SystemAddVerifier,                     // 52 N Y
  71. SystemSessionProcessesInformation      // 53 Y N
  72. } SYSTEM_INFORMATION_CLASS;
  73. typedef struct _SYSTEM_MODULE_INFORMATION {
  74. ULONG Reserved[2];
  75. PVOID Base; //The base address of the module.
  76. ULONG Size; //The size of the module.
  77. ULONG Flags;
  78. USHORT Index;
  79. USHORT Unknown;
  80. USHORT LoadCount;
  81. USHORT ModuleNameOffset;
  82. CHAR ImageName[256];//The filepath of the module.
  83. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
  84. NTSTATUS ZwQuerySystemInformation(
  85.   IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  86.   IN OUT PVOID SystemInformation,
  87.   IN ULONG SystemInformationLength,
  88.   OUT PULONG ReturnLength OPTIONAL );
  89. typedef struct _MODULE_LIST {
  90. ULONG    NumberOfModules;
  91. SYSTEM_MODULE_INFORMATION  SysModuleInfo[];
  92. } MODULE_LIST, *PMODULE_LIST;
  93. typedef struct _SECTION_IMAGE_INFORMATION {
  94. PVOID EntryPoint;
  95. ULONG StackZeroBits;
  96. ULONG StackReserved;
  97. ULONG StackCommit;
  98. ULONG ImageSubsystem;
  99. WORD  SubsystemVersionLow;
  100. WORD  SubsystemVersionHigh;
  101. ULONG Unknown1;
  102. ULONG ImageCharacteristics;
  103. ULONG ImageMachineType;
  104. ULONG Unknown2[3];
  105. } SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;
  106. /*NTSTATUS ZwCreateSection(
  107.    OUT PHANDLE SectionHandle,
  108.    IN  ACCESS_MASK DesiredAccess,
  109.    IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  110.    IN  PLARGE_INTEGER MaximumSize OPTIONAL,
  111.    IN  ULONG SectionPageProtection,
  112.    IN  ULONG AllocationAttributes,
  113.    IN  HANDLE FileHandle OPTIONAL);*/

  114. ULONG GetKernelBaseAddress(OUT PCHAR lpszModule)
  115. {
  116. NTSTATUS ntStatus;
  117. ULONG NeededSize, KernelAddr=0;
  118. PMODULE_LIST pModuleList;
  119. ZwQuerySystemInformation( SystemModuleInformation, &NeededSize, 0, &NeededSize);
  120. pModuleList = ExAllocatePool( NonPagedPool, NeededSize );
  121. ntStatus = ZwQuerySystemInformation( SystemModuleInformation, pModuleList, NeededSize, NULL );
  122. if ( NT_SUCCESS(ntStatus) )
  123. {
  124.   KernelAddr = (ULONG)pModuleList->SysModuleInfo[0].Base;
  125.   if (lpszModule)
  126.   {
  127.    strcpy( lpszModule, "\\SystemRoot\\System32\" );
  128.    strcat( lpszModule, pModuleList->SysModuleInfo[0].ModuleNameOffset+ pModuleList->SysModuleInfo[0].ImageName );
  129.   }
  130. }
  131. ExFreePool(pModuleList);
  132. return KernelAddr;
  133. }
  134. //用内存文件头 速度快点.
  135. ULONG RVAToRaw(IN  ULONG lpBase, IN  ULONG VirtualAddress )
  136. {
  137. IMAGE_DOS_HEADER     *pDosHeader;
  138. IMAGE_NT_HEADERS     *pNtHeader;
  139. IMAGE_SECTION_HEADER *pSectionHeader;
  140. ULONG  NumOfSections, i;
  141. pDosHeader = (IMAGE_DOS_HEADER*)lpBase;
  142. if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
  143.   return 0;
  144. pNtHeader =(IMAGE_NT_HEADERS*)( (unsigned char*)lpBase + pDosHeader->e_lfanew );
  145. NumOfSections = pNtHeader->FileHeader.NumberOfSections;

  146. pSectionHeader = (IMAGE_SECTION_HEADER*)((ULONG)pNtHeader + sizeof(ULONG) + sizeof(IMAGE_FILE_HEADER)
  147.   + pNtHeader->FileHeader.SizeOfOptionalHeader);
  148. VirtualAddress -= (ULONG)lpBase;
  149. for ( i=0; i<NumOfSections; i++ )
  150. {
  151.   pSectionHeader = (IMAGE_SECTION_HEADER*)( (ULONG)pSectionHeader + sizeof(IMAGE_SECTION_HEADER) * i );
  152.   if( VirtualAddress > pSectionHeader->VirtualAddress &&
  153.    VirtualAddress < pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData )
  154.   {
  155.    ULONG Offset = VirtualAddress - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;
  156.    return Offset;
  157.   }
  158. }
  159. return 0;
  160. }
  161. ULONG GetSSDTRealAddr(IN ULONG Index)
  162. {
  163. NTSTATUS ntStatus;
  164. ULONG KernelVirtualBase, KernelImageBase,RealServiceAddress=0;
  165. ULONG NumberOfServices, KiServiceTable, uSSDTRaw,KernelServiceTable;
  166. char szKernelPath[256];
  167. ANSI_STRING asFileName;
  168. UNICODE_STRING usFileName;
  169. OBJECT_ATTRIBUTES ObjAttr;
  170. IO_STATUS_BLOCK ioStatus;
  171. FILE_POSITION_INFORMATION FilePos;
  172. HANDLE hFile;
  173. KernelVirtualBase = GetKernelBaseAddress( szKernelPath );
  174. KernelImageBase  = ((IMAGE_NT_HEADERS*)(KernelVirtualBase + ((IMAGE_DOS_HEADER*)KernelVirtualBase)->e_lfanew))->OptionalHeader.ImageBase;
  175. NumberOfServices = KeServiceDescriptorTable->NumberOfServices;
  176. KiServiceTable  = (ULONG)KeServiceDescriptorTable->ServiceTableBase;
  177. if (Index>=NumberOfServices) return FALSE;
  178. uSSDTRaw = RVAToRaw( KernelVirtualBase, KiServiceTable+Index*4);//文件偏移
  179. if (uSSDTRaw)
  180. {
  181.   RtlInitAnsiString( &asFileName, szKernelPath );
  182.   ntStatus = RtlAnsiStringToUnicodeString( &usFileName, &asFileName, TRUE );
  183.   if( NT_SUCCESS(ntStatus) )
  184.   {
  185.    InitializeObjectAttributes(&ObjAttr,&usFileName,OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,NULL,NULL);
  186.    ntStatus = ZwOpenFile(&hFile,FILE_READ_DATA,&ObjAttr,&ioStatus,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,FILE_SYNCHRONOUS_IO_NONALERT );
  187.    if ( NT_SUCCESS(ntStatus) && hFile )
  188.    {
  189.     FilePos.CurrentByteOffset.LowPart = uSSDTRaw;
  190.     FilePos.CurrentByteOffset.HighPart = 0;
  191.     ntStatus = ZwSetInformationFile( hFile,&ioStatus,&FilePos,sizeof(FILE_POSITION_INFORMATION),FilePositionInformation );
  192.     if( NT_SUCCESS(ntStatus) )
  193.     {
  194.      ntStatus = ZwReadFile(hFile,NULL,NULL,NULL,&ioStatus,&KernelServiceTable,sizeof(ULONG),NULL,NULL );
  195.      if( NT_SUCCESS(ntStatus) )
  196.      {
  197.       RealServiceAddress=KernelServiceTable - KernelImageBase + KernelVirtualBase;   
  198.      }
  199.     }
  200.     ZwClose(hFile);
  201.    }
  202.   }
  203. }
  204. RtlFreeUnicodeString( &usFileName );
  205. return RealServiceAddress;
  206. }

  207. ULONG GetExportFuncAddr(IN PCHAR lpFunctionName, IN PUNICODE_STRING pDllName)
  208. {
  209. HANDLE hThread, hSection, hFile, hMod;
  210. SECTION_IMAGE_INFORMATION sii;
  211. PIMAGE_DOS_HEADER       pDosHeader;
  212. PIMAGE_OPTIONAL_HEADER  pOptHeader;
  213. PIMAGE_EXPORT_DIRECTORY pExportTable;
  214. PULONG arrayOfFuncAddr,arrayOfFuncNames;
  215. PSHORT  arrayOfFuncOrdinals;
  216. ULONG  funcOrdinal,Base, i, FuncAddr;
  217. PCHAR  FuncName;
  218. STRING ntFuncName, ntFuncNameSearch;
  219. PVOID  BaseAddress = NULL;
  220. SIZE_T size = 0;
  221. OBJECT_ATTRIBUTES ObjAttr;
  222. IO_STATUS_BLOCK IoStatusBlock;
  223. InitializeObjectAttributes(&ObjAttr,pDllName,OBJ_CASE_INSENSITIVE,NULL, NULL);
  224. ZwOpenFile(&hFile,FILE_EXECUTE | SYNCHRONIZE,&ObjAttr,&IoStatusBlock,FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT);
  225. ObjAttr.ObjectName = 0;
  226. ZwCreateSection(&hSection,SECTION_ALL_ACCESS,&ObjAttr,0,PAGE_EXECUTE,0x1000000,hFile);
  227. ZwMapViewOfSection(hSection,NtCurrentProcess(),&BaseAddress,0,1000, 0,&size,(SECTION_INHERIT)1,MEM_TOP_DOWN, PAGE_READWRITE);
  228. ZwClose(hFile);
  229. hMod = BaseAddress;
  230. pDosHeader = (PIMAGE_DOS_HEADER)hMod;
  231. pOptHeader = (PIMAGE_OPTIONAL_HEADER)((PBYTE)hMod + pDosHeader->e_lfanew + 24 );
  232. pExportTable =(PIMAGE_EXPORT_DIRECTORY)((PBYTE)hMod  + pOptHeader->DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress);
  233. arrayOfFuncAddr     = (PULONG)( (PBYTE)hMod + pExportTable->AddressOfFunctions);
  234. arrayOfFuncNames    = (PULONG)( (PBYTE)hMod + pExportTable->AddressOfNames);
  235. arrayOfFuncOrdinals = (PSHORT)( (PBYTE)hMod + pExportTable->AddressOfNameOrdinals);
  236. Base = pExportTable->Base;
  237. RtlInitString(&ntFuncNameSearch, lpFunctionName);
  238. for( i=0; i<pExportTable->NumberOfFunctions; i++ )
  239. {
  240.   FuncName = (PCHAR)( (PBYTE)hMod + arrayOfFuncNames[i]);
  241.   RtlInitString( &ntFuncName, FuncName );
  242.   funcOrdinal = arrayOfFuncOrdinals[i] + Base - 1;
  243.   FuncAddr = (ULONG)( (PBYTE)hMod + arrayOfFuncAddr[funcOrdinal]);
  244.   if (RtlCompareString(&ntFuncName, &ntFuncNameSearch, TRUE) == 0)
  245.   {
  246.    ZwClose(hSection);
  247.    return FuncAddr;
  248.   }
  249. }
  250. ZwClose(hSection);
  251. return 0;
  252. }

  253. ULONG GetSysCallIndex( PCHAR FuncName )
  254. {
  255. UNICODE_STRING usDllName;
  256. ULONG     FuncAddr;
  257. ULONG     SysCallIndex;
  258. RtlInitUnicodeString( &usDllName, L"\\SystemRoot\\System32\\ntdll.dll" );
  259. FuncAddr = GetExportFuncAddr(FuncName, &usDllName);
  260. SysCallIndex = *( (PSHORT)(FuncAddr + 1) );
  261. return SysCallIndex;
  262. }
复制代码

至于效果,就自己测试吧。。。

评分

参与人数 1水晶币 +10 收起 理由
囧rz12 + 10 没什么水晶币了 话说有没有哪位仁兄愿意把S.

查看全部评分

如果附件无法下载,请点击这里
本网站最菜的人 该用户已被删除
发表于 2010-5-29 22:07:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
本网站最菜的人 该用户已被删除
发表于 2010-5-29 22:11:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-5-30 00:31:00 | 显示全部楼层
沙发 + 膜拜 + 学习,感谢TA神牛为我们菜鸟提供代码
貌似只有XP以上才可以用
本网站最菜的人 发表于 2010-5-29 22:07



  这不是废话吗,XP以前根本没有NtSuspendProcess。
  另外到了NT6也不用这么干了,PsSuspendProcess直接被ntosxxxx.exe导出。

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-6-27 11:45:09 | 显示全部楼层
貌似我不太喜欢这种邪门功夫。。。。。又或者是我不太喜欢带有inlinehook风格的代码

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-6-27 11:46:00 | 显示全部楼层
挂起进程的话,最好另寻它途

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-6-27 11:47:47 | 显示全部楼层
比如模拟KeWaitforsignleObject的做法
又或者模拟进程管理器的做法,将进程的执行时间片改为0得了

1

主题

14

回帖

0

精华

铜牌会员

积分
43
发表于 2012-2-19 15:35:29 | 显示全部楼层
好东西啊  佩服一定好好学习

1

主题

48

回帖

0

精华

金牌会员

积分
978
发表于 2012-7-29 09:54:06 | 显示全部楼层
win7可以使用吗?

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-8 16:20:42 | 显示全部楼层
好東西! 看看!
头像被屏蔽

4

主题

101

回帖

0

精华

初来乍到

积分
19658
发表于 2014-1-17 17:17:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

6

回帖

0

精华

初来乍到

积分
10
发表于 2014-2-4 13:39:24 | 显示全部楼层
有没有哪位仁兄愿意把SYS文件发给我 好用VB调用哈

0

主题

6

回帖

0

精华

初来乍到

积分
10
发表于 2014-2-4 13:40:03 | 显示全部楼层
有没有哪位仁兄愿意把SYS文件发给我 好用VB调用哈
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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