The program responsible for retrieving this key from the copy protection track was called CPC.COM, and is a hidden file. Prior to DOS 5.0, there wasn't an easy way to see such files, since the /h flag to the DIR command was not implemented, but you could easily see the file with a program such as Norton Commander:
- The loader, which could be named differently per title (SIERRA.COM in this example), does some housekeeping and then loads the hidden CPC.COM file into a buffer in memory, pushes some arguments to CPC on the stack including the offset into the track where the key is located, then jumps to the buffer address to start CPC.
- CPC reads the protection track, extracting the key from the specified offset, then returns the key to the loader.
- The loader uses the key to XOR-decrypt the 'AGI' script interpreter that actually ran the game.
CPC.COM will hang the system if executed directly - it can only run successfully if executed from a memory buffer and passed the correct stack parameters.
I have no real evidence, but I speculate that CPC.COM was written by Softguard and provided to Sierra for their use. CPC.COM is heavily obfuscated, resistant to static analysis and disassembly. It appears to load only specific portions of code at a time into separate segments. A full analysis of it would be interesting, but would take significant time. The reason I suspect this was not code written by Sierra is primarily the stark difference in sophistication between CPC and Sierra's own loader. Sierra makes absolutely zero effort to obfuscate their loader or hide the returned encryption key.
Less than zero effort, actually - it was as if they were actively trying to assist crackers. I was frankly astonished at what I found.
Only As Good As The Implementation
A company like Softguard could only do so much - they could supply documentation and example code, but it was ultimately up to their customers how effective the protection would end up being. Some users of Superlok did not use the protection track to store an encryption key, but actually hid part of the game executable there, without which obviously the game would not run.
The important part of utilizing the Superlok protection track was to use an unpredictable offset into the track data for your 'secret' data, whether that data was a key or code. Even so, the limited amount of data limited the number of possible offsets to a few thousand, meaning that even in 1985 this was likely possible to brute-force.
In any case, Sierra made no attempt whatsoever to obfuscate the data offset to be used reading the Superlok track. In fact, they told crackers exactly where it is:
jmp start_0
aLoaderV30CCopy db 'LOADER v3.0 (c) Copyright Sierra On-Line, Inc. 1985',0
aKeyofs db 'keyOfs'
cpc_key_offset dw 0
aKkkkkkkkkkkkkk db 'kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk'
db 'kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkss'
There is literally a string containing 'keyOfs' directly preceding the key offset, at the very start of the loader executable. A potential cracker would see this immediately upon loading the file in a hex editor or disassembler. Basically, Sierra put a big neon sign in their code saying "Steal this."
Even more helpfully, the 128-byte buffer into which the resulting key is copied is initialized with all k's... what could 'k' possibly stand for? Now you didn't just know the location of the key, but the size.
It gets worse.
The key offset that follows was clearly intended to be a random offset into the protection track. The key offset variable here is initialized to 0.
I kept looking for where the real offset value was set to this variable. Oddly, I had trouble finding it. Maybe we can derive the offset and work backwards. Here's the key buffer in memory, before CPC.COM runs:
And here it is, after:
So our key starts with 43 B7 45 5D.
Coincidentally, here's the first 128 bytes of Track 6, Sector 1:
000000 | 43 B7 45 5D 97 49 2F F2 D8 12 7B 0E C0 3A D2 65 | C.E].I/...{..:.e
000010 | DE 85 64 41 22 51 01 D4 03 B9 D5 AA 4E D6 BE 3D | ..dA.Q......N..=
000020 | 8C 25 4C A1 10 03 56 5F 9C 54 35 5F AE 42 9F FE | ..L...V_.T5_.B..
000030 | 6C 22 21 3F 28 72 39 1D 91 FE 0F FE 78 22 CF 43 | l..?(r9.....x..C
000040 | 3B 29 A5 FB D1 D4 55 B6 72 F5 75 77 E2 3A 49 C2 | ;)....U.r.uw.:I.
000050 | 59 07 3A D5 11 7C F4 F3 6C 95 1A DA C1 70 A7 56 | Y.:..|..l....p.V
000060 | C3 A8 E4 EE 8E DF 00 BB 4F 5A 50 59 8E C6 24 F5 | ........OZPY....
000070 | 19 19 43 86 8F 92 04 18 88 E1 0A 43 5D 63 9B BA | ..C........C]c..
The reason I couldn't find where the key offset was set is because it never was. Sierra left the encryption key offset for King's Quest set to 0.
This wasn't the only Sierra title that would leave the offset at 0, although some titles did manage to change it eventually. But with Sierra helpfully pointing directly to the key offset variable on every Superlok-protected title they published, it didn't matter. The key could simply be extracted from the same place each time, patched into the loader's 'kkkk' buffer, and the call to CPC.COM skipped entirely by changing one byte. Most cracked versions seemed to have went one step further and just decrypted the whole thing and distributed the unencrypted result.
It's hard to believe this was just incompetence - Sierra games were technically impressive for the time, making great use of graphics and sound. But what other explanation is there? If Sierra's goal was simply to prevent casual copying, they didn't have to bother with licensing Superlok at all, a simple bad CRC on one sector would have sufficed. It's all very odd.
Even if Sierra had properly used random offsets into the Superlok track, and had more effectively obfuscated the loader, there was still an additional problem. They re-used the same Superlok track on each title they published with this protection. That means that if you owned one Sierra game, you could
add a batch file to the disk and produce a key disk for any other Superlok protected Sierra title you wanted.
Sierra only produced a few titles with Superlok protection before moving to everyone's favorite copy protection method: manual-based checks. These would be cracked as well, of course, but cost Sierra nothing assuming they were printing a manual for the game anyway.
About Those Overlapped Tracks...
The large outer Sector 1 serves as a means to read the entire track in one go. What then, is the point of the 7 inner, overlapped sectors? The protection does read them, from Sector 8 to 2, before reading Sector 1 from which it extracts the key.
There's one obvious reason to have sectors inside Sector 1. If we simply had one large sector, a home user could just copy it, especially since such a large sector would likely not have a valid CRC. The special encoding of sector index and data address markers meant that a direct copy of Sector 1 would not properly recreate the internal sectors, as the address markers would become plain data bytes. Of course if these sectors were found to be missing, the key would not be extracted.
Imagine a curious amateur cracker reading track 6 with a Read Track command. If they used the default value of N==2, they would receive data for 8 sectors, each appearing to be 512 bytes (however, the CRC failure flag and lack of a 9th sector would still be suspicious). It would be difficult to get a clear picture of what was going on without more specialized knowledge and techniques.
Superlok 3.0
What we've looked at so far is an implementation of Superlok 2.0. Sierra specifically used version 2.3 according to Great Hierophant. But there was also a version 3.0.
Arkanoid II, from publisher Taito, is another game protected by Superlok. It has its Superlok protection on track 16. This track contains contains 9 sectors, the outer sector again being 8192 bytes but now having a sector ID of 10. This would disguise itself better on a 360K floppy. Arkanoid II also shipped on 720K diskette, which has similar track 16, but the contents are not identical (take notes, Sierra...)
There are some indications that Arkanoid II is using Superlok 3.0. Both Arkanoid II and the 3.0-protected Lotus 1-2-3 v.2.0 ship with a hidden file named CML0300.FCL.
The DOS version of King's Quest worked right away in MartyPC after implementing support for bitstream images, but Arkanoid II fails. This may partially be due to improvements in Superlok 3.0.
Arkanoid II accesses the sectors on the protection track in the same order as King's Quest, the only real difference being that the final, outer sector has an ID of 10. Another observable difference is that the Superlok 3.0 protection code avoids using interrupt 13h to read the protection track, instead now talking directly to the floppy disk controller. This avoided a potential vulnerability where one could easily monitor what the Superlok 2.0 protection was doing by hooking the int13h vector.
Other than that, the Superlok 3.0 seems to be essentially the same concept. An odd track with a big outer sector, containing internal, overlapped sectors, each sector read in the same order. Except this time, the protection fails to work in MartyPC. Why?
This had me stumped for a bit, but a tip from NewRisingSun shed light on things.
Superlok 3.0 reads across the track index when reading the large outer sector.
Physically, a track on a diskette is continuous, unbroken surface. Logically, however, the presence of an index hole delineates the start of the track. Correspondingly, if we are reading a track and encounter the index mark, we know we are at the end of the track.
The index hole is a physical hole in the disk detectable by a photosensor. You can see the index hole on a 5.25" floppy if you rotate the medium until it is visible through the small, circular window:
When first written in a standard PC format, a track begins with gap bytes with the value 0x4E, and it ends with similar gap bytes. When a track has been written all the way around, it must line up with the start again. Recall that MFM encoded data is a series of clock and data bits. If there is a single bit mismatch in the pattern of clock, data, clock, data at the index mark, then reading sector data across the index mark will result in a phase error when trying to read it as an unbroken stream. This can happen naturally as drives start writing at the index or shortly afterwards. This is called a write splice.
A 8192 byte sector such as the one Superlok declares is larger than a single track can physically hold. When reading such a large sector, the data returned for the sector includes the controller's best interpretation of decoding the MFM stream as it crosses the index mark and trundles onwards into a partial second revolution. So we can actually see any phase error or write splice reflected in the data returned if we dump such a large sector from the disk image.
This is what that looks like:
1768| 4E 4E 4E 4E 4E 4E 4E 4E | NNNNNNNN
1770| 4E 4E 4E 4E 4E 4E 4E 4E | NNNNNNNN
1778| 4E 4E 4E 4E 4E 4E 4E 4E | NNNNNNNN
1780| 4E 4E 4E 4E 4E 4E 4E 4E | NNNNNNNN
1788| 4E 4E 4E 4E 4E 4E 4E 4E | NNNNNNNN
1790| 4E 4E 42 27 27 27 27 27 | NNB'''''
1798| 27 27 27 27 27 27 27 27 | ''''''''
17A0| 27 27 27 27 27 27 27 27 | ''''''''
17A8| 27 27 27 27 27 27 27 27 | ''''''''
17B0| 27 27 27 27 27 27 27 27 | ''''''''
17B8| 27 27 27 27 27 27 27 27 | ''''''''
17C0| 27 27 27 27 27 27 27 27 | ''''''''
The difference between the value 4E and 27 is just a single bit shift. We can see the change in the middle of byte 1792h, or 6,034 decimal. This represents 48k bits into sector 1. Considering an entire track can can hold 50k bits, that seems about the right spot since the sector doesn't start at the very beginning of the track.
A disk may just normally have a write splice near the index - and if so, there's no real problem with that. The real problem occurs by the way many bitstream image formats are encoded. Several formats, such as HFE and MFM, store an even number of bytes for each track, even though the number of bits representing the track may not be an even multiple of 8. This effectively creates 1-7 bits of padding between the end of the track and the start again. If this padding is present, the MFM stream can not be cleanly decoded at the seam by simply wrapping around the track data buffer. It essentially causes an artificial write splice.
This could a problem if Superlok 3.0 expects to see a clean, unbroken read of gap bytes across the index mark - something a commercial disk duplicator should be able to accomplish.
It may be possible to detect and fix this up automatically, especially if we assume that the data crossing the index mark is consistent, such as the gap byte value 4E. For the moment though, we can use a format that encodes absolute bit counts, such as 86F or PRI. All we need to do to fix the game then is to ensure we are properly wrapping around from the end of the track to the start again when reading a sector.
With track wrapping implemented, we can load an unpadded, 86F formatted image of Arkanoid II, and find that we pass the protection check:
An Angry Malware Developer
Softguard's Superlok copy protection was the target of a smear campaign by at least two different
software trojans.
SUG's message distinguishes it from the average dirty trick. After it trashes your disks, it displays a screen that says SUG is actually a product of Softguard, and it is exacting vengeance on people who try to break its copy protection.
"This destruction constitutes a prima facie evidence of your criminal violation. If you attempt to challenge Softguard Systems, Inc..., you will be vigorously counter-sued for copyright infringement and theft of services," the message says.
It then invites anyone whose disk got zapped to call Softguard's lawyers.
The second trojan, dubbed "
Twelve Tricks" is a bit more subtle - simply placing a Softguard copyright notice and the company's address in the Master Boot Record of an infected hard disk. I doubt either did any serious reputational damage to the company, but it was clear that Softguard was not making friends in the computing underworld.
Anti-Superlok Products
It wasn't just malware developers and crackers causing headaches for Softguard Systems - there was a adversarial commercial ecosystem at play, with various companies producing software that advertised the ability to defeat Superlok copy protection, both version 2 and 3. Central Point Software's Copy II PC software was a particularly popular product, and their NOGUARD utility was advertised specifically as being able to remove Superlok 3.0.
|
NOGUARD description from the Copy II PC v6.0 manual |
Central Point didn't stop at producing software - they had a hardware product as well, the Copy II PC Option Board, which intercepted data from the floppy drive directly (much as a modern flux capture device does). This allowed duplication of many copy-protection methods that software products couldn't handle. It was relatively inexpensive as well.
Central Point Software bundled this board with the TRANSCOPY software which could also write image files to disk. These Transcopy-format disk images can still be found floating around online, with the extension .TC. Our mysterious friend NewRisingSun even created a DOSBox fork, DOSBox-TC, that can read them. Even if your favorite emulator lacks support, they are a bitstream-level format that should be convertible to a more modern bitstream image format.
I found an
interesting allegation that Central Point Software cut a deal with Softguard at some point. Supposedly, a later version of the accompanying software for the Copy II PC Option Board could make a single backup copy of an original Superlok 3.0 disk, but would mark the resulting disk as a copy. The software would then fail to duplicate a disk identified as an existing copy, thus preventing the proliferation of copies of copies.
This seems like a fair compromise perhaps, but there is just one problem - clever publishers could take the same 'copy' markings and ship them on their original disks, rendering the product unable to make copies at all. I plan on a future article analyzing Copy II PC in more detail. Perhaps we can confirm these rumors for ourselves.
Another backup product was Quaid Software's CopyWrite, which bundled a similar utility to NOGUARD called 'UnGuard,' which could strip the protection from Superlok titles. Quaid software would eventually be dragged into an infamous court battle with another copy-protection company, Vault, but that is a story for another time.
Some publishers eventually decided that watching this cat-and-mouse game continue was not worth the potential issues experienced by end users, and dropped disk-based copy protection entirely. Articles such as this began to appear in publications:
|
InfoWorld Mar 31, 1986 |
Eventually, Softguard's biggest customers would move away from disk-based copy protection, leaving the company to face declining profits. Softguard had developed a few other products, such as a virtual machine product for the Intel 386 called
VM/386, but sold it off in 1987. In the end it seems Softguard failed to pivot to any substantial new revenue sources.
I couldn't find much information on the ultimate fate of Softguard Systems, other than that they were out of business by 1992, about which time their magazine advertisements abruptly disappear.
Read the next post in this series:
Comments
Post a Comment