<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='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' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-4738675137501261671</atom:id><lastBuildDate>Fri, 18 May 2012 12:24:51 +0000</lastBuildDate><category>Steganography</category><category>Reverse Engineering</category><category>games</category><category>privacy</category><category>Electronic Arts</category><category>Firebug</category><category>Spore</category><category>security</category><title>Rouli.net</title><description>Instead of curing cancer, I'm wasting my time on silly projects.</description><link>http://www.rouli.net/</link><managingEditor>noreply@blogger.com (rouli)</managingEditor><generator>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-2334768288930791314</guid><pubDate>Sun, 06 Nov 2011 18:36:00 +0000</pubDate><atom:updated>2011-11-06T10:36:47.541-08:00</atom:updated><title>Steve Jobs is Still Alive and Well on Hacker News</title><description>If you are a frequent patron of Hacker News, you probably have noticed that for the last month the social news site was under a deluge of submission concerning the life and death of Steve Jobs. Thirty days after his&amp;nbsp;death, this phenomenon may have subsided but is still present.&lt;br /&gt;&lt;br /&gt;To see the effect the death had on Hacker&amp;nbsp;News, I fetched all the submissions with "Jobs" in their title, filtered out those concerning real jobs (the kind of jobs that pays money), and graphed below some basic statistics.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Number of Submissions" height="300" src="http://chart.apis.google.com/chart?chxl=1:|10.6||8||10||12||14||16||18||20||22||24||26||28||30||11.1||3||5&amp;amp;chxr=0,0,150|1,-3.333,98.333&amp;amp;chxt=y,x&amp;amp;chbh=a&amp;amp;chs=512x300&amp;amp;cht=bvg&amp;amp;chco=80C65A&amp;amp;chds=0,150&amp;amp;chd=t:137,109,34,32,41,45,14,14,22,9,11,6,11,16,12,43,22,10,42,23,23,14,13,4,4,16,9,6,9,6,3&amp;amp;chma=|0,3&amp;amp;chtt=Number+of+Submissions" width="512" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chxl=1:|10.6||8||10||12||14||16||18||20||22||24||26||28||30||11.1||3||5&amp;amp;chxr=0,0,2200|1,0,101.667&amp;amp;chxs=0,676767,11.5,-0.167,l,676767&amp;amp;chxt=y,x&amp;amp;chbh=a&amp;amp;chs=512x267&amp;amp;cht=bvg&amp;amp;chco=7777CC&amp;amp;chds=3.333,2166&amp;amp;chd=t:2166,1718,529,714,173,1190,55,455,258,22,35,25,230,263,229,755,359,49,470,402,190,459,29,127,1807,330,53,47,53,8,24&amp;amp;chma=|2&amp;amp;chtt=Total+Karma&amp;amp;chts=676767,10.833" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="Average Karma" height="300" src="http://chart.apis.google.com/chart?chxl=1:|10.6||8||10||12||14||16||18||20||22||24||26||28||30||11.1||3||5&amp;amp;chxr=0,0,500|1,-3.333,100&amp;amp;chxt=y,x&amp;amp;chs=512x300&amp;amp;cht=lc&amp;amp;chco=7777CC&amp;amp;chds=0,452&amp;amp;chd=t:16,16,16,22,4,26,4,33,12,2,3,4,21,16,19,18,16,5,11,17,8,33,2,32,452,21,6,8,6,1,8&amp;amp;chls=1&amp;amp;chtt=Average+Karma" width="512" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="Number of Comments" height="300" src="http://chart.apis.google.com/chart?chxl=1:|10.6||8||10||12||14||16||18||20||22||24||26||28||30||11.1||3||5&amp;amp;chxr=0,0,700|1,-3.333,100&amp;amp;chxt=y,x&amp;amp;chbh=a&amp;amp;chs=512x300&amp;amp;cht=bvg&amp;amp;chco=3399CC&amp;amp;chds=0,622&amp;amp;chd=t:357,622,58,183,45,437,12,48,51,1,33,4,100,89,177,460,103,47,187,149,175,483,4,69,194,135,27,11,9,1,21&amp;amp;chtt=Number+of+Comments" width="512" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="Average Number of Comments" height="287" src="http://chart.apis.google.com/chart?chxl=1:|10.6||8||10||12||14||16||18||20||22||24||26||28||30||11.1||3||5&amp;amp;chxr=0,0,148.333|1,-3.333,20&amp;amp;chxt=y,x&amp;amp;chs=512x287&amp;amp;cht=lc&amp;amp;chco=3399CC&amp;amp;chds=0,49&amp;amp;chd=t:3,6,2,6,2,10,1,4,3,1,3,1,10,6,15,11,5,5,5,7,8,35,1,18,49,9,3,2,1,1,7&amp;amp;chls=1&amp;amp;chma=|3,3&amp;amp;chtt=Average+Number+of+Comments" width="512" /&gt; &lt;br /&gt;&lt;br /&gt;If you wonder what caused that crazy peak in the karma graph, it was "&lt;a href="http://news.ycombinator.com/item?id=3174961"&gt;A Sister’s Eulogy for Steve Jobs&lt;/a&gt;", which I guess I really should read now.  &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/4738675137501261671-2334768288930791314?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2011/11/steve-jobs-is-still-alive-and-well-on.html</link><author>noreply@blogger.com (rouli)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-7346607574313453783</guid><pubDate>Sat, 20 Aug 2011 16:09:00 +0000</pubDate><atom:updated>2011-08-25T01:22:34.600-07:00</atom:updated><title>Hybrid Image Generator</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_f3SZ5Tu916o/TMdACK3_CFI/AAAAAAAASCc/ql4CwniKRNE/s320/shortslightedness+test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_f3SZ5Tu916o/TMdACK3_CFI/AAAAAAAASCc/ql4CwniKRNE/s320/shortslightedness+test.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;If you have seen the picture above, blending Marilyn Monroe and Albert Einstein together, and wanted to create one of those on your own, than I guess you came to the right place. I created this &lt;a href="http://labs.rouli.net/oliva/index.html"&gt;hybrid image generator&lt;/a&gt; as a proof of concept, but I think it's quite fun.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's for example another Monroe hybrid:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-rFowQ3bHzAI/Tk_cDMo9nNI/AAAAAAAAAak/15DnYhsqiJ8/s1600/jfk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-rFowQ3bHzAI/Tk_cDMo9nNI/AAAAAAAAAak/15DnYhsqiJ8/s1600/jfk.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-7346607574313453783?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2011/08/hybrid-image-generator.html</link><author>noreply@blogger.com (rouli)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_f3SZ5Tu916o/TMdACK3_CFI/AAAAAAAASCc/ql4CwniKRNE/s72-c/shortslightedness+test.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-1191185899247237023</guid><pubDate>Fri, 06 Aug 2010 13:25:00 +0000</pubDate><atom:updated>2010-10-03T14:32:17.441-07:00</atom:updated><title>Fridge babe magnets</title><description>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;A common form of analog spam over where I live is the lowly fridge magnet. Many business owners leave promotional magnets on our doors, in hopes that we'll bring them into our homes to serve as a constant reminder to some restaurant's phone number or of a handyman's skills.&lt;br /&gt;&lt;br /&gt;I always wondered whether I can cut those magnets into little tiles and rearrange them into a mosaic. As most magnets belong to plumbers (there's a 5:1 ratio between plumber magnets and food delivery magnets, not that I’m insinuating anything about the quality of the food), Ii've decided to celebrate the 25th birthday of the world's most famous plumber. After spending many evenings and weekends, I'm quite proud of the end result. For explanations on how I did it (the Why is obvious – to impress the babes), and why it turned up a little bit distorted, read on.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(102, 102, 102);font-size:85%;" &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hDVLcOyq0vk/TJ4FCBsf6nI/AAAAAAAAATU/SklR-bYZQ50/s1600/SDC11045.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 287px; height: 354px;" src="http://4.bp.blogspot.com/_hDVLcOyq0vk/TJ4EruGB6NI/AAAAAAAAATM/ymeUqw51YCU/s400/SDC11045.small.jpg" alt="" id="BLOGGER_PHOTO_ID_5520855342357014738" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;Click on the image to see it in full-size&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How it was done&lt;/h2&gt;So, how do you get from this&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hDVLcOyq0vk/TJ4Fo1IPRQI/AAAAAAAAATc/46dL7AGjs_U/s1600/SDC11058.small.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 326px; height: 245px;" src="http://3.bp.blogspot.com/_hDVLcOyq0vk/TJ4Fo1IPRQI/AAAAAAAAATc/46dL7AGjs_U/s400/SDC11058.small.jpg" alt="" id="BLOGGER_PHOTO_ID_5520856392217347330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;to a mosaic that somewhat resembles Mario? With a couple of computer vision algorithms, some matching algorithms, and a lot of hard work. No way I'm doing it again without getting paid.&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4&gt;Step 1: Scan your magnets&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I've scanned roughly 60 magnets, placing them against a pink sheet of paper, to  serve as a contrasting background.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hDVLcOyq0vk/TJ4G66fsTmI/AAAAAAAAATk/4YE30sXdO6g/s1600/pink7.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 351px; height: 233px;" src="http://4.bp.blogspot.com/_hDVLcOyq0vk/TJ4G66fsTmI/AAAAAAAAATk/4YE30sXdO6g/s400/pink7.jpg" alt="" id="BLOGGER_PHOTO_ID_5520857802407169634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Step 2: Automatically crop each magnet&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I had fun playing with a variation on &lt;a href="http://en.wikipedia.org/wiki/Hough_transform"&gt;Hough transform&lt;/a&gt; in order to automatically extract individual magnets from each scan and rotate them to the right angle (and by 'fun' I mean 'laboriously tried to tune the parameters to get the damn thing to work'). My code was based &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.4239&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;on this paper&lt;/a&gt;, though I haven't followed the method described there through. Which might explain the less than satisfactory results:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hDVLcOyq0vk/TJ4KJXogu6I/AAAAAAAAATs/o-8ILfiqSBA/s1600/q2out5.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 284px; height: 152px;" src="http://2.bp.blogspot.com/_hDVLcOyq0vk/TJ4KJXogu6I/AAAAAAAAATs/o-8ILfiqSBA/s400/q2out5.png" alt="" id="BLOGGER_PHOTO_ID_5520861349281840034" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(102, 102, 102);font-size:85%;" &gt;Notice that the pink background is showing through.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Here, early in the process errors started to creep in. Not only my auto cropping &amp;amp; alignment algorithm wasn't very accurate, some of the magnets themselves weren't exactly rectangular (i.e. not all of their angles were 90 degrees). Nevertheless, the errors in the following steps were even more critical.&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4&gt;Step 3: Digitally cut the magnets into tiles and make a mosaic&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;After choosing &lt;a href="http://img.jeuxvideo.fr/00426451-photo-paper-mario-2-la-porte-millenaire.jpg"&gt;my target image&lt;/a&gt;, I used the &lt;a href="http://en.wikipedia.org/wiki/Hungarian_algorithm"&gt;Hungarian algorithm&lt;/a&gt; in order to find the arrangement of tiles best matching it. Unlike the previous image processing algorithm, I haven't implemented the Hungarian algorithm myself but rather took it from the internet. Quick tip to Python programmers out there - use the code linked from the Wikipedia page. I've tried using another one found on Google that looked prettier, but it was so unoptimized that even after a couple of obvious improvements was taking too long to compile the result (a couple of days).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hDVLcOyq0vk/TJ4QM3D1cxI/AAAAAAAAAT0/S89hplnzH0g/s1600/limited4700.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 331px; height: 400px;" src="http://1.bp.blogspot.com/_hDVLcOyq0vk/TJ4QM3D1cxI/AAAAAAAAAT0/S89hplnzH0g/s400/limited4700.png" alt="" id="BLOGGER_PHOTO_ID_5520868006327317266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;looks pretty good doesn't it? Well, remember the errors I've mentioned earlier? Now they begin to haunt us.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;Step 4: Cut the real magnets into tiles and make the mosaic&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt; Thanks to &lt;a href="http://www.tweetyourprayers.info/"&gt;my brother&lt;/a&gt; I got a nifty little tool that should have enabled me to cut the magnets according to the plan laid out by my algorithms.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hDVLcOyq0vk/TJ4R491eLUI/AAAAAAAAAT8/j1kugnjGu_0/s1600/SDC11056.small.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 326px; height: 245px;" src="http://2.bp.blogspot.com/_hDVLcOyq0vk/TJ4R491eLUI/AAAAAAAAAT8/j1kugnjGu_0/s400/SDC11056.small.jpg" alt="" id="BLOGGER_PHOTO_ID_5520869863571991874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;but -&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;I wasn't able to cut tiles  of the precise dimensions. I was off by no more than one millimeter, but as I went further inside the magnet, this error has accumulated.&lt;/li&gt;&lt;li&gt;Even worse was the fact that as time progressed the calibration of this guillotine changed a bit, so not all of the tiles were of the same size.&lt;/li&gt;&lt;li&gt;And lest us forget the errors I had in scanning the magnets in the first place.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;My lesson here is to use lasers the next time I attempt such a feat. Toy guillotines are better than exacto knifes (at least when it comes to keeping all your fingers intact), but not good enough for this task.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-98d8b26854613223" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://redirector.googlevideo.com/videoplayback?id%3D98d8b26854613223%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1340949203%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3D3BE828EE7BDC47A827C2714EDC7AFC3C9B532DFD.74C446F3D2A8AB35744607BC9B7A94A2B125ECE6%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D98d8b26854613223%26offsetms%3D5000%26itag%3Dw160%26sigh%3D1IPr3A3p7NKHqtLOT78ni-eX3-s&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash" width="320" height="266" bgcolor="#FFFFFF" flashvars="flvurl=http://redirector.googlevideo.com/videoplayback?id%3D98d8b26854613223%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1340949203%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3D3BE828EE7BDC47A827C2714EDC7AFC3C9B532DFD.74C446F3D2A8AB35744607BC9B7A94A2B125ECE6%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D98d8b26854613223%26offsetms%3D5000%26itag%3Dw160%26sigh%3D1IPr3A3p7NKHqtLOT78ni-eX3-s&amp;autoplay=0&amp;ps=blogger" allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now that I’ve completed setting all the tiles in place, all that was left to do was to hang the mosaic on the wall.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;Step 5: Drop the mosaic on the floor&lt;/h4&gt;&lt;br /&gt;Feel free to skip that step.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hDVLcOyq0vk/TJ4U-GdhxUI/AAAAAAAAAUE/4m0sW4nN0Sw/s1600/e2sk.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_hDVLcOyq0vk/TJ4U-GdhxUI/AAAAAAAAAUE/4m0sW4nN0Sw/s400/e2sk.jpg" alt="" id="BLOGGER_PHOTO_ID_5520873250321712450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I'm not exactly sure what happened, but one moment I had the board on which I constructed the mosaic in my hands, and in the next moment it was on the floor. First I laughed, then I cried. Then I cried some more. When the crying was over, I did the only logical thing to do in such a situation: picked up all the tiles from the floor and started over. I had to reassemble the mosaic from some blurry pictures I had, since I couldn't follow the directions calculated by my algorithms, because they assume that I have the uncut magnets at hand.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;Step 6: Hang it on your wall, write a blog post about it&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hDVLcOyq0vk/TJ4XZAvWb-I/AAAAAAAAAUU/V6S0LwcQBG0/s1600/onthewall.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 345px; height: 206px;" src="http://3.bp.blogspot.com/_hDVLcOyq0vk/TJ4XZAvWb-I/AAAAAAAAAUU/V6S0LwcQBG0/s400/onthewall.jpg" alt="" id="BLOGGER_PHOTO_ID_5520875911665577954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Anyone wants some spare tiles?&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Special thanks goes to:&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;My brother Alon for buying me the guillotine, helping me collect the tiles from the floor after I dropped the board, and proof reading this text.&lt;br /&gt;&lt;br /&gt;Nitzan and Ella for giving me some rare blue magnets.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-1191185899247237023?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2010/08/fridge-babe-magnets.html</link><author>noreply@blogger.com (rouli)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hDVLcOyq0vk/TJ4EruGB6NI/AAAAAAAAATM/ymeUqw51YCU/s72-c/SDC11045.small.jpg' height='72' width='72'/><thr:total>9</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-8379061250857739692</guid><pubDate>Mon, 04 Aug 2008 18:22:00 +0000</pubDate><atom:updated>2008-09-03T05:14:04.958-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>games</category><category domain='http://www.blogger.com/atom/ns#'>Reverse Engineering</category><category domain='http://www.blogger.com/atom/ns#'>Steganography</category><category domain='http://www.blogger.com/atom/ns#'>Spore</category><title>Spore's .png format (illustrated)</title><description>&lt;span style="font-size:85%;"&gt;Well, the obvious just happened, and I found that my work on decoding Spore's image files was in vain.  A couple of clever guys from &lt;a href="http://forums.somethingawful.com/showthread.php?threadid=2886188"&gt;Something Awful&lt;/a&gt; have reversed engineered Spore Creature Creator to gain insight on the way it encodes the creature models in .png files, and then&lt;a href="http://null.ifies.com/scc.txt"&gt; published a Python script &lt;/a&gt;to decode them. Looking at the encoding algorithm (which includes encryption and permutation), I'm quite sure that I couldn't find it by just examining the image files, and reverse engineering was the right path.&lt;br /&gt;&lt;br /&gt;Following is a brief description on the steps taken by spore to encode a creature. Some of the details were omitted, just to make the big picture a bit clearer. If you know your way around Python, you may want to fill those missing details later.&lt;br /&gt;&lt;br /&gt;So, lets start with the basics. We are given a creature model, in text format (xml) and a image of the creature. The model file is about 30k in size, and the image's width and height are 128 pixels, making it 16384 pixels long. Each pixel is composed of 4 bytes (for red, green, blue and transparency channels), which makes the image 65536 bytes long. Each byte is composed of 8 bits, where the least significant bit, the one that changes the value of the byte the least, is called the LSB.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SJdMyRFHTDI/AAAAAAAAAEI/OZ22T2HAGOo/s1600-h/pixelinbits.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SJdMyRFHTDI/AAAAAAAAAEI/OZ22T2HAGOo/s320/pixelinbits.png" alt="" id="BLOGGER_PHOTO_ID_5230733918676143154" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Now, that we have our definitions straight, we can turn to the encoding process itself.&lt;br /&gt;First, take the creature model, and compress it (using the deflate algorithm, nothing novel here). This usually shrinks  the model size to less than 8192 bits (I'm really sorry for the Powerpoint graphics).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_hDVLcOyq0vk/SJdN5XvZCwI/AAAAAAAAAEQ/rAST5CgL8Ow/s1600-h/01compressed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_hDVLcOyq0vk/SJdN5XvZCwI/AAAAAAAAAEQ/rAST5CgL8Ow/s320/01compressed.png" alt="" id="BLOGGER_PHOTO_ID_5230735140234791682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Add to the compressed model a header, footer containing a strong &lt;a href="http://en.wikipedia.org/wiki/Cyclic_redundancy_check"&gt;CRC&lt;/a&gt; (to make sure you would not open an erroneous model) and pad it with zeros to make it exactly 8192 bits long.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SJdOtqIuvKI/AAAAAAAAAEY/nPsaBgSpBrA/s1600-h/02paddedcompressed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SJdOtqIuvKI/AAAAAAAAAEY/nPsaBgSpBrA/s320/02paddedcompressed.png" alt="" id="BLOGGER_PHOTO_ID_5230736038526106786" border="0" /&gt;&lt;/a&gt;Now, take the image and produce an encryption key using the value of its bytes. This is done by first applying a permutation on the image bytes, and then &lt;a href="http://en.wikipedia.org/wiki/Scrambler"&gt;scrambling &lt;/a&gt;them. The final encryption key is 8192 bits long.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_hDVLcOyq0vk/SJdQBWEZR8I/AAAAAAAAAEg/RyKOl_T45M4/s1600-h/03createkey.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_hDVLcOyq0vk/SJdQBWEZR8I/AAAAAAAAAEg/RyKOl_T45M4/s320/03createkey.png" alt="" id="BLOGGER_PHOTO_ID_5230737476248225730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Exclusive_or"&gt;Xor&lt;/a&gt; the compressed model bits with the key bits to produce an encrypted model. The thing to remember here is that given the key, you can simply Xor the encrypted bits again to gain the decrypted model.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_hDVLcOyq0vk/SJdTQK_yceI/AAAAAAAAAE4/BX1YJME-bTI/s1600-h/04encrypt.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_hDVLcOyq0vk/SJdTQK_yceI/AAAAAAAAAE4/BX1YJME-bTI/s320/04encrypt.png" alt="" id="BLOGGER_PHOTO_ID_5230741029509034466" border="0" /&gt;&lt;/a&gt;Replace the the LSBs of the bytes in the image with the encrypted model bits. Since there are 65536 bytes in the image, there are 65536/8=8192 LSBs, so we have enough room for the whole creature. One last twist, you don't just replace the n'th LSB with the n'th encrypted model bit. You actually have a premutation function, p, and change the p(n)'th image LSB with the n'th model bit. Since we are changing only the least significant bits, we may not notice any change change in the output picture at all.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SJdUZ2pJyQI/AAAAAAAAAFA/wU-55JBkZo0/s1600-h/05encode.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SJdUZ2pJyQI/AAAAAAAAAFA/wU-55JBkZo0/s320/05encode.png" alt="" id="BLOGGER_PHOTO_ID_5230742295355705602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One thing to note - when we are creating the encryption key from the image, we don't use the image LSBs (as a matter of fact, we don't use the 3 least significant bits of each byte). This enables us to get the same encryption key from the encoded key as the one we got from the original image, even though we changed the LSBs.&lt;br /&gt;&lt;br /&gt;Using the image as the encryption key was a smart move from Maxis, since it disable the evil user from simply taking the LSBs in one image and replacing them with LSBs from another image, to create a creature that looks one way in Sporepedia, and another within Spore. A more sinister user might have encoded a model that would crash your computer within an innocent looking image (for example, he could create a model, that when compressed weighs less than 8192 bits, but when expanded, weighs hundreds of megabytes).&lt;br /&gt;&lt;br /&gt;So, is that all? Can we now encode the NSFW creature DonkeyPunch (by &lt;a href="http://forums.somethingawful.com/showthread.php?threadid=2875991"&gt;Tastyhumanburgers&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_hDVLcOyq0vk/SJdb50UPNiI/AAAAAAAAAFY/x0gHlFadyO8/s1600-h/Donkeypunch_censored.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_hDVLcOyq0vk/SJdb50UPNiI/AAAAAAAAAFY/x0gHlFadyO8/s320/Donkeypunch_censored.png" alt="" id="BLOGGER_PHOTO_ID_5230750541068318242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;in the cute and lovely Crowned Laggie (by &lt;a href="http://forums.somethingawful.com/showthread.php?threadid=2875991"&gt;vib rib&lt;/a&gt;)?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SJdWwxTpwZI/AAAAAAAAAFQ/IJcPd64cC7E/s1600-h/CrownedLaggie.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SJdWwxTpwZI/AAAAAAAAAFQ/IJcPd64cC7E/s320/CrownedLaggie.png" alt="" id="BLOGGER_PHOTO_ID_5230744888083595666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The guys in SomethingAwful also published an encoding procedure, but it usually doesn't work. You can encode your creature in its own image, in a slightly changed version of its own image (you can move a pixel here, delete one there) and even encode the creature in a blank image. But you can't encode one creature in another's image.&lt;br /&gt;&lt;br /&gt;We are surely missing something, but I can't tell what, two possible guesses:&lt;br /&gt;1. Spore checks that the creature model resembles the creature in the image file. I doubt it, since you can encode a creature in a blank image.&lt;br /&gt;2. Spore doesn't use the 3 least significant bits in each byte when creating an encryption key for a reason. We know that one of the bits is used to encode the creature, could the other two be used to encode some kind of an additional checksum? I doubt that too, but this post is long enough without going into my reasons.&lt;br /&gt;&lt;br /&gt;Ideas?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-8379061250857739692?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2008/08/spores-png-format-illustrated.html</link><author>noreply@blogger.com (rouli)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_hDVLcOyq0vk/SJdMyRFHTDI/AAAAAAAAAEI/OZ22T2HAGOo/s72-c/pixelinbits.png' height='72' width='72'/><thr:total>18</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-4694810498254943713</guid><pubDate>Tue, 29 Jul 2008 18:52:00 +0000</pubDate><atom:updated>2008-08-04T23:10:31.995-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>games</category><category domain='http://www.blogger.com/atom/ns#'>security</category><category domain='http://www.blogger.com/atom/ns#'>privacy</category><category domain='http://www.blogger.com/atom/ns#'>Firebug</category><category domain='http://www.blogger.com/atom/ns#'>Electronic Arts</category><category domain='http://www.blogger.com/atom/ns#'>Spore</category><title>SporeGate: the day after</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SItYQKtghxI/AAAAAAAAADo/UTIN8jupEdo/s320/failspore.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 120px; height: 120px;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SItYQKtghxI/AAAAAAAAADo/UTIN8jupEdo/s320/failspore.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;The email leakage that plagued Sporepedia, is now finally gone, after 3 days since it became public, and after more than two weeks since I first found it out. It was probably there from Sporepedia's day one, and more than 750000 were free for grabbing.&lt;br /&gt;Now that this episode is over, here's how I've done it. No intelligence is required. As a bonus, I've attached a new mail from the masterminds of EA at the end of this post, and if you all gonna be good kids, I'm gonna tell you Will Wright's email address. There are many other interesting things to do around there, and there are some more &lt;a href="http://www.spore.com/jsserv/index.html"&gt;services&lt;/a&gt; you can play with. I won't be surprised to find another security problem around there.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;As I've said in my&lt;a href="http://www.rouli.net/2008/07/sporepedia-leaks-email-addresses.html"&gt; last post&lt;/a&gt;, my goal was downloading a massive amount of creatures, believing that I could learn something on the way Maxis hides creature data in the .png files. In order to do so, I had to learn how Sporepedia worked. There was some way that my browser queried Sporepedia (for example, for the first 24 creatures), and got the results back. Using &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt; a great debug tool for Firefox,  I was able to see that it sent a query to www.spore.com/sporepedia/jsserv/call/plaincall/assetService.listAssets.dwr, with the following parameters (the two parameters marked in red are the first creature to retrieve, and the number of creatures to retrieve):&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size:78%;"&gt;callCount=1&lt;br /&gt;page=/sporepedia&lt;br /&gt;httpSessionId=******&lt;br /&gt;scriptSessionId=*****&lt;br /&gt;c0-scriptName=assetService&lt;br /&gt;c0-methodName=listAssets&lt;br /&gt;c0-id=0&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;c0-e1=number:0&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;c0-e2=number:24&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;c0-param0=Object_Object:{index:reference:c0-e1, count:reference:c0-e2}&lt;br /&gt;batchId=4&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;and got back, in plain text, the creatures details and their creatures details, including the email addresses. Now using some programming magic you could do the same requests to Sporepedia as your browser does and harvest the addresses without a problem. Moreover, you can change the parameters to get 1000 addresses at once.&lt;br /&gt;&lt;br /&gt;Now, if you just want to know a specific user email address, say the one of MaxisWill, Sporepedia made things even easier for you. No programming or firebugging needed. If you'll try snoop around "&lt;/span&gt;&lt;span style="font-size:85%;"&gt;assetService.listAssets.dwr" address you'll soon get to the  &lt;a href="http://www.spore.com/jsserv/test/sporeUserService"&gt;sporeUserService&lt;/a&gt; page.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_hDVLcOyq0vk/SI939ic_3MI/AAAAAAAAAEA/f1kWFZKrnk0/s1600-h/userservice.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_hDVLcOyq0vk/SI939ic_3MI/AAAAAAAAAEA/f1kWFZKrnk0/s400/userservice.png" alt="" id="BLOGGER_PHOTO_ID_5228529591504592066" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;here can fill the username you want to query under findSporeUserByScreenName, press execute, and get&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SI93mydpZ0I/AAAAAAAAAD4/APanjV_p6do/s1600-h/before.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SI93mydpZ0I/AAAAAAAAAD4/APanjV_p6do/s400/before.jpg" alt="" id="BLOGGER_PHOTO_ID_5228529200665290562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;As simple as that.&lt;br /&gt;&lt;br /&gt;Nowadays, you won't get the email address field. But fear not, if you still want to check whether a specific address is Will Wright's address, use the field named findSporeUserByEmail, and see if you get MaxisWill's details.&lt;br /&gt;&lt;br /&gt;That's it. And now, as promised, one last mail from EA:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;You recently contacted Electronic Arts for support of your EA game. As part of our mission to provide the highest quality support possible, we seek your thoughts on your most recent experience with our Customer Support department. The survey takes just a few minutes to complete. Your responses will help us determine ways to improve the support we provide to you.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;They're kidding me, right?&lt;br /&gt;&lt;br /&gt;See you all when (if) I would finally find how to decode the .png files! (update: &lt;a href="http://www.rouli.net/2008/08/spores-png-format-illustrated.html"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-4694810498254943713?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2008/07/sporegate-day-after.html</link><author>noreply@blogger.com (rouli)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_hDVLcOyq0vk/SItYQKtghxI/AAAAAAAAADo/UTIN8jupEdo/s72-c/failspore.png' height='72' width='72'/><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-2909712863497805700</guid><pubDate>Fri, 25 Jul 2008 20:02:00 +0000</pubDate><atom:updated>2008-07-29T13:15:31.821-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>games</category><category domain='http://www.blogger.com/atom/ns#'>security</category><category domain='http://www.blogger.com/atom/ns#'>privacy</category><category domain='http://www.blogger.com/atom/ns#'>Electronic Arts</category><category domain='http://www.blogger.com/atom/ns#'>Spore</category><title>Sporepedia leaks email addresses</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_hDVLcOyq0vk/SItYQKtghxI/AAAAAAAAADo/UTIN8jupEdo/s1600-h/failspore.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp1.blogger.com/_hDVLcOyq0vk/SItYQKtghxI/AAAAAAAAADo/UTIN8jupEdo/s320/failspore.png" alt="" id="BLOGGER_PHOTO_ID_5227368827269973778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I'm not a security engineer (though I wouldn't mind working in that industry). I'm just a curious guy that wanted to learn how spore encodes its creatures within .png files (see &lt;a href="http://www.rouli.net/2008/06/spore.html"&gt;previous post&lt;/a&gt;). As part of this (yet to be successful) research project, I wanted to download about 100 creatures for testing purposes. This led me to look into how the &lt;a href="http://www.spore.com/sporepedia"&gt;Sporepedia&lt;/a&gt; website works, and as the title of this post suggests, I found more than I was looking for. Apart from delivering creatures' pictures and names (as you can see in your own browser),  Sporepedia also delivers some creatures' stats, such as their feet number and health, &lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;and their creators email addresses&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.&lt;br /&gt;Here's a little excerpt of what you get when you browse Sporepedia and look for the toad like creature presented above (formatting is done by yours truly):&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;s5.assetId=500006865544;&lt;br /&gt;s5.attackRating=4.0;&lt;br /&gt;&lt;span style="color: rgb(255, 204, 0);"&gt;s5.author=s29;&lt;/span&gt;&lt;br /&gt;s5.baseGear=0.0; s5.bite=2.0; s5.boneCount=45;&lt;br /&gt;s5.carnivoreRating=1.0; s5.charge=2.0; s5.created=new Date(1217013619767);&lt;br /&gt;s5.cuteness=53.332813; s5.dance=0.0; s5.description=null;&lt;br /&gt;s5.featured=null; s5.footCount=4; s5['function']=s0;&lt;br /&gt;s5.gesture=2.0; s5.glide=0.0; s5.grasperCount=0;&lt;br /&gt;s5.health=2.0; s5.height=1.444589; s5.herbivoreRating=1.0;&lt;br /&gt;s5.id=500006865544; s5.maxAttack=2.0; s5.maxSocial=2.0;&lt;br /&gt;s5.meanness=13.0; &lt;span style="color: rgb(255, 153, 0);"&gt;s5.name="Rana"&lt;/span&gt;; s5.parentId=null;&lt;br /&gt;s5.posture=0.0; s5.quality=null; s5.rating=-1.0;&lt;br /&gt;s5.sing=1.0; s5.social=3.0; s5.spit=0.0;&lt;br /&gt;s5.sprint=0.0; s5.status=s1; s5.stealth=0.0;&lt;br /&gt;s5.strike=0.0; s5.tags=null; s5.thumbnailSize=27585;&lt;br /&gt;s5.totalEvoPoints=665; s5.type='CREATURE'; s5.updated=new Date(1217013619767);&lt;br /&gt;s29.avatarImage="thumb/500/006/462/500006462490.png";&lt;br /&gt;s29.dateCreated=new Date(1216243320000);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 102, 102); font-weight: bold;font-size:85%;" &gt; s29.emailAddress="re****@hotmail.com";&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;s29.id=2264719288;&lt;br /&gt;s29.lastUserAgent=null;&lt;br /&gt;s29.name="monkey-milker";&lt;br /&gt;s29.screenName="monkey-milker";&lt;br /&gt;s29.subscriptionCount=0;&lt;br /&gt;s29.tagline="drink enough monkey  milk ";&lt;br /&gt;s29.updated=new Date(1216638225588);&lt;br /&gt;s29.userId=2264719288;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;As you can see, there is a creature struct linked to a creator struct, the creator struct contains the email address of the user, censored by me. True, this is not a DNS poisoning scheme, but a malevolent party can easily mine those addresses for spam and phishing. I can imagine a phishing scheme where an email apparently coming from spore.com notifies you that you are able  to  buy   your creature "Rana" a special power for a mere $2, all you have to do is give your credit card number.&lt;br /&gt;&lt;br /&gt;&lt;hl&gt;&lt;br /&gt;&lt;br /&gt;I've tried to notify EA about this issue, without success.&lt;br /&gt;At first, I sent a mail to privacy_policy@ea.com, but their reply was:&lt;br /&gt;&lt;/hl&gt;&lt;blockquote&gt;We apologize, but emails regarding billing, account, technical, in-game, or Terms of Service violations or inquiries are not supported from this email address.&lt;br /&gt;&lt;br /&gt;Please visit &lt;a href="http://support.ea.com/" target="_blank"&gt;support.ea.com&lt;/a&gt; to view our knowledge base of frequently asked questions. If you are not able to find your answer there you may email the appropriate department by choosing the Ask a Question option at &lt;a href="http://support.ea.com/" target="_blank"&gt;http://support.ea.com&lt;/a&gt;.&lt;/blockquote&gt;So I posted a question, or rather a warning at http://support.ea.com, and got the following reply (after a bit of correspondence):&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;Hello,&lt;br /&gt;&lt;br /&gt;Thank you for contacting us here at Electronic Arts Technical Support. You can post your concern on the spore forums at &lt;a href="http://spore.com/forum" target="_blank"&gt;http://spore.com/forum&lt;/a&gt; so that the administrators of the website can provide you a direct answer since they are the one managing the website.&lt;br /&gt;&lt;br /&gt;Should you require further assistance about this or any Electronic Arts games in the future, please visit our website and review our extensive Self Help knowledgebase (&lt;a href="http://support.ea.com/" target="_blank"&gt;http://support.ea.com&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Thanks!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;However, since posting in that suggested forum required me to sign up as a Spore user, which in turn required me to risk my email address, I chose not to do so. And since posting to that forum would have made this issue public, I chose to made it public on my own turf.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Update:&lt;/span&gt;  I encourage everyone reading this post to send a mail to EA or leave a comment in their support forums. Maybe en masse, our voices will be heard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;More Updates:&lt;/span&gt; &lt;/span&gt;Turns out that I do have an account for EA forums (they can be quite confusing for my puny mind). So I went on to register a complaint, but someone already &lt;a href="http://forums.ea.com/mboards/thread.jspa?threadID=398062&amp;amp;tstart=0"&gt;beat me to it&lt;/a&gt;. If you are a spore user, and care about your email address, you should add a comment to that thread.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Last Update?&lt;/span&gt;: Meghan Kane McDowell &lt;/span&gt;who is "Producer, Pollination &amp;amp; Web" at Maxis, &lt;a href="http://forums.ea.com/mboards/thread.jspa?threadID=398062&amp;amp;start=30&amp;amp;tstart=0"&gt;has posted&lt;/a&gt; that a bug fix is ready and will be deployed in 24 hours. If that turns up to be true, I'll post a full disclosure on the bug tomorrow. You are welcome to stay tuned. - &lt;a href="http://www.rouli.net/2008/07/sporegate-day-after.html"&gt;here it is&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-2909712863497805700?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2008/07/sporepedia-leaks-email-addresses.html</link><author>noreply@blogger.com (rouli)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_hDVLcOyq0vk/SItYQKtghxI/AAAAAAAAADo/UTIN8jupEdo/s72-c/failspore.png' height='72' width='72'/><thr:total>11</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-525380537100040828</guid><pubDate>Mon, 30 Jun 2008 20:43:00 +0000</pubDate><atom:updated>2008-07-05T09:01:34.786-07:00</atom:updated><title>Spore</title><description>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;Following this &lt;a href="http://nedbatchelder.com/blog/200806/spore_creature_creator_and_steganography.html"&gt;post&lt;/a&gt; at Ned Batchelder blog, I've been playing with &lt;a href="http://www.spore.com/"&gt;Spore Creature Creator&lt;/a&gt;, the new game by Will Wright, which apart from Sid Meier, is my favorite game desginer (actually, those are the only two game designers I know by name).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;I won't write about the game itself, it suffice to say that from the computer science point of view, it's already marvelous, and from the biology point of view, it could be better. I would like to write a bit about how creatures are saved.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;It turns out that spore saves its creators in plain .png files. Here's an example (&lt;a href="http://www.spore.com/view/profile/WayneRTron"&gt;WayneRTron&lt;/a&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ll-927.ea.com/spore/static/thumb/500/004/927/500004927593.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 123px; height: 123px;" src="http://ll-927.ea.com/spore/static/thumb/500/004/927/500004927593.png" alt="" border="1" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;If you open those file with  any regular image viewer, you'll just see  a picture of the creature. However, if you drag those images into Spore Creature Creator, the 3d model of the creature would open up.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;It is still a mystery how Spore is able to do that. One thing is almost sure - the creature model is coded in the LSBs of each pixel in the image. You can see it by taking only those pictures which are fully transparent (the white background around the creature above). You'll notice then that only the LSBs of those pixels are changing. This shows that indeed something is hiding in the LSBs (why would they otherwise change if the pixels are transparent?), and that there's nothing coded in the other bits.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;Not convinced yet? Take a look at the following picture.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_hDVLcOyq0vk/SG-MwdO5wsI/AAAAAAAAAC8/DsqJcibOPsA/s1600-h/x0.png"&gt;&lt;img style="margin: 1px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_hDVLcOyq0vk/SG-MwdO5wsI/AAAAAAAAAC8/DsqJcibOPsA/s200/x0.png" alt="" id="BLOGGER_PHOTO_ID_5219545257254437570" border="1" /&gt;&lt;/a&gt;Don't worry if you don't see anything. I promise you there is indeed a picture in the center of the blank lines above (try right clicking around). The deal is that all of its pixels are either fully transparent or almost fully transparent, and if the contrast of your screen is not set to an high level, you won't see a thing. Try to save the image and load it to Spore, and lo and behold, you would see a simple green worm like creature. If you would look at the pixels composing the image, you would notice that only the LSBs are changing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;Reading the LSBs (if you haven't gone to Ned's post, do so now, to get a python script to read those pesky bits), you'll see no pattern at all. It seems that Spore's creators have either encrypted the creature's model, or compressed it. Moreover, saving again the same creature would create a different set of values for the LSBs, though the only thing that changes in the creature's model is probably a timestamp.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;So we can't (yet) read the creature's model from its .png file. Can we at least change the LSBs of one creature to another's LSBs? Can we take an innocent png file and load into it a very vulgar creature (&lt;a href="http://youtube.com/watch?v=QD0RcFxolt8"&gt;like this one&lt;/a&gt;, be warned), and publish it in Sporepedia? Apparently the answer is no. Such a chimera fails to load in Spore. Apparently the creature model encodes a checksum of some sort for the whole picture. I'm hopeful that this limitation could be overcome in the near future. In my next post I'll write a bit about how can one do research in this area. (A spoiler - don't upload your creatures to Sporepedia using your main email address).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-525380537100040828?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2008/06/spore.html</link><author>noreply@blogger.com (rouli)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_hDVLcOyq0vk/SG-MwdO5wsI/AAAAAAAAAC8/DsqJcibOPsA/s72-c/x0.png' height='72' width='72'/><thr:total>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4738675137501261671.post-8158065533491540268</guid><pubDate>Sat, 17 May 2008 12:47:00 +0000</pubDate><atom:updated>2008-06-28T10:10:37.222-07:00</atom:updated><title>Nothing new under the sun</title><description>Hi All!&lt;br /&gt;You most probably got here by mistake. If so, just gently press the back button of your browser, and no harm will be done.&lt;br /&gt;In case you are not here by mistake, you must be disappointed because there's nothing here.&lt;br /&gt;This blog was meant to be about natural life, &lt;a href="http://en.wikipedia.org/wiki/Artificial_life"&gt;artificial life&lt;/a&gt; and  some hacking, but  I can never find  time  for posting : / .&lt;br /&gt;If you want to contact me, feel  free to do so by  adding a comment, or sending mail to &lt;br /&gt;rouli.net /at/ gmail.com&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hope this is not a one post wonder,&lt;br /&gt;Rouli&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4738675137501261671-8158065533491540268?l=www.rouli.net' alt='' /&gt;&lt;/div&gt;</description><link>http://www.rouli.net/2008/05/nothing-new-under-sun.html</link><author>noreply@blogger.com (rouli)</author><thr:total>1</thr:total></item></channel></rss>
