Newsgroup: it.comp.programmare.win32
Titolo: Programma scioccante!

Ne ho le palle piene di questi "siti scioccanti".
Più che altro mi rode vedere che le persone educate sono impotenti contro
gli stronzi.
Tempo fa chiesi su it.news.net-abuse se si potessero cancellare messaggi
contenenti esclusivamente messaggi promozionali (per di più Off Topic).
Mi risposero di sì (anzi, avremmo fatto loro un favore, vista tutta
l'immondizia che
c'è in giro).
Io contribuisco con questo piccolo programma. E' soltanto un piccolo
in-memory-patch per OE: in questo modo Message->Cancel Message sarà sempre
abilitato.
Se il primo che vedesse un post "scioccante" lo cancellasse, risparmierebbe
a tutti gli altri di vederlo.
Temo che dovrete reindentare un po' il codice.
Dimenticavo: il codice è da intendersi a scopo didattico!
#include <windows.h>
#include <cstdio>
#include <tlhelp32.h>
//#define for if(0);else for
// cerca b in a (non ottimizzata, ma semplice)
int find(char *a, int an, char *b, int bn)
{
 for (int i = 0; i < an; i++)
 {
  if (a[i] == b[0])
  {
   int j, k;
   for (j = i, k = 0; (j < an) & (k < bn); j++, k++)
   {
    if (a[j] != b[k]) break;
   }
   if (k == bn) return i;
  }
 }
 return -1;
}
int WINAPI WinMain(HINSTANCE hThis, HINSTANCE hPrev, LPSTR Args, int
nWinMode)
{
 HKEY hkey;
 if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Outlook Express",
&hkey) != ERROR_SUCCESS)
 {
  MessageBox(0, "Assicurarsi che Outlook Express\nsia installato
correttamente!", "by Kiuhnm", MB_ICONSTOP);
  return 0;
 }
 char buf[512];
 int bufsize = 512;
 if (RegQueryValueEx(hkey, "InstallRoot", 0, 0, (BYTE *)buf, (DWORD
*)&bufsize) != ERROR_SUCCESS)
 {
  MessageBox(0, "Assicurarsi che Outlook Express\nsia installato
correttamente!", "by Kiuhnm", MB_ICONSTOP);
  return 0;
 }
 strcat(buf, "\\msimn.exe");
 char path[512];
 ExpandEnvironmentStrings(buf, path, 512);
 GetShortPathName(path, buf, 512);
 // Controlla se msimn.exe è già in memoria
 HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (hsnap == INVALID_HANDLE_VALUE)
 {
  MessageBox(NULL, "Errore in CreateToolhelp32Snapshot!", "ERRORE!",
MB_ICONERROR);
  return 0;
 }
 PROCESSENTRY32 pe32;
 int ris = Process32First(hsnap, &pe32);
 while (ris)
 {
  if (!strcmp(pe32.szExeFile, "msimn.exe"))
   break;
  ris = Process32Next(hsnap, &pe32);
 }
 CloseHandle(hsnap);
 if (ris)
 {
  MessageBox(NULL, "OE presente in memoria: patch non applicato!", "SECURITY
ERROR!", MB_ICONERROR);
  return 0;
 }
 // Esegue msimn.exe
 STARTUPINFO startinfo;
 PROCESS_INFORMATION pinfo;
 startinfo.cb = sizeof(STARTUPINFO);
 startinfo.lpReserved = NULL;
 startinfo.lpDesktop = NULL;
 startinfo.lpTitle = NULL;
 startinfo.dwFlags = STARTF_USESHOWWINDOW;
 startinfo.cbReserved2 = 0;
 startinfo.lpReserved2 = NULL;
 startinfo.wShowWindow = SW_SHOW;
 if (CreateProcess(NULL, buf,
     NULL, NULL, 0, 0, NULL, NULL,
     &startinfo, &pinfo) == FALSE)
 {
  MessageBox(NULL, "File non trovato!", "ERRORE!", MB_ICONERROR);
  return 0;
 }
 WaitForInputIdle(pinfo.hProcess, INFINITE);
 hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pinfo.dwProcessId);
 if (hsnap == INVALID_HANDLE_VALUE)
 {
  MessageBox(NULL, "Non è stato possibile applicare il patch!", "ERRORE!",
MB_ICONERROR);
  CloseHandle(pinfo.hThread);
  CloseHandle(pinfo.hProcess);
 }
 MODULEENTRY32 me32;
 ris = Module32First(hsnap, &me32);
 while (ris)
 {
  if (!stricmp("msoe.dll", me32.szModule))
   break;
  ris = Module32Next(hsnap, &me32);
 }
 CloseHandle(hsnap);
 if (ris)
 {
  // Applica il patch a "msoe.dll"
  DWORD cur_addr = (DWORD)me32.modBaseAddr;
  DWORD bread;
  BYTE *dest_buf = new BYTE[0x1000+0x10];
  int size;
  for (;;)
  {
   // Il codice da modificare si trova nella prima sezione (".text").
   // Leggendo i dati pagina (4 KB) per pagina si è in grado di leggere
l'intera
   // sezione senza conoscerne la dimensione effettiva.
   size = 0;
   if (!ReadProcessMemory(pinfo.hProcess, (BYTE *)cur_addr, dest_buf,
0x1000, &bread))
    break;
   size = bread;
   if (ReadProcessMemory(pinfo.hProcess, (BYTE *)cur_addr+bread,
dest_buf+bread, 0x10, &bread))
    size += bread;
   int pos;
   pos = find((char *)dest_buf, size,
"\xff\xd3\x8b\xf8\xf7\xdf\x1b\xff\x47\x8b\x45", 11);
   if (pos != -1)
   {
    // Modifica alcuni bytes
    ReadProcessMemory(pinfo.hProcess, (BYTE *)cur_addr+pos-0x2a, dest_buf,
0x2a+4, &bread);
    // Check
    size = 0;
    if (dest_buf[0] != 0x75 || dest_buf[0x2a+2] != 0x8b ||
dest_buf[0x2a+2+1] != 0xf8)
     break;
    // jne -> inc eax | dec eax
    dest_buf[0] = 0x40;
    dest_buf[1] = 0x48;
    // mov edi, eax -> xor edi, edi
    dest_buf[0x2a+2] = 0x33;
    dest_buf[0x2a+2+1] = 0xff;
    WriteProcessMemory(pinfo.hProcess, (BYTE *)cur_addr+pos-0x2a, dest_buf,
0x2a+4, &bread);
    size = 1;
    break;
   }
   cur_addr += 0x1000;
  }
  delete[] dest_buf;
  // Size viene usato anche come flag
  if (!size)
  {
   MessageBox(NULL, "Non è stato possibile applicare il patch\na questa
versione di OE!", "ERRORE!", MB_ICONERROR);
  }
 }
 else
 {
  MessageBox(NULL, "Non è stato possibile applicare il patch\na questa
versione di OE!", "ERRORE!", MB_ICONERROR);
 }
 CloseHandle(pinfo.hThread);
 CloseHandle(pinfo.hProcess);
 return 1;
}
Kiuhnm


Senti, un'altra cosa.
Ho installato il tuo patch ed ho appena fatto la richiesta di cancellazione
di uno dei tanti messaggi porno spam immondizia.
A questo punto per vederlo cancellato veramente che condizioni ci vogliono,
visto che il messaggio mi dice che la richiesta e' stata inoltrata e dovrei
aspettare del tempo per vederlo cancellato?
Mi sembra che una condizione sia che la richiesta di cancellazione debba
partire dopo non piu' di tot tempo dall'apparizione del messaggio.
Maurus

 messaggio.
Bravo, la cancellazione è andata a buon fine :-)))
Prova a cliccare su it.comp.programmare.win32 col tasto destro, scegli
Properties, Local File e quindi Remove Messages. Non ti preoccupare:
cancellerà soltanto il corpo dei messaggi, ma non gli header (non lo noterai
nemmeno insomma).
Ora clicca su sul messaggio che hai cancellato (l'header l'hai ancora tra i
tuoi file locali) e...
Ovviamente chi si connetterà al ng DOPO che tu avrai eseguito la
cancellazione, non scaricherà lo spam già in partenza quindi non dovrà fare
tutto sto lavoro.
Questo ti serve soltanto per verificare il patch funzioni.
Kiuhnm