[...] just use subversion, and if you feel it's missing features, please contribute them. By standardizing on subversion, we lower the barrier for people wanting to contribute, instead of increasing it by asking them to install and understand new tools.Quick thought experiment, Josselin: replace "subversion" with "Java". Or "Perl", or "C", or even "Python" or "Ruby". Or any other language. It doesn't matter which one. Even if the language you substitute is a good one, and one you happen to like, it's still a fairly obviously braindead idea -- that there can possibly be One True Programming Language for all problems, and that there can never be any improvement that can't be bolted into the existing OTPL. Revision control isn't so much different from programming languages. Different systems will provide different advantages and disadvantages. There's also incremental and revolutionary improvement that will take place over time -- machine code to symbolic to procedural to object oriented -- that can never take place within the established framework. I happen to really like the distributed model -- it reduces (though, naturally, cannot eliminate) the division between the Blessed and the Peons in a project (those with direct commit access vs. the rest of us). You can get disconnected operation for (almost) free. Also, despite the assertions contained in your article, the "barrier to entry", ironically, is actually lower with a good distributed RCS than with Subversion. The barrier isn't what you think, though -- sure, using an unfamiliar RCS is troublesome, but it's a lot less hassle than learning a new language, and people do that on occasion to hack on a particularly interesting problem. The real barrier to entry is forcing anyone who isn't blessed with direct access to The One And Only Repository to use inferior development support tools. "An example!" I hear you cry. Gladly. This morning (literally) I got enough of a handle on the internals of Ruby on Rails to actually track down a bug that was irritating the crap out of me. Being a good developer, I wanted to use revision control to track my changes. In the All Subversion, All The Time "utopia", that would involve getting an anonymous checkout, making a copy, hacking on the copy, then (when all was done) running diff -urN between the original and the copy, and sending it all upstream with a manually-created log message (assuming I could remember everything I'd done). You also need to manually remember (or encode it in your directory or something) the source of your tree, so upstream can merge it reliably (and compare it against other equivalent work that may have been done in the meantime). Doing it better, I could do an anonymous checkout, and then import it all into a new Subversion repository (or directory) of my very own, and hack on it in there. Benefit: revision control of my changes. But it's non-trivial to create a new repo and import everything into it, and there's still no automatic record made of the upstream source of my new repo. Wanting to make a second change is even worse -- I either have to make a whole new copy of my source tree (disk is cheap, but this is getting silly) or just keep forging ahead with changing my existing tree -- so this second set of changes can end up being dependent on the first (which is Not So Great if upstream don't merge your first patch). In the "new repo" scenario, you can branch from the root of your new repo and continue hacking on your newly created branch, which is a good start, but it's still icky. And good luck having the system track new commits from upstream while you're working, too. If the project was using a DRCS, in contrast, the problem would reduce to making a branch into your local archive, hacking (committing at will), updating with new upstream commits as you go along, and then publishing your changes to a public place for reintegration (or, in some cases, sending your changeset via e-mail). Oh, and before anyone starts screaming "if anyone can branch, it will encourage forking!", consider which is more likely to result in a permanent fork (rather than a temporary independent line of development): a local set of changes in a tarball or local subversion repo, both of which are hard for anyone else to collaborate on without major pain; or a branch in a simple-to-publish (or push) designed-to-be-shared DRCS archive, which automatically keeps all of your interesting metadata intact and coherent across archives, merges, time, and space (and possibly even dimensions). This utopia doesn't really exist, and is hampered by everybody having their own Pet DRCS, but the problem, I'm fairly sure, is transient, and my main point isn't even so much against the choice of Final Ultimate Solution, or even the problem space, but more about the attitude that everyone should get behind Any One System and stay there. I can't imagine the world of pain we'd be in if Josselin had posted his message a few years ago (but with s/subversion/CVS/i, naturally) and everyone had followed his advice -- can you imagine per-file changesets with no effective merge capability for the rest of eternity? <shudder />
he: its use in a gender-ambiguous context is disputed and there are various ways of avoiding it. The word
manhas similar problems, although it's a lot easier to find acceptable gender-neutral replacements. But in this story, Brin actually used
manin situations where the person indicated was known to be female! This leads to such eye-popping lines as:
He took her arm and introduced her to Fagin and Jacob.And if that doesn't strike you as odd, here's my personal favorite:
Sophonts, this is Helene deSilva, Confederacy Commandant here on Mercury, and my right-hand man. ...
Occasionally a man, male or female, would lean forward and peer at some detail on a screen, ...Ow! I had to read that sentence three times before I was sure I hadn't mistaken the words.
I spent
the whole weekend looking for a DRM-encumbered Sony CD so that I could check
for myself whether my code was really being redistributed without permission.
I eventually found one: Suspicious Activity?, by The Bad Plus. A rather
enjoyable post-modern jazz album. I am rather lucky, it could have been
C line Dion.
As expected, installing the CD s custom player also installed a stealth
aries.sys driver along with a few other interesting files such
as $sys$DRMServer.exe, all hidden in a $sys$filesystem
directory. I rapidly got rid of this cruft and started studying the really
important file, ECDPlayerControl.ocx.
It is the file Sebastian Porst and Matti Nikki found to be containing parts of mpglib, LAME, faad2, VLC...
Evidence that the DRMS code comes from VLC
There are of course obvious similarities between some functions and
structures of ECDPlayerControl.ocx and the ones in VLC s source.
However, given how precise the implementation of a cryptographic protocol
needs to be, the possibility that two separate implementations show many
similarities must not be dismissed. The data structures and constant tables
especially are likely to be identical. I think however that I found strong
enough evidence that this is not the case here.
The original drms.c was written by Jon on 01/05/04. I then hacked on that file on 01/18/04 and reorganised it, also replacing the reverse-engineered MD5 and AES functions with clean implementations, then Jon added DRMSv2 support on 05/05/04 and I reorganised the code again on 05/08/04. Some of these changes were specific to VLC (not in that they made the code unusable outside of VLC, but rather that they made it possible to use an external MD5 hash provider, for instance), so they were the bits I was looking for in ECDPlayerControl.ocx.
For instance, Jon s original code had the following instruction:
Since all bytes of this long word are comprised between 0x20 and 0x7f, it was later rewritten like this:p_acei[ 4 ] = 0x5476212A;
This change makes the code more human-readable because many other secrets in the Apple DRMS protocol are ASCII strings. Also, I know how to look for binaries that use the string "Tv!*", but it takes me some more time to think of a way to find binaries that use 0x5476212A. And the Sony rootkit uses the following (only relevant lines shown):char p_secret1[] = "Tv!*";
The use of xxxxx+4 shows that ECDPlayerControl.ocx uses a string instead of a 32 bits integer to store the secret, disregarding the fact that the 5th character of the string (a null char) is never used. Another example: in this commit I reorganised the DoExtShuffle() function, merging FourthPass() and FifthPass() and discarding a structure allocated on the stack. What is important here is that DoExtShuffle() was built by a complex combination of choices, the main purpose of which being to reduce the size of the C functions:.text:100883B8 mov cl, byte ptr ds:xxxxx+4 ; 0 .text:100883C2 mov eax, dword ptr ds:xxxxx ; "Tv!*" .text:100883C8 mov [esp+70h+yyyyy], eax .text:100883DC mov [esp+7Ch+zzzzz], cl
Note how i_ret is not reused and could be merged into the p_bordel array, or maybe SecondPass() merged into FirstPass(). This choice is definitely a legacy of how the code evolved. And the Sony equivalent: a perfect match.static void DoExtShuffle( uint32_t * p_bordel ) uint32_t i_ret; i_ret = FirstPass( p_bordel ); SecondPass( p_bordel, i_ret ); ThirdPass( p_bordel ); FourthPass( p_bordel );
After having studied the Sony code for a while, I have of course gathered dozens of such examples. But I also discovered a few new things. Where does the DRMS code come from? The code undoubtedly comes originally from VLC, but it has traveled a lot. I would be surpried if it came directly from VLC, as no other part of VLC is included with the rootkit. And although there are parts of FAAC in the Sony code and FAAC includes VLC s drms.c, the version currently in the FAAC CVS is horribly outdated. Sebastian Porst also noticed a few obvious differences between the Sony code and the version of drms.c present in VLC. The most obvious being this one:.text:10089F3C xxxxx: .text:10089F3C mov ecx, esi .text:10089F3E call yyyyy .text:10089F43 push eax .text:10089F44 mov eax, esi .text:10089F46 call zzzzz .text:10089F4B add esp, 4 .text:10089F4E call ttttt .text:10089F53 call uuuuu
Which became:if( p_shuffle->i_version == 0x01000300 ) DoExtShuffle( p_bordel );
That 0x01000400 is a version check for 4th generation iPods firmwares. I also discovered at least 40 KB of new lookup tables that seem to be used for more buffer shuffling. At first I thought it was simply F4I s DRM implementation, but the shuffling calls are nested with iPod hardware information retrieval from our DRMS code, so they re really part of drms.c. Sony distributing a DRMSv3 descrambler? The only explanation I can think of is that someone took the VLC code, added support for an upcoming Apple DRMS format version and redistributed the software without letting the VLC authors know, probably violating the GPL (I only say that because I have not found the software yet, but I feel pretty safe in saying it). Since it is based on GPL software, I was already entitled to ask Sony for the source code of ECDPlayerControl.ocx. But as the copyright holder of a significant part of the software they counterfeited, maybe I have a greater chance of being heard. Not that it would be difficult to reverse-engineer it yet another time, but it would be awesome if the next opensource iTunes Music Store file player was contributed by Sony!.text:10089F2E cmp eax, 1000300h .text:10089F33 jz short DoExtShuffle .text:10089F35 cmp eax, 1000400h .text:10089F3A jnz short skip .text:10089F3C DoExtShuffle: .text:10089F3C ... .text:10089F58 skip: .text:10089F58 ...
LOCALE=en_GB it claims that week 1 of 2006 starts on Sunday 1st January, and ends on Saturday 7th January, making my week numbers one lower than the rest of the world.
It is funny to see how things have evolved since then. Being 6 at that time,
and PCs not being very common those days at home, I started using a computer at an age of
8 or so. It was an Amstrad PCW 8512,
a TV box sized computer which integrated a green screen monitor, two
"3" floppy bays and
a 9-pin dot matrix printer. It was powered by a 8bit Z80 processor, running at 4MHz and
had 512KB of RAM and no ROM at all. Main software was
LocoScript, a powerful word processor. It could be controlled by drop down menus
at a top toolbar, and initial screen was a file manager, in which you could manage
those text files in the floppy you booted from or a floppy in the other bay.
It had even support for some kind of multiuser support, as you could declare
in each floppy up to 7 user areas, with area 0 being a common root. Also,
it had support for limbo a place for deleted files.
Although LocoScript didn't need a separate OS to work, CPW 8512 could also
run CP/M OS,
which added programming capabilities (Maillard BASIC) and support for
spreadsheets and databases, along with some games as
Batman.
After using this system for a long time, my first PC was a 486, running
the new Windows 3.1 and later 3.11 for Workgroups version. I even installed
there a Windows 95 when it was released, and managed to create a partition
in the only 170MB HDD it had to install a test copy of IBM's
OS/2 Warp that came in a
CD bundled with PC World magazine.
Some time later my parents bought a Pentium 166MMX running Windows 95. I was 18 by then,
it was 1997, Internet was starting to be widely spread and used, and after a
couple of months at University I was installing my first Linux copy, which
was a RedHat based version. During next three years I installed different
distributions, as they were released with newer software and you could get them
in a CD with a magazine. Installing Debian Slink and having an Internet connection
available at my Student's Residence at the same time made me be able to
participate in mailing lists, send bug reports and download upgrades. I discovered
a new dimension in using Linux: collaboration.
A statement of verifiable fact is a statement that conveys a provably false factual assertion, such as someone has committed murder or has cheated on his spouse. To illustrate this point, consider the following excerpt from a court (Vogel v. Felice) considering the alleged defamatory statement that plaintiffs were the top-ranking 'Dumb Asses' on defendant's list of "Top Ten Dumb Asses":A statement that the plaintiff is a "Dumb Ass," even first among "Dumb Asses," communicates no factual proposition susceptible of proof or refutation. It is true that "dumb" by itself can convey the relatively concrete meaning "lacking in intelligence." Even so, depending on context, it may convey a lack less of objectively assayable mental function than of such imponderable and debatable virtues as judgment or wisdom. Here defendant did not use "dumb" in isolation, but as part of the idiomatic phrase, "dumb ass." When applied to a whole human being, the term "ass" is a general expression of contempt essentially devoid of factual content. Adding the word "dumb" merely converts "contemptible person" to "contemptible fool." Plaintiffs were justifiably insulted by this epithet, but they failed entirely to show how it could be found to convey a provable factual proposition. ... If the meaning conveyed cannot by its nature be proved false, it cannot support a libel claim.
Next.