<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Implementing a Partial Serial Number Verification System in Delphi</title>
	<atom:link href="http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/</link>
	<description>Software, Society, the Bible, Politics, and everything else.</description>
	<lastBuildDate>Wed, 28 Dec 2011 22:22:01 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Olav</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-6780</link>
		<dc:creator>Olav</dc:creator>
		<pubDate>Wed, 28 Dec 2011 22:22:01 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-6780</guid>
		<description>Great article!

I am thinking of implementing something like this into my own software.

The thing I have issues with though, is making the operations secure enough.

Another concern is the amount of data needed to implement for example 16 bit ckeck words instead of bytes. And having 6 or 8 instead of just 4. These could also be CRC16 values of some data.

That makes the key very long...

Any thoughts on that?</description>
		<content:encoded><![CDATA[<p>Great article!</p>
<p>I am thinking of implementing something like this into my own software.</p>
<p>The thing I have issues with though, is making the operations secure enough.</p>
<p>Another concern is the amount of data needed to implement for example 16 bit ckeck words instead of bytes. And having 6 or 8 instead of just 4. These could also be CRC16 values of some data.</p>
<p>That makes the key very long&#8230;</p>
<p>Any thoughts on that?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: K. Bolino</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-6215</link>
		<dc:creator>K. Bolino</dc:creator>
		<pubDate>Tue, 04 Oct 2011 18:30:41 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-6215</guid>
		<description>@Jamie Briant

No solution is &quot;100% immune&quot; to cracking.  Even phoning-home/dialing-in can be spoofed, as a clever user can do the following:

1. Packet-sniff a legitimate handshake with the real authentication server.
2. Reverse-engineer the authentication protocol.
3. Develop a custom server that emulates the protocol.
4. Reconfigure the network (DNS and routing) to redirect authentication requests to the emulated server.
5. Run the program as-is (i.e., no patches) in said environment until it receives the response it expects.

You can introduce some cryptography to this process, but it will only frustrate an attacker, not completely defeat him.  Of course, patching--which, &quot;sane&quot; or not, is commonplace--completely undermines key checking, with or without phoning home.</description>
		<content:encoded><![CDATA[<p>@Jamie Briant</p>
<p>No solution is &#8220;100% immune&#8221; to cracking.  Even phoning-home/dialing-in can be spoofed, as a clever user can do the following:</p>
<p>1. Packet-sniff a legitimate handshake with the real authentication server.<br />
2. Reverse-engineer the authentication protocol.<br />
3. Develop a custom server that emulates the protocol.<br />
4. Reconfigure the network (DNS and routing) to redirect authentication requests to the emulated server.<br />
5. Run the program as-is (i.e., no patches) in said environment until it receives the response it expects.</p>
<p>You can introduce some cryptography to this process, but it will only frustrate an attacker, not completely defeat him.  Of course, patching&#8211;which, &#8220;sane&#8221; or not, is commonplace&#8211;completely undermines key checking, with or without phoning home.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vitor Rubio</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4352</link>
		<dc:creator>Vitor Rubio</dc:creator>
		<pubDate>Wed, 24 Nov 2010 18:55:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4352</guid>
		<description>Great article. Thanks :)</description>
		<content:encoded><![CDATA[<p>Great article. Thanks :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: KarlW</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4098</link>
		<dc:creator>KarlW</dc:creator>
		<pubDate>Wed, 29 Sep 2010 19:11:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4098</guid>
		<description>Awesome article, thanks! Very simply explained for such a potentially complex procedure.

Just a quick query... you state that the seed is 64-bit integer, however it is stored as 8 hex digits, which I thought could only represent a 32-bit number. Have I confused myself here? Or is this a mistake in the article?

Thanks again,
Karl :)</description>
		<content:encoded><![CDATA[<p>Awesome article, thanks! Very simply explained for such a potentially complex procedure.</p>
<p>Just a quick query&#8230; you state that the seed is 64-bit integer, however it is stored as 8 hex digits, which I thought could only represent a 32-bit number. Have I confused myself here? Or is this a mistake in the article?</p>
<p>Thanks again,<br />
Karl :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alvaro</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4073</link>
		<dc:creator>Alvaro</dc:creator>
		<pubDate>Fri, 24 Sep 2010 14:32:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4073</guid>
		<description>I don&#039;t see the point, if you want security why don&#039;t use a digital signature method?. With RSA, digital signatures are only 64 bits (16 hexa characters). And beign RSA an asymmetric method it is very difficult for hackers to generate valid serials without the private key.</description>
		<content:encoded><![CDATA[<p>I don&#8217;t see the point, if you want security why don&#8217;t use a digital signature method?. With RSA, digital signatures are only 64 bits (16 hexa characters). And beign RSA an asymmetric method it is very difficult for hackers to generate valid serials without the private key.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sam</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4007</link>
		<dc:creator>Sam</dc:creator>
		<pubDate>Fri, 27 Aug 2010 02:29:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4007</guid>
		<description>Hi, just visiting from Hacker News. Just curious, is there a high incidence of piracy among Bible software consumers?</description>
		<content:encoded><![CDATA[<p>Hi, just visiting from Hacker News. Just curious, is there a high incidence of piracy among Bible software consumers?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jamie Briant</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4004</link>
		<dc:creator>Jamie Briant</dc:creator>
		<pubDate>Thu, 26 Aug 2010 18:12:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4004</guid>
		<description>Seriously? You don&#039;t appreciate dialing in to activate? Get over it! Your customers have. They do it for Windows, iTunes, iPhones, you name it. The only ones who don&#039;t are huge companies like Ford, and you&#039;ll be using FlexLM for them.

Dialing in is 100% immune to keygens, so pirates will have to create a patch tool, which any sane individual will refuse to download and run. Nothing you can do to stop patch tools: the more you try, the more of a challenge it is for them - frankly some kid will do it just to prove he&#039;s better than you.</description>
		<content:encoded><![CDATA[<p>Seriously? You don&#8217;t appreciate dialing in to activate? Get over it! Your customers have. They do it for Windows, iTunes, iPhones, you name it. The only ones who don&#8217;t are huge companies like Ford, and you&#8217;ll be using FlexLM for them.</p>
<p>Dialing in is 100% immune to keygens, so pirates will have to create a patch tool, which any sane individual will refuse to download and run. Nothing you can do to stop patch tools: the more you try, the more of a challenge it is for them &#8211; frankly some kid will do it just to prove he&#8217;s better than you.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ramshankar</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4003</link>
		<dc:creator>Ramshankar</dc:creator>
		<pubDate>Thu, 26 Aug 2010 13:04:18 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4003</guid>
		<description>Good article, bookmarked for reading again.</description>
		<content:encoded><![CDATA[<p>Good article, bookmarked for reading again.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Joe White</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4001</link>
		<dc:creator>Joe White</dc:creator>
		<pubDate>Tue, 24 Aug 2010 03:15:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4001</guid>
		<description>FYI, unless something has changed recently, some of your statements about &quot;inline&quot; are not correct.

The &quot;inline&quot; directive will not *force* the compiler to inline your code, only tell it that it&#039;s *allowed* to inline it. In the words of Danny Thorpe (the guy who added the &quot;inline&quot; feature to the Delphi compiler), the compiler &quot;can disregard it if it thinks you’re wrong or stupid&quot;. (One example he gave was if inlining made your call site so complicated that you needed too many temps and blew your registers. In that case, the compiler might choose to make the call instead of inlining.)

And the entry point might still exist. If every call is inlined, then the smart linker will remove the standalone function; but if any of the calls aren&#039;t inlined, then the entry point will still exist. Granted, &quot;inline&quot; could make the code more resistant to cracking -- even if the entry point still exists, some of the callers might use the inlined version instead. But if the check method is complicated, it probably gets more likely that the compiler will call the central function instead of inlining. (You can always look at the x86 code in the debug view to see whether it got inlined or not.)

There&#039;s more in-depth details about &quot;inline&quot; in the &quot;Function inlining&quot; section on this blog post (my notes from Danny&#039;s BorCon presentation, clear back when the feature was introduced): http://blog.excastle.com/2004/09/13/dannys-whats-new-in-the-diamondback-compiler-session/</description>
		<content:encoded><![CDATA[<p>FYI, unless something has changed recently, some of your statements about &#8220;inline&#8221; are not correct.</p>
<p>The &#8220;inline&#8221; directive will not *force* the compiler to inline your code, only tell it that it&#8217;s *allowed* to inline it. In the words of Danny Thorpe (the guy who added the &#8220;inline&#8221; feature to the Delphi compiler), the compiler &#8220;can disregard it if it thinks you’re wrong or stupid&#8221;. (One example he gave was if inlining made your call site so complicated that you needed too many temps and blew your registers. In that case, the compiler might choose to make the call instead of inlining.)</p>
<p>And the entry point might still exist. If every call is inlined, then the smart linker will remove the standalone function; but if any of the calls aren&#8217;t inlined, then the entry point will still exist. Granted, &#8220;inline&#8221; could make the code more resistant to cracking &#8212; even if the entry point still exists, some of the callers might use the inlined version instead. But if the check method is complicated, it probably gets more likely that the compiler will call the central function instead of inlining. (You can always look at the x86 code in the debug view to see whether it got inlined or not.)</p>
<p>There&#8217;s more in-depth details about &#8220;inline&#8221; in the &#8220;Function inlining&#8221; section on this blog post (my notes from Danny&#8217;s BorCon presentation, clear back when the feature was introduced): <a href="http://blog.excastle.com/2004/09/13/dannys-whats-new-in-the-diamondback-compiler-session/" rel="nofollow">http://blog.excastle.com/2004/09/13/dannys-whats-new-in-the-diamondback-compiler-session/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Damitha</title>
		<link>http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/comment-page-1/#comment-4000</link>
		<dc:creator>Damitha</dc:creator>
		<pubDate>Mon, 23 Aug 2010 12:50:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/#comment-4000</guid>
		<description>Thanks. this helped me lot. keep up the good work</description>
		<content:encoded><![CDATA[<p>Thanks. this helped me lot. keep up the good work</p>
]]></content:encoded>
	</item>
</channel>
</rss>

