Newsgroup: it.comp.programmare.win32
Titolo: <<< ANTI - WORM [WIN32NAPP] --- SOURCE CODE --- >>>

E' da un bel po' che non visito più i ng, dato che sono troppo impegnato col
micro sistema operativo (sì, ancora sui metodi di sincronizzazione lock e
wait-free...).
Ieri ho installato un antivirus freeware (di cui francamente non ricordo il
nome) e da quel momento sono iniziati un sacco di problemi...icone delle
applicazioni completamente bianche (azzurre, in realtà), rallentamenti,
ecc... che l'antivirus stesso fosse infetto???
In seguito mi sono installato un antivirus commerciale (norton), ma anche
con tutti gli update non mi ha rilevato nessun virus...strano...che sia un
nuovo worm???
Penso proprio di sì!
Questo bastardo si presenta come un file c:\win32napp.exe e un file ".exe"
(esatto! Ha solo l'estensione: la CreateFile lo permette), aggiunge un
valore nella chiave "Run" (registro) e infetta file .exe e .mp3 (che
trasforma in .mp3.exe).
I file .exe sono recuperabili (integralmente), ma gli mp3 purtroppo sono
stati sovrascritti completamente qiundi c'è veramente poco da fare.
Questo Worm è stato programmato così tanto male (in Visual Basic se non
ricordo male!!!) da fare più danni di quelli che vorrebbe fare in realtà
:-)))
Il codice è stato testato solo sul mio computer (e ora funziona tutto
bene...anche le icone, dopo un po', sono tornate a posto).
PER FAVORE, leggete il codice prima di usarlo!
L'ho scritto in 2 giorni e ho finito un quarto d'ora fa!
Kiuhnm
P.S. Buon Natale a tutti!
-------------- CODE --------------
Come al solito è indentato malissimo, ma farete di certo prima a
reindentarlo che a scriverlo da zero.
/* By Kiuhnm
NON MI ASSUMO NESSUNA RESPONSABILITÀ RIGUARDO A DANNI DERIVANTI
DALL'UTILIZZO DI QUESTO CODICE.
L'ho testato solo su un WinXP Pro (il mio).
Questo programma riesce a recuperare tutti i file .exe (non ci vuole poi
tanto), però tronca tutti i file
mp3 infettati, dato che sono stati praticamente sovrascritti dal Worm (in
pratica *sono* una copia del Worm).
Ho deciso di troncare i file (a 0 bytes) in modo che l'utente possa rendersi
conto (facendo una dir) di quali
file ha perso. */
/* PRIMA FATE ALCUNE PROVE RESTRINGENDO L'ANALISI A UNA DIRECTORY CON POCHI
FILE!!! */
#include "windows.h"
#include <tlhelp32.h>
#include <iostream>
#include <fstream>
using namespace std;
int CleanReg();
int CleanMemory();
int find(char *a, int an, char *b, int bn);
void LogError(char *str);
int Remove(char *p);
DWORD WINAPI PMCleaner(LPVOID v);
char SIGNATURE[] = "---DEVILSTILLSMELLSME---";
char LOG_FILE[] = "log.txt";
int main()
{
 char buf[1024];
 char root[1024];
 if (MessageBox(0, "Rimuovere Worm Win32napp?", "W32N_REM", MB_YESNO) ==
IDYES)
 {
  DeleteFile(LOG_FILE);
  cout << "Inserire la directory principale all'interno della quale eseguire
l'analisi" << endl
    << "Per es:" << endl
    << "  c:\\" << endl
    << "> ";
  cin.getline(root, sizeof(root));
  DWORD attr = GetFileAttributes(root);
  if (attr != 0xffffffff && (attr & FILE_ATTRIBUTE_DIRECTORY))
  {
   cout << endl;
   cout << "Installing Periodic Cleaner...";
   DWORD thid;
   HANDLE hth = CreateThread(0, 0, PMCleaner, root, 0, &thid);
   if (hth)
    cout << "OK" << endl;
   else
    cout << "ERROR" << endl;
   cout << endl << "*Cleaning*" << endl << endl;
   cout << "Cleaning Reg...";
   int ris = CleanReg();
   if (ris == -1)
    cout << "NOT FOUND [*UN*EXPECTED]" << endl;
   else if (ris == -2)
    cout << "NOT FOUND [EXPECTED]" << endl;
   else  // ris = 0
    cout << "OK" << endl;
   char *fname;
   GetFullPathName(root, sizeof(buf), buf, &fname);
   buf[3] = 0;
   lstrcat(buf, "win32napp.exe");
   cout << "Deleting [" << buf << "]...";
   if (DeleteFile(buf))
    cout << "OK" << endl;
   else
    cout << "NOT FOUND [EXPECTED]" << endl;
   cout << "Cleaning Memory...";
   if (CleanMemory())
    cout << "OK" << endl;
   else
    cout << "ERROR" << endl;
   Remove(root);
   // Ancora (per sicurezza)
   cout << endl << "*Re-cleaning*" << endl << endl;
   cout << "Cleaning Reg...";
   ris = CleanReg();
   if (ris == -1)
    cout << endl << "NOT FOUND [*UN*EXPECTED]" << endl;
   else if (ris == -2)
    cout << "NOT FOUND [EXPECTED]" << endl;
   else  // ris = 0
    cout << "OK" << endl;
   GetFullPathName(root, sizeof(buf), buf, &fname);
   buf[3] = 0;
   lstrcat(buf, "win32napp.exe");
   cout << "Deleting [" << buf << "]...";
   if (DeleteFile(buf))
    cout << "OK" << endl;
   else
    cout << "NOT FOUND [EXPECTED]" << endl;
   cout << "Cleaning Memory...";
   if (CleanMemory())
    cout << "OK" << endl;
   else
    cout << "ERROR" << endl;
   cout << endl;
   cout << "Removing Periodic Cleaner...";
   if (TerminateThread(hth, 0))
    cout << "OK" << endl;
   else
    cout << "ERROR" << endl;
   CloseHandle(hth);
   cout << endl;
   MessageBox(0, "Please examine \"log.txt\" and delete residual \"tmp.exe\"
files!\n(You must be sure that these have been created by the worm!!!)", "",
MB_OK);
  }
  else cout << endl << "Invalid Directory!" << endl << endl;
 }
 return 0;
}
// 0 = OK
// -1 = "Run" not found
// -2 = "win32napp" not found
int CleanReg()
{
 HKEY hkey;
 DWORD disp;
 if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", 0, 0, 0,
KEY_ALL_ACCESS, 0, &hkey, &disp) == ERROR_SUCCESS)
 {
  if (RegDeleteValue(hkey, "win32napp") == ERROR_SUCCESS)
   return 0;
  else
  {
   return -2;
  }
 } else return -1;
}
DWORD WINAPI PMCleaner(LPVOID v)
{
 char buf[1024];
 char *root = (char *)v;
 for (;;)
 {
  CleanReg();
  char *fname;
  GetFullPathName(root, sizeof(buf), buf, &fname);
  buf[3] = 0;
  lstrcat(buf, "win32napp.exe");
  DeleteFile(buf);
  CleanMemory();
  Sleep(500);
 }
 return 0;
}
// Termina ogni processo del Worm.
int CleanMemory()
{
 HWND hwnd;
 DWORD pid;
 do
 {
  hwnd = FindWindow("ThunderRT6Main", "win32napp");
  if (hwnd)
  {
   if (GetWindowThreadProcessId(hwnd, &pid))
   {
    HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    if (hproc)
     TerminateProcess(hproc, -1);
   }
  }
 } while (hwnd);
 return 1;  // non fallisce mai!
}
// cerca b in a
int find(char *a, int an, char *b, int bn)
{
  for (int i = 0; i < an; i++)
  {
 if (a[i] == b[0])
 {
   for (int j = i, k = 0; (j < an) & (k < bn); j++, k++)
   {
     if (a[j] != b[k]) break;
   }
   if (k == bn) return i;
 }
  }
  return -1;
}
int Remove(char *p)
{
 int cur_sign = 0;
 ofstream of;
 char path[1024];
 WIN32_FIND_DATA w32fd;
 lstrcpy(path, p);
 int l = lstrlen(path);
 if (path[l-1] != '\\')
 {
  path[l] = '\\';
  path[l+1] = 0;
  l++;
 }
 lstrcpy(path+l, "*.*");
 HANDLE hf = FindFirstFile(path, &w32fd);
 if (hf != INVALID_HANDLE_VALUE)
 {
  do
  {
   if (lstrcmpi(w32fd.cFileName, ".") && lstrcmpi(w32fd.cFileName, ".."))
   {
    lstrcpy(path+l, w32fd.cFileName);
    if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
     lstrcat(path, "\\");
     Remove(path);
    }
    else if (!lstrcmpi(path + strlen(path)-4, ".exe"))
    {
     // Se togliete il NOT cancellate tutti file :)))
     if (!lstrcmpi(w32fd.cFileName, ".exe"))
     {
      cout << "Deleting [" << path << "]...";
      if (DeleteFile(path))
       cout << "OK" << endl;
      else cout << "ERROR" << endl;
     }
     else if (!lstrcmpi(path + strlen(path)-8, ".mp3.exe"))
     {
      DeleteFile(path);
      int l = strlen(path);
      path[l-4] = 0;
      cout << "Truncating [" << path << "]...";
      HANDLE htmp = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, 0);
      if (htmp != INVALID_HANDLE_VALUE)
      {
       cout << "OK" << endl;
       CloseHandle(htmp);
      }
      else cout << "ERROR" << endl;
     }
     else
     {
      HANDLE hf = CreateFile(path, GENERIC_READ, 0, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
      if (hf != INVALID_HANDLE_VALUE)
      {
       int fsize = GetFileSize(hf, 0);
       HANDLE hm = CreateFileMapping(hf, 0, PAGE_READONLY, 0, 0, 0);
       CloseHandle(hf);
       if (hm)
       {
        char *fptr = (char *)MapViewOfFile(hm, FILE_MAP_READ, 0, 0, 0);
        CloseHandle(hm);
        if (fptr)
        {
         int off;
         // Cerca la signature
         if ((off = find(fptr, fsize, SIGNATURE, sizeof(SIGNATURE)-1))
!= -1)
         {
          char tmp_file[1024];
          off += sizeof(SIGNATURE)-1;
          /* Controlla che il file originale sia un EXE MZ/PE */
          char *cur = fptr + off;
          int ris = 0;
          if (cur[0] == 'M' && cur[1] == 'Z')
          {
           cout << "Recovering [" << path << "]...";
           strcpy(tmp_file, path);
           lstrcat(tmp_file, ".tmp");
           // Crea file temp
           HANDLE ho = CreateFile(tmp_file, GENERIC_WRITE, 0, 0, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, 0);
           if (ho != INVALID_HANDLE_VALUE)
           {
            // "Estrae" file originale
            DWORD written;
            if (WriteFile(ho, fptr+off, fsize-off, &written, 0))
            {
             CloseHandle(ho);
             UnmapViewOfFile(fptr);
             fptr = 0;
             // Cancella file infetto
             DeleteFile(path);
             // Rinomina file temp (se mp3, rimuove .exe)
             int l = strlen(path);
             MoveFile(tmp_file, path);
             cout << "OK" << endl;
            }
            else // ERROR
            {
             CloseHandle(ho);
             cout << "WriteFile error" << endl;
             of.open(LOG_FILE, ios::app);
             if (of.is_open())
             {
              of << "WriteFile error [" << path << "]" << endl;
              of.close();
             }
             cout << "ERROR" << endl;
            }
           }
           else // ERROR
           {
            cout << "CreateFile-WRITE error" << endl;
            of.open(LOG_FILE, ios::app);
            if (of.is_open())
            {
             of << "CreateFile-WRITE error [" << path << "]" << endl;
             of.close();
            }
            cout << "ERROR" << endl;
           }
          }
          else // ERROR
          {
           cout << "Strange File or Condivision Error [" << path << "]" <<
endl;
           of.open(LOG_FILE, ios::app);
           if (of.is_open())
           {
            of << "Strange File [" << path << "]" << endl;
            of.close();
           }
          }
         }
         else
         {
          switch (cur_sign)
          {
           case 0:
            cout << "-\r";
            break;
           case 1:
            cout << "/\r";
            break;
           case 2:
            cout << "|\r";
            break;
           default:
            cout << "\\\r";
            break;
          }
          cur_sign = (cur_sign + 1) % 4;
         }
        }
        if (fptr)
         UnmapViewOfFile(fptr);
       }
       else // ERROR
       {
        cout << "CreateFileMapping error [" << path << "]" << endl;
        of.open(LOG_FILE, ios::app);
        if (of.is_open())
        {
         of << "CreateFileMapping error [" << path << "]" << endl;
         of.close();
        }
       }
      }
      else // ERROR
      {
       cout << "CreateFile-READ error [" << path << "]" << endl;
       of.open(LOG_FILE, ios::app);
       if (of.is_open())
       {
        of << "CreateFile-READ error [" << path << "]" << endl;
        of.close();
       }
      }
     }
    }
   }
  } while (FindNextFile(hf, &w32fd));
 }
 return 1;
}

 nuovo worm???
