内核级结束进程c代码

来源:互联网 发布:重复文件查找软件 编辑:程序博客网 时间:2024/06/08 07:11

 

 

  1. #include <windows.h>    
  2. #include <ntsecapi.h>    
  3. #include <aclapi.h>   
  4. #include <tlhelp32.h>    
  5. #pragma comment (lib,"ntdll.lib")    // Copy From DDK    
  6. #pragma comment (lib,"Kernel32.lib")    
  7. #pragma comment (lib,"Advapi32.lib")    
  8. #pragma comment(linker, "/ENTRY:main")   
  9.    
  10. #ifndef ULONG_PTR    
  11. #define ULONG_PTR unsigned long   
  12. #endif   
  13. //------------------ 数据类型声明开始 --------------------//   
  14. typedef struct _PROCESS_BASIC_INFORMATION {   
  15.     NTSTATUS ExitStatus;   
  16.     ULONG PebBaseAddress;   
  17.     ULONG_PTR AffinityMask;   
  18.     LONG BasePriority;   
  19.     ULONG_PTR UniqueProcessId;   
  20.     ULONG_PTR InheritedFromUniqueProcessId;   
  21. } PROCESS_BASIC_INFORMATION;   
  22. typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;   
  23.    
  24. typedef struct _SYSTEM_HANDLE_INFORMATION   
  25. {   
  26.     ULONG            ProcessId;   
  27.     UCHAR            ObjectTypeNumber;   
  28.     UCHAR            Flags;   
  29.     USHORT            Handle;   
  30.     PVOID            Object;   
  31.     ACCESS_MASK        GrantedAccess;   
  32. } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;    
  33. typedef struct _SYSTEM_MODULE_INFORMATION {    
  34.   ULONG Reserved[2];    
  35.   PVOID Base;    
  36.   ULONG Size;    
  37.   ULONG Flags;    
  38.   USHORT Index;    
  39.   USHORT Unknown;    
  40.   USHORT LoadCount;    
  41.   USHORT ModuleNameOffset;    
  42.   CHAR ImageName[256];    
  43. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;    
  44.    
  45. typedef struct _OBJECT_ATTRIBUTES {    
  46.   ULONG Length;    
  47.   HANDLE RootDirectory;    
  48.   PUNICODE_STRING ObjectName;    
  49.   ULONG Attributes;    
  50.   PVOID SecurityDescriptor;    
  51.   PVOID SecurityQualityOfService;    
  52. } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;    
  53.    
  54. typedef enum _SECTION_INHERIT {    
  55.   ViewShare = 1,    
  56.   ViewUnmap = 2    
  57. } SECTION_INHERIT;    
  58.    
  59. typedef struct _MY_PROCESS_INFO {    
  60.   ULONG PID;    
  61.   ULONG KPEB;    
  62.   ULONG CR3;    
  63.   CHAR Name[16];    
  64.   ULONG Reserved;    
  65. } MY_PROCESS_INFO, *PMY_PROCESS_INFO;   
  66. typedef struct _CLIENT_ID {   
  67.     HANDLE UniqueProcess;   
  68.     HANDLE UniqueThread;   
  69. } CLIENT_ID;   
  70. typedef CLIENT_ID *PCLIENT_ID;    
  71.    
  72. typedef long NTSTATUS;    
  73.     
  74. //------------------ 数据类型声明结束 --------------------//    
  75.    
  76. //--------------------- 预定义开始 -----------------------//    
  77. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)    
  78. #define STATUS_SUCCESS        0x00000000    
  79. #define STATUS_UNSUCCESSFUL      0xC0000001    
  80. #define STATUS_NOT_IMPLEMENTED    0xC0000002    
  81. #define STATUS_INFO_LENGTH_MISMATCH 0xC0000004    
  82. #define STATUS_INVALID_PARAMETER  0xC000000D    
  83. #define STATUS_ACCESS_DENIED    0xC0000022    
  84. #define STATUS_BUFFER_TOO_SMALL  0xC0000023    
  85. #define OBJ_KERNEL_HANDLE      0x00000200    
  86. #define SystemModuleInformation  11   
  87. #define SystemHandleInformation  0x10    
  88.    
  89. #define InitializeObjectAttributes( p, n, a, r, s ) { (p)->Length = sizeof( OBJECT_ATTRIBUTES );(p)->RootDirectory = r;                (p)->Attributes = a;                    (p)->ObjectName = n;                      (p)->SecurityDescriptor = s;                (p)->SecurityQualityOfService = NULL;        }    
  90. //--------------------- 预定义结束 -----------------------//    
  91.    
  92. //------------------ Native API声明开始 ------------------//    
  93. /*  
  94. NTSYSAPI   
  95. NTSTATUS   
  96. NTAPI   
  97. ZwQuerySystemInformation(   
  98.   ULONG SystemInformationClass,   
  99.   PVOID SystemInformation,   
  100.   ULONG SystemInformationLength,   
  101.   PULONG ReturnLength   
  102.   );   
  103.   */   
  104. typedef NTSTATUS (NTAPI* PNtZwQuerySystemInformation) (ULONGPVOIDULONGPULONG);   
  105. PNtZwQuerySystemInformation ZwQuerySystemInformation;   
  106. /*  
  107. NTSYSAPI   
  108. NTSTATUS  
  109. NTAPI  
  110. ZwOpenProcess(  
  111.   
  112.   OUT PHANDLE            ProcessHandle,  
  113.   IN ACCESS_MASK          AccessMask,  
  114.   IN POBJECT_ATTRIBUTES  ObjectAttributes,  
  115.   IN PCLIENT_ID          ClientId );  
  116. */   
  117. typedef NTSTATUS (NTAPI* PNtZwOpenProcess) (OUT PHANDLE, IN ACCESS_MASK, IN POBJECT_ATTRIBUTES,   
  118.                                             IN PCLIENT_ID);   
  119. PNtZwOpenProcess ZwOpenProcess;   
  120. /*  
  121. NTSYSAPI   
  122. NTSTATUS  
  123. NTAPI  
  124. ZwAllocateVirtualMemory(  
  125.   
  126.   IN HANDLE              ProcessHandle,  
  127.   IN OUT PVOID            *BaseAddress,  
  128.   IN ULONG                ZeroBits,  
  129.   IN OUT PULONG          RegionSize,  
  130.   IN ULONG                AllocationType,  
  131.   IN ULONG                Protect );  
  132. */   
  133. typedef NTSTATUS (NTAPI* PNtZwAllocateVirtualMemory) (IN HANDLE, IN OUT PVOID,   
  134.                                                       IN ULONG, IN OUT PULONG,   
  135.                                                       IN ULONG, IN ULONG);   
  136. PNtZwAllocateVirtualMemory ZwAllocateVirtualMemory;   
  137. /*  
  138. NTSYSAPI   
  139. NTSTATUS  
  140. NTAPI  
  141. ZwDuplicateObject(  
  142.   
  143.   IN HANDLE              SourceProcessHandle,  
  144.   IN PHANDLE              SourceHandle,  
  145.   IN HANDLE              TargetProcessHandle,  
  146.   OUT PHANDLE            TargetHandle,  
  147.   IN ACCESS_MASK          DesiredAccess OPTIONAL,  
  148.   IN BOOLEAN              InheritHandle,  
  149.   IN ULONG                Options );*/   
  150. typedef NTSTATUS (NTAPI* PNtZwDuplicateObject) ( IN HANDLE, IN PHANDLE, IN HANDLE, OUT PHANDLE,   
  151.                                                 IN ACCESS_MASK, IN BOOLEAN,  IN ULONG);   
  152. PNtZwDuplicateObject ZwDuplicateObject;   
  153.    
  154. /*  
  155. NTSYSAPI   
  156. NTSTATUS  
  157. NTAPI  
  158. ZwQueryInformationProcess(  
  159.   
  160.   IN HANDLE              ProcessHandle,  
  161.   IN PVOID         ProcessInformationClass,  
  162.   OUT PVOID              ProcessInformation,  
  163.   IN ULONG                ProcessInformationLength,  
  164.   OUT PULONG              ReturnLength );*/   
  165. typedef NTSTATUS(NTAPI* PNtZwQueryInformationProcess)(IN HANDLE, IN PVOID, OUT PVOID, IN ULONG, OUT PULONG );   
  166. PNtZwQueryInformationProcess ZwQueryInformationProcess;   
  167.    
  168. /*  
  169. NTSYSAPI   
  170. NTSTATUS  
  171. NTAPI  
  172. ZwProtectVirtualMemory(  
  173.   
  174.   IN HANDLE              ProcessHandle,  
  175.   IN OUT PVOID            *BaseAddress,  
  176.   IN OUT PULONG          NumberOfBytesToProtect,  
  177.   IN ULONG                NewAccessProtection,  
  178.   OUT PULONG              OldAccessProtection );*/   
  179. typedef NTSTATUS (NTAPI* PNtZwProtectVirtualMemory) (IN HANDLE, IN OUT PVOID, IN OUT PULONG, IN ULONG , OUT PULONG);   
  180. PNtZwProtectVirtualMemory ZwProtectVirtualMemory;   
  181. /*  
  182. NTSYSAPI   
  183. NTSTATUS  
  184. NTAPI  
  185. ZwWriteVirtualMemory(  
  186.   
  187.   IN HANDLE              ProcessHandle,  
  188.   IN PVOID                BaseAddress,  
  189.   IN PVOID                Buffer,  
  190.   IN ULONG                NumberOfBytesToWrite,  
  191.   OUT PULONG              NumberOfBytesWritten OPTIONAL );  
  192. */   
  193. typedef NTSTATUS (NTAPI *PNtZwWriteVirtualMemory) ( IN HANDLE, IN PVOID, IN PVOID, IN ULONG, OUT PULONG );   
  194. PNtZwWriteVirtualMemory ZwWriteVirtualMemory;   
  195.    
  196. /*  
  197. NTSYSAPI   
  198. NTSTATUS  
  199. NTAPI  
  200. ZwClose(  
  201.   
  202.   IN HANDLE              ObjectHandle );  
  203. */   
  204. typedef NTSTATUS (NTAPI *PNtZwClose) ( IN HANDLE );   
  205. PNtZwClose ZwClose;   
  206. /*  
  207. NTSYSAPI   
  208. NTSTATUS  
  209. NTAPI  
  210. ZwFreeVirtualMemory(  
  211.   
  212.   IN HANDLE              ProcessHandle,  
  213.   IN PVOID                *BaseAddress,  
  214.   IN OUT PULONG          RegionSize,  
  215.   IN ULONG                FreeType );  
  216. */   
  217.    
  218. typedef NTSTATUS (NTAPI *PNtZwFreeVirtualMemory)( IN HANDLE, IN PVOID, IN OUT PULONG, IN ULONG );   
  219. PNtZwFreeVirtualMemory ZwFreeVirtualMemory;   
  220.    
  221. //------------------ Native API声明结束 ------------------//    
  222.    
  223. //------------------ 程序正式开始 ------------------//    
  224.    
  225. DWORD GetPidByName(char *szName)   
  226. {   
  227.     HANDLE hProcessSnap = INVALID_HANDLE_VALUE;   
  228.     PROCESSENTRY32 pe32={0};   
  229.     DWORD dwRet=0;   
  230.    
  231.     hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
  232.     if(hProcessSnap == INVALID_HANDLE_VALUE)   
  233.         return 0;   
  234.    
  235.     pe32.dwSize = sizeof(PROCESSENTRY32);   
  236.     if(Process32First(hProcessSnap, &pe32))   
  237.     {   
  238.         do   
  239.         {   
  240.             if(lstrcmpi(szName,pe32.szExeFile)==0)   
  241.             {   
  242.                 dwRet=pe32.th32ProcessID;   
  243.                 break;   
  244.             }   
  245.         } while (Process32Next(hProcessSnap,&pe32));   
  246.     }   
  247.     else return 0;   
  248.    
  249.     if(hProcessSnap !=INVALID_HANDLE_VALUE)   
  250.         CloseHandle(hProcessSnap);   
  251.     return dwRet;   
  252. }   
  253.    
  254. void KillIce(ULONG dwProcessId)    
  255. {    
  256.     HMODULE hNTDLL = LoadLibrary ("ntdll");   
  257.     HANDLE     ph, h_dup;   
  258.     ULONG     bytesIO;   
  259.     PVOID     buf;   
  260.     ULONG        i;   
  261.     CLIENT_ID    cid1;   
  262.     OBJECT_ATTRIBUTES    attr;   
  263.     HANDLE        csrss_id;   
  264.     PROCESS_BASIC_INFORMATION    pbi;   
  265.     PVOID        p0, p1;   
  266.     ULONG        sz, oldp;   
  267.     ULONG        NumOfHandle;   
  268.     PSYSTEM_HANDLE_INFORMATION    h_info;     
  269.    
  270.     HMODULE hNtDll = ::GetModuleHandle( "ntdll.dll" );   
  271.     if( hNtDll == NULL ) return ;   
  272.    
  273. // 函数 ++   
  274.     // ZwQuerySystemInformation   
  275.     ZwQuerySystemInformation = (PNtZwQuerySystemInformation)GetProcAddress( hNtDll,   
  276.                                         "ZwQuerySystemInformation" );   
  277.     if( ZwQuerySystemInformation == NULL ) return ;   
  278.        
  279.     // ZwOpenProcess   
  280.     ZwOpenProcess = (PNtZwOpenProcess)GetProcAddress( hNtDll,   
  281.                                         "ZwOpenProcess" );   
  282.     if( ZwOpenProcess == NULL ) return ;   
  283.    
  284.     // ZwAllocateVirtualMemory   
  285.     ZwAllocateVirtualMemory = (PNtZwAllocateVirtualMemory)GetProcAddress( hNtDll,   
  286.                                         "ZwAllocateVirtualMemory" );   
  287.     if( ZwAllocateVirtualMemory == NULL ) return ;   
  288.    
  289.     // ZwDuplicateObject   
  290.     ZwDuplicateObject = (PNtZwDuplicateObject)GetProcAddress( hNtDll,   
  291.                                         "ZwDuplicateObject" );   
  292.     if( ZwDuplicateObject == NULL ) return ;   
  293.    
  294.     // ZwQueryInformationProcess   
  295.     ZwQueryInformationProcess = (PNtZwQueryInformationProcess)GetProcAddress( hNtDll,   
  296.                                         "ZwQueryInformationProcess" );   
  297.     if( ZwQueryInformationProcess == NULL ) return ;   
  298.    
  299.     // ZwProtectVirtualMemory   
  300.     ZwProtectVirtualMemory = (PNtZwProtectVirtualMemory)GetProcAddress( hNtDll,   
  301.                                         "ZwProtectVirtualMemory" );   
  302.     if( ZwProtectVirtualMemory == NULL ) return ;   
  303.    
  304.     // ZwWriteVirtualMemory   
  305.     ZwWriteVirtualMemory = (PNtZwWriteVirtualMemory)GetProcAddress( hNtDll,   
  306.                                         "ZwWriteVirtualMemory" );   
  307.     if( ZwWriteVirtualMemory == NULL ) return ;   
  308.    
  309.     // ZwClose   
  310.     ZwClose = (PNtZwClose)GetProcAddress( hNtDll,   
  311.                                         "ZwClose" );   
  312.     if( ZwClose == NULL ) return ;   
  313.    
  314.     // ZwFreeVirtualMemory   
  315.     ZwFreeVirtualMemory = (PNtZwFreeVirtualMemory)GetProcAddress( hNtDll,   
  316.                                         "ZwFreeVirtualMemory" );   
  317.     if( ZwFreeVirtualMemory == NULL ) return ;   
  318.    
  319. // 函数 --   
  320.    
  321.     csrss_id = (HANDLE)GetPidByName("csrss.exe");   
  322.     attr.Length = sizeof(OBJECT_ATTRIBUTES);   
  323.     attr.RootDirectory = 0;   
  324.     attr.ObjectName = 0;   
  325.     attr.Attributes = 0;   
  326.     attr.SecurityDescriptor = 0;   
  327.     attr.SecurityQualityOfService = 0;   
  328.    
  329.     cid1.UniqueProcess = csrss_id;   
  330.     cid1.UniqueThread = 0;   
  331.     ZwOpenProcess(&ph, PROCESS_ALL_ACCESS, &attr, &cid1);   
  332.    
  333.     bytesIO = 0x400000;   
  334.     buf = 0;   
  335.     ZwAllocateVirtualMemory(GetCurrentProcess(), &buf, 0, &bytesIO, MEM_COMMIT, PAGE_READWRITE);   
  336.     ZwQuerySystemInformation(SystemHandleInformation, buf, 0x400000, &bytesIO);   
  337.     NumOfHandle = (ULONG)buf;   
  338.     h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);   
  339.    
  340.     for (i= 0 ; i<numofhandle; i++)="" {="" if="" ((h_info-="">ProcessId == (ULONG)csrss_id)&&(h_info->ObjectTypeNumber == 5))   
  341.         {   
  342.             if (ZwDuplicateObject(ph, (PHANDLE)h_info->Handle, (HANDLE)-1, &h_dup,   
  343.                                     0, 0, DUPLICATE_SAME_ACCESS) == STATUS_SUCCESS)   
  344.                 ZwQueryInformationProcess(h_dup, 0, &pbi, sizeof(pbi), &bytesIO);   
  345.             if (pbi.UniqueProcessId == dwProcessId)   
  346.             {   
  347.                 MessageBox(0, "目标已确定!""OK", MB_OK);   
  348.                 for (i = 0x1000; i<0x80000000; i = i + 0x1000)   
  349.                 {   
  350.                     p0 = (PVOID)i;   
  351.                     p1 = p0;   
  352.                     sz = 0x1000;   
  353.                     if (ZwProtectVirtualMemory(h_dup, &p1, &sz, PAGE_EXECUTE_READWRITE, &oldp) == STATUS_SUCCESS)   
  354.                     {                 
  355.                         ZwWriteVirtualMemory(h_dup, p0, buf, 0x1000, &oldp);   
  356.                     }             
  357.                     }   
  358.                     MessageBox(0, "任务已完成!","OK", 0);   
  359.                     ZwClose(h_dup);                           
  360.                 }   
  361.             }   
  362.     }   
  363.    
  364.     bytesIO = 0;   
  365.     ZwFreeVirtualMemory(GetCurrentProcess(), &buf, &bytesIO, MEM_RELEASE);   
  366.     FreeLibrary(hNTDLL);       
  367. }   
  368.    
  369. BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName,BOOL fEnable)   
  370. {   
  371.     TOKEN_PRIVILEGES tp;   
  372.     tp.PrivilegeCount = 1;   
  373.     LookupPrivilegeValue(NULL,szPrivName,&tp.Privileges[0].Luid);   
  374.     tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED:0;   
  375.     AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);   
  376.     return((GetLastError() == ERROR_SUCCESS));   
  377. }   
  378.    
  379. void main()    
  380. {       
  381.     ULONG Pid;   
  382.     HANDLE hToken;   
  383.     OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);   
  384.     EnablePrivilege(hToken,SE_DEBUG_NAME,TRUE);   
  385.     if (Pid = GetPidByName("taskmgr.exe"))   
  386.     {   
  387.         KillIce(Pid);   
  388.     }        
  389.     ExitProcess(0);   
  390. }</numofhandle;></tlhelp32.h></aclapi.h></ntsecapi.h></windows.h>  

 

http://read.pudn.com/downloads122/sourcecode/windows/system/519804/KillProcess.cpp__.htm

原创粉丝点击