Imported Upstream version 2.7
[ossec-hids.git] / src / rootcheck / win-process.c
1 /* @(#) $Id: ./src/rootcheck/win-process.c, 2011/09/08 dcid Exp $
2  */
3
4 /* Copyright (C) 2009 Trend Micro Inc.
5  * All right reserved.
6  *
7  * This program is a free software; you can redistribute it
8  * and/or modify it under the terms of the GNU General Public
9  * License (version 2) as published by the FSF - Free Software
10  * Foundation
11  */
12
13 #ifdef WIN32
14 #include "shared.h"
15 #include "rootcheck.h"
16
17 #include <tlhelp32.h>
18 #include <psapi.h>
19
20
21 /* Using: http://support.microsoft.com/kb/q131065/ as ref for debug priv */
22
23
24 /* Set Debug privilege */
25 int os_win32_setdebugpriv(HANDLE h, int en)
26 {
27     TOKEN_PRIVILEGES tp;
28     TOKEN_PRIVILEGES tpPrevious;
29     LUID luid;
30     DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES);
31
32     if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
33     {
34         return(0);
35     }
36
37     tp.PrivilegeCount = 1;
38     tp.Privileges[0].Luid = luid;
39     tp.Privileges[0].Attributes = 0;
40
41     AdjustTokenPrivileges(h, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
42                           &tpPrevious,&cbPrevious);
43
44     if(GetLastError() != ERROR_SUCCESS)
45     {
46         return(0);
47     }
48
49     tpPrevious.PrivilegeCount = 1;
50     tpPrevious.Privileges[0].Luid = luid;
51
52
53     /* If en is set to true, we enable the privilege */
54     if(en)
55     {
56         tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
57     }
58     else
59     {
60         tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &
61                 tpPrevious.Privileges[0].Attributes);
62     }
63
64     AdjustTokenPrivileges(h, FALSE, &tpPrevious, cbPrevious, NULL, NULL);
65     if(GetLastError() != ERROR_SUCCESS)
66     {
67         return(0);
68     }
69
70     return(1);
71 }
72
73
74
75 /* os_get_process_list: Get list of win32 processes */
76 void *os_get_process_list()
77 {
78     OSList *p_list = NULL;
79
80     HANDLE hsnap;
81     HANDLE hpriv;
82     PROCESSENTRY32 p_entry;
83     p_entry.dwSize = sizeof(PROCESSENTRY32);
84
85
86     /* Getting token for enable debug priv */
87     if(!OpenThreadToken(GetCurrentThread(),
88                         TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, FALSE, &hpriv))
89     {
90         if(GetLastError() == ERROR_NO_TOKEN)
91         {
92             if(!ImpersonateSelf(SecurityImpersonation))
93             {
94                 merror("%s: ERROR: os_get_win32_process_list -> "
95                        "ImpersonateSelf",ARGV0);
96                 return(NULL);
97             }
98
99             if(!OpenThreadToken(GetCurrentThread(),
100                                 TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
101                                 FALSE, &hpriv))
102             {
103                 merror("%s: ERROR: os_get_win32_process_list -> "
104                        "OpenThread",ARGV0);
105                 return(NULL) ;
106             }
107         }
108         else
109         {
110             merror("%s: ERROR: os_get_win32_process_list -> OpenThread",ARGV0);
111             return(NULL);
112         }
113     }
114
115
116     /* Enabling debug privilege */
117     if(!os_win32_setdebugpriv(hpriv, 1))
118     {
119         merror("%s: ERROR: os_win32_setdebugpriv",ARGV0);
120         CloseHandle(hpriv);
121
122         return(NULL);
123     }
124
125
126     /* Snapshot of every process */
127     hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
128     if(hsnap == INVALID_HANDLE_VALUE)
129     {
130         merror("%s: ERROR: CreateToolhelp32Snapshot",ARGV0);
131         return(NULL);
132     }
133
134
135     /* Getting first and second processes -- system entries */
136     if(!Process32First(hsnap, &p_entry) && !Process32Next(hsnap, &p_entry ))
137     {
138         merror("%s: ERROR: Process32First", ARGV0);
139         CloseHandle(hsnap);
140         return(NULL);
141     }
142
143
144     /* Creating process list */
145     p_list = OSList_Create();
146     if(!p_list)
147     {
148         CloseHandle(hsnap);
149         merror(LIST_ERROR, ARGV0);
150         return(0);
151     }
152
153
154     /* Getting each process name and path */
155     while(Process32Next( hsnap, &p_entry))
156     {
157         char *p_name;
158         char *p_path;
159         Proc_Info *p_info;
160
161         /* Setting process name */
162         os_strdup(p_entry.szExeFile, p_name);
163
164
165         /* Getting additional information from modules */
166         HANDLE hmod = INVALID_HANDLE_VALUE;
167         MODULEENTRY32 m_entry;
168         m_entry.dwSize = sizeof(MODULEENTRY32);
169
170         /* Snapshot of the process */
171         hmod = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
172                                         p_entry.th32ProcessID);
173         if(hmod == INVALID_HANDLE_VALUE)
174         {
175             os_strdup(p_name, p_path);
176         }
177
178         /* Getting executable path (first entry in the module list */
179         else if(!Module32First(hmod, &m_entry))
180         {
181             CloseHandle(hmod);
182             os_strdup(p_name, p_path);
183         }
184
185         else
186         {
187             os_strdup(m_entry.szExePath, p_path);
188             CloseHandle(hmod);
189         }
190
191         os_calloc(1, sizeof(Proc_Info), p_info);
192         p_info->p_name = p_name;
193         p_info->p_path = p_path;
194         OSList_AddData(p_list, p_info);
195     }
196
197     /* Removing debug privileges */
198     os_win32_setdebugpriv(hpriv, 0);
199
200     CloseHandle(hsnap);
201     return((void *)p_list);
202 }
203
204 #endif /* WIN32 */
205
206 /* EOF */