http://vil.nai.com/vil/content/v_99909.htm
--
Lorenzo


Ci sono già stato...i motori di ricerca li so usare anch'io :-)))
Comunque mi stupisce che il NAV non lo rilevi.
Kiuhnm

Ho modificato il codice (vedi SIGNATURE) in modo che non sembri infetto
(strange file error).
/* By Kiuhnm
Ver. 1.1a
NON MI ASSUMO NESSUNA RESPONSABILITÀ RIGUARDO A DANNI DERIVANTI
DALL'UTILIZZO DI QUESTO CODICE.
L'ho testato solo su un WinXP Pro (il mio).
Questo programma riesce a recuperare tutti i file .exe (non ci vuole poi
tanto), però tronca tutti i file
mp3 infettati, dato che sono stati praticamente sovrascritti dal Worm (in
pratica *sono* una copia del Worm).
Ho deciso di troncare i file (a 0 bytes) in modo che l'utente possa rendersi
conto (facendo una dir) di quali
file ha perso. */
/* PRIMA FATE ALCUNE PROVE RESTRINGENDO L'ANALISI A UNA DIRECTORY CON POCHI
FILE!!! */
#include "windows.h"
#include <tlhelp32.h>
#include <iostream>
#include <fstream>
using namespace std;
int CleanReg();
int CleanMemory();
int find(char *a, int an, char *b, int bn);
void LogError(char *str);
int Remove(char *p);
DWORD WINAPI PMCleaner(LPVOID v);
// NOTA:
// Per ottenere la signature corretta sostituire '*' con '-'. Questo serve
per evitare che w32napp_rem.exe
// sembri infetto!!! (Strange File Error)
char SIGNATURE[] = "*--DEVILSTILLSMELLSME---";
char LOG_FILE[] = "log.txt";
int main()
{
 char buf[1024];
 char root[1024];
 // Corregge la signature
 SIGNATURE[0] = '-';






   Remove(root);



   cout << endl;

   cout << endl;



 for (;;)
 {
  CleanReg();

  Sleep(500);
 }
 return 0;
}








          off += sizeof(SIGNATURE)-1;



             UnmapViewOfFile(fptr);
             fptr = 0;





           cout << "Strange File [" << path << "]" << endl;


 Comunque mi stupisce che il NAV non lo rilevi.
Una mancanza. Oltre tutto non l'hanno ancora incluso neppure nella 
release dei virus update in data odierna (23/12).
Lou


Non lo ritengono un virus/worm degno di nota?
Effettivamente non č cosě cattivo, perň ti sovrascrive un bel po' di mp3 e
dato che č programmato abbastanza male incide molto sulle prestazioni.
Kiuhnm

 Non lo ritengono un virus/worm degno di nota?
[OT]
Non credo che sia quello, o almeno spero di no. Comunque qui possiamo 
fare solo puro opinionismo, tipo "forse non hanno ancora ricevuto 
lamentele sufficienti".
Magari puoi segnalare loro il problema.
Lou