I promised to give some pointers for programmers on how to enhance your software so it is less vulnerable to cracker's attacks, who are trying to crack or make a serial for it.
All of these things are pretty obvious, yet a lot of software authors don't obey them. As a result, a serial number pops up on the Usenet / web boards within a few days (or even hours) after the new version release, thus hurting sales dramatically - my experience shows that if "generic pirate" people cannot find a serial number or crack for a particular software within first 3 days, they are more likely to buy it. But don't overestimate this statement, as lots of pirates will never, ever pay for your software, no matter what you do. But either way, often holding up for the initial 3 days after each release is a strategic move that might bring you more sales.
So here is a couple of tips to prevent serial numbers from being generated:
pbxbuild install or strip on your executable before shipping the code. Otherwise, a quick nm run will reveal a list of all of your internal symbols, such as, ugh, _CheckSerialNumber, or similar, thus giving a lot of clues to the hacker. Note that for Cocoa applications, it is not possible to completely strip off the classes and methods used in the executable - even if nm won't show it, class-dump will still do. However this adds some additional hassle as the hacker would have to set a breakpoint on a memory address rather than a symbol name in gdb.gdb to find out the correct serial number your application nicely pre-generated for the cracker.orderWindowOut: instead of isSerialValid:). There's a good chance hacker will step over a routine with such an innocent name.sheetDidEnd: callback - just don't do it right away. This makes finding the right spot harder.This about sums it up. Hopefully some of you found this useful. :)
I've been chatting to a buddy over ICQ today; he works as a principal sysadmin for a medium-sized ISP here in St.Petersburg (around 3k users). At some point of our conversation, I was completely shocked he is not aware of the recent MS SQL worm, and was wondering why is he getting a UDP packet flood on a local accounting Intranet. Can you believe this? A person directly responsible for the network and system operation in his organization is not aware about a worm that saturated half of the Internet for a few hours a week ago. Is he living in a can? Or spends too much time in q3a?.. Who knows. One thing for sure, I wouldn't want to be a customer at that ISP.
A much talked about update to WindowShade X is out, fixing plenty of reported issues:
I recommend everybody to upgrade. Download here. Thank you for your support!
In the comments to the recent post, Terri suggested us to introduce a network check for our software to prevent haxies with the same serial number running on multiple machines, to increase profits.
This comment made me think about the whole protection deal, and in the end, it made me to write this small rant about software protection systems in general, and our take on them in particular. I will also briefly discuss the downsides and vulnerabilities of particular approaches (on a spite of a whole "software piracy" issue).
First of all, let's overview most popular takes on the software protection:
-[MyApp serialNumberForName:] and then simply do if ([userEnteredSerial isEqualToString:[MyApp serialNumberForName:userEnteredName]]) to verify the validity of the serial number. With that approach, for a hacker it usually takes 2 to 3 minutes to generate a valid serial number for some bogus name and distribute it over usenet and WWW boards.Maybe there are more methods available around that I forgot here, but I think the overview above pretty much covers it. There are more variations and cross-methods of software protection, of course, and I am not a software "cracker" to know them all.
Sitting on my own tree, I can say that many shareware developers suffer from piracy. I don't know much about big corporations such as Adobe or Macromedia, but I think they lose some of the sales because of the piracy issue as well.
So what do software developers do when they encounter that the serial number to their software was "leaked" to the "general public"? The most obvious answer is - they disabled the leaked serial numbers in the next version of the software so they no longer work. What is most common answer to that action from the pirate land? A new serial is leaked, or generated, within a few days after the software release (pirates, and crackers, just like us, watch MacUpdate and similar sites for new titles/new versions of the software ;). This ends up as an endless cycle - developer bans the serials and improves the protection, pirates crack and leak numbers.
This is where every developer should stop for a few minutes and think - is it worth to battle with the pirates? Will the pirates buy your product if they cannot crack it or find a serial number? Or this ends up as a battle with the windmill - you spend lots of time improving your protection, time that could be spent on adding useful features, and give the pirates more fun - because most of them do what they do for fun, as an entertainment, or as a challenge?
I think there is a thin balance between bringing sufficient anti-pirate protection and wasting time you could have spent improving your product. Your software should be fairly well protected, but do not forget about legal users who bought it and are expecting you to improve the software functionality.
This is exactly the reason we are not wasting too much time trying to squeeze money out of unhonest users - we try to improve our software so they will see how good it is and will want to buy it. After all, people who will not buy it ever, will not buy it either way - so why bother?.. Better focus on making your product better - and everybody will benefit from it.
Sometime later I will highlight a few things for software developers to make their products more hacker-resistant. And for now, thanks for reading all this rant. =)
Ugh, that new Internet virus (or worm, whatever that is) caused my ISP to die. ;) So right now I am connected through GPRS -- the ISP promised to have issues resolved by tomorrow. Ack. One more reason to not use Windows. ;)
So after a long hiatus from Slava's...err, the company blog, I get the task of letting you all in on a recent decision Unsanity has made.
To get right to it, we have decided to raise the price of our current lineup of products from 7 bucks a pop to $10. Believe it or not, this was a tough decision to come to for us. We actually liked providing our products at dirt cheap prices. Seven bucks became somewhat of a signature price for us.
Remember, this is not an upgrade charge. This will be effective for new purchases only. Those of you that already own our current products will still have free upgrades for the life of the product.
We think $10 per copy is still a great value for our products, it's still dirt cheap, it's just a higher grade dirt now. ;) But we always like to play fair, so we're not going to switch the price until February 1, 2003. That gives anyone who has been waiting to purchase a chance to snag our products while they're low-grade dirt cheap. (Note: the "dirt cheap" is reference to price only, not the quality of the product....the products are of course "pure gold") This change will help us to be able to continue to improve existing products even further and innovate and bring more cool products to Mac OS X in the future.
So thanks for listening and for your continued support. We do hope our users understand and have faith that we'll deliver sufficient value to erase any doubt on our price. So hold the mobs/riots/demonstrations please! ;)
The topic pretty much says it all. Today is Macintosh 19th birthday, and this means my favorite computer is only 4 years younger than I am!
We may be called a cult, a following, die-hard maniacs of a dying computer evolution branch, but no matter what, we know what is the best computer out there. It may have quirks both in lagging hardware and OS, but eventually they are getting worked out. Thanks, Apple!
Read this entry by David Hyatt if you haven't already. Then read the comments to it. This is what happens when:
a) General, non-geek crowd tries to read a techie/geek blog;
b) The crowd above don't bother reading the archives.
A joke turned out to be taken pretty seriously by most of the people who commented. WTF? Or does humor always has to have a "Humor" category tag David added some time later to be interpreted as such? =)
Just a quick note that WindowShade X 2.1.2 will go Final Candidate tonight, with a release pending sometime next week. Thanks to everybody who submitted the bug reports!
Unfortunately, it will not completely fix the bug described in MacFixIt with renaming files. If you disable WindowShade X and minimize the Finder window while editing the filename, then restore the window back, the filename will be blank, until you click somewhere else. This is exactly how WindowShade X2.1.2 works now -- and unfortunately I cannot do much about that as it is an Apple's bug (and I have submitted it to RadarWeb, so let's hope it'll be fixed soon). =)
Nifty, a blog dialogue. It happens every day, and it happened to be happening here as well. Anyway, John tried to point that the recently updated MacMinute RSS feed is actually not the full one. I agree, getting used to the whole RSS feed thing you usually tend to want all of the article's text to be included. However, I can clarify that although I am in charge of the technical aspect of the above mentioned site, I have no control whatsoever on the content. So unless "the management" decides to include full text of the articles in the feed, I cannot do much. ;) You are more than welcome to actually suggest some marketing ideas about monetizing of a complete RSS feed -- maybe that will push this and other sites on the Mac side to implement these feeds. In the end, we all benefit, right? =)
Alrighty, I seem to be on my quest to make John happy today. A search field is added to the main index template, woo hoo!
I've updated the MacMinute's RSS Feed so it includes the first sentence of every newsbit. That gives enough information and should please you, John. ;)
Well, here we go - as promised, Application Enhancer 1.2.1 and Application Enhancer SDK 1.2.1 are out. Next things we;ll be focusing on is WindowShade X 2.1.2, which is nearly ready for the release. I will spend half a day investigating a bug reported on MacFixIt - and possibly fix it if its under my jurisdiction.
Rewrite of WindowShade X Cocoa part is going well - I am expecting it to be done by tonight. Meanwhile, I cleaned up a lot of code and built up a foundation that will serve well for the addition of minimize-in-place functionality later on in the next major WSX update. If all goes well, WindowShade X 2.1.2 will be out this week.
On the other hand, we'll be releasing an update to Application Enhancer tonight tomorrow. It fixes no major bugs (simply because we are not aware of any ;), but gives a few nice little fixes to the APE Manager tool, and fixes two small memory leaks (6 bytes per running application, whoop!). Also, a thing that is long overdue is APE SDK 1.2.1 - now with better documentation, example code, ProjectBuilder templates and more.
I was chasing against some weird Mail.app bugs caused by WindowShade X (collapse window, expand window, double-click a message - new window with the message will not appear until you switch out of Mail.app and switch back) and did some serious investigations on the Cocoa side of things. It turned out the Cocoa WindowShade X side can be made much more cleaner and efficient (and get rid of the above mentioned bug(s)). So here I am, started a little rewrite/cleanup of the code for Cocoa part of WSX.
1.5 years ago, when I was just starting on WindowShade X, we had much less advanced tools to do stuff, so some parts of WSX (especially on the Cocoa side) were pretty... hackish. They work fine, but there is a better way of implementing it -- I see it now. The code carried on since then and now I finally can dedicate 2 days to completely rewrite the thing.
On that matter, a quick poll for WindowShade X users:
- Try Windowshading a window;
- Click on the Minimize to Dock widget or Make Transparent;
- The window will unshade and either fly to Dock or become transparent.
Is that the right behavior? Shouldn't it just unshade? What to you think?
The joys of the weather -- the temperature here jumps up and down every day (been about 0 C yesterday, and -27 C the day before, and -16 C today). Sort of frustrating, especially since it's pretty uncomfortable to ski at below -25 C.
And I got a typical winter stuff -- common cold, coughing, and a runny nose. Yet today when I saw the temp at -16 C, I decided to ski anyway. It was pretty fun, to be able to go downhill after 1.5 weeks of sitting at home (more or less).
And now I am sitting here, coughing frequently, and looking for a bug in WindowShade X that causes Mail.app misbehave a little bit. Wee!
Probably Russia is the only country celebrating an odd holiday named Old New Year. Does it makes sense to you? =)
It is celebrated in the night between 13th and 14th January -- that's today! Gives us Russians another reason to get drunk. The holiday has its roots in the dates shift occured somewhere in the beginning of 20th century to catch up with the missing 2 weeks that were made during 1900 years. Or something like that.
Anyway, 13th Jan is the same as Dec 31st in the "old" dates (without the day shift) - so this is why this is called Old New Year. (That's the same reason as why we celebrate Xmas on Jan 7th and not Dec 25th. Odd).
Happy Old New Year 2003!
Well, well, well. I bought a new Epson inkjet printer today for the sole purpose of printing my digital photos. I guess the full circle of digital lifestyle is complete now (almost, the only thing pending is iPod). I've got:
Edit: Oh yeah, a Palm. I used to own one, but then I noticed I suck too much to forget about using it all the time (it was fun for the first 2 weeks, then I was either forgetting it at home or forgetting to use it). At the end, I gave it to my father, who proudly lost it after 3 weeks of use. Ohwell.
This may be extremely buggy. This is the first time someone other than me has used it. Never tested on 10.1.5.
Get it here
Version 1.5a3
- Now refreshes the font boxes if you delete a substitution rule.
- Moved some logging to only appear if log stuff is checked.
- Redid GUI some more.
- Can now drag the font substitution fonts into text editors (like email in case I ask for your rules)
- About box works again
- Fixed a problem that could cause some odd problems in cocoa applications when loading nibs if Minimum font size was enabled, but theme font was disabled and there was no theme font ever set (the Theme Font box would say "No Font"). This would cause crashes in some applications like Chimera. The conditional operator saves the day. This bug was reported in the MacNN forums instead of directly to me. Err!
- Remove is now enabled if you set a replacement font.
- Can no longer select an invalid font in the Font Panel.
- Added regular expression per app settings.
- New individual settings are now based off the global settings instead of what I think should be default.
- Adding a new application now causes the individual settings list to scroll to the selection.
- No longer tries to find matching individual settings for the current application once it is found.
- Added an option to prefer outline fonts. This will make fonts like Geneva, Monaco, and the like anti-aliased at point sizes where a screen font exists.
- When silk crashes, it should now point blame at itself instead of hiding behind the shadows.
Version 1.5a
- Ability to prefer outline versions of fonts.
- Font substitution
- Theme Font Replacement
- Minimum Font Size
- Moved to .APE
- Some other bugs fixed I can't remember. Like this one caused by a bug in OS X that makes it so Silk can't get the path of a CFM unbundled application using CFBundle.
Known Problems
- Changes may not take effect immediately for the new fonts tab.
- May replace some fonts it shouldn't and might not replace others it should.
- TextEdit (the API, not the Application) selection shows fuzzy pixels. Want to fix this for next version. Not sure how yet.
- Doesn't make sure APE is installed.
- Minimum font size is wacky at times.
- The desktop seems to randomly decide when to draw shadows when Fast Theme font replacement is selected.
- If you have substitution rule for Lucida Grande to some other font and a theme font selected that is different from the rule, you will get some odd results.
- If you replace the font that is the theme font as a font substitution rule, you will get some weird results as well.
- Because of Objective-C's inherent slowness, doing font substitution on a Cocoa app that uses Cocoa text handling (Like OmniWeb and ProjectBuilder but not Chimera) can be extremely painful.
- There may be some memory leaks here and there.
Settings Fonts
- You can drag and drop just about any text selection with font information or object from the right side of the Silk Preference pane to the left side of the Silk Preference Pane's Font Tab or two the "Font Boxes" below the tables. Like if you don't like a font in Internet Explorer but don't know the name of the font, just drag a text selection containing the font onto the Original Font box or the font substitution rule table of the Font tab of the Silk preference pane. I'll make a movie later to explain this.
Just finished reading a book by Iain Banks, "The Wasp Factory". It is a second book I've read of that author (first was "Walking on Glass"), and just like the first one I tried, it is just great. Quite a simple story yet told with plenty of humor and horror at the same time -- the whole book made me want to read more of the same authors, so I'll be starting on The Bridge tomorrow). Being read mostly sci-fi for past few years, I started moving towards different writing styles at the end of 2002, and I don't regret it. Variety of reading is essential to keep yourself sane. Or unsane.
I've been talking about this one some time ago, uet after some delays and more fixing Jason released a new, all-better version of iChat Enhancer. This handy little APE module will resize the size of the iChat input line area, and (an invaluable feature to me) will optionally prevent iChat from stripping out line breaks from your messages -- often it's so much needed to send a piece of some code to somebody, and you paste it in, and notice iChat proudly ate all returns. Yikes. This thing fixes it, so I can be happy now!

