Files
Filip Olszak ec1556cc79 refactor
2021-04-10 19:12:15 +02:00

197 lines
5.4 KiB
C++

#include "TiEtwAgent.h"
#include "AgentService.h"
DWORD install_elam()
{
DWORD ret{ 0 };
WCHAR driverName[]{ DRIVER_NAME };
HANDLE hFile{ NULL };
log_debug(L"TiEtwSensor: Opening driver file: %s\n", driverName);
hFile = CreateFile(
driverName,
FILE_READ_DATA,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
ret = 1;
log_debug(L"TiEtwSensor: Unable to read driver file\n");
return ret;
}
if (InstallELAMCertificateInfo(hFile) == FALSE) {
ret = 1;
log_debug(L"TiEtwSensor: Unable to install ELAM certificate\n");
return ret;
}
log_debug(L"TiEtwSensor: ELAM driver has been installed successfully\n");
return ret;
}
DWORD install_agent_service()
{
DWORD ret = 0;
SERVICE_LAUNCH_PROTECTED_INFO info;
SC_HANDLE hService;
SC_HANDLE hSCManager;
DWORD SCManagerAccess = SC_MANAGER_ALL_ACCESS;
hSCManager = OpenSCManager(NULL, NULL, SCManagerAccess);
if (NULL == hSCManager) {
ret = 1;
log_debug(L"TiEtwSensor: Unable to open Service Control Manager\n");
return ret;
}
wchar_t serviceCmd[MAX_BUF_SIZE]{ 0 };
GetModuleFileName(
NULL,
serviceCmd,
MAX_BUF_SIZE
);
DWORD serviceCmdLen = lstrlenW(serviceCmd);
wcscpy_s(serviceCmd + serviceCmdLen, MAX_BUF_SIZE - serviceCmdLen, L" service");
hService = CreateService(
hSCManager,
SERVICE_NAME,
SERVICE_NAME,
SCManagerAccess,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
serviceCmd,
NULL,
NULL,
NULL,
NULL,
NULL
);
if (NULL == hService) {
ret = GetLastError();
if (ret == ERROR_SERVICE_EXISTS) {
log_debug(L"TiEtwSensor: Service '%s' already exists\n", SERVICE_NAME);
}
else {
log_debug(L"TiEtwSensor: Unable to create new service: %d\n", ret);
}
return ret;
}
info.dwLaunchProtected = SERVICE_LAUNCH_PROTECTED_ANTIMALWARE_LIGHT;
if (ChangeServiceConfig2(hService, SERVICE_CONFIG_LAUNCH_PROTECTED, &info) == FALSE) {
ret = GetLastError();
log_debug(L"TiEtwSensor: Unable to change service config %d\n", ret);
return ret;
}
log_debug(L"TiEtwSensor: Service has been installed successfully\n");
return ret;
}
DWORD uninstall_agent_service() {
DWORD ret = 0;
SC_HANDLE hSCManager;
SC_HANDLE hService;
SERVICE_STATUS_PROCESS ssp;
DWORD dwBytesNeeded;
log_debug(L"TiEtwSensor: Uninstalling the service\n");
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL) {
ret = 1;
log_debug(L"TiEtwSensor: Couldn't open Service Control Manager %d\n");
return ret;
}
hService = OpenService(hSCManager, SERVICE_NAME, SERVICE_ALL_ACCESS);
if (hService == NULL) {
ret = 1;
log_debug(L"TiEtwSensor: Couldn't open the service\n");
return ret;
}
if (!QueryServiceStatusEx(
hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) {
ret = GetLastError();
log_debug(L"TiEtwSensor: Couldn't query the service status: %d\n", ret);
return ret;
}
if (ssp.dwCurrentState != SERVICE_STOPPED) {
if (!ControlService(hService, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp)) {
ret = GetLastError();
log_debug(L"TiEtwSensor: ControlService(Stop) Error: %d\n", ret);
return ret;
}
if (ssp.dwCurrentState != SERVICE_STOPPED) {
Sleep(3000);
if (!QueryServiceStatusEx(
hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) {
ret = GetLastError();
log_debug(L"TiEtwSensor: QueryServiceStatusEx2 Error: %d\n", ret);
return ret;
}
if (ssp.dwCurrentState != SERVICE_STOPPED) {
ret = ssp.dwCurrentState;
log_debug(L"TiEtwSensor: Waited but service stull not stopped: %d\n", ret);
return ret;
}
}
}
if (!DeleteService(hService)) {
ret = GetLastError();
log_debug(L"TiEtwSensor: DeleteService Error: %d\n", ret);
return ret;
}
log_debug(L"TiEtwSensor: Deleted Service %s\n", SERVICE_NAME);
return ret;
}
int main(INT argc, CHAR** argv)
{
DWORD ret{ 0 };
if (argc != 2) {
log_debug(L"Usage: TiMemAgent.exe ( install | uninstall )\n");
ret = 1;
}
else if (strcmp("install", argv[1]) == 0) {
log_debug(L"TiEtwSensor: Installing the Early Launch Anti-Malware drivers\n");
ret = install_elam();
if (ret == 0) {
log_debug(L"TiEtwSensor: Installing the agent service\n");
ret = install_agent_service();
}
}
else if (strcmp(argv[1], "service") == 0) {
log_debug(L"TiEtwSensor: The service is starting up\n");
ret = agent_service_init();
}
else if (strcmp(argv[1], "uninstall") == 0) {
ret = uninstall_agent_service();
}
else {
log_debug(L"TiEtwSensor: Unable to parse commandline\n");
ret = 1;
}
return ret;
}