<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Weblog de Madelman &#187; Spam</title>
	<atom:link href="http://elligre.tk/madelman/index.php/archivos/category/spam/feed/" rel="self" type="application/rss+xml" />
	<link>http://elligre.tk/madelman</link>
	<description>Weblog sobre seguridad</description>
	<lastBuildDate>Wed, 05 Nov 2008 16:10:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Como leer los datos del fichero training.dat</title>
		<link>http://elligre.tk/madelman/index.php/archivos/2005/12/01/como-leer-los-datos-del-fichero-trainingdat/</link>
		<comments>http://elligre.tk/madelman/index.php/archivos/2005/12/01/como-leer-los-datos-del-fichero-trainingdat/#comments</comments>
		<pubDate>Thu, 01 Dec 2005 18:02:19 +0000</pubDate>
		<dc:creator>madelman</dc:creator>
				<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://elligre.tk/madelman/index.php/archivos/2005/12/01/como-leer-los-datos-del-fichero-trainingdat/</guid>
		<description><![CDATA[Una de las ventajas de los programas de código abierto es que permiten estudiar su código, sus algoritmos y los formatos de los ficheros que utilizan. Por ello, resulta bastante sencillo hacer un pequeño programa que interprete los datos del fichero training.dat, de forma que podremos ver los valores (igual que hacíamos con el Bayes [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las ventajas de los programas de código abierto es que permiten estudiar su código, sus algoritmos y los formatos de los ficheros que utilizan. Por ello, resulta bastante sencillo hacer un pequeño programa que interprete los datos del fichero training.dat, de forma que podremos ver los valores (igual que hacíamos con el <a href="http://elligre.tk/madelman/index.php/archivos/2005/11/29/donde-guarda-thunderbird-los-datos-del-spam-trainingdat/">Bayes Junk Tool</a>) o tratarlos nosotros.</p>
<p>Si tenemos interés en las técnicas de detección de spam, este es un fichero interesante de analizar y permite realizar fácilmente pruebas de diferentes algoritmos de detección.</p>
<p><span id="more-241"></span></p>
<p>El formato del fichero es el siguiente:</p>
<pre>[0xFEEDFACE]
[number good messages][number bad messages]
[number good tokens]
[count][length of word]word
...
[number bad tokens]
[count][length of word]word
...
</pre>
</p>
<p>Donde los valores están guardados con 4 bytes en formato Big Endian.</p>
<p>Dejo aquí un ejemplo de lectura del fichero que nos muestra los 10 tokens de spam con un valor más alto. El resultado con mi training.dat es el siguiente:</p>
<pre>[2071, mime-version:1.0]
[1592, and]
[1435, for]
[1117, with]
[1017, have]
[959, envelope-to:madelman@unservidor.com]
[913, our]
[864, x-scaned-fib:antivirus/antispam en otroservidor.es]
[812, not]
[757, will]
[724, x-original-to:e9999999@otroservidor.es]
[684, more]
</pre>
<p><p>Si quereis podeis enviarme vuestros resultados para comparar diferentes valores y los subiré en una próxima nota.</p>
<p><a href="http://elligre.tk/madelman/imagenes/read_training.cpp">File Attachment: read_training.cpp (3 KB)</a></p>
<p><a href="http://elligre.tk/madelman/imagenes/read_training.exe">File Attachment: read_training.exe (428 KB)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://elligre.tk/madelman/index.php/archivos/2005/12/01/como-leer-los-datos-del-fichero-trainingdat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Donde guarda Thunderbird los datos del spam: training.dat</title>
		<link>http://elligre.tk/madelman/index.php/archivos/2005/11/29/donde-guarda-thunderbird-los-datos-del-spam-trainingdat/</link>
		<comments>http://elligre.tk/madelman/index.php/archivos/2005/11/29/donde-guarda-thunderbird-los-datos-del-spam-trainingdat/#comments</comments>
		<pubDate>Tue, 29 Nov 2005 09:54:48 +0000</pubDate>
		<dc:creator>madelman</dc:creator>
				<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://elligre.tk/madelman/index.php/archivos/2005/11/29/donde-guarda-thunderbird-los-datos-del-spam-trainingdat/</guid>
		<description><![CDATA[Para que Thunderbird pueda clasificar nuestros correos en spam y ham necesita tener una lista de tokens con sus probabilidades. Esta lista está inicialmente vacia y se crea entrenando a Thunderbird, es decir, diciendole cuales de nuestros mensajes son ham y cuales son spam. Habitualmente, con repetir este proceso con el correo que recibamos en [...]]]></description>
			<content:encoded><![CDATA[<p>Para que Thunderbird pueda clasificar nuestros correos en spam y ham necesita tener una lista de tokens con sus probabilidades. Esta lista está inicialmente vacia y se crea entrenando a Thunderbird, es decir, diciendole cuales de nuestros mensajes son ham y cuales son spam. Habitualmente, con repetir este proceso con el correo que recibamos en tres o cuatro días el programa ya será capaz de clasificar con un alto grado de fiabilidad.</p>
<p>Esta lista de palabras se guarda en nuestro directorio de profile (en mi caso &#8220;c:\Documents and Settings\madelman\Datos de programa\Thunderbird\Profiles\default.ph9&#8243;) en el fichero training.dat. Este fichero no es directamente visible ni editable, pero podemos tratarlo gracias a <a href="http://bayesjunktool.mozdev.org/index.html">Bayes Junk Tool</a>, una herramienta en Java que permite realizar modificaciones del fichero.</p>
<p><span id="more-240"></span></p>
<p>Una vez nos hayamos bajado Bayes Junk Tool lo ejecutamos (necesita un runtime de Java) con:</p>
<pre>set classpath=bayesjunktool-0.2.1.jar
java mozilla_training_analyzer.Analyzer</pre>
<p><p>Desde el programa seleccionamos nuestro fichero&nbsp;training.dat, el cual cargará y nos lo mostrará por pantalla.</p>
<p><a href="http://elligre.tk/madelman/imagenes/bayes1.png"><img height="267" alt="Bayes1" src="http://elligre.tk/madelman/imagenes/bayes1_thumb.jpg" width="320" vspace="5" border="0" /></a></p>
<p>Con este programa podemos ver todas las palabras con las que Thunderbird intentará clasificar nuestro correo, el número de veces que han aparecido tanto en mensajes ham como en mensajes spam y la probabilidad de cada una. También permite modificar este fichero, añadir y quitar palabras e incluso modificar el número de apariciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://elligre.tk/madelman/index.php/archivos/2005/11/29/donde-guarda-thunderbird-los-datos-del-spam-trainingdat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algoritmo de detección de spam en Thunderbird</title>
		<link>http://elligre.tk/madelman/index.php/archivos/2005/11/28/algoritmo-de-deteccion-de-spam-en-thunderbird/</link>
		<comments>http://elligre.tk/madelman/index.php/archivos/2005/11/28/algoritmo-de-deteccion-de-spam-en-thunderbird/#comments</comments>
		<pubDate>Mon, 28 Nov 2005 11:56:05 +0000</pubDate>
		<dc:creator>madelman</dc:creator>
				<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://elligre.tk/madelman/index.php/archivos/2005/11/28/algoritmo-de-deteccion-de-spam-en-thunderbird/</guid>
		<description><![CDATA[En&#160;la nota&#160;anterior A plan for spam&#160;explicaba el algoritmo genérico que propuso Paul Graham para la detección de spam y comentaba que el de Thunderbird es una implementación ligeramente modificada de este. Veamos entonces como funciona.
El algoritmo está implementado en el fichero mozilla\mailnews\extensions\bayesian-spam-filter\src\nsBayesianFilter.cpp concretamente en la función classifyMessage. Para hacerlo más sencillo de entender lo pasaré [...]]]></description>
			<content:encoded><![CDATA[<p>En&nbsp;la nota&nbsp;anterior <a href="http://elligre.tk/madelman/index.php/archivos/2005/11/27/a-plan-for-spam-detectar-spam-con-filtrado-bayesiano/">A plan for spam</a>&nbsp;explicaba el algoritmo genérico que propuso Paul Graham para la detección de spam y comentaba que el de Thunderbird es una implementación ligeramente modificada de este. Veamos entonces como funciona.</p>
<p>El algoritmo está implementado en el fichero mozilla\mailnews\extensions\bayesian-spam-filter\src\nsBayesianFilter.cpp concretamente en la función classifyMessage. Para hacerlo más sencillo de entender lo pasaré a pseudo-código y lo simplificaré. En primer lugar debemos ver cuales son las variables que utiliza:</p>
<ul>
<li>mGoodCount: número de mensajes ham clasificados</li>
<li>mBadCount: número de mensajes spam clasificados</li>
<li>mGoodTokens: tabla de hash de tokens ham con el número de veces que han aparecido</li>
<li>mBadTokens: tabla de hash de tokens spam con el número de veces que han aparecido</li>
</ul>
<p><span id="more-239"></span></p>
<p>Por defecto:</p>
<pre>si (mGoodCount == 0 || mGoodTokens.count() == 0)
	suponemos que el mensaje es spam
si (mBadCount == 0 || mBadTokens.count() == 0)
	suponemos que el mensaje es ham
</pre>
<p>Seguidamente vemos el algoritmo principal (copiado del <a href="https://bugzilla.mozilla.org/attachment.cgi?id=138425&amp;action=view">bugzilla</a>):</p>
<pre>para cada token {
	hamcount = numero de veces que el token aparece en mensajes ham
	spamcount = numero de veces que el token aparece en mensajes spam
	hamratio = hamcount / nGoodCount
	spamratio = spamcount / nBadCount

	prob = spamratio / (hamratio + spamratio)

	n = hamcount +  spamcount
	prob = (0.225 + n * prob) / (.45 + n)

	distance = abs(prob - 0.5)
	if (distance &gt; = .1) {
		token.distance = distance
		token.prob = prob
	}
}
</pre>
<p>Con esto calculamos y guardamos la probabilidad de cada token. Una vez calculadas las probabilidades, ordenamos este array por distancias (tomando como distancia la diferencia entre las probabilidades de cada token) y cogemos los 150 primeros elementos. Utilizando una distribución de probabilidad chi<sup>2</sup>, de la cual ahorraremos el código para una mayor brevedad.</p>
<p>Una vez calculada esta distribución de probabilidad debemos comparar el valor resultante con el límite que tenemos establecido que, por defecto, es 0.9. Si la probabilidad es mayor o igual que esta, el mensaje será clasificado como spam.</p>
]]></content:encoded>
			<wfw:commentRss>http://elligre.tk/madelman/index.php/archivos/2005/11/28/algoritmo-de-deteccion-de-spam-en-thunderbird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A plan for spam: detectar spam con filtrado bayesiano</title>
		<link>http://elligre.tk/madelman/index.php/archivos/2005/11/27/a-plan-for-spam-detectar-spam-con-filtrado-bayesiano/</link>
		<comments>http://elligre.tk/madelman/index.php/archivos/2005/11/27/a-plan-for-spam-detectar-spam-con-filtrado-bayesiano/#comments</comments>
		<pubDate>Sun, 27 Nov 2005 18:10:06 +0000</pubDate>
		<dc:creator>madelman</dc:creator>
				<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://elligre.tk/madelman/index.php/archivos/2005/11/27/a-plan-for-spam-detectar-spam-con-filtrado-bayesiano/</guid>
		<description><![CDATA[Hace ya bastante tiempo que se proponen soluciones para la detección del spam, pero una de las que más repercusión ha tenido ha sido la propuesta de Paul Graham A plan for Spam. En ella propone utilizar métodos estadísticos para calcular la probabilidad de que un mensaje sea spam o no.
Para poder utilizar estos métodos, [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya bastante tiempo que se proponen soluciones para la detección del spam, pero una de las que más repercusión ha tenido ha sido la propuesta de Paul Graham <a href="http://www.paulgraham.com/spam.html">A plan for Spam</a>. En ella propone utilizar métodos estadísticos para calcular la probabilidad de que un mensaje sea spam o no.</p>
<p>Para poder utilizar estos métodos, en primer lugar es necesario tener un conjunto de mensajes de ejemplo, tanto de spam como de correo ordinario (que él denomina ham, jamón, en contraposición a spam, que además de correo basura también es una carne en lata). Estos mensajes deberán ser trozeados en tokens, trozos de texto, habitualmente palabras. Esta partición del texto es muy importante, ya que dependiendo de como la hagamos el algoritmo funcionará mejor o peor.</p>
<p><span id="more-238"></span></p>
<p>Una vez partido el texto en tokens determinaremos la probabilidad de que un email que contenga ese token sea spam, mediante la siguiente fórmula (código Lisp):</p>
<pre>(let ((g (* 2 (or (gethash word good) 0)))
      (b (or (gethash word bad) 0)))
   (unless (&lt; (+ g b) 5)
     (max .01
          (min .99 (float (/ (min 1 (/ b nbad))
                             (+ (min 1 (/ g ngood))
                                (min 1 (/ b nbad)))))))))</pre>
<p>Mmmm, la cosa parece que se complica. No vamos a preocuparnos demasiado de esta fórmula y pasamos a ver como calcula si un correo es spam o no. Cuando llega un correo nuevo, coge los 15 tokens más interesantes (lo que tienen una probabilidad más alejada de 0.5) y guarda esas probabilidades en una lista llamada probs.</p>
<pre>(let ((prod (apply #'* probs)))
  (/ prod (+ prod (apply #'* (mapcar #'(lambda (x)
                                         (- 1 x))
                                     probs)))))
</pre>
<p><p>Si esta fórmula da como resultado un valor mayor de 0.9 entonces consideraremos que ese correo es spam, sino lo consideraremos como ham.</p>
<p>Thunderbird utiliza este mismo algoritmo, aunque ligeramente modificado, para clasificar el correo recibido. Veremos en un próximo post como funciona.</p>
]]></content:encoded>
			<wfw:commentRss>http://elligre.tk/madelman/index.php/archivos/2005/11/27/a-plan-for-spam-detectar-spam-con-filtrado-bayesiano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplos de tipos de spam</title>
		<link>http://elligre.tk/madelman/index.php/archivos/2005/11/24/ejemplos-de-tipos-de-spam/</link>
		<comments>http://elligre.tk/madelman/index.php/archivos/2005/11/24/ejemplos-de-tipos-de-spam/#comments</comments>
		<pubDate>Thu, 24 Nov 2005 11:03:57 +0000</pubDate>
		<dc:creator>madelman</dc:creator>
				<category><![CDATA[Artículo]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://elligre.tk/madelman/index.php/archivos/2005/11/24/ejemplos-de-tipos-de-spam/</guid>
		<description><![CDATA[Comentaba que ultimamente la cantidad de spam&#160;no detectado por mi lector de correo es bastante alta y está creciendo. Para saber porque se está produciendo esto, voy a analizar primero las diferencias entre los mensajes de spam que son clasificados correctamente y los que no.
Una vez tengamos ejemplos de como es cada uno de los [...]]]></description>
			<content:encoded><![CDATA[<p>Comentaba que ultimamente la <a href="http://elligre.tk/madelman/index.php/archivos/2005/11/22/aumento-de-la-cantidad-de-spam-no-detectado/">cantidad de spam</a>&nbsp;no detectado por mi lector de correo es bastante alta y está creciendo. Para saber porque se está produciendo esto, voy a analizar primero las diferencias entre los mensajes de spam que son clasificados correctamente y los que no.</p>
<p>Una vez tengamos ejemplos de como es cada uno de los tipos de spam, estudiaremos el algoritmo de clasificación&nbsp;e intentaremos ver porque estos correos no se están clasificando correctamente.</p>
<p><span id="more-236"></span></p>
<p>Un ejemplo de spam detectado correctamente:</p>
<pre>Autumn sale on V i agra and other drugs.

You won`t find better prices anywhere!

V alium - 180 PiIls - 370$
X anax - 180 PiIls - 316$
A mbien - 180 PiIls - 388$
S oma - 160 PiIls - 145$
V iagra - 100 PilIs - 209.99$
C ialis - 90 PiIls - 324$
U ltram - 120 PilIs - 155$
P hentermine - 90 PiIls - 261$
and many more...

Please click below and check out our offer.

[link]

rd explode pluggable cookie americanism stimulus ogre exultation sunnyvale prompt
slop stub curfew minion clout avow plain anaglyph point
orthoclase coach thorstein gravy closeup passer adhere hammerhead trounce aaa derbyshire
varsity degeneracy people ryder unimodular inductance sock crystalline
apathy daybed progenitor protestation darpa trundle wreak soliton
derive dianne bedimmed radiometer betelgeuse divestiture heroin dockyard
</pre>
<p><p>Podemos ver que hay una gran cantidad de faltas de ortografía, palabras mal escritas expresamente (piIls en lugar de pills, dependiendo del tipo de letra hay que fijarse mucho para notar la diferencia) y el nombre de los medicamentos está escrito con la primera letra separada. Además, hay una serie de palabras, al parecer, sin sentido debajo del mensaje principal. Veremos por que están estas palabras cuando estudiemos los algoritmos de detección de spam.</p>
<p>Veamos ahora un ejemplo de spam no detectado:</p>
<pre>Den

Hey Dude, This has you written all over it. I assumed I had better send it
to you.

Kira

 -------Original Message-------

From: Hong [mailto:pvhfnc@fpvo.com]
Sent: Wed, 23 Nov 2005 21:40:32 -0100
To: Bianca
Subject: Georgie Cool fashion item that is at reasonable price. Topmost
fashion item.

Sweet Michel,

 Today you do not need to worry about the regular noise of life. You only
need to worry about choosing the one you like best. Choose anyone of the
time pieces at this internet-site. It is your surprise.
[LINK]

You are going to look terrific in it. 

You are going to be very happy to know you can track your package.

My deepest love,

Anton
</pre>
<p>Una técnica bastante utilizada ultimamente es enviar el spam como si fuera no mensaje reenviado por alguien. Además, el texto escrito suena, digamos, raro, un poco forzado , aunque está escrito correctamente.&nbsp;Estudiaremos en próximos post cual puede ser el problema de la detección.</p>
]]></content:encoded>
			<wfw:commentRss>http://elligre.tk/madelman/index.php/archivos/2005/11/24/ejemplos-de-tipos-de-spam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

