const char * vp_pipe_read(char *args) { vp_stack_t stack; int fd; int nr; int timeout; DWORD n; char buf[VP_READ_BUFSIZE]; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &nr)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &timeout)); vp_stack_push_str(&_result, ""); /* initialize */ while (nr != 0) { n = 0; if (!PeekNamedPipe((HANDLE)_get_osfhandle(fd), buf, (nr < 0) ? VP_READ_BUFSIZE : (VP_READ_BUFSIZE < nr) ? VP_READ_BUFSIZE : nr, &n, NULL, NULL)) { /* can be ERROR_HANDLE_EOF? */ if (GetLastError() == 0 || GetLastError() == ERROR_BROKEN_PIPE) { /* error or eof */ if (n != 0) { /* decrease stack top for concatenate. */ _result.top--; vp_stack_push_bin(&_result, buf, n); } vp_stack_push_num(&_result, "%d", 1); return vp_stack_return(&_result); } return vp_stack_return_error(&_result, "PeekNamedPipe() error: %08X %s", GetLastError(), lasterror()); } if (n == 0) { break; } if (read(fd, buf, n) == -1) return vp_stack_return_error(&_result, "read() error: %s", strerror(errno)); /* decrease stack top for concatenate. */ _result.top--; vp_stack_push_bin(&_result, buf, n); if (nr > 0) nr -= n; /* try read more bytes without waiting */ timeout = 0; } vp_stack_push_num(&_result, "%d", 0); return vp_stack_return(&_result); }
const char * vp_close_handle(char *args) { vp_stack_t stack; HANDLE handle; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle)); if (!CloseHandle(handle)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); return NULL; }
const char * vp_dlclose(char *args) { vp_stack_t stack; HINSTANCE handle; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle)); if (!FreeLibrary(handle)) return lasterror(); vp_stack_free(&_result); return NULL; }
const char * vp_pipe_close(char *args) { vp_stack_t stack; int fd; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd)); if (!CloseHandle((HANDLE)_get_osfhandle(fd))) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); return NULL; }
const char * vp_kill(char *args) { vp_stack_t stack; HANDLE handle; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle)); if (!TerminateProcess(handle, 2) || !CloseHandle(handle)) return vp_stack_return_error(&_result, "kill() error: %s", lasterror()); return NULL; }
const char * vp_file_read(char *args) { vp_stack_t stack; int fd; int nr; int timeout; DWORD ret; int n; char buf[VP_READ_BUFSIZE]; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &nr)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &timeout)); vp_stack_push_str(&_result, ""); /* initialize */ while (nr != 0) { ret = WaitForSingleObject((HANDLE)_get_osfhandle(fd), timeout); if (ret == WAIT_FAILED) { return vp_stack_return_error(&_result, "WaitForSingleObject() error: %s", lasterror()); } else if (ret == WAIT_TIMEOUT) { /* timeout */ break; } if (nr > 0) n = read(fd, buf, (VP_READ_BUFSIZE < nr) ? VP_READ_BUFSIZE : nr); else n = read(fd, buf, VP_READ_BUFSIZE); if (n == -1) { return vp_stack_return_error(&_result, "read() error: %s", strerror(errno)); } else if (n == 0) { /* eof */ vp_stack_push_num(&_result, "%d", 1); return vp_stack_return(&_result); } /* decrease stack top for concatenate. */ _result.top--; vp_stack_push_bin(&_result, buf, n); if (nr > 0) nr -= n; /* try read more bytes without waiting */ timeout = 0; } vp_stack_push_num(&_result, "%d", 0); return vp_stack_return(&_result); }
BOOL enzyme::kernel::Service::start(SC_HANDLE scm, const TCHAR* path) { mSCHandle = OpenService(scm, bsname, SERVICE_ALL_ACCESS); if(mSCHandle != NULL) ChangeServiceConfig(mSCHandle, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL, NULL); else mSCHandle = CreateService(scm, bsname, bsname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL); if(mSCHandle == NULL) { CloseServiceHandle(scm); throw std::runtime_error("Kernel Driver: " + lasterror()); } return StartService(mSCHandle, 1, &bsname); }
const char * vp_open(char *args) { vp_stack_t stack; char *path; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &path)); if ((size_t)ShellExecute(NULL, "open", path, NULL, NULL, SW_SHOWNORMAL) < 32) { return vp_stack_return_error(&_result, "ShellExecute() error: %s", lasterror()); } return NULL; }
const char * vp_dlopen(char *args) { vp_stack_t stack; char *path; HINSTANCE handle; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &path)); handle = LoadLibrary(path); if (handle == NULL) return lasterror(); vp_stack_push_num(&_result, "%p", handle); return vp_stack_return(&_result); }
const char * vp_waitpid(char *args) { vp_stack_t stack; HANDLE handle; DWORD exitcode; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle)); if (!GetExitCodeProcess(handle, &exitcode)) return vp_stack_return_error(&_result, "GetExitCodeProcess() error: %s", lasterror()); vp_stack_push_str(&_result, (exitcode == STILL_ACTIVE) ? "run" : "exit"); vp_stack_push_num(&_result, "%u", exitcode); return vp_stack_return(&_result); }
void DestroyHandler::Call(LPDICTIONARY request, LPDICTIONARY response) { LPBEOBJECT pool = request->Get(KEY_POOL_ID); if (pool == NULL) { // no pool id supplied response->Set(KEY_RESPONSE_CD, E_INC_REQUEST); response->Set(KEY_RESPONSE_MSG, RESP_NO_POOLID); return; } if (pool->GetType() != BEObject::BET_STRING) { response->Set(KEY_RESPONSE_CD, E_BAD_REQUEST); response->Set(KEY_RESPONSE_MSG, RESP_OBJ_FMT); return; } string poolid = *static_cast<LPSTRING>(pool); LPBEOBJECT object = request->Get(KEY_OBJECT_ID); if (object == NULL) { // no object id supplied response->Set(KEY_RESPONSE_CD, E_INC_REQUEST); response->Set(KEY_RESPONSE_MSG, RESP_NO_OBJECTID); return; } if (object->GetType() != BEObject::BET_STRING) { response->Set(KEY_RESPONSE_CD, E_BAD_REQUEST); response->Set(KEY_RESPONSE_MSG, RESP_OBJ_FMT); return; } string objectid = *static_cast<LPSTRING>(object); // Destroy the object ObjectDB *pDB = ObjectDB::instance(); BOOL result = pDB->DestroyObject(poolid, objectid); if (!result) { response->Set(KEY_RESPONSE_CD, E_CANT_DESTROY); response->Set(KEY_RESPONSE_MSG, lasterror()); return; } response->Set(KEY_RESPONSE_CD, INT64(E_OK)); }
BOOL enzyme::kernel::Service::stop() { if(mHandle != INVALID_HANDLE_VALUE) { CloseHandle(mHandle); } if(mSCHandle != INVALID_HANDLE_VALUE) { SERVICE_STATUS_PROCESS status; if(ControlService(mSCHandle, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&status)) { DWORD timeout = GetTickCount() + 5000; while(status.dwCurrentState != SERVICE_STOPPED) { DWORD tmp; if(GetTickCount() >= timeout) { std::clog << "Timeout stopping kernel driver" << std::endl; break; } Sleep(50); if(!QueryServiceStatusEx(mSCHandle, SC_STATUS_PROCESS_INFO, (LPBYTE)&status, sizeof(SERVICE_STATUS_PROCESS), &tmp)) { break; } } } else if(GetLastError() != ERROR_SERVICE_NOT_ACTIVE) { std::clog << lasterror() << std::endl; } DeleteService(mSCHandle); return CloseServiceHandle(mSCHandle); } return TRUE; }
const char * vp_file_write(char *args) { vp_stack_t stack; int fd; char *buf; size_t size; int timeout; size_t nleft; DWORD ret; int n; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd)); VP_RETURN_IF_FAIL(vp_stack_pop_bin(&stack, &buf, &size)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &timeout)); nleft = 0; while (nleft < size) { ret = WaitForSingleObject((HANDLE)_get_osfhandle(fd), timeout); if (ret == WAIT_FAILED) { return vp_stack_return_error(&_result, "WaitForSingleObject() error: %s", lasterror()); } else if (ret == WAIT_TIMEOUT) { /* timeout */ break; } n = write(fd, buf + nleft, (unsigned int)(size - nleft)); if (n == -1) { return vp_stack_return_error(&_result, "write() error: %s", strerror(errno)); } nleft += n; /* try write more bytes without waiting */ timeout = 0; } vp_stack_push_num(&_result, "%u", nleft); return vp_stack_return(&_result); }
enzyme::kernel::Service::Service() { SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if(scm == NULL) { if(GetLastError() == ERROR_ACCESS_DENIED) throw std::runtime_error("Access Denied: Please run this program as Administrator"); else throw std::runtime_error("Kernel Driver: " + lasterror()); } TCHAR path[MAX_PATH]; TCHAR* ptr; if(GetModuleFileName(NULL, ptr = path, MAX_PATH - 12)) ptr = _tcsrchr(ptr, '\\') + 1; _tcscpy(ptr, koname); mSCHandle = OpenService(scm, bsname, SERVICE_ALL_ACCESS); if(mSCHandle != NULL) ChangeServiceConfig(mSCHandle, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL, NULL); else mSCHandle = CreateService(scm, bsname, bsname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL); if(mSCHandle == NULL) { CloseServiceHandle(scm); throw std::runtime_error("Kernel Driver: " + lasterror()); } BOOL r = start(scm, path); if(!r) { DWORD error = GetLastError(); if(error == ERROR_PATH_NOT_FOUND) // Possibly due to running via network/removable drive { /* if(GetWindowsDirectory(ptr = path, MAX_PATH - 22)) { ptr += _tcslen(ptr); _tcscpy(ptr, _T("\\System32\\")); ptr += _tcslen(ptr); } _tcscpy(ptr, koname); static bool copied = false; if(!copied) { env::filesystem::copy_file(koname, path); copied = true; } r = start(scm, path);*/ } } CloseServiceHandle(scm); if(!r) { if(GetLastError() != ERROR_SERVICE_ALREADY_RUNNING) { std::string error(lasterror()); stop(); throw std::runtime_error("Kernel Driver: " + error); } } }
/* * http://support.microsoft.com/kb/190351/ */ const char * vp_pipe_open(char *args) { vp_stack_t stack; int npipe, hstdin, hstderr, hstdout; char *cmdline; HANDLE hInputWrite = INVALID_HANDLE_VALUE, hInputRead; HANDLE hOutputWrite, hOutputRead = INVALID_HANDLE_VALUE; HANDLE hErrorWrite, hErrorRead = INVALID_HANDLE_VALUE; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; STARTUPINFO si; VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &npipe)); if (npipe != 2 && npipe != 3) return vp_stack_return_error(&_result, "npipe range error"); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &hstdin)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &hstdout)); VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &hstderr)); VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &cmdline)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (hstdin) { /* Get handle. */ hInputRead = (HANDLE)_get_osfhandle(hstdin); } else { HANDLE hInputWriteTmp; /* Create pipe. */ if (!CreatePipe(&hInputRead, &hInputWriteTmp, &sa, 0)) return vp_stack_return_error(&_result, "CreatePipe() error: %s", lasterror()); if (!DuplicateHandle(GetCurrentProcess(), hInputWriteTmp, GetCurrentProcess(), &hInputWrite, 0, FALSE, DUPLICATE_SAME_ACCESS)) return vp_stack_return_error(&_result, "DuplicateHandle() error: %s", lasterror()); if (!CloseHandle(hInputWriteTmp)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); } if (hstdout) { /* Get handle. */ hOutputWrite = (HANDLE)_get_osfhandle(hstdout); } else { HANDLE hOutputReadTmp; /* Create pipe. */ if (!CreatePipe(&hOutputReadTmp, &hOutputWrite, &sa, 0)) return vp_stack_return_error(&_result, "CreatePipe() error: %s", lasterror()); if (!DuplicateHandle(GetCurrentProcess(), hOutputReadTmp, GetCurrentProcess(), &hOutputRead, 0, TRUE, DUPLICATE_SAME_ACCESS)) return vp_stack_return_error(&_result, "DuplicateHandle() error: %s", lasterror()); if (!CloseHandle(hOutputReadTmp)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); } if (npipe == 2) { if (!DuplicateHandle(GetCurrentProcess(), hOutputWrite, GetCurrentProcess(), &hErrorWrite, 0, TRUE, DUPLICATE_SAME_ACCESS)) return vp_stack_return_error(&_result, "DuplicateHandle() error: %s", lasterror()); } else { if (hstderr) { /* Get handle. */ hErrorWrite = (HANDLE)_get_osfhandle(hstderr); } else { HANDLE hErrorReadTmp; /* Create pipe. */ if (!CreatePipe(&hErrorReadTmp, &hErrorWrite, &sa, 0)) return vp_stack_return_error(&_result, "CreatePipe() error: %s", lasterror()); if (!DuplicateHandle(GetCurrentProcess(), hErrorReadTmp, GetCurrentProcess(), &hErrorRead, 0, TRUE, DUPLICATE_SAME_ACCESS)) return vp_stack_return_error(&_result, "DuplicateHandle() error: %s", lasterror()); if (!CloseHandle(hErrorReadTmp)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); } } ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); /*si.dwFlags = STARTF_USESTDHANDLES;*/ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdInput = hInputRead; si.hStdOutput = hOutputWrite; si.hStdError = hErrorWrite; if (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) /*0, NULL, NULL, &si, &pi))*/ /*DETACHED_PROCESS, NULL, NULL, &si, &pi))*/ /*CREATE_NO_WINDOW, NULL, NULL, &si, &pi))*/ return vp_stack_return_error(&_result, "CreateProcess() error: %s %s", lasterror()); if (!CloseHandle(pi.hThread)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); if (!CloseHandle(hInputRead)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); if (!CloseHandle(hOutputWrite)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); if (!CloseHandle(hErrorWrite)) return vp_stack_return_error(&_result, "CloseHandle() error: %s", lasterror()); vp_stack_push_num(&_result, "%p", pi.hProcess); vp_stack_push_num(&_result, "%d", hstdin ? 0 : _open_osfhandle((size_t)hInputWrite, 0)); vp_stack_push_num(&_result, "%d", hstdout ? 0 : _open_osfhandle((size_t)hOutputRead, _O_RDONLY)); if (npipe == 3) vp_stack_push_num(&_result, "%d", hstderr ? 0 : _open_osfhandle((size_t)hErrorRead, _O_RDONLY)); return vp_stack_return(&_result); }