domingo, 21 de junio de 2009

ld09.exe y podmena

Al parar el ordenador me pregunta "¿desea matar a cmd.exe, que tarda mucho?".
¿uh? si no tengo ninguna línea de comando abierta.

Lanzo el Administrador de Tareas y veo multipleas instancias de cmd.exe y un proceso iexplore.exe
Raro, porque yo uso Firefox.

Al intentar ejecutar "regedit" desde Inicio->Ejecutar se reiniciaba el Explorador.
Uf, mala pinta.
Pruebo a ejecutar "regedit" desde el administrador de tareas y también se muere.
Uf, mal rollito seguro.

Tengo gran aprecio al Process Explorer y desde ahí ya puedo lanzar con éxito a regedit.
Nos vamos a
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run

Y lo que canta bastante (porque no me suena de nada) es "ld09.exe"

Google nos da una página en blanco para LD09.exe
http://www.prevx.com/filenames/X1867469537856748618-X1/LD09.EXE.html

Pero la versión en la caché sí es más interesante:
http://209.85.229.132/search?q=cache:L30I0qUVx80J:www.prevx.com/filenames/X1867469537856748618-X1/LD09.EXE.html+ld09&cd=3&hl=es&ct=clnk&gl=es&client=firefox-a

Es un informe muy exhaustivo de lo que hace el virus éste.
Pone lo que hace, pero no cómo quitarlo, ya que la misma página aprovecha para venderte su antivirus.
Me entra la duda ¿serán ellos los autores del virus? A ver si su antivirus es otro virus peor ...

Bueno, en cualquiera caso la descripción de lo que hace me permite deshacer bastante:

Borré
c:\windows\ld09.exe
c:\program files\podmena\podmena.sys
c:\program files\podmena\podmena.dll


Fuí al Panel de Control, y desde el Firewall de Windows, quité al accesso a podmena.
Borré la entrada "ld09.exe" del registro
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run\

Y borre las ramas del registro
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\podmena
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\drv_podmena


Cruzamos dedos (lo más fácil al tocar el registro con tanta inconsciencia es que no arranque) y reiniciamos.

Bueno, superamos el arranque. Aunque seguimos con múltiples cmd.exe e iexplore.exe

Hala, a mirar con más atención a
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run

Ajá: hay un "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe" y no tiene mucho sentido que el ayudante de conexión a internet se ejecute en cada arranque.

Pues nada, borramos a "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe"
y quitamos su entrada de "icwsetup.exe" del registro:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run\

Y reiniciamos. Pues que si quieres arroz, Catalina.

¡El muy cuco! (usaría otra expresión, pero al crear el blog marqué la casilla de contenido apto para todos públicos).
Resulta que ha vuelto a poner a "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe" como estaba.

Otro intento, cogemos a "notepad.exe" y lo copiamos con otro nombre, casualmente "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe"

Y reiniciamos. Je, je, esta vez sale una bonita ventana de "notepad" al arrancar, y no tenemos ya a los múltiples cmd.exe.

Bueno, aunque el PC sigue malito, ya tenemos controlada la infección.
Otro día toca erradicarla.

domingo, 14 de junio de 2009

Compilar para Windows desde Cygwin (II)

Vamos a compilar a libGD para Windows.

Nos traemos el código fuente:
wget http://www.libgd.org/releases/gd-2.0.36RC1.tar.bz2

Lo desempaquetamos:
tar jxvf gd-2.0.36RC1.tar.bz2

Nos vamos a su directorio:
cd gd-2.0.36RC1

Y le ponemos el parche para aligerar libGD:
patch -p0 < ..patches/libgd.trim.1.diff

Podríamos compilar libpng, libjpeg y freetype desde su código fuente, pero vamos a bajarlos ya compilados desde Mplayer Win32.
Ojo, desempaquetamos cada cosa en su sitio (bibliotecas, includes y scripts de configuración) según la jerarquía de directorios que os comenté.

Lo configuro desactivando la creación de la la bilioteca dinámica, y sólo hará la enlazada estáticamente:

CC="gcc-3" CFLAGS="-mno-cygwin -DNONDLL=1" ./configure --disable-shared --prefix=/mingw --with-png=/mingw --with-freetype=/mingw --with-jpeg=/mingw --without-xpm --without-fontconfig

A construir:
make

Y ya está, sólo falta instalarlo:
make install

viernes, 12 de junio de 2009

Parches

Imagina que modificas el código fuente de alguna utilidad. Cada vez que se libere una nueva versión, tendrás que volver a modificarla.
Pero un virtuoso programador (por ende: vago, orgulloso e impaciente) ideó a patch

Así que primero guardas en un ficherito tus cambios:
diff -u source.c.original source.c > source.diff

Y luego puedes decir a patch que aplique esos cambios a la nueva versión:
patch < source.diff

Y por supuesto no está limitado a cambios en un solo fichero, puedes tener un directorio con la versión inicial, otro directorio con la versión modificada por tí, y luego aplicar los cambios a un tercer directorio.

Por ejemplo, aquí me entretuve en recortar cosillas que no necesitaba de la versión 2.0.36 de libGD, e hize un .diff que bautizaremos como libgd.trim.1.diff.

Cuendo esté disponible la versión 2.0.37, le aplicaré mi parche asi:

cd src/gd-2.0.37
patch -p0 < ..patches/libgd.trim.1.diff

miércoles, 10 de junio de 2009

Tamaño de imágenes