It's about time Apple released its own implementation of X11 system for Mac OS X. I've installed it, and it looks pretty good - at least way better than any other alternatives I tried before.
There's one minor drawback, though - WindowShade X is not working with X11 app windows. I spent some time yesterday investigating the problem and found the source of troubles, as well as mostly implemented a fix for it. So this means that sooner or later a minor update to WindowShade X will be released (sooner than I thought, as I have sort of expected to get to WSX when implementing our own minimize-in-place system).
At the same time, an update to Application Enhancer is in the works as well (no real big bugs to fix, mostly cosmetic touches in the APE Manager). I also have to finish updating the docs and release APE SDK 1.2.
Lots of work ahead, and even more fun ideas are waiting to be played with. This is great.
Well, Apple did it again, in my opinion. Safari looks like a true winner to me -- been using it for about 19 minutes now, and already in love. The only thing I miss is tabbed browsing. Ohwell, I guess it'll be coming up. ;)
As many of you have already known or guessed, I live in Russia. The rest of the team (Brian and Rosyna) are in the States. This makes us a true Internet company, I guess, even though we know each other in real life, as well.
Somebody in the comments for the previous blog entry asked why do I live in Russia. Frankly, there are a few reasons, but most of them are pretty... silly, or maybe a bit naive.
First of all, I was born here; most of my family lives here. Lots of my real life friends and people we know also live in Russia. I don't really know any foreign languages, too. ;)
Second reason, I am pretty well established here. I have a great wife and an awesome kid. I own an appartment, a car, and tons of other junk called "property". No, property won't be a real obstacle if I *really* wanted to move, but still...
Third reason, I earn a bit more than most other average Russian people - considering an average programmer working fulltime in an officc here gets around $400 to $800 per month. Makes me feel good. In the other countries, my salary would feel much more average than it is here. ;)
I like to travel though, and sometime on my agenda is getting an appartment in some other, warmer country, where I can stay during the frosts I hate so much.
On the issue of travelling, I wish I could be at MWSF, but oh well, being a Russian citizen also gives some troubles with getting a US entry visa -- US Consulate refused to give me one, because:
- I work in an american company;
- I work in hi-tech/IT;
- I am young.
Sounds pretty absurd, yet the guy explained that in his opinion I am not tied enough to Russia to have a motivation to come back (wife, kid, and property probably just doesn't count), besides since I work in a US company, there's a high possibility I will immigrate. Hah. Makes it sort of unfair - I am not allowed in the country that makes profit off my work. They also gave me a "to-do list" of things i have to achieve for a possibility of gaining a visa:
- Get one more kid;
- Get employed in a Russian company;
- Make the Russian economics be better.
I laughed at the last one, and politely asked, how the guy thinks I can affect that. Of course I got no answer. ;) So all in all, I'll try again to get a visa for WWDC or MacHack. That'll be fun, for sure.
BTW if any of you are planning to visit St.Pete (we will celebrate 300 city anniversary this summer), drop me a note, I'll happily have a glass of your favorite drink with you.
I am sick of power outages in this city. We have our electricity cut off every single day, lasting up to 4-5 hours; kind of kills my productivity -- my UPS systems (one for each computer in the appartment) run out in about an hour, so the rest of the time we have to sit here with candles (it's only fun for first 3-5 times ;). I've heard this is because we have a major elections coming, and one of the opponents to the current major (people are not too satisfied with him) heads the local branhc of a nation-wide electricity company -- so the current government are organizing the power blackouts to make people angry and not vote for him. Sounds pretty absurd, however knowing Russia I won't be surprised if it's the truth. ;)
On the other hand, yesterday (when half of my work day went off with the power), I looked in the window and saw northern lights -- first time I ever saw these in St.Petersburg! Quite a stunning view, the whole sky was stripey. I took some pictures, but none of them came out well (crappy cheap digital camera ;).
Any way, sometimes power outages are fun. I saw northern lights, and went to bed early. ;)
The new ProjectBuilder is a whole lot better. It can utilize multiple CPUs (at last), and it has a few other improvements.
However, check out this nifty screenshot:

Can you tell the build was failed if you just glance over the window without really paying attention to the text? That tiny green icon sorta misleaded me, and I was thinking "why my newest changes are not reflected on the build?". ;)
Weird, more and more people around me are getting into typography stuff. One codes a few popular Mac OS font tools (FontLab, TransType). Another one, Aaron Sittig, used to work with infamous Napster, and now, when the company dissolved, got back to the university and began learning typography and tries to design his own fonts.
The whole area is pretty much a mystery to me -- I can judge a font by the way it looks, but I got no other criteria or special knowledge to do so. This is something I'd love to learn sometime later -- I guess I'll have to pick some good books on the issue. Any suggestions?
Well, this is 1837th time you read a 'happy new year' post on blogosphere. So we'll make it short -
HAPPY NEW YEAR!