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

<channel>
	<title>seoxys.com&#187; Apple</title>
	<atom:link href="http://www.seoxys.com/category/apple/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.seoxys.com</link>
	<description></description>
	<lastBuildDate>Mon, 17 Jan 2011 00:49:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>The Sorry State of Apple Developer Relations</title>
		<link>http://www.seoxys.com/the-sorry-state-of-apple-developer-relations/</link>
		<comments>http://www.seoxys.com/the-sorry-state-of-apple-developer-relations/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 19:54:42 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Rants]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/?p=229</guid>
		<description><![CDATA[iLaugh disappeared from the App Store about a week ago. My contract expired last&#160;week. I had been trying to renew the contract through the Apple Store for over a month now. However, I initially signed up through the Swiss Apple Store, and that is the only store it will let me&#160;use. The French Swiss store [...]]]></description>
			<content:encoded><![CDATA[<p>iLaugh disappeared from the App Store about a week ago. My contract expired last&nbsp;week.</p>
<p>I had been trying to renew the contract through the Apple Store for over a month now. However, I initially signed up through the Swiss Apple Store, and that is the only store it will let me&nbsp;use.</p>
<p>The French Swiss store is broken, and will not work at all. The German Swss store works, but will only accept a Swiss credit card. Thankfully, I do have one, but for some obscure reason, it throws an &ldquo;unexpected error&rdquo; every time I try to use it. It won&#8217;t let me use my US Bank of America cards at&nbsp;all.</p>
<p>I&rsquo;ve called and emailed Apple&rsquo;s support team many times. Yet all they tell me is that they&rsquo;ll forward it to some other team, which will (after waiting another week) email me proposing that I try &ldquo;emptying my browser&rsquo;s&nbsp;cache.&rdquo;</p>
<p>I&rsquo;m kind of unsure about what to do now. With every day that passes, I miss out on a substantial amount of money. Not only that, but not having the App in the Store causes many other problems, such as breaking links from my website, and&nbsp;more&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/the-sorry-state-of-apple-developer-relations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apple&#8217;s Increasingly Ridiculous Rejections</title>
		<link>http://www.seoxys.com/apples-increasingly-ridiculous-rejections/</link>
		<comments>http://www.seoxys.com/apples-increasingly-ridiculous-rejections/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 23:40:39 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/?p=195</guid>
		<description><![CDATA[Three months ago, I submitted an update to iLaugh and iLaugh Lite, numbered 1.1.1 that fixed many bugs but didn&#8217;t change anything to the functionality of the&#160;app. Today, after three whole months in review (seriously, I&#8217;m not making this up!), they decided to finally tackle the issue and issue me a rejection for no other [...]]]></description>
			<content:encoded><![CDATA[<p>Three months ago, I submitted an update to <a href="http://www.ilaughapp.com/">iLaugh</a> and iLaugh Lite, numbered 1.1.1 that fixed many bugs but didn&#8217;t change anything to the functionality of the&nbsp;app.</p>
<p>Today, after three whole months in review (seriously, I&#8217;m not making this up!), they decided to finally tackle the issue and issue me a rejection for no other reason other than &#8220;because we said&nbsp;so.&#8221;</p>
<p>See for&nbsp;yourself.</p>
<p><a href="http://akhun.com/seo/skitch/Inbox_%2821_messages%29-20090611-003253.png"><img src="http://akhun.com/seo/skitch/Inbox_%2821_messages%29-20090611-003253.png" /></a></p>
<p>Please note, this is for iLaugh 1.1.1. iLaugh 2.0 is still in review, as a new application, and there&#8217;s no reason it should be rejected. In fact, the premium edition has already been approved and is <a href="http://ilaughapp.com/appstore/premium.php">already live on the App&nbsp;Store</a>.</p>
<p>Speaking of iLaugh 2.0&thinsp;&#8211;&thinsp;the first public screenshot&nbsp;ever:</p>
<div style="text-align:center"><a href="http://ilaughapp.com/appstore/premium.php"><img src="http://akhun.com/seo/skitch/iPhone_Portrait_0708-20090609-183209.png" style="border:none;" /></a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/apples-increasingly-ridiculous-rejections/feed/</wfw:commentRss>
		<slash:comments>90</slash:comments>
		</item>
		<item>
		<title>On The App Store Hype</title>
		<link>http://www.seoxys.com/on-the-app-store-hype/</link>
		<comments>http://www.seoxys.com/on-the-app-store-hype/#comments</comments>
		<pubDate>Sat, 30 May 2009 17:05:47 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Rants]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/?p=189</guid>
		<description><![CDATA[A while back, TechCrunch covered yet another article complaining about the App Store being more of a Lotto than a marketplace. Setting aside the App&#160;Store&#8217;s numerous other issues, coverage of iPhone app developers has been divided into two extremes: reassuring yet unlikely success stories, or depressing yet much more likely failure&#160;stories. The general question in [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, TechCrunch <a href="http://www.techcrunch.com/2009/05/25/the-app-store-hype-gets-a-dose-of-reality/">covered</a> yet another <a href="http://www.stromcode.com/2009/05/24/the-incredible-app-store-hype/">article</a> complaining about the App Store being more of a Lotto than a marketplace. Setting aside the App&#160;Store&#8217;s numerous other issues, coverage of iPhone app developers has been divided into two extremes: reassuring yet unlikely success stories, or depressing yet much more likely failure&nbsp;stories.</p>
<p>The general question in all of these articles is: &#8220;Can an average guy become a successful iPhone developer?&#8221;. The answer depends on how you define success, and on that topic I can speak from my own&nbsp;<a href="http://www.seoxys.com/growing-iphone-development-into-a-viable-business/">experience</a>.</p>
<p>If, to you, success means making a million bucks overnight you will most likely be unsuccessful. To me, success is defined as the return on my investment (both in time and money) on the project. In my <a href="http://www.seoxys.com/growing-iphone-development-into-a-viable-business/">previous article</a>, I mentioned making somewhere around a hundred dollars a day on iLaugh. However, I didn&#8217;t mention how much I invested in the&nbsp;project.</p>
<p>The first version of iLaugh and its subsequent revisions took me very little time to create. I estimate that I invested between ten to twenty hours of my time to create iLaugh 1.0. At my asking rate of $100 per hour, that represents a $1,000 to $2,000 investment. The server running the first iteration of the iLaugh API cost me about $100 per month to&nbsp;maintain.</p>
<p>If you look at the numbers for iLaugh from previous months, I make over $3,000 monthly (for a total of over $8,000 so far). Thus, I consider it a&nbsp;success.</p>
<p>Many people, in response to my previous article, said that I too, was one of the lucky ones, albeit on a smaller scale. And while that may be true, considering the low quality of that first iteration of iLaugh, a more carefully crafted app would likely have done&nbsp;better.</p>
<p><em>I believe the potential for success is relative to the investment put into&nbsp;anything.</em></p>
<p>If you look at the familiar success stories, many of them involve reinvestment and good marketing. For instance, <a herf="http://tapulous.com/">Tapulous</a> hit the jackpot with their Tap Tap games. Being good friends with one of their employees, I know exactly how much work goes into their&nbsp;production.</p>
<p>Perhaps one of the most talked-about success stories is Trism. Its developer, <a href="http://www.demiforce.com/games.html">Steve Demeter</a>, made an insane $250,000 in just two months. What I believe is the key to Steve&#8217;s long-term success, is that instead of buying a fancy sports car, he reinvested his money into founding a sustainable&nbsp;business.</p>
<p>Part of reinvesting, and a facet of development often ignored, are things that a typical developer <em>can&#8217;t</em> do. Most importantly: design, copywriting and marketing. These are things that will most likely have to be outsourced. Developers are reluctant to do that, because it&#8217;s very costly, but in the end, ignoring it is going to cost them the popularity of their&nbsp;application.</p>
<p>I view iLaugh 1.x as a catalyst towards bigger and, hopefully, even more successful&nbsp;endeavors.</p>
<p>In fact, I have already put a big part of my (in comparison to the numbers above, quite mediocre) earnings into the second iteration of iLaugh. I&#8217;ve hired a bunch of people much more talented than I am in their respective fields, and iLaugh 2.0 is coming along really nicely. It will be entirely different and nearly incomparable to the first iteration. There are some <em>very</em> cool things&nbsp;coming.</p>
<p>So, responding to my initial question: &#8220;Can an average guy become a successful iPhone developer?&#8221;. Yes! An average developer can be successful in the App Store. But it takes hard work, a lot of time, money, and&nbsp;perseverance.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/on-the-app-store-hype/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>How Genius is a Genius Business Model</title>
		<link>http://www.seoxys.com/how-genius-is-a-genius-business-model/</link>
		<comments>http://www.seoxys.com/how-genius-is-a-genius-business-model/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 15:34:45 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/?p=145</guid>
		<description><![CDATA[Apple&#8217;s introduction of Genius into iTunes may have been one of the best business decisions they ever&#160;made. First, it&#8217;s a great feature for the user. It&#8217;s a joy to just chose a beloved track, and instantly get plenty more of that awesomeness. I&#8217;ve been a great fan of Genius myself, and I use it all [...]]]></description>
			<content:encoded><![CDATA[<p>Apple&#8217;s introduction of Genius into iTunes may have been one of the best business decisions they ever&nbsp;made.</p>
<p>First, it&#8217;s a great feature for the user. It&#8217;s a joy to just chose a beloved track, and instantly get plenty more of that awesomeness. I&#8217;ve been a great fan of Genius myself, and I use it all the time. It&#8217;s also great when picking out tracks for a DJ&nbsp;set.</p>
<p>But what probably goes unnoticed by the general public is the staggering amounts of money Apple will be able to make of this. They will own the data to what millions of people are listening to. They&#8217;ll have direct access to millions of people&#8217;s tastes, likes, dislikes. Many companies would kill for such data, and I wouldn&#8217;t be surprised if the labels were prepared to pay big for such&nbsp;statistics.</p>
<p>Additionally, Apple is using genius to sell more music on the iTunes Store through the sidebar. The iTunes Store is already the biggest music retailer in the US, but with Genius, it&#8217;ll only sell even more music to the people already buying music on the&nbsp;store.</p>
<p>And lastly, Apple could sell promotions for artists who want more exposure for their music. Since Apple controls what users are exposed to / listen to when they&#8217;re in Genius, they can now push an artist more often in their user&#8217;s Genius lists, and thus give the user the impression and the feeling of liking the music. They can thus manipulate the user&#8217;s tastes, and I&#8217;m willing to bet that many record labels would pay big money for that kind of&nbsp;exposure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/how-genius-is-a-genius-business-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>App Store = Paperwork Nightmare</title>
		<link>http://www.seoxys.com/app-store-paperwork-nightmare/</link>
		<comments>http://www.seoxys.com/app-store-paperwork-nightmare/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 13:16:29 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/?p=92</guid>
		<description><![CDATA[[Note: I hope this article doesn&#8217;t break the NDA, but if it find out it does and I get a Cease &#038; Desist from Apple, I will have to take it&#160;down.] When you upload an iPhone application to the App Store through iTunes Connect, you&#8217;re presented with a few screens of information to fill in. [...]]]></description>
			<content:encoded><![CDATA[<p>[Note: I hope this article doesn&#8217;t break the NDA, but if it find out it does and I get a Cease &#038; Desist from Apple, I will have to take it&nbsp;down.]</p>
<p>When you upload an iPhone application to the App Store through iTunes Connect, you&#8217;re presented with a few screens of information to fill in. First, there&#8217;s the screen where you put the Application&#8217;s description, category, and any other textual information about&nbsp;it.</p>
<p>Then there&#8217;s the screen where you upload the binary, the icon(s), and screenshots. And lastly there&#8217;s a screen to set the price. Unlike what I thought would be the case, you cannot chose a specific price. You get to chose from several price groups. A price group has a price in US Dollars, and a price in different currencies usually of a similar value. (For example, a $0.99 app in Switzerland is CHF&nbsp;1.10)</p>
<p>At the top of this page, there is a little warning message that says you need a contract with Apple if you&#8217;re going to put up non-free apps. I did not pay too much attention to it, and the rest of the process seemed to go smoothly, eventually leading back to a page where I could see my app was &#8220;In&nbsp;Review&#8221;.</p>
<p>I was still slightly confused about this contract message, and decided to find out what it was about. I asked a few fellow developers, and found out that Apple would not sell my app until the contract was taken care&nbsp;of.</p>
<p>In iTunes Connect, there is a section on contracts, with a link to create a new contract. A contract is made of three parts; Contact Details, Banking Details and Tax&nbsp;Details.</p>
<ul>
<li><b>Contact Details</b>
<p>This is very straightforward. I just had to fill in my full contact details. (Including physical&nbsp;address.)</li>
<li><b>Banking Details</b>
<p>This is slightly more complicated. I&#8217;m with one of the smaller Swiss banks, and I wanted to use this account for my App Store&nbsp;revenue.</p>
<p>One of the things Apple requires is a SWIFT code. Luckily, I&#8217;m with a Swiss bank, and these tend to be very professional. I just had to give my bank a phone call, and I had my SWIFT code. However, after reading a recent topic on the MacSB mailing list, it appears to be very common for many of the smaller banks in the US and other countries not to have SWIFT codes. In which case you&#8217;re screwed and you&#8217;ll have to open a new account with a bank that has a SWFT code. (Apple recommends Bank of&nbsp;America.)</p>
<p>Another thing required by Apple is the IBAN. International Bank Account Number. My bank informed me that they printed these on all the bank statements they issued. However, I didn&#8217;t have any bank statement around. It wasn&#8217;t too hard getting this number. Switzerland has a standardized way of building these numbers from your CB Number (Clearing Banquaire - this is what we call Branch IDs) and your account number. A handy little script I found on the web would take this info and convert it into an IBAN. (I later found one of my Bank statements, and the IBAN generated did indeed match the one on the&nbsp;statement).</p>
<p>Apple also asked for the Branch ID (I put my CB number for this) and account number, and another number called the SIC / Short Code. I researched it a bit, and it looks like I didn&#8217;t need it. I just left that field&nbsp;blank.</li>
<li><b>Tax Details</b>
<p>This is where it gets nasty. Note that this is not an Apple thing, this is government tax regulation. Apple provides an online version of the government form W-8BEN. It seems I am not obligated to fill this form in, but if I don&#8217;t, Apples keeps another 30% of my revenue as anticipated taxes. This, with the 30% commission they take from every sale, leaves me with only 49% of my gross sales. (70% * 70% =&nbsp;49%)</p>
<p>This form is extremely cryptic, and I filled it in to the best of my knowledge. This, however, wasn&#8217;t enough for Apple. The form complained about missing information. It&#8217;s only then that I realized that Apple provides a handy tip sheet explaining how to fill the form in, and what are the most common&nbsp;answers.</p>
<p>With this information, I was able to understand and fill in most of the form. Except for one field: Taxpayer Identification Number. Since I&#8217;m not a US resident (although I&#8217;m eligible for citizenship by blood, and plan to apply soon), I did not have this information. Apple&#8217;s tip sheet luckily had a small paragraph regarding this. An EIN (Employer Identification Number) would do. To get an EIN, I had to download another form entitled&nbsp;SS-4.</p>
<p>This form was even more cryptic than the previous one. It is obviously made for more traditional companies, and had questions asking how many employees I have in different field, how much wages I paid them, where and when my company was incorporated, and a bunch of other tax-related questions. It also asked a few things I couldn&#8217;t fill in, such as my SSN (Social Security Number - I don&#8217;t have one). I phoned the IRS (Internal Revenue Service) - the government entity I had to submit the form to - and it turned out this field wasn&#8217;t necessary. In response to the question &#8220;Check one box that best describes the principal activity of your business&#8221;, there of course wasn&#8217;t anything about technology. I had to tick &#8220;Other (specify)&#8221; and enter&nbsp;&#8220;Royalties&#8221;.</p>
<p>There is three way you can submit the form. Firstly, you can do it the traditional way of mailing it by post. But this would take a minimum of 4 weeks. Second way would be by fax, but this would also take at least 1 week. The third way is actually pretty clever. You fax while you&#8217;re on the&nbsp;phone.</p>
<p>Problem: my phone and my fax are on the same phone line. Meaning I can&#8217;t do both at the same time. I do have a cellphone, but phoning oversees for a good half hour at least from a cellphone would be so outrageously expensive it didn&#8217;t make any sense. Luckily, I though of a brilliant idea, and opened a Skype Out account. The audio quality wasn&#8217;t very good, but at least it worked. After another hour of phoning, I finally had my EIN and could submit the W-8BEN form to&nbsp;Apple.</li>
</ul>
<p>Everything seems to be in order as of now. My app is still in review, but expect it in the app store&nbsp;soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/app-store-paperwork-nightmare/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>NanoLifeSaver</title>
		<link>http://www.seoxys.com/nanolifesaver/</link>
		<comments>http://www.seoxys.com/nanolifesaver/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 23:06:43 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Art]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/nanolifesaver/</guid>
		<description><![CDATA[I bring to you,&#160;NanoLifeSaver. NanoLifeSaver is a slick Core Animation&#160;screensaver. (This last one is a movie, Click to&#160;Play) Download&#160;NanoLifeSaver Credit goes to Scott Stevenson for coming up with the original animation&#160;code.]]></description>
			<content:encoded><![CDATA[<p>I bring to you,&nbsp;NanoLifeSaver.</p>
<p>NanoLifeSaver is a slick Core Animation&nbsp;screensaver.</p>
<p><img src="http://rsrc.azuretalon.com/nano/nano_screen1.png" /></p>
<p><img src="http://rsrc.azuretalon.com/nano/nano_screen2.png" />  	<object width="347" height="266" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"><param name="src" value="http://rsrc.azuretalon.com/nano/nano-poster.jpg" /><param name="href" value="nano.mov" /><param name="target" value="myself" /><param name="controller" value="false" /><param name="autoplay" value="false" /><param name="scale" value="aspect" /><embed width="347" height="266" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/" 			src="http://rsrc.azuretalon.com/nano/nano-poster.jpg" 			href="http://rsrc.azuretalon.com/nano/nano.mov" 			target="myself" 			controller="false" 			autoplay="false" 			scale="aspect"></embed></object><br />
(This last one is a movie, Click to&nbsp;Play)</p>
<p><a href="http://dl.azuretalon.com/nano.zip">Download&nbsp;NanoLifeSaver</a></p>
<p>Credit goes to <a href="http://theocacao.com">Scott Stevenson</a> for coming up with the <a href="http://theocacao.com/document.page/555/">original animation&nbsp;code</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/nanolifesaver/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
<enclosure url="http://rsrc.azuretalon.com/nano/nano.mov" length="78" type="video/quicktime" />
		</item>
		<item>
		<title>R.I.P. Hijack</title>
		<link>http://www.seoxys.com/rip-hijack/</link>
		<comments>http://www.seoxys.com/rip-hijack/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 14:27:05 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/rip-hijack/</guid>
		<description><![CDATA[Disappointingly, codename: Hijack / Spool is no&#160;more. I have posted about this project before, and it was really something I was excited&#160;about. Back in the day where I actually had time, I was a forum freak and was active in more than 10 forums&#8230; This would have been the dream app for&#160;me. Unfortunately, Hijack has [...]]]></description>
			<content:encoded><![CDATA[<p>Disappointingly, codename: Hijack / Spool <a href="http://hijackapp.com/2008/02/04/welcome-to-codename-hijack/">is no&nbsp;more</a>.</p>
<p><img src="http://goodcomics.com/end/spool/spool_reveal.jpg" /></p>
<p>I have <a href="http://www.seoxys.com/everything-about-nothing/">posted about this project before</a>, and it was really something I was excited&nbsp;about.</p>
<p>Back in the day where I actually had time, I was a forum freak and was active in more than 10 forums&#8230; This would have been the dream app for&nbsp;me.</p>
<p>Unfortunately, Hijack has just been open-sourced. Which means that the project is essentially&nbsp;dead.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/rip-hijack/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hacking mac apps: Direct Mail</title>
		<link>http://www.seoxys.com/hacking-mac-apps-direct-mail-archive/</link>
		<comments>http://www.seoxys.com/hacking-mac-apps-direct-mail-archive/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 23:02:36 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Hacking]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/2007/12/19/hacking-mac-apps-direct-mail/</guid>
		<description><![CDATA[Update: I rewrote this post with better language and better explanations. Please read the newer version first. In this post, I will describe how to hack a mac shareware app. The reason for this is to push the developers to create stronger protection, and to show common weaknesses in licensing&#160;code. Before each hack is published, [...]]]></description>
			<content:encoded><![CDATA[<p><b>Update:</b> I <a href="http://kswizz.com/post/2785664228/hacking-mac-apps">rewrote</a> this post with better language and better explanations. Please read the newer version first.<br />
<br />
In this post, I will describe how to hack a mac shareware app.<br />
<br />
The reason for this is to push the developers to create stronger protection, and to show common weaknesses in licensing&nbsp;code.</p>
<p>Before each hack is published, I get the concerned developer&#8217;s approval, and send them a note describing the hack, and suggesting ways to improve their protection. I also leave them some time to patch their app before I publish the&nbsp;hack.</p>
<p>I have no intention of promoting piracy, and this not meant to be used as a guide for would-be pirates to get those for free. What follows if of highly technical nature, and is intended for fellow&nbsp;developers.</p>
<p>Today is up: <a href="http://ethreesoftware.com/directmail/index.php">Direct Mail</a>, a great app from e3 software useful for anyone doing mailing lists or press&nbsp;releases.</p>
<p>I did this hack on version 1.8.3, because it isn&#8217;t the&nbsp;latest.</p>
<p>First thing to do, is to class-dump the executable, which results in an interesting find:<br />
</p>
<pre class="textmate-source barf"><span class="source source_objc"><span class="meta meta_interface-or-protocol meta_interface-or-protocol_objc"><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>interface</span> <span class="entity entity_name entity_name_type entity_name_type_objc">CAppDelegate</span> <span class="punctuation punctuation_definition punctuation_definition_entity punctuation_definition_entity_other punctuation_definition_entity_other_inherited-class punctuation_definition_entity_other_inherited-class_objc">:</span> <span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_objc">NSObject</span><span class="meta meta_divider meta_divider_objc">
</span><span class="meta meta_scope meta_scope_interface meta_scope_interface_objc">{
    <span class="storage storage_type storage_type_objc">BOOL</span> _registered;   <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> 4 = 0x4
</span>    <span class="support support_class support_class_cocoa">NSString</span> *_registeredName;  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> 8 = 0x8
</span>    SUUpdater *sparkleUpdater;  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_c++"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_c">//</span> 12 = 0xc
</span>}

<span class="meta meta_function meta_function_objc">+ <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">sharedDelegate</span></span>;</span>
<span class="meta meta_function meta_function_objc">+ <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span??span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">applyIconsToChangeStatusMenu</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">init</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">registered</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">registeredName</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">setRegisteredName</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">validateMenuItem</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">loadRegistration</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">isValidCode</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">forName</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp12</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">saveRegistrationCode</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span> <span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc">forName</span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp12</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">sparkleUpdater</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">doPrefs</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">doRegister</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">doPurchase</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">alertShowHelp</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">doAbout</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">doReportBug</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">doConnectionDoctor</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">openAppWebsite</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">openRegisterWebsite</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">runKRM</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">lookupKagiAffiliate</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">showPurchaseThankYou</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">showFirstRunAlert</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">applicationWillFinishLaunching</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_c">void</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">applicationDidFinishLaunching</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>
<span class="meta meta_function meta_function_objc">- <span class="meta meta_return-type meta_return-type_objc"><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">BOOL</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="entity entity_name entity_name_function entity_name_function_objc">crashReporterShouldDisplayException</span></span><span class="meta meta_argument-type meta_argument-type_objc"><span class="entity entity_name entity_name_function entity_name_function_name-of-parameter entity_name_function_name-of-parameter_objc"><span class="punctuation punctuation_separator punctuation_separator_arguments punctuation_separator_arguments_objc">:</span></span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">(</span><span class="storage storage_type storage_type_objc">id</span><span class="punctuation punctuation_definition punctuation_definition_type punctuation_definition_type_objc">)</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_objc">fp8</span></span>;</span>

</span><span class="storage storage_type storage_type_objc"><span class="punctuation punctuation_definition punctuation_definition_storage punctuation_definition_storage_type punctuation_definition_storage_type_objc">@</span>end</span></span>
</span></pre>
<p>Now, there&#8217;s different ways to hack this. You could just edit the ivar _registered upon launch. Other option would be to hack registered or isValidCode:forName: to always return true.<br />
<br />
I&#8217;m going to go with a slightly more complicated way, and hack the methods which call&nbsp;isValidCode:forName:.</p>
<p>Let&#8217;s set a breakpoint when isValidCode is called. Disassemble the whole thing, and check where isValidCode:forName: is called. For me, it returns at 0x00008fdc. Run. It hits the breakpoint immediately. Continue once, to let it finish its setting up etc. Now, using the app, go to the register menu and try to register (with a properly-formatted email-address). It will hit the breakpoint again. Do a nexti. You now are in &#8220;0x0002ffb7 in -[CRegisterPanelController doOK:] ()&#8221;<br />
<br />
Let&#8217;s disassemble this&nbsp;method:</p>
<p><code style="overflow:auto;white-space: nowrap; ">0x0002ff50 &lt;-[CRegisterPanelController doOK:]+0&gt;:   push   %ebp<br />0x0002ff51 &lt;-[CRegisterPanelController doOK:]+1&gt;:   mov    %esp,%ebp<br />0x0002ff53 &lt;-[CRegisterPanelController doOK:]+3&gt;:   push   %edi<br />0x0002ff54 &lt;-[CRegisterPanelController doOK:]+4&gt;:   push   %esi<br />0x0002ff55 &lt;-[CRegisterPanelController doOK:]+5&gt;:   push   %ebx<br />0x0002ff56 &lt;-[CRegisterPanelController doOK:]+6&gt;:   sub    $0x1c,%esp<br />0x0002ff59 &lt;-[CRegisterPanelController doOK:]+9&gt;:   mov    0x8(%ebp),%edi<br />0x0002ff5c &lt;-[CRegisterPanelController doOK:]+12&gt;:  mov    0x22091c,%eax<br />0x0002ff61 &lt;-[CRegisterPanelController doOK:]+17&gt;:  mov    %eax,0x4(%esp)<br />0x0002ff65 &lt;-[CRegisterPanelController doOK:]+21&gt;:  mov    0x221fa4,%eax<br />0x0002ff6a &lt;-[CRegisterPanelController doOK:]+26&gt;:  mov    %eax,(%esp)<br />0x0002ff6d &lt;-[CRegisterPanelController doOK:]+29&gt;:  call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x0002ff72 &lt;-[CRegisterPanelController doOK:]+34&gt;:  mov    %eax,%esi<br />0x0002ff74 &lt;-[CRegisterPanelController doOK:]+36&gt;:  mov    0xc(%edi),%edx<br />0x0002ff77 &lt;-[CRegisterPanelController doOK:]+39&gt;:  mov    0x221428,%eax<br />0x0002ff7c &lt;-[CRegisterPanelController doOK:]+44&gt;:  mov    %eax,0x4(%esp)<br />0x0002ff80 &lt;-[CRegisterPanelController doOK:]+48&gt;:  mov    %edx,(%esp)<br />0x0002ff83 &lt;-[CRegisterPanelController doOK:]+51&gt;:  call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x0002ff88 &lt;-[CRegisterPanelController doOK:]+56&gt;:  mov    %eax,%ebx<br />0x0002ff8a &lt;-[CRegisterPanelController doOK:]+58&gt;:  mov    0x8(%edi),%edx<br />0x0002ff8d &lt;-[CRegisterPanelController doOK:]+61&gt;:  mov    0x221428,%eax<br />0x0002ff92 &lt;-[CRegisterPanelController doOK:]+66&gt;:  mov    %eax,0x4(%esp)<br />0x0002ff96 &lt;-[CRegisterPanelController doOK:]+70&gt;:  mov    %edx,(%esp)<br />0x0002ff99 &lt;-[CRegisterPanelController doOK:]+73&gt;:  call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x0002ff9e &lt;-[CRegisterPanelController doOK:]+78&gt;:  mov    %ebx,0xc(%esp)<br />0x0002ffa2 &lt;-[CRegisterPanelController doOK:]+82&gt;:  mov    %eax,0x8(%esp)<br />0x0002ffa6 &lt;-[CRegisterPanelController doOK:]+86&gt;:  mov    0x22084c,%eax<br />0x0002ffab &lt;-[CRegisterPanelController doOK:]+91&gt;:  mov    %eax,0x4(%esp)<br />0x0002ffaf &lt;-[CRegisterPanelController doOK:]+95&gt;:  mov    %esi,(%esp)<br />0x0002ffb2 &lt;-[CRegisterPanelController doOK:]+98&gt;:  call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x0002ffb7 &lt;-[CRegisterPanelController doOK:]+103&gt;: test   %al,%al<br />0x0002ffb9 &lt;-[CRegisterPanelController doOK:]+105&gt;: jne    0x2ffc7 &lt;-[CRegisterPanelController doOK:]+119&gt;<br />0x0002ffbb &lt;-[CRegisterPanelController doOK:]+107&gt;: add    $0x1c,%esp<br />0x0002ffbe &lt;-[CRegisterPanelController doOK:]+110&gt;: pop    %ebx<br />0x0002ffbf &lt;-[CRegisterPanelController doOK:]+111&gt;: pop    %esi<br />0x0002ffc0 &lt;-[CRegisterPanelController doOK:]+112&gt;: pop    %edi<br />0x0002ffc1 &lt;-[CRegisterPanelController doOK:]+113&gt;: pop    %ebp<br />0x0002ffc2 &lt;-[CRegisterPanelController doOK:]+114&gt;: jmp    0x21f444 &lt;dyld_stub_NSBeep&gt;<br />0x0002ffc7 &lt;-[CRegisterPanelController doOK:]+119&gt;: mov    0x22091c,%eax<br />0x0002ffcc &lt;-[CRegisterPanelController doOK:]+124&gt;: mov    %eax,0x4(%esp)<br />0x0002ffd0 &lt;-[CRegisterPanelController doOK:]+128&gt;: mov    0x221fa4,%eax<br />0x0002ffd5 &lt;-[CRegisterPanelController doOK:]+133&gt;: mov    %eax,(%esp)<br />0x0002ffd8 &lt;-[CRegisterPanelController doOK:]+136&gt;: call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x0002ffdd &lt;-[CRegisterPanelController doOK:]+141&gt;: mov    %eax,%esi<br />0x0002ffdf &lt;-[CRegisterPanelController doOK:]+143&gt;: mov    0xc(%edi),%edx<br />0x0002ffe2 &lt;-[CRegisterPanelController doOK:]+146&gt;: mov    0x221428,%eax<br />0x0002ffe7 &lt;-[CRegisterPanelController doOK:]+151&gt;: mov    %eax,0x4(%esp)<br />0x0002ffeb &lt;-[CRegisterPanelController doOK:]+155&gt;: mov    %edx,(%esp)<br />0x0002ffee &lt;-[CRegisterPanelController doOK:]+158&gt;: call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x0002fff3 &lt;-[CRegisterPanelController doOK:]+163&gt;: mov    %eax,%ebx<br />0x0002fff5 &lt;-[CRegisterPanelController doOK:]+165&gt;: mov    0x8(%edi),%edx<br />0x0002fff8 &lt;-[CRegisterPanelController doOK:]+168&gt;: mov    0x221428,%eax<br />0x0002fffd &lt;-[CRegisterPanelController doOK:]+173&gt;: mov    %eax,0x4(%esp)<br />0x00030001 &lt;-[CRegisterPanelController doOK:]+177&gt;: mov    %edx,(%esp)<br />0x00030004 &lt;-[CRegisterPanelController doOK:]+180&gt;: call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x00030009 &lt;-[CRegisterPanelController doOK:]+185&gt;: mov    %ebx,0xc(%esp)<br />0x0003000d &lt;-[CRegisterPanelController doOK:]+189&gt;: mov    %eax,0x8(%esp)<br />0x00030011 &lt;-[CRegisterPanelController doOK:]+193&gt;: mov    0x220788,%eax<br />0x00030016 &lt;-[CRegisterPanelController doOK:]+198&gt;: mov    %eax,0x4(%esp)<br />0x0003001a &lt;-[CRegisterPanelController doOK:]+202&gt;: mov    %esi,(%esp)<br />0x0003001d &lt;-[CRegisterPanelController doOK:]+205&gt;: call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x00030022 &lt;-[CRegisterPanelController doOK:]+210&gt;: movl   $0x219530,0x8(%esp)<br />0x0003002a &lt;-[CRegisterPanelController doOK:]+218&gt;: mov    0x220784,%eax<br />0x0003002f &lt;-[CRegisterPanelController doOK:]+223&gt;: mov    %eax,0x4(%esp)<br />0x00030033 &lt;-[CRegisterPanelController doOK:]+227&gt;: mov    0x221fb4,%eax<br />0x00030038 &lt;-[CRegisterPanelController doOK:]+232&gt;: mov    %eax,(%esp)<br />0x0003003b &lt;-[CRegisterPanelController doOK:]+235&gt;: call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x00030040 &lt;-[CRegisterPanelController doOK:]+240&gt;: mov    0x220780,%edx<br />0x00030046 &lt;-[CRegisterPanelController doOK:]+246&gt;: mov    %edx,0x4(%esp)<br />0x0003004a &lt;-[CRegisterPanelController doOK:]+250&gt;: mov    %eax,(%esp)<br />0x0003004d &lt;-[CRegisterPanelController doOK:]+253&gt;: call   0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />0x00030052 &lt;-[CRegisterPanelController doOK:]+258&gt;: mov    0x4(%edi),%edx<br />0x00030055 &lt;-[CRegisterPanelController doOK:]+261&gt;: mov    0x220900,%eax<br />0x0003005a &lt;-[CRegisterPanelController doOK:]+266&gt;: mov    %eax,0xc(%ebp)<br />0x0003005d &lt;-[CRegisterPanelController doOK:]+269&gt;: mov    %edx,0x8(%ebp)<br />0x00030060 &lt;-[CRegisterPanelController doOK:]+272&gt;: add    $0x1c,%esp<br />0x00030063 &lt;-[CRegisterPanelController doOK:]+275&gt;: pop    %ebx<br />0x00030064 &lt;-[CRegisterPanelController doOK:]+276&gt;: pop    %esi<br />0x00030065 &lt;-[CRegisterPanelController doOK:]+277&gt;: pop    %edi<br />0x00030066 &lt;-[CRegisterPanelController doOK:]+278&gt;: pop    %ebp<br />0x00030067 &lt;-[CRegisterPanelController doOK:]+279&gt;: jmp    0x21f395 &lt;dyld_stub_objc_msgSend&gt;<br />
</code></p>
<p>We now are at this line: &#8220;0x0002ffb7 <-[CRegisterPanelController doOK:]+103>:	test&nbsp;%al,%al&#8221;</p>
<p>That, in the right, is assembly code. This is basically some kind of &#8220;if&#8221; statement. (a TEST followed by a JNE (jump if not equal)).<br />
<br />
What interests me is the next line: &#8220;0x0002ffb9 <-[CRegisterPanelController doOK:]+105>:	jne    0x2ffc7 <-[CRegisterPanelController doOK:]+119>&#8221;<br />
<br />
If we just reverse this test (turn the JNE into a JE (jump if equal)), any invalid code will be considered valid, and vice-versa. Let&#8217;s examine the memory for this&nbsp;statement.</p>
<p><code style="overflow:auto;white-space: nowrap; "><br />
<br />
(gdb) x/x 0x0002ffb9<br />
<br />
0x2ffb9 <-[CRegisterPanelController doOK:]+105>:	0xc4830c75<br />
<br />
</code></p>
<p>Now, I&#8217;m working on a intel machine. And for some dumb reason, every block of four bytes is inverted. What this means, is that the byte that interests me is  the rightmost one: 0x75. This is what a JNE looks like. Do some more tests by setting breakpoints until you find a JE, and read the memory for it: you will find that a JE is&nbsp;0x74.</p>
<p>Let&#8217;s test if our theory is correct by editing the memory live, before we edit it in the binary. Do the&nbsp;following:</p>
<p><code style="overflow:auto;white-space: nowrap; "><br />
<br />(gdb) set {char}0x0002ffb9=0x74<br />(gdb) x/x 0x0002ffb9<br />0x2ffb9 <-[CRegisterPanelController doOK:]+105>:	0xc4830c74<br />(gdb) disassemble 0x0002ffb7<br />Dump of assembler code for function -[CRegisterPanelController doOK:]:<br />[...edited out...]<br />0x0002ff99 <-[CRegisterPanelController doOK:]+73>:	call   0x21f395 <dyld_stub_objc_msgSend><br />0x0002ff9e <-[CRegisterPanelController doOK:]+78>:	mov    %ebx,0xc(%esp)<br />0x0002ffa2 <-[CRegisterPanelController doOK:]+82>:	mov    %eax,0x8(%esp)<br />0x0002ffa6 <-[CRegisterPanelController doOK:]+86>:	mov    0x22084c,%eax<br />0x0002ffab <-[CRegisterPanelController doOK:]+91>:	mov    %eax,0x4(%esp)<br />0x0002ffaf <-[CRegisterPanelController doOK:]+95>:	mov    %esi,(%esp)<br />0x0002ffb2 <-[CRegisterPanelController doOK:]+98>:	call   0x21f395 <dyld_stub_objc_msgSend><br />0x0002ffb7 <-[CRegisterPanelController doOK:]+103>:	test   %al,%al<br />0x0002ffb9 <-[CRegisterPanelController doOK:]+105>:	je     0x2ffc7 <-[CRegisterPanelController doOK:]+119><br />0x0002ffbb <-[CRegisterPanelController doOK:]+107>:	add    $0x1c,%esp<br />0x0002ffbe <-[CRegisterPanelController doOK:]+110>:	pop    %ebx<br />0x0002ffbf <-[CRegisterPanelController doOK:]+111>:	pop    %esi<br />0x0002ffc0 <-[CRegisterPanelController doOK:]+112>:	pop    %edi<br />0x0002ffc1 <-[CRegisterPanelController doOK:]+113>:	pop    %ebp<br />0x0002ffc2 <-[CRegisterPanelController doOK:]+114>:	jmp    0x21f444 <dyld_stub_NSBeep><br />0x0002ffc7 <-[CRegisterPanelController doOK:]+119>:	mov    0x22091c,%eax<br />[...edited out...]<br />End of assembler dump.<br />(gdb) <br />
</code></p>
<p>Here we change the byte for the JNE, then test if we changed it correctly by re-reading it.<br />
<br />
Then we disassemble the whole method again to see if the JNE was changed correctly. And yes&thinsp;&#8212;&thinsp;tah-da&thinsp;&#8212;&thinsp;- it now says JE. Perfect. Continue. You are now registered. To make this change permanent: do &#8220;x/8x 0x0002ffb9&#8221;. You will get 24 bytes of data. Open the binary in your favorite hex editor and find the bytes outputted by gdb. If you&#8217;re on intel, don&#8217;t forget you have to reverse all the blocks of four bytes before searching. When you find it, edit the 0x75 into 0x74. Bravo! You have now made the change&nbsp;permanent.</p>
<p>We are not finished yet. As you will now notice if you run the program, it makes your code valid, but you get an error message each launch, and you have to re-do the entering a code process every time. This is because the first check at launch doesn&#8217;t happen in&nbsp;doOk:.</p>
<p>Continue and quit normally (using cmd-Q in Direct Mail). Launch it again by doing run. But this time, don&#8217;t continue after hitting the breakpoint at launch. Do nexti. Ok, so now we are in loadRegistration. Disassemble this method. Similarly, there&#8217;s a JE this time, just after the call to isValidCode:forName: Turn this into a JNE by changing the 0x74 into a 0x75 at this location in memory. If you disassemble the method again, you can see that the JE turned into a JNE. Like before, change this in the&nbsp;binary.</p>
<p>Well Done! You have now fully hacked Direct Mail&nbsp;1.8.3.</p>
<p>By now, the developer has probably fixed this security flaw, so you can&#8217;t use this to get this app for free. If you like it, buy it. It&#8217;s a great piece of software! Think about the poor developers who have to feed their family.<br />
<br />
You can <a href="http://ethreesoftware.com/directmail/download.php">download the trial version&nbsp;here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/hacking-mac-apps-direct-mail-archive/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>An introduction to Sean Collins</title>
		<link>http://www.seoxys.com/an-introduction-to-sean-collins/</link>
		<comments>http://www.seoxys.com/an-introduction-to-sean-collins/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 08:59:12 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.seosoft.info/seolog/2007/11/22/an-introduction-to-sean-collins/</guid>
		<description><![CDATA[From: Sean Collins Date: July 23, 2007 4:32:35 PM EDT To: [anonymous@gmail.com] Subject: Aquatic&#160;Prime I recently read your blog post about Aquatic prime, after I was hunting around inside another&#160;application. I would like to perhaps exchange some notes, because I think I might have found at least an individual application that uses the PHP authentication [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
<b>From</b>: Sean Collins <sean@seanmcollins.com><br />
<b>Date</b>: July 23, 2007 4:32:35 PM EDT<br />
<b>To</b>: [anonymous@gmail.com]<br />
<b>Subject</b>: Aquatic&nbsp;Prime</p>
<p>I recently read your blog post about Aquatic prime, after I was hunting around inside another&nbsp;application.</p>
<p>I would like to perhaps exchange some notes, because I think I might have found at least an individual application that uses the PHP authentication of the AquaticPrime framework, and I suspect that it would be vulnerable to SQL Injection attacks, as well as using what I believe to be, a cookie that never expires that is baked into the executable, which could lead to some other interesting&nbsp;things.</p>
<p>Let me know if you&#8217;d be interested in a&nbsp;chat!</p>
<p>Thank You,<br />
Sean&nbsp;Collins
</p></blockquote>
<blockquote><p>
1:42:24 PM <span style="color:red;">seanwdp</span>: [Hey], it&#8217;s Sean C<br />
1:42:48 PM <span style="color:blue;">anonymous</span>: hey sean.<br />
1:43:10 PM <span style="color:red;">seanwdp</span>: The app in question is called Exces<br />
1:43:22 PM <span style="color:red;">seanwdp</span>: part of that MacHeist deal they were doing a week ago<br />
1:43:35 PM <span style="color:blue;">anonymous</span>: ok<br />
1:43:58 PM <span style="color:blue;">anonymous</span>: and what can you do exactly? (re-reading your email)<br />
1:44:13 PM <span style="color:red;">seanwdp</span>: I don&#8217;t have any POC just yet, just some leads.<br />
1:44:41 PM <span style="color:red;">seanwdp</span>: just looking through the executable, found some little things<br />
1:45:04 PM <span style="color:red;">seanwdp</span>: the app uses the PHP part of the AP framework<br />
1:45:14 PM <span style="color:red;">seanwdp</span>: to do registration keys and such<br />
1:45:20 PM <span style="color:blue;">anonymous</span>: k<br />
1:45:44 PM <span style="color:red;">seanwdp</span>: let me give you the executable dump<br />
1:45:55 PM <span style="color:blue;">anonymous</span>: k<br />
1:47:27 PM <span style="color:blue;">anonymous</span>: can i just strings it?<br />
1:47:57 PM <span style="color:red;">seanwdp</span>: yeah, already did and sent it to you as a txt<br />
1:48:52 PM <span style="color:red;">seanwdp</span>: one of the stings contains his license check<br />
1:48:53 PM <span style="color:blue;">anonymous</span>: ok<br />
1:48:59 PM <span style="color:red;">seanwdp</span>: it&#8217;s a PHP script<br />
1:49:09 PM <span style="color:red;">seanwdp</span>: if you connect to it with just a browser you get a bunch of mysql errors<br />
1:49:10 PM <span style="color:blue;">anonymous</span>: http://www.seosoft.info/app_rsrc/exces_licence_check.plist.php<br />
1:49:13 PM <span style="color:blue;">anonymous</span>: yeah i see<br />
1:49:14 PM <span style="color:red;">seanwdp</span>: exactly<br />
1:49:23 PM <span style="color:red;">seanwdp</span>: so I think that the cookie is a few lines below<br />
1:49:25 PM <span style="color:red;">seanwdp</span>: that has the login data<br />
1:49:43 PM <span style="color:blue;">anonymous</span>: and that is based on the AP sample code you think?<br />
1:49:52 PM <span style="color:red;">seanwdp</span>: I&#8217;m not entirely sure<br />
1:49:59 PM <span style="color:red;">seanwdp</span>: If it is the AP sample code<br />
1:50:02 PM <span style="color:red;">seanwdp</span>: that&#8217;s pretty bad<br />
1:50:11 PM <span style="color:red;">seanwdp</span>: I was going from the thinking that he tried to extend the AP<br />
1:50:18 PM <span style="color:blue;">anonymous</span>: so have you actually tried to inject anything?<br />
1:50:32 PM <span style="color:red;">seanwdp</span>: I&#8217;ve been looking for a way to feed it some bad data<br />
1:50:38 PM <span style="color:red;">seanwdp</span>: I was doing some pretty simple stuff<br />
1:50:47 PM <span style="color:red;">seanwdp</span>: the license key I think is through stenography<br />
1:50:57 PM <span style="color:red;">seanwdp</span>: so I was trying to see what it takes as a dragging source<br />
1:51:12 PM <span style="color:red;">seanwdp</span>: see if I could craft some bad data, then capture the packets<br />
1:51:22 PM <span style="color:blue;">anonymous</span>: heh ok<br />
1:51:30 PM <span style="color:red;">seanwdp</span>: What makes me wonder, is the fact that he has another part, his bug reporting<br />
1:51:39 PM <span style="color:blue;">anonymous</span>: ap uses real encryption though<br />
1:51:51 PM <span style="color:red;">seanwdp</span>: right<br />
1:51:52 PM <span style="color:blue;">anonymous</span>: no stenagraphy no faking<br />
1:52:13 PM <span style="color:red;">seanwdp</span>: but my thinking is that the app will send a user/pass<br />
1:52:30 PM <span style="color:red;">seanwdp</span>: since you get the error about not having a user or database selected<br />
1:52:35 PM <span style="color:red;">seanwdp</span>: when you visit that register page<br />
1:53:22 PM <span style="color:blue;">anonymous</span>: what user/pass?<br />
1:53:28 PM <span style="color:blue;">anonymous</span>: a bit confused<br />
1:53:44 PM <span style="color:red;">seanwdp</span>: okay. Know how you visit that registration page with a regular browser?<br />
1:53:53 PM <span style="color:blue;">anonymous</span>: y<br />
1:54:10 PM <span style="color:red;">seanwdp</span>: notice those mysql errors<br />
1:54:16 PM <span style="color:blue;">anonymous</span>: right right<br />
1:54:22 PM <span style="color:red;">seanwdp</span>: Line 2 is the host<br />
1:54:27 PM <span style="color:red;">seanwdp</span>: line 3 is the database<br />
1:54:46 PM <span style="color:blue;">anonymous</span>: looks like he&#8217;s on a dreamhost box<br />
1:54:50 PM <span style="color:red;">seanwdp</span>: right<br />
1:54:59 PM <span style="color:red;">seanwdp</span>: I&#8217;m thinking those variables<br />
1:55:02 PM <span style="color:red;">seanwdp</span>: the PHP ones<br />
1:55:22 PM <span style="color:red;">seanwdp</span>: that set the host, database name, and possibly user/password combo are in the app<br />
1:55:26 PM <span style="color:blue;">anonymous</span>: ok<br />
1:55:32 PM <span style="color:blue;">anonymous</span>: i&#8217;d be real surprised<br />
1:55:36 PM <span style="color:red;">seanwdp</span>: as would I<br />
1:55:48 PM <span style="color:blue;">anonymous</span>: in fact i doubt its likely at all<br />
1:56:05 PM <span style="color:blue;">anonymous</span>: knowing dreamhost (used to be a customer) they firewall off the mysql server<br />
1:56:24 PM <span style="color:blue;">anonymous</span>: the info would be embedded in the php<br />
1:56:33 PM <span style="color:blue;">anonymous</span>: it looks to me as if the guy has a f-ed up php<br />
1:56:45 PM <span style="color:blue;">anonymous</span>: either the mysql server is down, or something is misconfigured<br />
1:56:52 PM <span style="color:blue;">anonymous</span>: i dont think the username password are in the app<br />
1:56:56 PM <span style="color:blue;">anonymous</span>: unless you&#8217;ve found them?<br />
1:57:08 PM <span style="color:red;">seanwdp</span>: only guesses at this point, nothing jumped out in the strings<br />
1:57:14 PM <span style="color:blue;">anonymous</span>: what happens when you packet sniff?<br />
1:57:23 PM <span style="color:red;">seanwdp</span>: still trying to get that running<br />
1:57:27 PM <span style="color:blue;">anonymous</span>: ok<br />
1:57:29 PM <span style="color:red;">seanwdp</span>: I might have to do what you did<br />
1:57:33 PM <span style="color:red;">seanwdp</span>: with the code injection<br />
1:57:37 PM <span style="color:red;">seanwdp</span>: just force it to connect<br />
1:57:43 PM <span style="color:blue;">anonymous</span>: ah<br />
1:57:54 PM <span style="color:blue;">anonymous</span>: so it doesn&#8217;t connect to that url normally?<br />
1:58:02 PM <span style="color:blue;">anonymous</span>: until you register it perhaps?<br />
1:58:05 PM <span style="color:red;">seanwdp</span>: yeah<br />
1:58:08 PM <span style="color:red;">seanwdp</span>: and there&#8217;s a cookie<br />
1:58:13 PM <span style="color:red;">seanwdp</span>: expires never<br />
1:58:27 PM <span style="color:red;">seanwdp</span>: I wondered if that might be a good lead.<br />
1:58:33 PM <span style="color:blue;">anonymous</span>: AP is designed for client side validation<br />
1:58:39 PM <span style="color:blue;">anonymous</span>: he&#8217;s doing it server side too perhaps<br />
1:59:03 PM <span style="color:red;">seanwdp</span>: I mean the guy just sold like 100k licenses or something<br />
1:59:09 PM <span style="color:blue;">anonymous</span>: no shit?<br />
1:59:11 PM <span style="color:red;">seanwdp</span>: yeah<br />
1:59:12 PM <span style="color:red;">seanwdp</span>: macheist<br />
1:59:16 PM <span style="color:red;">seanwdp</span>: so I mean, it&#8217;s gotta work<br />
1:59:19 PM <span style="color:blue;">anonymous</span>: heh<br />
1:59:20 PM <span style="color:blue;">anonymous</span>: yeha<br />
1:59:24 PM <span style="color:blue;">anonymous</span>: unless it is a dead url<br />
1:59:29 PM <span style="color:blue;">anonymous</span>: isn&#8217;t used any more<br />
1:59:33 PM <span style="color:blue;">anonymous</span>: or is in there to throw you off <img src='http://www.seoxys.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> <br />
1:59:34 PM <span style="color:red;">seanwdp</span>: true, maybe he baked a new version for macheist<br />
1:59:39 PM <span style="color:blue;">anonymous</span>: maybe<br />
1:59:53 PM <span style="color:red;">seanwdp</span>: I dunno, I can&#8217;t imagine him being too smart<br />
2:00:06 PM <span style="color:red;">seanwdp</span>: his app just hands off the dirty work to disk utility<br />
2:00:09 PM <span style="color:blue;">anonymous</span>: i&#8217;d _hope_ he is if he&#8217;s releasing an encryption app<br />
2:00:11 PM <span style="color:blue;">anonymous</span>: ah<br />
2:00:12 PM <span style="color:blue;">anonymous</span>: haha<br />
2:00:19 PM <span style="color:red;">seanwdp</span>: yet still manages to have a &#8220;limit&#8221; of 10gb<br />
2:00:26 PM <span style="color:red;">seanwdp</span>: for his &#8220;vaults&#8221;<br />
2:00:48 PM <span style="color:red;">seanwdp</span>: it&#8217;s right in the code, he calls hdiutil<br />
2:01:03 PM <span style="color:red;">seanwdp</span>: all he&#8217;s got is a pretty GUI<br />
2:01:31 PM <span style="color:blue;">anonymous</span>: yeah<br />
2:01:35 PM <span style="color:blue;">anonymous</span>: another Disco app<br />
2:01:38 PM <span style="color:red;">seanwdp</span>: yep.<br />
2:02:00 PM <span style="color:red;">seanwdp</span>: At least Disco has &#8220;ismoke&#8221;<br />
2:02:05 PM <span style="color:red;">seanwdp</span>: <img src='http://www.seoxys.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <br />
2:03:30 PM <span style="color:red;">seanwdp</span>: so what are your thoughts?<br />
2:04:17 PM <span style="color:blue;">anonymous</span>: i dunno. i&#8217;d be really surprised if the app relies on it for registration<br />
2:04:30 PM <span style="color:blue;">anonymous</span>: AP is vulnerable once you have it in your hands.<br />
2:04:44 PM <span style="color:blue;">anonymous</span>: it just depends on how much work the guy has done to obfuscate it<br />
2:04:56 PM <span style="color:blue;">anonymous</span>: and even then you can always find (and then replace) the public key used<br />
2:05:04 PM <span style="color:red;">seanwdp</span>: right<br />
2:05:11 PM <span style="color:red;">seanwdp</span>: but what about the risks to his website<br />
2:05:20 PM <span style="color:blue;">anonymous</span>: i&#8217;d be surprised if there are any<br />
2:05:28 PM <span style="color:blue;">anonymous</span>: it could just be the mysql server is fubared<br />
2:05:32 PM <span style="color:blue;">anonymous</span>: something is misconfigured<br />
2:05:41 PM <span style="color:blue;">anonymous</span>: hard to say<br />
2:05:50 PM <span style="color:blue;">anonymous</span>: any badly written php could be vulnerable<br />
2:05:54 PM <span style="color:red;">seanwdp</span>: right<br />
2:06:04 PM <span style="color:blue;">anonymous</span>: to find out for sure you need to sniff the packets and find out what it sends<br />
2:06:07 PM <span style="color:red;">seanwdp</span>: well I mean he has a bug reporter, where all the stuff is sent using the $_GET array<br />
2:06:19 PM <span style="color:blue;">anonymous</span>: any suspicious looking printf style strings?<br />
2:06:32 PM <span style="color:blue;">anonymous</span>: stuff that could be a http url request?<br />
2:06:47 PM <span style="color:blue;">anonymous</span>: &#8220;%@&#038;%@&#038;%@&#8221; type stuff?<br />
2:07:01 PM <span style="color:red;">seanwdp</span>: lemme see<br />
2:07:09 PM <span style="color:blue;">anonymous</span>: you could try hacking the bug reporter<br />
2:07:11 PM <span style="color:red;">seanwdp</span>: I swear I saw some<br />
2:07:22 PM <span style="color:blue;">anonymous</span>: if that is vulnerable then the license check  probably is too<br />
2:07:27 PM <span style="color:red;">seanwdp</span>: yeah<br />
2:07:40 PM <span style="color:red;">seanwdp</span>: I mean, it&#8217;s much easier to crack the bug reporter<br />
2:07:52 PM <span style="color:red;">seanwdp</span>: since I guess the database connection info is in the script<br />
2:07:56 PM <span style="color:red;">seanwdp</span>: *not guess<br />
2:07:59 PM <span style="color:red;">seanwdp</span>: it is<br />
2:08:07 PM <span style="color:blue;">anonymous</span>: that makes no sense<br />
2:08:08 PM <span style="color:blue;">anonymous</span>: why do that?<br />
2:08:16 PM <span style="color:red;">seanwdp</span>: pulled it out of a php book<br />
2:08:16 PM <span style="color:blue;">anonymous</span>: easier for it to be server side<br />
2:08:24 PM <span style="color:blue;">anonymous</span>: if he has to change the password he&#8217;d be fucked<br />
2:08:26 PM <span style="color:red;">seanwdp</span>: right, that&#8217;s what I&#8217;m saying<br />
2:08:27 PM <span style="color:blue;">anonymous</span>: or whatever<br />
2:08:34 PM <span style="color:red;">seanwdp</span>: he&#8217;s probably got a mysql_connect.php<br />
2:08:46 PM <span style="color:red;">seanwdp</span>: that has a username, password, host, and all that<br />
2:08:54 PM <span style="color:blue;">anonymous</span>: but even then he&#8217;d have to jump through hoops to expose his mysql server to the world<br />
2:08:59 PM <span style="color:blue;">anonymous</span>: by default DH firewalls it<br />
2:09:07 PM <span style="color:blue;">anonymous</span>: so you have to assume he knows how to do that at least<br />
2:09:12 PM <span style="color:red;">seanwdp</span>: yeah<br />
2:09:21 PM <span style="color:blue;">anonymous</span>: which is inconsistent with him putting his password in the client<br />
2:09:31 PM <span style="color:red;">seanwdp</span>: it would be<br />
2:09:46 PM <span style="color:red;">seanwdp</span>: it&#8217;s just that you don&#8217;t get the same error reporting on the bug page as the license page<br />
2:10:15 PM <span style="color:red;">seanwdp</span>: but that could be because someone wrote the bug script better<br />
2:10:24 PM <span style="color:red;">seanwdp</span>: and it doesn&#8217;t give out those errors to the user<br />
2:10:38 PM <span style="color:red;">seanwdp</span>: meanwhile someone far dumber left the error reporting on, for the license script<br />
2:11:59 PM <span style="color:blue;">anonymous</span>: well focus on the bug reporter see if you can capture what it sends<br />
2:12:05 PM <span style="color:blue;">anonymous</span>: i&#8217;d be interested to see that<br />
2:15:46 PM <span style="color:red;">seanwdp</span>: yeah<br />
2:15:58 PM <span style="color:red;">seanwdp</span>: I&#8217;m pretty sure it just sends three or four variables<br />
2:16:06 PM <span style="color:red;">seanwdp</span>: the PHP script gets them and off they go into the database<br />
2:16:12 PM <span style="color:red;">seanwdp</span>: since they&#8217;re right in the url<br />
2:16:23 PM <span style="color:red;">seanwdp</span>: http://www.seosoft.info/app_rsrc/bug_send.php?<br />lang=%@&#038;product=Exces&#038;name=%@&#038;email=<br />%@&#038;description=%@&#038;explanation=%@<br />
2:16:52 PM <span style="color:blue;">anonymous</span>: yeah<br />
2:17:15 PM <span style="color:blue;">anonymous</span>: so do some injection <img src='http://www.seoxys.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br />
2:24:07 PM <span style="color:red;">seanwdp</span>: I&#8217;ll let you know what I come up with<br />
2:24:20 PM <span style="color:blue;">anonymous</span>: cool<br />
2:24:26 PM <span style="color:red;">seanwdp</span>: work finally threw up their hands and let me run our stuff on Apache<br />
2:24:39 PM <span style="color:red;">seanwdp</span>: the guy running the server (win2003) has NFC<br />
2:24:47 PM <span style="color:red;">seanwdp</span>: and i don&#8217;t like or care about IIS<br />
2:24:56 PM <span style="color:red;">seanwdp</span>: thing spent more time broken then up and&nbsp;running
</p></blockquote>
<p>&#8216;Nuff&nbsp;said.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/an-introduction-to-sean-collins/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Econ</title>
		<link>http://www.seoxys.com/econ-2/</link>
		<comments>http://www.seoxys.com/econ-2/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 14:28:24 +0000</pubDate>
		<dc:creator>kenneth</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Interface]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.seoxys.com/econ-2/</guid>
		<description><![CDATA[Introducing Econ, the screensaver that uses your&#160;icons! Note: This screenshot is UGLY. Screen capture just wouldn&#8217;t capture a smooth image&#8230; Click on the screenshot to get a nice QuickTime preview of the&#160;screensaver. Econ is Leopard-only and requires a decent graphics card &#38; CPU. Download&#160;Econ Update: In Snow Leopard, you need to launch System Preferences in [...]]]></description>
			<content:encoded><![CDATA[<p>Introducing Econ, the screensaver that uses your&nbsp;icons!</p>
<p><a href="http://akhun.com/seo/econ.mov" class="lightview" title="::::width:347,height:250"><img src="http://excesapp.com/images/econ.png" /></a></p>
<p><b>Note</b>: This screenshot is UGLY. Screen capture just wouldn&#8217;t capture a smooth image&#8230;<br />
Click on the screenshot to get a nice QuickTime preview of the&nbsp;screensaver.</p>
<p>Econ is Leopard-only and requires a decent graphics card &amp; CPU.<br />
<a href="http://excesapp.com/dl/econ.zip">Download&nbsp;Econ</a></p>
<p><b>Update:</b> In Snow Leopard, you need to launch System Preferences in 32-bit mode in order to be able to select Econ from the list of screensavers. To open System Preferences in 32-bit mode, right-click on its icon, choose <i>Get Info</i> and check the <i>Open In 32-bit Mode</i>&nbsp;checkbox.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seoxys.com/econ-2/feed/</wfw:commentRss>
		<slash:comments>57</slash:comments>
<enclosure url="http://akhun.com/seo/econ.mov" length="1769472" type="video/quicktime" />
		</item>
	</channel>
</rss>

