mirror of
https://github.com/xinbailu/TiEtwAgent
synced 2026-06-08 18:26:30 +00:00
197 lines
5.4 KiB
C++
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;
|
|
}
|