La utilidad de menor tamaño que he encontrado para conocer al ancho y alto de las imágenes (PNG, GIF, JPEG, XPM) es image_size

Trivial de compilar para Cygwin:
gcc image_size.c -s -o image_size

O para Windows:
gcc -mno-cygwin image_size.c -s -o image_size

Para usarlo, basta pasar los nombres de los ficheros, y nos devuelve el nombre y dimensiones de cada uno:
image_size *.png *.gif
demoin.png: 128 128
demoin.gif: 128 128

sábado, 6 de junio de 2009

Compilar para Windows desde Cygwin (I)

Cygwin es una excelente simulación de POSIX sobre Windows, lo que facilita compilar programs que vengan del mundillo Unix.
Aparte de programs para el propio entorno Cygwin, también permite compilar programas "puro-Windows", que no dependan de la biblioteca de funciones cygwin1.dll.

Básicamente, sólo hay que añadir el parámetro "-mno-cygwin" al compilar.

Hay unos pocos paquetes Cygwin que contienen bibliotecas puras de Windows (que procedecen del proyecto MinGW): mingw-runtime, mingw-zlib y mingw-bzip2, más sus versiones -devel para desarrollar.

Estos paquetes se instalan así:
  • /usr/include/mingw/ para los includes
  • /usr/lib/mingw/ para las bibliotecas.
Resulta conveniente que ambos directorios partan de la misma raiz, así que yo tengo un par de enlaces simbólicos:
  • /mingw/include -> /usr/include/mingw/
  • /mingw/lib -> /usr/lib/mingw/
También tengo /mingw/bin para guardar ejecutables puro-Windows o scripts de configuración de las bibliotecas puro-Windows.

Vamos, que ejecuté estos comandos:

mkdir -p /mingw/bin
ln -s /usr/include/mingw/ /mingw/include
ln -s /usr/lib/mingw/ /mingw/lib

martes, 2 de junio de 2009

Jeroglíficos


Mala fama tiene la línea de comando: inescrutable, críptica, y sólo apta para los iniciados en tan oscuro saber.

¿Qúe mejor para perpetuar esa fama que escribir jeroglíficos con comandos? ;-)

Ingredientes:
  • xgawk
  • un tipo de letra adecuado, Greywolf Glyphs
  • un sencillo script, que denominaremos jeroglífico.awk.
El sencillo script es éste, donde en lugar de comentarios he preferido poner "print" para ir mostrando los pasos:

@load gd

BEGIN {
MARGEN = 8
TAM_LETRA = 48
TIPO_LETRA = "GWGLYPTT.ttf"
if (!("GDFONTPATH" in ENVIRON)) {
print "\n¡¡Recuerda definir GDFONTPATH!!\nHaz algo parecido a ...\n"
print "GDFONTPATH=/cygdrive/c/WINDOWS/Fonts/:/usr/X11R6/lib/X11/fonts/TTF/; export GDFONTPATH\n"
print "... y vuelve a lanzarme."
exit
}

print "Averiguamos el ancho que ocupa nuestro texto"
err = gdImageStringFT("", brect, 0, TIPO_LETRA, TAM_LETRA, 0.0, 0, 0, txt)
if (err) {
print err
print "\nEl tipo de letra Greywolf Glyphs está en:"
print "http://greywolf.critter.net/fonts.htm"
exit
}
ancho = brect[2]-brect[6] + MARGEN

print "Averiguamos el trazo más alto y el más bajo del tipo de letra"
err = gdImageStringFT("", brect, 0, TIPO_LETRA, TAM_LETRA, 0.0, 0, 0, "|ÑILMgf_q")
alto = brect[3]-brect[7] + MARGEN
base = -brect[7]

print "Creamos una imagen, del tamaño de nuestro texto"
im = gdImageCreateTrueColor(ancho, alto)

print "Definimos el color marrón"
marron = gdImageColorAllocate(im, 204, 153, 51)

print "Rellenamos de marrón"
gdImageFilledRectangle(im, 0, 0, ancho, alto, marron)

print "Definimos el color lila"
lila = gdImageColorAllocate(im, 128, 0, 255)

print "Dibujamos el texto en lila"
x = MARGEN/2
y = base + MARGEN/2
err=gdImageStringFT(im, brect, lila, TIPO_LETRA, TAM_LETRA, 0.0, x, y, txt)

print "Guardamos el resultado"
gdImagePngName(im, salida)

print "Destruímos la imagen"
gdImageDestroy(im)

print "¡Eso es todo, amigos!"
}


Luego invocamos el comando:
xgawk -f jeroglifico.awk -vtxt="Maravilloso" -vsalida=texto_egipcio.png

Y ya tenemos la imagen.

Bueno, la verdad es que la he recomprimido un poquito más (un 38%), con el comando:
pngcrush.exe -brute texto_egipcio.png texto_egipcio2.png

lunes, 1 de junio de 2009

Termostatos e impaciencia

Ahora que se avecina el verano, no está de más recordar que poner al mínimo el termostato en absoluto acelera que lleguemos a la temperatura de confort.
La causa es que los aparatos de aire acondicionado o están apagados o funcionan a plena potencia (salvo que sean "inverter").

Y lo mismo pasa en invierno: poner al máximo el termostato no hace que lleguemos antes a una temperatura agradable, porque las calderas (todas) o están apagadas o funcionan a plena potencia.

Vamos, que son dispositivos digitales, y el verdadero control de su potencia promedio se hace variando la relación entre el tiempo que permanecen encendidos y el tiempo que están apagados.