Domain: perl.org
Stories and comments across the archive that link to perl.org.
Comments · 847
-
Parrot != Perl 6I don't mean to sound contentious, but Parrot is the virtual machine that Perl 6 will target. It is not, in fact, the language itself.
In this way, I suppose, Perl 6 will be kinda sorta like Java in that it will target a VM, rather than a CPU. The Parrot VM is not exclusive to Perl - from what I understand, idea is that eventually Python and Perl will share a common VM. It's conceivable, I suppose, that some sick bastard could write a Java compiler that targets Parrot.
Parrot isn't finished yet, but there are a few "toy" languages that target it (Jako and Cola, and more recently BASIC).
-
Re:This is a Good Thing
What we need is an open language that matches up to java and c#.
Perl 6 is what I bet on.
-
Here is what I have as my perfect email client
There are three major points for my perfect email client:
1. Look and feel the same in X and console, so that I could make use of both xpdf/mozilla and remote mail reading.
2. Localization. Being non-native english speaker, this one is pretty important.
3. Keyboard navigation
For the last 4 years I am extremely satisfied with the combination:
- fetchmail (getting mail)
- procmail (sorting mail into mailboxes)
- mutt (reading/replying)
- vim (editing)
When it comes down to analyze mailbox and generate some reports, like for example, in the case with antivirus reports, I use perl with Mail::MboxParser module.
For all my friends, who need GUI to read email, I recommend using Mozilla and or Evolution
-
Re:What about my old perl code?
Where are you getting this? He talks about such an idea in Apocalypse 1, referencing RFC 16: Keep default Perl free of constraints such as warnings and strict. and says specifically that it is not good:
Now, there are right ways to do this, and wrong ways. I was peeved by the approach taken by DEC when they upgraded BASIC/PLUS to handle long variable names. Their solution was to require every program using long variable names to use the command EXTEND at the top. So henceforth and forevermore, every BASIC/PLUS program had EXTEND at the top of it. I don't know whether to call it Bad or Ugly, but it certainly wasn't Good.
Furthermore he goes on:
A better approach is to modify something that would have to be there anyway. If you go out to CPAN and look at every single module out there, what do you see at the top? Answer: a ``package'' declaration. So we break that.
I hereby declare that a package declaration at the front of a file unambiguously indicates you are parsing Perl 5 code. If you want to write a Perl 6 module or class, it'll start with the keyword module or class. I don't know yet what the exact syntax of a module or a class declaration will be, but one thing I do know is that it'll set the current global namespace much like a package declaration does.
And if you continue to read this section it sounds like the issue has not been completely resolved.
I've not read much more of the Apocalypses or Exegesises in depth...but what I've skimmed doesn't seem to address this in greater depth. Is there a more definitive answer to this question?
-
Re:What about my old perl code?
Where are you getting this? He talks about such an idea in Apocalypse 1, referencing RFC 16: Keep default Perl free of constraints such as warnings and strict. and says specifically that it is not good:
Now, there are right ways to do this, and wrong ways. I was peeved by the approach taken by DEC when they upgraded BASIC/PLUS to handle long variable names. Their solution was to require every program using long variable names to use the command EXTEND at the top. So henceforth and forevermore, every BASIC/PLUS program had EXTEND at the top of it. I don't know whether to call it Bad or Ugly, but it certainly wasn't Good.
Furthermore he goes on:
A better approach is to modify something that would have to be there anyway. If you go out to CPAN and look at every single module out there, what do you see at the top? Answer: a ``package'' declaration. So we break that.
I hereby declare that a package declaration at the front of a file unambiguously indicates you are parsing Perl 5 code. If you want to write a Perl 6 module or class, it'll start with the keyword module or class. I don't know yet what the exact syntax of a module or a class declaration will be, but one thing I do know is that it'll set the current global namespace much like a package declaration does.
And if you continue to read this section it sounds like the issue has not been completely resolved.
I've not read much more of the Apocalypses or Exegesises in depth...but what I've skimmed doesn't seem to address this in greater depth. Is there a more definitive answer to this question?
-
Re:What about my old perl code?No, you won't have to rewrite your old code - there are so many changes and so much Perl5 code out there - it would be impossible. Likely, there will be a separate Perl5 parser/compiler on top of Parrot (largely separate from the Perl6 parser/compiler).
If you are a Perl person, or have any interest at all in Perl, I recommend setting aside some time to read the current 4 (and the future) Apocalypses and Exegesises at dev.perl.org.
-
Perl Users All Thank Sun For Their SupportIn real non april 1st way, the Perl Peeps are all really grateful for Sun's support of Perl.
Recently Sun donated some new hardware to make search.cpan.org work a lot faster. This was covered on use Perl.
Thanks Sun!
-
Perl philosophy: "There's more than one way ..."From the a Perl glossary:
TMTOWTDI
There's More Than One Way To Do It - a major philosophy in the design of Perl. ...Sig: What Happened To The Censorware Project (censorware.org)
-
Re:Hosting Myself???Step 1: Register at DHS for a Dynamic/Static Subdomain (Free)
Step 2: Redirect traffic from your family domain to the dynamic one.
Step 3: Install Linux on a nice 486 with ~32 MB RAM and at least a 1 GB HD
Step 4: Install apache , sendmail, perl, and maybe webmin if you are completely unfamiliar with Linux.
Step 5: If you want a web front end for your email system, try out NeoMail
Step 6: That's about it, you'll have to mess with the configration files before it runs, but it's worth it. The fact that all your email is automagically downloaded to your local machine is just an added bonus.
-
Re:More to biology than genomics!they don't encompass any of us
The content of Bioperl is driven far more by the interests of the bioperl community than by some malfeasant desire to exclude ecologists. What started out as a codebase dealing mostly with parsing sequence files and results from sequence-analysis applications is slowly branching out to include code for analysis of phylogenetic trees, etc.
If bioperl doesn't meet your needs the community as a whole needs to hear from you! Let the mailing list know what interests you or, even better, start contributing code!
The Bio* namespace can help address your problems only if you share them with the community!
:)-j
-
THE LINUX GAY CONSPIRACY
It has come to my attention that the entire Linux community is a hotbed of so called 'alternative sexuality,' which includes anything from hedonistic orgies to homosexuality to paedophilia.
What better way of demonstrating this than by looking at the hidden messages contained within the names of some of Linux's most outspoken advocates:
- Linus Torvalds is an anagram of slit anus or VD 'L,' clearly referring to himself by the first initial.
- Richard M. Stallman, spokespervert for the Gaysex's Not Unusual 'movement' is an anagram of mans cram thrill ad.
- Alan Cox is barely an anagram of anal cox which is just so filthy and unchristian it unnerves me.
I'm sure that Eric S. Raymond, composer of the satanic homosexual propaganda diatribe The Cathedral and the Bizarre, is probably an anagram of something queer, but we don't need to look that far as we know he's always shoving a gun up some poor little boy's rectum. Update: Eric S. Raymond is actually an anagram for secondary rim and cord in my arse. It just goes to show you that he is indeed queer.
Update the Second: It is also documented that Evil Sicko Gaymond is responsible for a nauseating piece of code called Fetchmail, which is obviously sinister sodomite slang for 'Felch Male' -- a disgusting practice. For those not in the know, 'felching' is the act performed by two perverts wherein one sucks their own post-coital ejaculate out of the other's rectum. In fact, it appears that the dirty Linux faggots set out to undermine the good Republican institution of e-mail, turning it into 'e-male.'
As far as Richard 'Master' Stallman goes, that filthy fudge-packer was actually quoted on leftist commie propaganda site Salon.com as saying the following: 'I've been resistant to the pressure to conform in any circumstance,' he says. 'It's about being able to question conventional wisdom,' he asserts. 'I believe in love, but not monogamy,' he says plainly.
And this isn't a made up troll bullshit either! He actually stated this tripe, which makes it obvious that he is trying to politely say that he's a flaming homo slut!
Speaking about 'flaming,' who better to point out as a filthy chutney ferret than Slashdot's very own self-confessed pederast Jon Katz. Although an obvious deviant anagram cannot be found from his name, he has already confessed, nay boasted of the homosexual perversion of corrupting the innocence of young children. To quote from the article linked:
'I've got a rare kidney disease,' I told her. 'I have to go to the bathroom a lot. You can come with me if you want, but it takes a while. Is that okay with you? Do you want a note from my doctor?'
Is this why you were touching your penis in the cinema, Jon? And letting the other boys touch it too?
We should also point out that Jon Katz refers to himself as 'Slashdot's resident Gasbag.' Is there any more doubt? For those fortunate few who aren't aware of the list of homosexual terminology found inside the Linux 'Sauce Code,' a 'Gasbag' is a pervert who gains sexual gratification from having a thin straw inserted into his urethra (or to use the common parlance, 'piss-pipe'), then his homosexual lover blows firmly down the straw to inflate his scrotum. This is, of course, when he's not busy violating the dignity and copyright of posters to Slashdot by gathering together their postings and publishing them en masse to further his twisted and manipulative journalistic agenda.
Sick, disgusting antichristian perverts, the lot of them.
In addition, many of the Linux distributions (a 'distribution' is the most common way to spread the faggots' wares) are run by faggot groups. The Slackware distro is named after the 'Slack-wear' fags wear to allow easy access to the anus for sexual purposes. Furthermore, Slackware is a close anagram of claw arse, a reference to the homosexual practise of anal fisting. The Mandrake product is run by a group of French faggot satanists, and is named after the faggot nickname for the vibrator. It was also chosen because it is an anagram for dark amen and ram naked, which is what they do.
Another 'distro,' (abbrieviated as such because it sounds a bit like 'Disco,' which is where homosexuals preyed on young boys in the 1970s), is Debian, an anagram of in a bed, which could be considered innocent enough (after all, a bed is both where we sleep and pray), until we realise what other names Debian uses to describe their foul wares. 'Woody' is obvious enough, being a term for the erect male penis, glistening with pre-cum. But far sicker is the phrase 'Frozen Potato' that they use. This filthy term, again found in the secret homosexual 'Sauce Code,' refers to the solo homosexual practice of defecating into a clear polythene bag, shaping the turd into a crude approximation of the male phallus, then leaving it in the freezer overnight until it becomes solid. The practitioner then proceeds to push the frozen 'potato' up his own rectum, squeezing it in and out until his tight young balls erupt in a screaming orgasm.
And Red Hat is secret homo slang for the tip of a penis that is soaked in blood from a freshly violated underage ringpiece.
The fags have even invented special tools to aid their faggotry! For example, the 'supermount' tool was devised to allow deeper penetration, which is good for fags because it gives more pressure on the prostate gland. 'Automount' is used, on the other hand, because Linux users are all fat and gay, and need to mount each other automatically.
The depths of their depravity can be seen in their use of 'mount points.' These are, plainly speaking, the different points of penetration. The main one is obviously
/anus, but there are others. Militant fags even say 'there is no /opt mount point' because for these dirty perverts faggotry is not optional but a way of life.More evidence is in the fact that Linux users say how much they love `man`, even going so far as to say that all new Linux users (who are in fact just innocent heterosexuals indoctrinated by the gay propaganda) should try out `man`. In no other system do users boast of their frequent recourse to a man.
Other areas of the system also show Linux's inherit gayness. For example, people are often told of the 'FAQ,' but how many innocent heterosexual Windows users know what this actually means. The answer is shocking: Faggot Anal Quest: the voyage of discovery for newly converted fags!
Even the title 'Slashdot' originally referred to a homosexual practice. Slashdot of course refers to the popular gay practice of blood-letting. The Slashbots, of course are those super-zealous homosexuals who take this perversion to its extreme by ripping open their anuses, as seen on the site most popular with Slashdot users, the depraved work of Satan, http://www.eff.org/.
The editors of Slashdot also have homosexual names: 'Hemos' is obvious in itself, being one vowel away from 'Homos.' But even more sickening is 'Commander Taco' which sounds a bit like 'Commode in Taco,' filthy gay slang for a pair of spreadeagled buttocks that are caked with excrement. (The best form of lubrication, they insist.) Sometimes, these 'Taco Commodes' have special 'Salsa Sauce' (blood from a ruptured rectum) and 'Cheese' (rancid flakes of penis discharge) toppings. And to make it even worse, Slashdot runs on Apache!
The Apache server, whose use among fags is as prevalent as AIDS, is named after homosexual activity -- as everyone knows, popular faggot band, the Village People, featured an Apache Indian, and it is for him that this gay program is named.
And that's not forgetting the use of patches in the Linux fag world -- patches are used to make the anus accessible for repeated anal sex even after its rupture by a session of fisting.
To summarise: Linux is gay. 'Slash -- Dot' is the graphical description of the space between a young boy's scrotum and anus. And BeOS is for hermaphrodites and disabled 'stumpers.'
FEEDBACK
What worries me is how much you know about what gay people do. I'm scared I actually read this whole thing. I think this post is a good example of the negative effects of Internet usage on people. This person obviously has no social life anymore and had to result to writing something as stupid as this. And actually take the time to do it too. Although... I think it was satire.. blah.. it's early. -- Anonymous Coward, Slashdot
Well, the only reason I know all about this is because I had the misfortune to read the Linux 'Sauce code' once. Although publicised as the computer code needed to get Linux up and running on a computer (and haven't you always been worried about the phrase 'Monolithic Kernel'?), this foul document is actually a detailed and graphic description of every conceivable degrading perversion known to the human race, as well as a few of the major animal species. It has shocked and disturbed me, to the point of needing to shock and disturb the common man to warn them of the impending homo-calypse which threatens to engulf our planet.
You must work for the government. Trying to post the most obscene stuff in hopes that slashdot won't be able to continue or something, due to legal woes. If i ever see your ugly face, i'm going to stick my fireplace poker up your ass, after it's nice and hot, to weld shut that nasty gaping hole of yours. -- Anonymous Coward, Slashdot
Doesn't it give you a hard-on to imagine your thick strong poker ramming it's way up my most sacred of sphincters? You're beyond help, my friend, as the only thing you can imagine is the foul penetrative violation of another man. Are you sure you're not Eric Raymond? The government, being populated by limp-wristed liberals, could never stem the sickening tide of homosexual child molesting Linux advocacy. Hell, they've given NAMBLA free reign for years!
you really should post this logged in. i wish i could remember jebus's password, cuz i'd give it to you. -- mighty jebus, Slashdot
Thank you for your kind words of support. However, this document shall only ever be posted anonymously. This is because the 'Open Sauce' movement is a sham, proposing homoerotic cults of hero worshipping in the name of freedom. I speak for the common man. For any man who prefers the warm, enveloping velvet folds of a woman's vagina to the tight puckered ringpiece of a child. These men, being common, decent folk, don't have a say in the political hypocrisy that is Slashdot culture. I am the unknown liberator.
ROLF LAMO i hate linux FAGGOTS -- Anonymous Coward, Slashdot
We shouldn't hate them, we should pity them for the misguided fools they are... Fanatical Linux zeal-outs need to be herded into camps for re-education and subsequent rehabilitation into normal heterosexual society. This re-education shall be achieved by forcing them to watch repeats of Baywatch until the very mention of Pamela Anderson causes them to fill their pants with healthy heterosexual jism.
Actually, that's not at all how scrotal inflation works. I understand it involves injecting sterile saline solution into the scrotum. I've never tried this, but you can read how to do it safely in case you're interested. (Before you moderate this down, ask yourself honestly -- who are the real crazies -- people who do scrotal inflation, or people who pay $1000+ for a game console?) -- double_h, Slashdot
Well, it just goes to show that even the holy Linux 'sauce code' is riddled with bugs that need fixing. (The irony of Jon Katz not even being able to inflate his scrotum correctly has not been lost on me.) The Linux pervert elite already acknowledge this, with their queer slogan: 'Given enough arms, all rectums are shallow.' And anyway, the PS2 sucks major cock and isn't worth the money. Intellivision forever!
dude did u used to post on msnbc's nt bulletin board now that u are doing anti-gay posts u also need to start in with anti-black stuff too c u in church -- Anonymous Coward, Slashdot
For one thing, whilst Linux is a cavalcade of queer propaganda masquerading as the future of computing, NT is used by people who think nothing better of encasing their genitals in quick setting plaster then going to see a really dirty porno film, enjoying the restriction enforced onto them. Remember, a wasted arousal is a sin in the eyes of the Catholic church. Clearly, the only god-fearing Christian operating system in existence is CP/M -- The Christian Program Monitor. All computer users should immediately ask their local pastor to install this fine OS onto their systems. It is the only route to salvation.
Secondly, this message is for every man. Computers know no colour. Not only that, but one of the finest websites in the world is maintained by a Black Man . Now fuck off you racist donkey felcher.
And don't forget that slashdot was written in Perl, which is just too close to 'Pearl Necklace' for comfort.... oh wait; that's something all you heterosexuals do.... I can't help but wonder how much faster the trolls could do First-Posts on this site if it were redone in PHP... I could hand-type dynamic HTML pages faster than Perl can do them. -- phee, Slashdot
Although there is nothing unholy about the fine heterosexual act of ejaculating between a woman's breasts, squirting one's load up towards her neck and chin area, it should be noted that Perl (standing for Pansies Entering Rectums Locally) is also close to 'Pearl Monocle,' 'Pearl Nosering,' and the ubiquitous 'Pearl Enema.'
One scary thing about Perl is that it contains hidden homosexual messages. Take the following code: LWP::Simple -- It looks innocuous enough, doesn't it? But look at the line closely: There are two colons next to each other! As Larry 'Balls to the' Wall would openly admit in the Perl Documentation, Perl was designed from the ground up to indoctrinate it's programmers into performing unnatural sexual acts -- having two colons so closely together is clearly a reference to the perverse sickening act of 'colon kissing,' whereby two homosexual queers spread their buttocks wide, pressing their filthy torn sphincters together. They then share small round objects like marbles or golfballs by passing them from one rectum to another using muscle contraction alone. This is also referred to in programming 'circles' as 'Parameter Passing.'
And PHP stands for Perverted Homosexual Penetration. Didn't you know?
Thank you for your valuable input on this. I am sure you will be never forgotten. BTW: Did I mention that this could be useful in terraforming Mars? Mars rulaa. -- Eimernase, Slashdot
Well, I don't know about terraforming Mars, but I do know that homosexual Linux Advocates have been probing Uranus for years.
That's inspiring. Keep up the good work, AC. May God in his wisdom grant you the strength to bring the plain honest truth to this community, and make it pure again. Yours, Cerberus. -- Anonymous Coward, Slashdot
*sniff* That brings a tear to my eye. Thank you once more for your kind support. I have taken faith in the knowledge that I am doing the Good Lord's work, but it is encouraging to know that I am helping out the common man here.
However, I should be cautious about revealing your name 'Cerberus' on such a filthy den of depravity as Slashdot. It is a well known fact that the 'Kerberos' documentation from Microsoft is a detailed manual describing, in intimate, exacting detail, how to sexually penetrate a variety of unwilling canine animals; be they domesticated, wild, or mythical. Slashdot posters have taken great pleasure in illegally spreading this documentation far and wide, treating it as an 'extension' to the Linux 'Sauce Code,' for the sake of 'interoperability.' (The slang term they use for nonconsensual intercourse -- their favourite kind.)
In fact, sick twisted Linux deviants are known to have LAN parties, (Love of Anal Naughtiness, needless to say.), wherein they entice a stray dog, known as the 'Samba Mount,' into their homes. Up to four of these filth-sodden blasphemers against nature take turns to plunge their erect, throbbing, uncircumcised members, conkers-deep, into the rectum, mouth, and other fleshy orifices of the poor animal. Eventually, the 'Samba Mount' collapses due to 'overload,' and needs to be 'rebooted.' (i.e., kicked out into the street, and left to fend for itself.) Many Linux users boast about their 'uptime' in such situations.
Inspiring stuff! If only all trolls were this quality! -- Anonymous Coward, Slashdot
If only indeed. You can help our brave cause by moderating this message up as often as possible. I recommend '+1, Underrated,' as that will protect your precious Karma in Metamoderation. Only then can we break through the glass ceiling of Homosexual Slashdot Culture. Is it any wonder that the new version of Slashcode has been christened 'Bender'???
If we can get just one of these postings up to at least '+1,' then it will be archived forever! Others will learn of our struggle, and join with us in our battle for freedom!
It's pathetic you've spent so much time writing this. -- Anonymous Coward, Slashdot
I am compelled to document the foulness and carnal depravity that is Linux, in order that we may prepare ourselves for the great holy war that is to follow. It is my solemn duty to peel back the foreskin of ignorance and apply the wire brush of enlightenment.
As with any great open-source project, you need someone asking this question, so I'll do it. When the hell is version 2.0 going to be ready?!?! -- Anonymous Coward, Slashdot
I could make an arrogant, childish comment along the lines of 'Every time someone asks for 2.0, I won't release it for another 24 hours,' but the truth of the matter is that I'm quite nervous of releasing a 'number two,' as I can guarantee some filthy shit-slurping Linux pervert would want to suck it straight out of my anus before I've even had chance to wipe.
I desperately want to suck your monolithic kernel, you sexy hunk, you. -- Anonymous Coward, Slashdot
I sincerely hope you're Natalie Portman.
Dude, nothing on slashdot larger than 3 paragraphs is worth reading. Try to distill the message, whatever it was, and maybe I'll read it. As it is, I have to much open source software to write to waste even 10 seconds of precious time. 10 seconds is all its gonna take M$ to whoop Linux's ass. Vigilence is the price of Free (as in libre -- from the fine, frou frou French language) Software. Hack on fellow geeks, and remember: Friday is Bouillabaisse day except for heathens who do not believe that Jesus died for their sins. Those godless, oil drench, bearded sexist clowns can pull grits from their pantaloons (another fine, fine French word) and eat that. Anyway, try to keep your message focused and concise. For concision is the soul of derision. Way. -- Anonymous Coward, Slashdot
What the fuck?
I've read your gay conspiracy post version 1.3.0 and I must say I'm impressed. In particular, I appreciate how you have managed to squeeze in a healthy dose of the latent homosexuality you gay-bashing homos tend to be full of. Thank you again. -- Anonymous Coward, Slashdot
Well bugger me!
ooooh honey. how insecure are you!!! wann a little massage from deare bruci. love you -- Anonymous Coward, Slashdot
Fuck right off!
IMPORTANT: This message needs to be heard (Not HURD, which is an acronym for 'Huge Unclean Rectal Dilator') across the whole community, so it has been released into the Public Domain. You know, that licence that we all had before those homoerotic crypto-fascists came out with the GPL (Gay Penetration License) that is no more than an excuse to see who's got the biggest feces-encrusted cock. I would have put this up on Freshmeat, but that name is known to be a euphemism for the tight rump of a young boy.
Come to think of it, the whole concept of 'Source Control' unnerves me, because it sounds a bit like 'Sauce Control,' which is a description of the homosexual practice of holding the base of the cock shaft tightly upon the point of ejaculation, thus causing a build up of semenal fluid that is only released upon entry into an incision made into the base of the receiver's scrotum. And 'Open Sauce' is the act of ejaculating into another mans face or perhaps a biscuit to be shared later. Obviously, 'Closed Sauce' is the only Christian thing to do, as evidenced by the fact that it is what Cathedrals are all about.
Contributors: (although not to the eternal game of 'soggy biscuit' that open 'sauce' development has become) Anonymous Coward, Anonymous Coward, phee, Anonymous Coward, mighty jebus, Anonymous Coward, Anonymous Coward, double_h, Anonymous Coward, Eimernase, Anonymous Coward, Anonymous Coward, Anonymous Coward, Anonymous Coward, Anonymous Coward, Anonymous Coward, Anonymous Coward, Anonymous Coward. Further contributions are welcome.
Current changes: This version sent to FreeWIPO by 'Bring BackATV' as plain text. Reformatted everything, added all links back in (that we could match from the previous version), many new ones (Slashbot bait links). Even more spelling fixed. Who wrote this thing, CmdrTaco himself?
Previous changes: Yet more changes added. Spelling fixed. Feedback added. Explanation of 'distro' system. 'Mount Point' syntax described. More filth regarding `man` and Slashdot. Yet more fucking spelling fixed. 'Fetchmail' uncovered further. More Slashbot baiting. Apache exposed. Distribution licence at foot of document.
ANUX -- A full Linux distribution... Up your ass!
-
Re:Is this relevant?
Hey javidb, I have one box running Mac OS X, but I use it only for IRC, web browsing (when my other Mac is busy), playing MP3s, shells, etc. And as a test box for Mac OS X when I need one (such as last night, when I was playing around some more with making Mac::Glue work with Mac OS X apps).
-
Re:Perl + Aqua
Are there any plans underway to give Perl acces to Aqua, like with Perl/Tk or GTKPerl? I'd really like to be able to write perl scripts with simple, non-XFree86 GUIs on OSX, the way I can use various toolboxes on Unix to create GUIs.
Sign the petition! -
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:My perl is not as grand as it once was...
My post was actually a joke (I'm surprised that someone has moderated it as Troll! If that moderator thought I don't like Perl, he/she obviously hasn't read my code...) and this was a parody for Java's "write once, run everywhere". ...but I do not think that perl is the "Write Once, Read Nowhere" langue you make it out to be ^_^Just for a little fun, I thought I'd try out my rusting perl tricks and unroll your silly script.
You're a first person I know about, who was ever interested in understanding this code. This is my original, clean version:$c = 'plfeY04jaJnYI';
I'm amazed, that your code is almost identical, congratulations! I like this program, because looking at it (the clean version) it's impossible to know how long it would take to get the result. For example your domain voila.fr would be written if $c was frmHZ0u6Ne2HQ but it takes about an hour to crack on my machine, while my domain in plfeY04jaJnYI is cracked in only 4 seconds. It would take over 2 years and 7 months to crack this xxFHuIaD7CdpI, which is the worst case, zzzzzzzz, the last key guessed by my program. So, the average time for guessing random keys (containing 1 to 8 lowercase letters) is over one year!
$s = substr $c, 0, 2;
for $l (1..8) {
for ('a' x $l .. 'z' x $l){
if($c eq crypt($_, $s)) {
print "$_.$s\n";
exit;
}
}
}If you want to see a really good password cracking program, check out Alec Muffett's great and famous Crack. It's really great, especially when you have good dictionaries. If you want to check if your password is easily cracked by Crack, you can use Alec Muffett's CrackLib. Check out my online Password-Guessability-O-Meter, I wrote it some time ago to demonstrate to one of my clients how does the CrackLib work. You just enter your desired password, and it tells you if (and why) it is easy to guess, using English, Polish, Czech, French and Latin dictionaries.
I use CrackLib for online registrations CGI scripts etc. so users can't have silly and easy to guess passwords. It can also be used with passwd program. Great library, and easy to use (there's Crypt::Cracklib Perl interface), but may be quite difficult to set up for the first time.
Not very difficile, Mister shiny@rfl.pl, but I shall compliment you for at least trying to obfuscate with the silly "q//" perl operateur ^_^
Thanks. :) I like it too. That's the most recent obfuscation, if I remember correctly. When I started to experiment with q// using q,x, and q.x. and q;x; etc. I was even trying to use something like this:$q=q,p,.q,l,.q,f,.q,e,.q,Y,.q,0,.q,4,.q,j,.q,a,.q
(in one line and with no spaces) but it looks terrible, as you can see., J,.q,n,.q,Y,.q,I,;The "if" statement is another ruse; suffixed "if" is in fact called before the condition of the "if" statement, and he uses this to initialise $q apparently after it's been first used. The above code is in fact equal to this:
Yes, this is exactly the original code, and this is exactly the way I was thinking. You're very good.$q = 'plfeY04jaJnYI';
$x = substr $q, 0, 2; :)And it makes itself apparent that $q is the crypt hash (henceforth called $crypt) and $x is the salt ($salt).
The original variables were $c and $s, I changed them to $q and $x for easy mistakes with q// quoting and x repetition operator.for (++$_..$_<<3){...}
Now you are just being silly
:-) $_ is not used yet and thus is 0, and ++0 is of course 1. 1<<3 is 8. :) 1..8 looked just to clear and simple... And that way I have 3 independent values of $_ variable (i.e. the original global $::_ is two times localized) in 3 nested scopes (main program, outer loop and inner loop), which makes it more interesting.for($i = 1; $i <= 8; ++$i) {...}
Actually in newer versions of Perl, the foreach loop is faster than the C-style for loop. See perlop manpage: Range Operators and perlsyn manpage: Foreach Loops.Which not only looks simpler, but runs faster too ^_^
I just run this benchmark:
#!/usr/bin/perl -w
and with Perl 5.6.1 I got this results:
use Benchmark;
sub s1{ for ($i = 1; $i <= 1_000_000; ++$i) { } }
sub s2{ for (1 .. 1_000_000) { } }
$t1 = timestr timeit 100, \
$t2 = timestr timeit 100, \
print "1. $t1\n2. $t2\n";1. 103 wallclock secs (87.77 usr + 0.15 sys = 87.92 CPU) @ 1.14/s (n=100)
2. 60 wallclock secs (51.93 usr + 0.04 sys = 51.97 CPU) @ 1.92/s (n=100)But in my code this loop has only eight iterations, where the 8th one takes two years, so the loop control overhead itself doesn't really matter here. The inner loop is more important but crack() function takes most of the time, anyway.
Older versions of Perl (I don't know which exactly) created a temporary array for the range operator in foreach loop, so the code like:
for (1
could easily take all of the memory, but now it's fixed. Fortunately, it doesn't create a temporary array any more, and it's highly optimized, so it's safe to use it now for large ranges. .. 1_000_000_000) { ... }The "and die" bit just is taking advantage of the short-circuit boolean operateur système. The "die" only is executing when $crypt (the origin hash) and the encrypted form of the current guess are equal, in which case the key has been found and we quit ^_^ I changed it to a nicer looking "print" statement for further clairitie.
Yes, there were print and exit in the original version. You have exactly reconstructed my way of thinking. Well done. :)I think you're very good, really. Most of people have no idea how to analyze such obfuscated code. Actually I'm quite disappointed that decrypting my code was so easy for you...
:)I'll tell you why and how I wrote this program. I was inspired by this code:
#!/usr/bin/perl
and few JAPH signatures. I wanted to write a small program, that it would be impossible to tell what it writes, until you run it. Most of such programs are very obfuscated but after enough work you can usually find the printed message, without running them. So I thought that the message could be ciphered using some one-way alghoritm, like crypt(3) or MD5, and the code would just brute-force crack it. That way it's really impossible to tell what the message is, until you run the code. The code itself only cracks, but doesn't know what is being cracked and when it finishes. Using crypt(3) had this advantage, that it has 2-character salt, which can act as country code in domain name.
@a=(Lbzjoftt,Inqbujfodf,
Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c =
" Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs"
. ":\n";$c =~y/b-y/a-z/;
print"\n\n$c ";for($i=0;
$i<@a; $i++) { $a[$i] =~
y/b-y/a-z/;if($a[$i]eq$a
[-1]){print"and $a[$i]." ;}else{ print"$a[$i], ";
}}print"\n\t\t--$b\n\n";So I wrote the first working version and started to make it as small as possible. Originally it didn't have to be obfuscated, just small. This is the smallest version I've written so far:
$c='plfeY04jaJnYI';$s=substr$c,0,
with 98 characters. But today I shrinked it some more, to 93 characters:
2;for(1..8){for('a'x$_..'z'x$_){
die"$_.$s\n"if crypt($_,$s)eq$c}}$c='plfeY04jaJnYI';$s=substr$c,
and few minutes ago (while I write this comment!) I found a better idea and wrote this:
0,2;for(1..8){$c eq crypt$_,$s
and die"$_.$s"for'a'x$_..'z'x$_}$c='plfeY04jaJnYI';$s=substr$c,0,2;$k=
which having only 79 characters is my record so far (thanks to Perl's magical auto-increment operator) and finally fits in one line!
'a';$k++while$c ne crypt$k,$s;die"$k.$s";Hopefully that wasn't too difficile to follow, my english is not perfect.
Your english is OK, don't worry. Actually, I like the way you use French spelling for some words, like difficile. It's like a French accent in written text, very nice in my opinion.Just remember, Mr. shiny@rfl.pl, no langue is completely impenetrable (except perhaps Intercal, but that's a small bit pathological
Good point. :-) :) I wonder if these guys tried Intercal when proving the impossibility of obfuscating programs... I personally like Unlambda and Brainf***.This Unlambda program "calculates and prints the Fibonacci numbers (as lines of asterisks)":
```s``s``sii`ki
`k.*``s``s`ks
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
`k``s`kskI wanted to show a Hello world example of Brainf***, but I got this error:
Lameness filter encountered. Post aborted!
Visit Esoteric Topics in Computer Programming, great stuff if you want to go mad.
Reason: Please use fewer 'junk' characters.You like Perl, so if you know Inline::C and Inline::CPR (if you don't, read Pathologically Polluting Perl by Brian Ingerson) you may enjoy understanding this code:
#!/usr/bin/cpr
It's great, once you really understand it.
int main(void) {
CPR_eval("use Inline (C => q{
char* greet() {
return \"Hello world\";
}
})");
printf("%s, I'm running under Perl version %s\n",
CPR_eval("&greet"),
CPR_eval("use Config; $Config{version}"));
return 0;
}Are you up to date with Perl 6 development? It's going to be great and extremely powerful language. Read Larry Wall's Apocalypses and Damian Conway's Exegeses if you're interested:
- Apocalypse 1: The Ugly, the Bad, and the Good (April 2, 2001)
- Apocalypse 2: Fundamental data types, variables and the context and scoping of the language (May 3, 2001)
- Exegesis 2 (May 15, 2001)
- Apocalypse 3: Operators (October 2, 2001)
- Exegesis 3 (October 3, 2001)
- Apocalypse 4: Syntax (January 18, 2002)
-
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:Obfuscated code contests?
I'll admit I don't know much about computer science, but I do know that it's important to keep your code clear, well-documented and easy to understand.
Well, unfortunately it's not always that simple. Let's take the Shiny Metal Brute Force Crypt Cracker v3.1.9 as an example. It can crack every single password encrypted with crypt(3) containing 1 to 8 lowercase latin letters. It uses a sophisticated cryptoanalysis method, which scientists call the "Brute Force". Its main purpose is to hide domain of my electronic-mail address from spammers (see my bio). Here's the source code:
#!/usr/bin/perl
#
# Shiny Metal Brute Force Crypt Cracker v3.1.9
#
# Copyright (C) 2001,2002 shiny@key.salt (shiny@output)
# http://slashdot.org/~Shiny+Metal+S./
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this program;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
$x=substr$q,q,0,,q,2,if$q=q,plfeY04jaJnYI,;for
(++$_..$_<<3){qq,$q,eq crypt$_,$x and die
qq,$_.$x,for q,a,x$_..q,z,x$_}As you can clearly see, the main algorithm used in this program (in the main loop) is able to always find every password (from the 1-8 lowercase latin characters set) but what does it mean? I had to use strong cryptography, because otherwise my electronic-mail address could be harvested by spambots (and therefore be used to perform unsolicited commercial mass mailing), but it also means, that this algorithm could be used to crack passwords from your
/etc/passwd (or even from /etc/shadow), which usually contain passwords encrypted with crypt(3) and this could compromise the whole system security (imagine hackers having unlimited access to your PC). It's a very dangerous problem. Most of password cracking tools use the, so called, "Dictionary Method" to guess passwords, which mean that you're safe as long as you have a password like "wmctsbvg" or "obwhdrle" or even "awxolfrk", but this program will guess such passwords. My point is, that it can be to dangerous to publish a clear and well documented source code to such a dangerous tool. It could be used by one of many underground hacker groups, like the famous Script Kiddies, who don't even care that reverse engineering of this code is illegal under the DMCA. Fortunately, this program was written in Perl, which was found to be the only language, with mathematically proved possibility of secure one-way obfuscating (also known as WOL - "write only language", or WORN paradigm - "write once - read never"), so it is impossible to reverse engineer. The situation will be even improved when Perl 6 is released (read Apocalypse I, Apocalypse II, Exegesis II, Apocalypse III, Exegesis III and Apocalypse IV for a good introduction to this subject). That way, people can still use crypt(3) to encrypt their passwords, with no fear that hackers know how to crack them, the crypt(3) encryption method is as secure as before. When this program will be rewriten in Perl 6, the crypt(3) method will be actually even more secure than before, thanks to the strong source code obfuscation method. I hope I explained where the obfuscated code can be useful, but this is only one example, I'm sure there are many places where the good old obfuscation will be priceless for many decades. If you have any additional questions, feel free to contact me. -
Re:another thing
First 90%. I passed that mark awhile ago. I watched the same process in much smaller scale on use Perl;.
-
I Disagree
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Parrot, Python and Perl 6
Seeing as how parrot is being developed pretty much entirely by Perl developers (heck, the development is being done on the perl6-internals mailing list), I think it's unlikely that it'll ever be adopted by the Python community.
Given that a Google search for "Parrot" on the Python.org shows 570 matches, I don't think so.Does Parrot even support real type systems, or does it only support Perl's broken "scalars are scalars" type system?
If you had ever clicked one of the links in my post, you'd have known that. There are these basic data types:- IV (integer)
- NV (floating-point)
- STRING (encoding-independent string)
- PMC (Parrot Magic Cookie)
Vtable Datatypes
And about ``Perl's broken "scalars are scalars" type system''. I won't argue with you, as you obviously have no idea what are you talking about, but other people may be interested in this subject as well, so I'll point out where to find informations on how these things are going to change in Perl 6: For a good introduction to Perl 6 in current shape read Larry Wall's Apocalypses and Damian Conway's Exegeses: For more detailed info, join the mailing lists and read the archives: There's more info about in on dev.perl.org - the Perl 6 homepage.The next major thing that Parrot needs to implement is PMCs; these are almost like Perl 5's SVs, only more so. A PMC is an object of some type, which can be instructed to perform various operations. So when we say
inc P1
to increment the value in PMC register 1, the increment method is called on the PMC - and it's up to the PMC how it handles that method.PMCs are how we plan to make Parrot language-independent - a Perl PMC would have different behavior from a Python PMC or a Tcl PMC. The individual methods are function pointers held in a structure called a vtable, and each PMC has a pointer to the vtable which implements the methods of its "class." Hence a Perl interpreter would link in a library full of Perl-like classes and its PMCs would have Perl-like behavior.
[ read more ]
-
Re:Yes, but...
It's one thing to program in good style, but it's another to have the language force you to. Yes, I'm still resentful over that.
It's a well known fact, even among Perl advocates, that the vast majority of Perl code is indecipherable. It isn't impossible to write fairly clean code in Perl, but the language certainly doesn't encourage it.Please, don't argue Perl vs. Python, it will only start pointless flame wars. Let's agree that it's just a matter of taste. Remember, There's More Than One Way To Do It. I personally prefer Perl, but it's a totally subjective opinion. Perl and Python are more or less equally powerful languages today. But what I'm really looking forward to is Parrot, i.e. the virtual machine for Perl 6 and, I hope, also for Python, Ruby, Tcl and maybe few other good languages. It's a VM and a low-level assembly language for that VM - the language, to which Perl 6 (and hopefully other high-level languages) will be compiled to (as a layer between Perl and the VM bytecode) like C is compiled to machine-specific Assembbler (between C and the machine code). See the examples of Parrot use and read Parrot: Some Assembly Required to see what it is. Also the perl6-internals at perl.org mailing list archives is a good place to start. I'd love to see Perl and Python playing nice together, thanks to Parrot. It'd be really cool if I could write a program in Perl with someone who writes his part in Python, and another one writing in Ruby. I would just use their classes and objects, they would just use mine as well, without worrying about the language of our implementation. Parrot can be the answer here. Would it be the end of language flame wars? I do hope so.
-
Previous awards
In 1998, Larry Wall for his work on Perl and other software.
"Larry Wall won the Free Software Foundation Award for the Advancement of Free Software for his many contributions to the advancement of freely distributed software, most notably Perl, a robust scripting language for sophisticated text manipulation and system management. His other widely-used programs include rn (news reader), patch (development and distribution tool), metaconfig (a program that writes Configure scripts), and the Warp space-war game."
In 1999, Miguel de Icaza for his work on GNOME
"de Icaza headed a team of more than 300 programmers worldwide, most of them volunteers, in the development of GNOME. GNOME is a user-friendly graphical users interface (GUI) and programming platform for GNU/Linux. GNOME 1.0 was first released in March, 1999 and has since had a step-up release."
In 2001, Brian Paul for his ground-breaking work on the Mesa 3D Graphics Library
"The Mesa 3D Graphics Library allows free software users to model and render in full 3D." Jeff Bates, chairman of the Free Software Foundation Awards Committee said. "The library has added tools and capabilities to the GNU/Linux system that are being utilized by people all over the world."