1696 lines
62 KiB
Plaintext
1696 lines
62 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
VOL 1 NUM 1
|
||
|
||
|
||
|
||
|
||
The Amatuer Crackist Tutorial
|
||
Version 1.3
|
||
By
|
||
Specular Vision
|
||
|
||
|
||
|
||
|
||
|
||
Special Thanks to:
|
||
Mr. Transistor
|
||
Ironman
|
||
The Grand Elusion
|
||
Banzai Buckaroo
|
||
|
||
|
||
|
||
|
||
Another fine PTL Production
|
||
Call The Myth Inc. BBS
|
||
Table of Contents:
|
||
------------------ (Page Numbers will be aprox. until
|
||
final version is finished)
|
||
i. Table of Contents 2
|
||
|
||
ii. Introduction 3
|
||
|
||
I. How to Crack 4
|
||
Debugging DOS 4
|
||
Cracking on the IBM PC Part 1 7
|
||
Cracking on the IBM PC Part 2 11
|
||
|
||
II. Example Cracks 14
|
||
Mean-18 by Accolade 14
|
||
Submarine by Eypx 18
|
||
Space Station Oblivion by Eypx 22
|
||
|
||
III. Removing Doc Check Questions 23
|
||
F-15 Strike Eagle by MicroProse 23
|
||
Battlehawks 1945 by Lucasfilms 25
|
||
Yeager's AFT by Electronic Arts 26
|
||
|
||
IV. Cracking Self Booters 27
|
||
Disk Basics
|
||
Victory Road by Data East 27
|
||
MS-Flight Simulator (Ver 2.x) 30
|
||
|
||
V. Creating Title Screens 33
|
||
|
||
VI. Appendix 35
|
||
A - Interrupt Tables 36
|
||
(This will be an add-on file)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
2
|
||
Introduction:
|
||
-------------
|
||
|
||
Due to the current lack of Crackers, and also keeping in mind
|
||
the time it took me to learn the basics of cracking, I de-
|
||
cided to put this tutorial together. I will include many
|
||
files which I have found helpful in my many cracking endeav-
|
||
ors. It also has comments that I have included to make it
|
||
easier to understand.
|
||
|
||
|
||
|
||
Comments Key:
|
||
-------------
|
||
|
||
Comments in the following material will be made by one of the
|
||
following and the lines that enclose the comments show who
|
||
made the comment.
|
||
|
||
Specular Vision = -------------
|
||
Mr. Transistor = +++++++++++++
|
||
Ironman = |||||||||||||
|
||
|
||
|
||
Special thanks to Mr. Transistor, for coming out of "Retire-
|
||
ment" to help compose this document.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
3
|
||
Chapter I How to Crack
|
||
|
||
|
||
-------------------------------------------------------------
|
||
Let's start with a simple introduction to patching a program
|
||
using the DOS DEBUG program. The following article will in-
|
||
troduce you to the basic ideas and concepts of looking for a
|
||
certain area of a program and making a patch to it.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
By: Charles Petzold / Specular Vision
|
||
Title: Case Study: A Colorful CLS
|
||
|
||
This article originally appeared in the Oct. 14,1986 Issue
|
||
of PC Magazine (Vol 15. Num 17.). Written by Charles Petzold.
|
||
|
||
The hardest part of patching existing programs is determin-
|
||
ing where the patch should go. You really have to make an
|
||
intelligent guess about the functioning of the program.
|
||
|
||
As an example, let's attempt to modify COMMAND.COM so that
|
||
is colors the screen on a CLS command. As with any type of
|
||
patch try it out on a copy and NOT the original.
|
||
|
||
First, think about what we should look for. CLS is differ-
|
||
ent from all the other DOS internal Commands, It is the only
|
||
internal command that does something to the screen other than
|
||
just write to it with simple teletype output. CLS blanks the
|
||
screen and homes the cursor. Since it can't do this through
|
||
DOS Calls (unless ANSI.SYS is loaded), it is probably calling
|
||
the BIOS Directly. The BIOS Interrupt 10h call controls the
|
||
video, and so the CLS command probably uses several INT 10h
|
||
instructions. The machine code for INT 10h is CD 10.
|
||
|
||
(While this same method will work under any version of
|
||
PC-DOS, Version 2.0 and later, the addresses I'll be using
|
||
are from PC-DOS 3.1. Other versions of PC-DOS(or MS-DOS) will
|
||
have different addresses; you should be absolutely certain
|
||
that you're using the correct addresses.)
|
||
|
||
Load COMMAND.COM into DEBUG:
|
||
|
||
DEBUG COMMAND.COM
|
||
|
||
and do an R (Registers) command. The size of COMMAND.COM is
|
||
in register CX. For DOS 3.1's COMMAND.COM, this value is
|
||
5AAA.
|
||
|
||
Now do Search command to look for the CD 10 bytes:
|
||
|
||
S 100 L 5AAA CD 10
|
||
|
||
You'll get a list of six addresses, all clustered close to-
|
||
|
||
4
|
||
gether. The first one is 261D. You can now pick an address a
|
||
little before that (to see what the first call is doing) and
|
||
start disassembling:
|
||
|
||
U 261B
|
||
|
||
The first INT 10 has AH set to 0F which is a Current Video
|
||
State call. The code checks if the returned value of AL
|
||
(Which is the video mode) is less than 3 or equal to 7.
|
||
These are the text modes. If so, it branches to 262C. If
|
||
not, it just resets the video mode with another INT 10 at ad-
|
||
dress 2629.
|
||
|
||
At 262C, the code first sets the border black (the INT 10
|
||
at 2630), then does another Current Video State call (at
|
||
2634) to get the screen width in register AH. It uses infor-
|
||
mation from this call to set DX equal to the bottom right row
|
||
and column. It then clears the screen by scrolling the en-
|
||
tire screen up with another INT 10 (at 2645), and then sets
|
||
the cursor to the zeroth row and zeroth column with the final
|
||
INT 10 (at 264D).
|
||
|
||
When it scrolls the whole screen, the zero value in AL ac-
|
||
tually means blank the screen, the value of BH is the at-
|
||
tribute to be used on the blanked area. In an unmodified
|
||
COMMAND.COM, BH is set to 7 (Which is white on black) by the
|
||
following statement at address 2640:
|
||
|
||
MOV BX,0700
|
||
|
||
If you prefer a yellow-on-blue attribute (1E), you can
|
||
change this line by going into Assemble mode by entering:
|
||
|
||
A
|
||
|
||
then entering
|
||
|
||
MOV BX,1E00
|
||
|
||
and exiting Assemble mode by entering a blank line.
|
||
|
||
Now you can save the modified file:
|
||
|
||
W
|
||
|
||
and quit DEBUG:
|
||
|
||
Q
|
||
|
||
When you load the new version of COMMAND.COM (and you can
|
||
do so without rebooting by just entering:
|
||
|
||
COMMAND
|
||
|
||
|
||
5
|
||
on the DOS command level), a CLS will turn the screen blue
|
||
and display characters as yellow.
|
||
|
||
If it doesn't or if anything you type shows up as white on
|
||
black, that probably means you have ANSI.SYS loaded. If you
|
||
use ANSI.SYS, you don't have to make this patch but can in-
|
||
stead use the prompt command for coloring the screen.
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
6
|
||
-------------------------------------------------------------
|
||
That was just one section of a very large article that helped
|
||
me to get started. Next we'll look at two other articles,
|
||
both written by Buckaroo Banzi. These two articles CRACK-1
|
||
and CRACK-2 give you an introduction to the different copy
|
||
protection schemes used on IBM PC's, and how to find and by-
|
||
pass them.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
|
||
By: Buckaroo Banzai
|
||
Title: Cracking On the IBM PC Part I
|
||
|
||
|
||
Introduction
|
||
------------
|
||
For years, I have seen cracking tutorials for the APPLE
|
||
computers, but never have I seen one for the PC. I have de-
|
||
cided to try to write this series to help that pirate move up
|
||
a level to a crackest.
|
||
|
||
In this part, I will cover what happens with INT 13 and how
|
||
most copy protection schemes will use it. I strongly suggest
|
||
a knowledge of Assembler (M/L) and how to use DEBUG. These
|
||
will be an important figure in cracking anything.
|
||
|
||
|
||
INT-13 - An overview
|
||
--------------------
|
||
|
||
Many copy protection schemes use the disk interrupt
|
||
(INT-13). INT-13 is often use to either try to read in a il-
|
||
legally formatted track/sector or to write/format a
|
||
track/sector that has been damaged in some way.
|
||
|
||
INT-13 is called like any normal interrupt with the assem-
|
||
bler command INT 13 (CD 13). [AH] is used to select which
|
||
command to be used, with most of the other registers used for
|
||
data.
|
||
|
||
INT-13 Cracking College
|
||
-----------------------
|
||
Although, INT-13 is used in almost all protection schemes,
|
||
the easiest to crack is the DOS file. Now the protected pro-
|
||
gram might use INT-13 to load some other data from a normal
|
||
track/sector on a disk, so it is important to determine which
|
||
tracks/sectors are important to the protection scheme. I
|
||
have found the best way to do this is to use LOCKSMITH/pc
|
||
(what, you don't have LS. Contact your local pirate for it.)
|
||
|
||
Use LS to analyze the diskette. Write down any track/sector
|
||
that seems abnormal. These track are must likely are part of
|
||
the protection routine. Now, we must enter debug. Load in
|
||
|
||
7
|
||
the file execute a search for CD 13. Record any address
|
||
show.
|
||
|
||
If no address are picked up, this mean 1 or 2 things, the
|
||
program is not copy protected (right...) or that the check is
|
||
in an other part of the program not yet loaded. The latter
|
||
being a real hassle to find, so I'll cover it in part II.
|
||
There is another choice. The CD 13 might be hidden in self
|
||
changing code. Here is what a sector of hidden code might
|
||
look like
|
||
|
||
-U CS:0000
|
||
1B00:0000 31DB XOR BX,BX
|
||
1B00:0002 8EDB MOV DS,BX
|
||
1B00:0004 BB0D00 MOV BX,000D
|
||
1B00:0007 8A07 MOV AL,[BX]
|
||
1B00:0009 3412 XOR AL,12
|
||
1B00:000B 8807 MOV [BX],AL
|
||
1B00:000D DF13 FIST WORD...
|
||
|
||
In this section of code, [AL] is set to DF at location
|
||
1B00:0007. When you XOR DF and 12, you would get a CD(hex)
|
||
for the INT opcode which is placed right next to a 13 ie,
|
||
giving you CD13 or INT-13. This type of code can't and will
|
||
not be found using debug's [S]earch command.
|
||
|
||
|
||
|
||
Finding Hidden INT-13s
|
||
----------------------
|
||
|
||
The way I find best to find hidden INT-13s, is to use a
|
||
program called PC-WATCH (TRAP13 works well also). This pro-
|
||
gram traps the interrupts and will print where they were
|
||
called from. Once running this, you can just disassemble
|
||
around the address until you find code that look like it is
|
||
setting up the disk interrupt.
|
||
|
||
An other way to decode the INT-13 is to use debug's [G]o
|
||
command. Just set a breakpoint at the address give by
|
||
PC-WATCH (both programs give the return address). Ie, -G
|
||
CS:000F (see code above). When debug stops, you will have
|
||
encoded not only the INT-13 but anything else leading up to
|
||
it.
|
||
|
||
|
||
What to do once you find INT-13
|
||
-------------------------------
|
||
|
||
Once you find the INT-13, the hard part for the most part
|
||
is over. All that is left to do is to fool the computer in
|
||
to thinking the protection has been found. To find out what
|
||
the computer is looking for, examine the code right after the
|
||
INT-13. Look for any branches having to do with the
|
||
|
||
8
|
||
CARRYFLAG or any CMP to the AH register. If a JNE or JC
|
||
(etc) occurs, then [U]nassembe the address listed with the
|
||
jump. If it is a CMP then just read on.
|
||
|
||
Here you must decide if the program was looking for a pro-
|
||
tected track or just a normal track. If it has a CMP AH,0
|
||
and it has read in a protected track, it can be assumed that
|
||
it was looking to see if the program had successfully com-
|
||
plete the READ/FORMAT of that track and that the disk had
|
||
been copied thus JMPing back to DOS (usually). If this is
|
||
the case, Just NOP the bytes for the CMP and the correspond-
|
||
ing JMP.
|
||
|
||
If the program just checked for the carry flag to be set,
|
||
and it isn't, then the program usually assumes that the disk
|
||
has been copied. Examine the following code
|
||
|
||
INT 13 <-- Read in the Sector
|
||
JC 1B00 <-- Protection found
|
||
INT 19 <-- Reboot
|
||
1B00 (rest of program)
|
||
|
||
The program carries out the INT and find an error (the il-
|
||
legally formatted sector) so the carry flag is set. The com-
|
||
puter, at the next instruction, see that the carry flag is
|
||
set and know that the protection has not been breached. In
|
||
this case, to fool the computer, just change the "JC 1B00" to
|
||
a "JMP 1B00" thus defeating the protection scheme.
|
||
|
||
NOTE: the PROTECTION ROUTINE might be found in more than just
|
||
1 part of the program
|
||
|
||
|
||
Handling EXE files
|
||
------------------
|
||
|
||
As we all know, Debug can read .EXE files but cannot write
|
||
them. To get around this, load and go about cracking the
|
||
program as usual. When the protection scheme has been found
|
||
and tested, record (use the debug [D]ump command) to save + &
|
||
- 10 bytes of the code around the INT 13. Exit back to dos
|
||
and rename the file to a .ZAP (any extension but .EXE will
|
||
do) and reloading with debug. Search the program for the 20+
|
||
bytes surrounding the code and record the address found.
|
||
Then just load this section and edit it like normal. Save
|
||
the file and exit back to dos. Rename it back to the .EXE
|
||
file and it should be cracked.
|
||
|
||
***NOTE: Sometimes you have to play around with it for a
|
||
while to make it work.
|
||
|
||
|
||
|
||
|
||
|
||
9
|
||
DISK I/O (INT-13)
|
||
-----------------
|
||
This interrupt uses the AH resister to select the function
|
||
to be used. Here is a chart describing the interrupt.
|
||
|
||
AH=0 Reset Disk
|
||
AH=1 Read the Status of the Disk
|
||
system in to AL
|
||
|
||
AL Error
|
||
----------------------------
|
||
00 - Successful
|
||
01 - Bad command given to INT
|
||
*02 - Address mark not found
|
||
03 - write attempted on write protected disk
|
||
*04 - request sector not found
|
||
08 - DMA overrun
|
||
09 - attempt to cross DMA boundary
|
||
*10 - bad CRC on disk read
|
||
20 - controller has failed
|
||
40 - seek operation failed
|
||
80 - attachment failed
|
||
(* denotes most used in copy protection)
|
||
AH=2 Read Sectors
|
||
|
||
input
|
||
DL = Drive number (0-3)
|
||
DH = Head number (0or1)
|
||
CH = Track number
|
||
CL = Sector number
|
||
AL = # of sectors to read
|
||
ES:BX = load address
|
||
output
|
||
AH =error number (see above)
|
||
[Carry Flag Set]
|
||
AL = # of sectors read
|
||
|
||
AH=3 Write (params. as above)
|
||
AH=4 Verify (params. as above -ES:BX)
|
||
AH=5 Format (params. as above -CL,AL
|
||
ES:BX points to format
|
||
Table)
|
||
|
||
------------------------------------------------------------
|
||
For more information on INT-13 refer to appendix A.
|
||
------------------------------------------------------------
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
10
|
||
-------------------------------------------------------------
|
||
In part II, Buck cover's Calls to INT-13 and INT-13 that are
|
||
located in different overlays of the program. This is a
|
||
method that is used often.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
Cracking Tutorial II.
|
||
|
||
By: Buckaroo Banzai
|
||
Title: Cracking On the IBM PC Part II
|
||
|
||
|
||
Introduction
|
||
------------
|
||
|
||
OK guys, you now passed out of Copy Class 101 (dos files)
|
||
and have this great new game with overlays. How do I crack
|
||
this one. You scanned the entire .EXE file for the CD 13 and
|
||
it's nowhere. Where can it be you ask yourself.
|
||
|
||
In part II, I'll cover cracking Overlays and the use of
|
||
locksmith in cracking. If you haven't read part I, then I
|
||
suggest you do so. The 2 files go together.
|
||
|
||
|
||
Looking for Overlays
|
||
--------------------
|
||
So, you cant find CD 13 in the .EXE file, well, it can mean
|
||
4 things.
|
||
|
||
1: The .EXE (though it is mostly .COM) file is just a
|
||
loader for the main file.
|
||
|
||
2: The .EXE file loads in an overlay.
|
||
|
||
3: The CD 13 is encrypted &/or hidden in the .EXE file.
|
||
|
||
4: Your looking at the WRONG file.
|
||
|
||
|
||
I won't discuss case 1 (or at least no here) because so
|
||
many UNP files are devoted to PROLOCK and SOFTGUARD, if you
|
||
can't figure it out with them, your stupid.
|
||
|
||
If you have case 3, use the technique in part I and restart
|
||
from the beginning. And if you have case 4, shoot your self.
|
||
|
||
You know the program uses overlays but don't see and on
|
||
disk? Try looking at the disk with good old Norton's. Any
|
||
hidden files are probably the overlays. These are the ones
|
||
we are after. If you still can't find them, use PC-WATCH
|
||
(this program is a must!!! For all crackists. Traps ALL in-
|
||
terrupts).
|
||
|
||
11
|
||
|
||
Using PC-Watch to Find Overlays
|
||
-------------------------------
|
||
Start up PC-Watch and EXCLUDE everything in the left Col..
|
||
Search the right Col. until you find DOS21 - OpnFile and
|
||
select it.
|
||
|
||
Now run the program to be cracked.
|
||
Play the game until the protection is checked.
|
||
Examine you PCWatch output to see what file was loaded
|
||
right before it.
|
||
This probably is the one holding the check.
|
||
If not, go through all the files.
|
||
|
||
|
||
You Have Found the Overlays
|
||
---------------------------
|
||
Great, now just crack the overlay as if it was a DOS file.
|
||
You don't need to worry about .EXE file, debug can write an
|
||
overlay file. Part I explains the basics of cracking. I
|
||
suggest that you keep a backup copy of the overlay so if you
|
||
mess up, and you will, you can recover quickly. Ah, and you
|
||
thought cracking with overlays was going to be hard.
|
||
|
||
|
||
|
||
Locksmith and Cracking
|
||
----------------------
|
||
|
||
The copy/disk utility program Locksmith by AlphaLogic is a
|
||
great tool in cracking. It's analyzing ability is great for
|
||
determining what and where the protection is.
|
||
|
||
I find it useful, before I even start cracking, to analyze
|
||
the protected disk to find and id it's protection. This
|
||
helps in 2 ways. First, it helps you to know what to do in
|
||
order to fake out the protection. Second, it helps you to
|
||
find what the program is looking for.
|
||
|
||
I suggest that you get locksmith if you don't already have
|
||
it. Check your local pirate board for the program. I also
|
||
suggest getting PC-Watch and Norton Utilities 3.1.(Now 4.1)
|
||
All of these program have many uses in the cracking world.
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
12
|
||
Chapter II Example Cracks
|
||
|
||
|
||
|
||
-------------------------------------------------------------
|
||
OK, now let's put some of this information into practice by
|
||
examining a few cracks of some common programs. First we'll
|
||
look at a Crack for Mean-18 Golf by Accolade. Accolade has
|
||
been one of those companies that has a fervent belief in Copy
|
||
Protection.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
|
||
|
||
Title: MEAN-18 UnProtect For CGA/EGA Version
|
||
|
||
|
||
This crack works by eliminating the code that tests for known
|
||
bad sectors on the original diskette to see if it is the
|
||
genuine article or an illegal copy. The code begins with an
|
||
INT 13 (CD 13 HEX), a DOS BIOS disk service routine followed
|
||
a few bytes later by another INT 13 instruction. The program
|
||
then checks the returned value for the bit configuration that
|
||
signifies the bad sectors and, if all is as expected, contin-
|
||
ues on with program execution.
|
||
|
||
The code that needs to be patched is in the GOLF.EXE file and
|
||
in the ARCH.EXE file. It is identical in both files and lies
|
||
near the end of each file.
|
||
|
||
In the following steps, you'll locate the start of the test
|
||
code and patch it by replacing it with NOP instructions (HEX
|
||
90). The method described uses the DOS DEBUG utility but
|
||
Norton's Utility (NU) works too.
|
||
|
||
Copy all of the files from the MEAN-18 disk onto a fresh
|
||
floppy using the DOS COPY command and place your original
|
||
diskette out of harm's way.
|
||
|
||
Assuming DEBUG is in the A: drive and the floppy containing
|
||
the files to be unlocked is in the B: drive , proceed as fol-
|
||
lows:
|
||
|
||
First REName the GOLF.EXE file so it has a different
|
||
EXTension other than .EXE.
|
||
|
||
REN GOLF.EXE GOLF.DEB
|
||
|
||
|
||
Next load the file GOLF.DEB into DEBUG and displays the "-"
|
||
DEBUG prompt.
|
||
|
||
A:> DEBUG B:GOLF.EXE
|
||
|
||
13
|
||
Search for the beginning of the code to be patched by typing:
|
||
|
||
|
||
- S CS:100 FFFF CD 13
|
||
|
||
Searches the file for the two byte INT 13 instruction. If
|
||
all goes well, two addresses should appear on the screen.
|
||
|
||
XXXX:019C
|
||
XXXX:01A8
|
||
|
||
XXXX indicates that the numbers preceeding the ":" vary from
|
||
system to system but the numbers following the ":" are the
|
||
same on all systems.
|
||
|
||
The next step is to use the "U" command as indicated to
|
||
un-assemble a few bytes in order to verify your position in
|
||
the file)
|
||
|
||
- U CS:019C
|
||
|
||
(Un-assembles 32 bytes of code. Verify the following se-
|
||
quence of instructions:
|
||
|
||
INT 13
|
||
JB 01E9
|
||
MOV AL,[BX+01FF]
|
||
PUSH AX
|
||
MOV AX,0201
|
||
INT 13
|
||
POP AX
|
||
JB 01E9
|
||
CMP AL,F7
|
||
JNZ 01B5
|
||
|
||
These are the instructions you'll be patching out in the fol-
|
||
lowing step)
|
||
|
||
- A CS:019C
|
||
|
||
This command assembles the new instructions you enter at the
|
||
keyboard into the addresses shown. Beginning at CS:019C, and
|
||
for the next 21 bytes, ending with and including CS:01B0, en-
|
||
ter the no op command "NOP" (90h) followed by a <return> or
|
||
<enter>. Just hit <enter> at address XXXX:01B1 to end the
|
||
assemble command.)
|
||
|
||
XXXX:019C NOP <enter>
|
||
XXXX:019D NOP <enter>
|
||
.
|
||
.
|
||
.
|
||
XXXX:01AE NOP <enter>
|
||
XXXX:01AF NOP <enter>
|
||
|
||
14
|
||
XXXX:01B0 NOP <enter>
|
||
XXXX:01B1 <enter>
|
||
|
||
This just wipes out the section of code containing the INT 13
|
||
check.
|
||
|
||
Now do a HEX dump and verify that bytes 019C through 01B0
|
||
have been set to 90 HEX.
|
||
|
||
- D CS:019C
|
||
|
||
If they have, write the patched file to the disk as follows)
|
||
|
||
- W
|
||
|
||
This writes the patched file back to the
|
||
disk where it can be run by typing GOLF just as before but
|
||
now, it can be run from any drive, including the hard
|
||
drive)
|
||
|
||
Now just [Q]uit or exit back to DOS. This command can be ex-
|
||
ecuted at any "-" DEBUG prompt if you get lost. No modifica-
|
||
tion will be made to the file on the disk until you issue the
|
||
"W" command.
|
||
|
||
- Q
|
||
|
||
The process is the same for the ARCH.EXE file but because it
|
||
is a different length, the segment address, (XXXX part of the
|
||
address), will be different. You should find the first INT
|
||
13 instruction at address XXXX:019C and the second one at
|
||
XXXX:01A8 as before.
|
||
|
||
You will again be patching 21 bytes and you will start with
|
||
019C and end with 01B0 as before. After doing the HEX dump
|
||
starting at address 019C, you again write the file back to
|
||
the disk with a "W" command then "Q" uit.
|
||
|
||
Norton's utilities can also be used to make this patch. Be-
|
||
gin by searcing the GOLF.EXE or ARCH.EXE files for the two
|
||
byte combination CD 13 (remember to enter these as HEX
|
||
bytes). Once located, change the 21 bytes, starting with the
|
||
first "CD" byte, to 90 (a NOP instruction). As a check that
|
||
you are in the right place, the byte sequence in both files
|
||
is CD 13 72 49 8A 87 FF 01 50 B8 01 02 CD 13 58 72 3C 3C F7
|
||
75 04. After modifying the bytes, write the modified file
|
||
back to the disk. It can then be run from any drive.
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
15
|
||
------------------------------------------------------------
|
||
That was the first the tutorial cracks, here's another crack
|
||
based on the same ideas but using Norton's Utilities instead.
|
||
The following is an unprotect method for Eypx Submarine.
|
||
Eypx is another one of those companies bent on protecting the
|
||
world.
|
||
------------------------------------------------------------
|
||
|
||
|
||
By: Assembler Magic
|
||
Title: EPYX Submarine Unprotect
|
||
|
||
|
||
You will only need to make one modification to the main
|
||
executable program of Submarine, SUB.EXE. I will assume that
|
||
your computer has a hard disk and that you have a path to
|
||
DOS. It's time to fire up DEBUG as follows:
|
||
|
||
DEBUG SUB.EXE<cr>
|
||
|
||
The computer should respond with a "-" prompt. Now look at
|
||
the registers, just to make sure everything came up okay.
|
||
Type the letter "R" immediately after the prompt. The com-
|
||
puter should respond with a few lines of info as follows:
|
||
|
||
AX=0000 BX=0001 CX=6103 DX=0000 SP=0080 BP=0000 SI=0000
|
||
DI=0000 DS=12CE ES=12CE SS=37B2 CS=27FC IP=0010 NV UP EI PL
|
||
NZ NA PO NC
|
||
27FC:0010 8CC0 MOV AX,ES
|
||
-
|
||
|
||
Note the value of CS is "27FC". That is the hexadecimal
|
||
segment address for the beginning of the program code in your
|
||
computer's memory. It is highly probable that the value you
|
||
see for CS will differ from mine. Whatever it is, write it
|
||
down. Also, the values you see for DS, ES and SS will almost
|
||
certainly differ from mine and should not cause you concern.
|
||
The other registers should show the same values mine do, and
|
||
the flags should start with the same values.
|
||
|
||
Next, we will do a search for Interrupt 13's. These are
|
||
BIOS (not DOS) Interrupts built into the program which are
|
||
used to ensure that the original disk is being used to run
|
||
the program. The whole key to this unprotect scheme is to by-
|
||
pass these Interrupts in the program code. The tricky part
|
||
of this unprotect is to find them! They are not in the seg-
|
||
ment of program code starting at the value of CS equal to
|
||
"27FC". They are closer to the beginning of the program in
|
||
memory. Easy enough! Reset the value of CS to equal the
|
||
value of DS as follows; type immediately after Debug's "-"
|
||
prompt:
|
||
|
||
RCS<cr>
|
||
|
||
|
||
16
|
||
Debug will prompt you for the new value of CS with:
|
||
|
||
CS:27FC:
|
||
|
||
You respond by typing the value of DS you saw when you
|
||
dumped the registers the first time. For example, I typed
|
||
"12CE<cr>". The value you type will be different. Debug
|
||
will again respond with the "-" prompt which means we are
|
||
ready to do our search. Type in the following after the "-"
|
||
prompt:
|
||
|
||
S CS:0 FFFF CD 13<cr>
|
||
|
||
The computer should respond with three lines of information
|
||
which are the addresses of the three Interrupt 13 calls built
|
||
into the program. The first four digits are the segment ad-
|
||
dress and will equal to the value of CS you have just set.
|
||
The second four digits following the colon are the offset ad-
|
||
dresses which are of primary interest to us. On my machine
|
||
they came back as follows:
|
||
|
||
12CE:4307
|
||
12CE:431F
|
||
12CE:4335
|
||
|
||
The segment addresses will be identical and the three off-
|
||
set addresses should all be relatively close together. Now
|
||
look at the first offset address. (As you can see, mine was
|
||
"4307".) Write it down. Now we do a bit of Unassembly.
|
||
|
||
Type "U4307<cr>" which is the letter "U", followed immedi-
|
||
ately (with no blank spaces) by whatever your first offset
|
||
address turned out to be, followed by a carriage return. If
|
||
you are not familiar with unassembled machine code, it will
|
||
look like lines of gibberish as follows:
|
||
|
||
12CE:4307 CD13 INT 13
|
||
12CE:4309 4F DEC DI
|
||
12CE:430A 744C JZ 4358
|
||
.
|
||
.
|
||
12CE:431F CD13 INT 13
|
||
12CE:4321 4F DEC DI
|
||
.
|
||
.
|
||
12CE:4324 BF0400 MOV DI,0004
|
||
12CE:4326 B80102 MOV AX,0201
|
||
|
||
In my computer, Unassemble will automatically output 16
|
||
lines of code to the screen. Yours may differ. Note, in the
|
||
abbreviated list I have shown above, the addresses at the be-
|
||
ginning of the two lines which contain the Interrupt 13's
|
||
(INT 13) correspond to the first two addresses we found in
|
||
our search. Now we continue the unassemble, and here comes
|
||
|
||
17
|
||
another tricky part. Just type in "U<cr>" after the "-"
|
||
prompt.
|
||
|
||
You'll get sixteen more lines of code with the third Inter-
|
||
rupt 13 on a line which begins with the address (CS):4335 if
|
||
you have the same version of Submarine as I do. It's not
|
||
terribly important to this exercise, but it will at
|
||
least show you that things are proceeding okay. Now type in
|
||
"U<cr>" again after the prompt. You are now looking for
|
||
three key lines of code. On my program they appear as fol-
|
||
lows:
|
||
|
||
12CE:4335 07 POP ES
|
||
12CE:4356 5D POP BP
|
||
12CE:4357 CB RETF
|
||
|
||
The true key is the instruction "POP ES". This instruction
|
||
begins the normal return sequence after the program has ex-
|
||
ecuted its Interrupt 13 instructions and accompanying checks.
|
||
If Debug on your machine prints fewer than 16 lines of code
|
||
at a shot, you may have to type in "U" more than twice at the
|
||
"-" to find these instructions. (If you haven't found any of
|
||
this stuff, either get help on the use of Debug or go back to
|
||
using your diskette version!) Write down the offset address
|
||
of the "POP ES" instruction; the four digits following the
|
||
colon, which in my example is "4354". You're well on your
|
||
way now, so please persevere.
|
||
|
||
The next step is to modify the program to JUMP around the
|
||
code which executes the Interrupt 13's and go immediately to
|
||
the instruction which begins the normal return sequence
|
||
(again, it's the "POP ES". Type in the following instruc-
|
||
tions carefully:
|
||
|
||
A4307<cr>
|
||
|
||
This first bit tells Debug that new Assembler code will be
|
||
inserted at the address of the first Interrupt 13. If your
|
||
first Interrupt 13 is at an address other that "4307", use
|
||
the correct address, not mine. The computer will prompt you
|
||
with the address:
|
||
|
||
12CE:4307
|
||
|
||
After which you will immediately type:
|
||
|
||
JMP 4354<cr>
|
||
|
||
This instruction jumps the program immediately to the normal
|
||
return code instructions. Again, at the risk of being redun-
|
||
dant, if your "POP ES" instruction is at a different address,
|
||
use that address, not "4354"!
|
||
|
||
The computer will prompt you with the address of the next in-
|
||
|
||
18
|
||
struction if all went well. MAKE SURE you just hit the
|
||
carriage return at this point. Debug will then return the
|
||
familiar "-" prompt.
|
||
|
||
Now it's time to examine your handiwork. Let's do the
|
||
unassemble again starting at the address of what had been the
|
||
first Interrupt 13 instruction, but which is now the Jump in-
|
||
struction. Type in "U4307<cr>" or "U" followed by the appro-
|
||
priate address and a carriage return. The first line begin-
|
||
ning with the address should appear as follows:
|
||
|
||
12CE:4307 EB4B JMP 4354
|
||
|
||
The key here is the four bytes immediately following the ad-
|
||
dress. In my example they are "EB4B". Yours may not be.
|
||
But, they are VERY IMPORTANT because they represent the ac-
|
||
tual machine code which is the Jump instruction. WRITE THESE
|
||
FOUR BYTES DOWN AND MAKE SURE THEY ARE CORRECT.
|
||
|
||
Now if you want to have some fun before we go on, reset
|
||
register CS to its original value by first typing "RCS<cr>"
|
||
at the "-" prompt. Then type in the original value of CS
|
||
that I asked you to write down. Using my example, I typed
|
||
"27FC<cr>". Next, you will type "G<cr>" after the "-" prompt
|
||
which means GO! If all went well, SUB should run at this
|
||
point. At least it will if you put all of the Submarine
|
||
files onto the diskette or into the hard disk subdirectory
|
||
where youre working. If it didn't run, you may have made an
|
||
error. Check through what you have done.
|
||
|
||
Don't give up at this point if it does not run. Your version
|
||
of Debug may simply have not tolerated our shenanigans. When
|
||
you are done playing, quit Submarine ("Alt-Q<cr>") and type a
|
||
"Q<cr>" after the Debug prompt "-" appears.
|
||
|
||
Now comes the tough part. I can't walk you through this
|
||
phase in complete detail, because you may be using one of
|
||
several programs available to modify the contents of SUB.EXE.
|
||
Debug is not the way to go, because it can't write out .EXE
|
||
files, only .COM files.
|
||
|
||
-------------------------------------------------------------
|
||
Note: Another method of doing this is to REName the SUB.EXE
|
||
file so it has a different extension other than .EXE before
|
||
you enter DEBUG. That way after you've made the change you
|
||
can then [W]rite then changes out to the file right in DEBUG.
|
||
Then one drawback is that you can't run the program in DEBUG
|
||
once you've changed the name.
|
||
-------------------------------------------------------------
|
||
|
||
You have to get into your sector modification package (NORTON
|
||
works good) and work on the SUB.EXE file on your new diskette
|
||
or your hard disk. Remember, I warned you that doing this on
|
||
your hard disk is dangerous if you are not fully aware of
|
||
|
||
19
|
||
what you are doing. So, IF YOU MESS UP, it's YOUR OWN FAULT!
|
||
|
||
You are looking for the first occurrence of an Interrupt 13
|
||
(the "CD 13") using the search facility in your program. If
|
||
you don't have the ability to search for the two-byte hexa-
|
||
decimal code "CD 13" directly, then you will have to manually
|
||
search.
|
||
|
||
-------------------------------------------------------------
|
||
Note: Norton 4.x now has a search utility. When you get to
|
||
the point of typing in the search text, just press the TAB
|
||
key, and you can type in the actual hexadecimal code "CD 13".
|
||
-------------------------------------------------------------
|
||
|
||
Start at the beginning of SUB.EXE and proceed. Again, you
|
||
want to find the first of the three (first from the beginning
|
||
of the program).
|
||
|
||
I will give you a hint. I found it in NORTON at location
|
||
4407 hexadecimal which is location 17,415 decimal in the
|
||
SUB.EXE program file. DOS standard sectors are 512 decimal
|
||
bytes. Replace the two bytes "CD 13" with the "EB 4B" or
|
||
whatever your Jump instruction turned out to be. Write or
|
||
save the modified file.
|
||
|
||
That's ALL there is to modifying SUB.EXE. You can go ahead
|
||
and execute your program. If you have followed my instruc-
|
||
tions, it should run fine. Get help if it doesn't. Now, you
|
||
should be all set. You can load onto your hard disk, if you
|
||
haven't already. You can run it from a RAM disk using a BAT
|
||
file if you really want it to hum. Or, if you have the fa-
|
||
cilities, you can copy it from 5-1/4" floppy to 3-1/2" dis-
|
||
kette and run it on machines which accept that medium if you
|
||
upgrade to a new computer.
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
20
|
||
-------------------------------------------------------------
|
||
Now let's take a look at a newer crack on the program, Space
|
||
Station Oblivion by Eypx. At a first [S]earch with Debug and
|
||
Norton's Utility no CD 13's could be found, and yet it was
|
||
using them... So a different approach had to be taken...
|
||
-------------------------------------------------------------
|
||
|
||
|
||
By: PTL
|
||
Title: Space Station Oblivion Crack
|
||
|
||
|
||
First of all, you must determine which file the INT 13's are
|
||
in, in this case it had to be the file OBLIVION.EXE since it
|
||
was the main program and probably contained the INT 13's. So
|
||
then rename it to a different EXTension and load it into De-
|
||
bug.
|
||
|
||
Then do a [S]earch for INT 13's.
|
||
|
||
-S 100 FFFF CD 13
|
||
|
||
Which will promptly turned up nothing. Hmmm...
|
||
|
||
Next you might decide that, maybe, the code was modifying it-
|
||
self. So quit from Debug and load up PC-Watch, include all
|
||
the INT 13 Calls. For those of you not familiar with
|
||
PC-Watch, it is a memory resident program that can be set to
|
||
look for any type of BIOS call. When that call is made
|
||
PC-Watch prints to the screen the contents of all the regis-
|
||
ters and the current memory location that the call was made
|
||
from.
|
||
|
||
After PC-Watch is initialized, then run the OBLIVION.EXE file
|
||
from the hard disk, leaving the floppy drive door open, and
|
||
sure enough, when the red light comes on in the diskette
|
||
drive, PC-Watch will report the address's of some INT 13
|
||
calls. Which you should then write down.
|
||
|
||
From there, quit the game, reboot, (To dump PC-Watch from
|
||
memory) and load the OBLIVION.EXE into Debug and issue a [G]o
|
||
command with a breakpoint. What address should you use for a
|
||
breakpoint? You guessed it, the same address PC-Watch gives
|
||
you.
|
||
|
||
Well, it locked up did'nt it? Which is quite common in this
|
||
line of work so don't let that discourage you. So next re-
|
||
loaded it into debug and this time [U]nassemble the address
|
||
that you got from PC-Watch. But instead of finding the INT
|
||
13's you'll find harmless INT 21's.
|
||
|
||
Hmm... could it be that the program was converting the CD
|
||
21's to CD 13's during the run? Well, to test the idea as-
|
||
semble an INT 20 (Program Terminate) right after the first
|
||
|
||
21
|
||
INT 21. Then I run the program, and yes immediately after the
|
||
red light comes on the drive, the program will terminate nor-
|
||
mally.
|
||
|
||
Then [U]nassemble that same area of memory, and low and be-
|
||
hold, some of the INT 21's have magically turned into INT
|
||
13's. How clever...
|
||
|
||
So, then it is just a matter of locating the address of the
|
||
routine that it jumped (JMP) to if the correct disk was found
|
||
in drive A:. Once you have that address, just go to the
|
||
start of all this nonsense and [A]ssemble a JMP XXXX command.
|
||
Where XXXX was the address to jump to if the original disk
|
||
was in drive A:.
|
||
|
||
Then just [W]rite the file back out to the disk and [Q]uit
|
||
debug, and then REName the file back to OBLIVION.EXE
|
||
afterwhich it should work fine.
|
||
|
||
|
||
END.
|
||
|
||
22
|
||
Chapter III Removing Doc Check Questions
|
||
|
||
|
||
-------------------------------------------------------------
|
||
A new fad has recently started up with software vendors, it
|
||
involves the use of "Passwords" which are either stored in
|
||
the documentation or are actually the documentation itself.
|
||
Then when you reach a certain part of the program (Usually
|
||
the beginning) the program will ask for the password and you
|
||
have to look it up in the Docs before being allowed to con-
|
||
tinue. If the wrong password is entered, it will usually
|
||
drop you to DOS or take you to a Demo version of the program.
|
||
|
||
This new form of copy protection is very annoying, but can
|
||
usually be cracked without too much effort, and the files
|
||
and the disk are usually in the standard DOS format. So now
|
||
we'll take a look at cracking the Doc check questions.
|
||
|
||
First of all we'll crack the startup questions in F-15
|
||
Strike Eagle by MicroProse.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
By: JP ASP
|
||
Title: F-15 Unprotect
|
||
|
||
|
||
|
||
Make a copy of the original disk using the DOS DISKCOPY pro-
|
||
gram.
|
||
|
||
>DISKCOPY A: B:
|
||
|
||
Then insert the copy disk in the A drive and invoke DOS DE-
|
||
BUG.
|
||
|
||
>DEBUG
|
||
|
||
Now we'll [F]ill an area of memory with nothing (00).
|
||
|
||
-F CS:100 L FEFF 0
|
||
|
||
Next we will [L]oad into address CS:0100 the data that is on
|
||
the A: disk (0) from sector 0 to sector 80.
|
||
|
||
-l cs:100 0 0 80
|
||
|
||
Now lets [S]earch the data we loaded for the area where the
|
||
copy protection routine is.
|
||
|
||
-s cs:100 l feff FA EB FD
|
||
|
||
Then for each of the occurences listed, use the address DEBUG
|
||
returned in the [E]nter command below.
|
||
|
||
23
|
||
|
||
-e xxxx 90 90 90
|
||
|
||
-------------------------------------------------------------
|
||
Here's the part we are interested in, it's where you change
|
||
all the autorization codes to a space. Notice how you can
|
||
use the [S]earch command to look for ASCII text.
|
||
-------------------------------------------------------------
|
||
|
||
-s cs:100 l feff "CHIP"
|
||
|
||
Then for each occurance of "CHIP" use the address DEBUG re-
|
||
turned in the [F]ill command below.
|
||
|
||
-F XXXX L F 20
|
||
|
||
Write out the modified data
|
||
|
||
-W CS:100 1 0 80
|
||
|
||
Quit DEBUG
|
||
|
||
-Q
|
||
|
||
|
||
You should now be able to DISKCOPY and boot from all copies
|
||
also just press the space bar when it ask for ANY authority
|
||
code and then press "ENTER". Now there is no need to remember
|
||
(or look up) any codes that are so finely tucked away in the
|
||
manual!
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
24
|
||
-------------------------------------------------------------
|
||
Here is a similar method that was used break the passwords in
|
||
the program BATTLEHAWKS 1945 by Lucasfilms. However Norton
|
||
Utilities is used to search for the passwords and change
|
||
them.
|
||
-------------------------------------------------------------
|
||
|
||
By: PTL
|
||
Title: BATTLEHAWKS-1945 Doc Check Crack
|
||
|
||
|
||
In keeping in line with their previous programs, Lucasfilms
|
||
has released yet another program which uses Doc Checks for
|
||
its means of copy protection, Battlehawks 1942.
|
||
|
||
When you run this program, it first goes through a series of
|
||
graphic displays, then it goes through a series of questions,
|
||
asking what type of mission you want to fly, such as Train-
|
||
ing, Active Duty, or which side of the war you want to be on.
|
||
|
||
Then right before the simulation begins, it shows you a pic-
|
||
ture of a Japanese Zero and ask you for a password which you
|
||
|
||
are then supposed to get by looking up the picture of the
|
||
Zero in the User Manual and typing the corresponding password
|
||
in. After which it enters the simulation, in the event you
|
||
enter the wrong password, it puts you into a training mis-
|
||
sion.
|
||
|
||
Removing the Doc Check in a program like this is usually
|
||
pretty easy. The ideal way to do it is to remove the Doc
|
||
Check routine itself, but if you don't have all day to debug
|
||
and trace around the code this might not be the best way.
|
||
For instance if you only have your lunch hour to work on it
|
||
(Like I did), then you need to use the standard Q.D.C.R.S.
|
||
(Quick Doc Check Removal System).
|
||
|
||
How do you do a QDCRS? Well first of all, play around with
|
||
the program, find out what it will and will NOT accept as a
|
||
password. Most programs will accept anything, but a few
|
||
(Like Battlehawks) will only accept Alpha characters.
|
||
|
||
Once you've learned what it likes, make an educated guess as
|
||
to what program the Doc Check routine is in. Then load that
|
||
program into Norton's Utility (NU).
|
||
|
||
At this point, take a look at the passwords, and write down
|
||
the most unusual one that you can find (I'll explain later).
|
||
Now type that password in as the search string, and let NU
|
||
search through the file until it finds the password. Now a
|
||
couple of things can happen.
|
||
|
||
1. It only finds one occurrence
|
||
2. It finds more than one occurrence
|
||
3. It doesn't find any occurrence
|
||
|
||
In the event of case 2 then YOU have to determine where the
|
||
passwords are stored, you can do this by opening your eyes
|
||
and looking.
|
||
|
||
In the event of case 3, go to the kitchen and start a pot of
|
||
coffee, then tell you wife to go to bed without you, because
|
||
you have a "Special Project" that you have to finish tonight.
|
||
And by the way, Good Luck. You'll need it.
|
||
|
||
Hopefully case 1 will occur, now you have to take a look at
|
||
the data and ask yourself 2 questions:
|
||
|
||
1. Are all the passwords the same length?
|
||
2. Is there a set number of spaces between each pass-
|
||
word?
|
||
3. Does the next password always start a certain number
|
||
of characters from the first character of the previ-
|
||
ous password?
|
||
|
||
If you can answer yes to any of the above questions, you in
|
||
luck. All you have to do is change the passwords to spaces
|
||
|
||
(If the program allows that, Battlehawks doesn't) or change
|
||
them to you favorite character. The letter X works good, it's
|
||
easy to type and easy to remember.
|
||
|
||
If you can't answer yes to any of the questions then you ei-
|
||
ther need to bypass the Doc Check routine itself or you need
|
||
to be adventurous and experiment. Battlehawks will not follow
|
||
any of the above patterns, and your quickly running out of
|
||
time, so you'll have to try something, fast...
|
||
|
||
So just wiped out all of the data area with X's, all the
|
||
passwords and associated "garbage" between them. Then saved
|
||
the changes and drop out of NU and into BH. Then when it ask
|
||
for the password, just filed the area with X's. Next thing
|
||
you know, you'll be escorting a bombing run on a Japanese
|
||
carrier.
|
||
|
||
So, this one turned out to be fairly simple. Where you may
|
||
run into trouble is on Doc Checks that use a graphic system,
|
||
such as Gunship by MicroProse. When it comes to this type of
|
||
Doc Check, you almost have to bypass the routine itself. And
|
||
again, a good way to do this is with setting break points and
|
||
using the trace option in Debug.
|
||
|
||
END.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
25
|
||
|
||
-------------------------------------------------------------
|
||
That was the easy version Doc Check crack, however there a
|
||
"Better" way to crack Doc Checks, is to bypass the routine
|
||
completely so the user can just press enter and not worry
|
||
about spaces. Let's take a lot at this method by looking at
|
||
a crack for the program, Yeager's Advanced Flight Trainer, by
|
||
Electronic Arts.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
By: PTL
|
||
Title: Yeager's Advanced Flight Trainer
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
26
|
||
Chapter 5 Cracking Self Booters
|
||
|
||
|
||
|
||
-------------------------------------------------------------
|
||
Now we'll take a look at cracking self booters. A few compa-
|
||
nies have found this to be the best copy protection scheme
|
||
for them, one of which is DataEast, makers of Ikari Warriors,
|
||
Victory Road, Lock-On, Karnov, etc... This posses a special
|
||
problem to the Amateur Cracker, since they seldom use stan-
|
||
dard DOS formats. So let's jump right in!
|
||
-------------------------------------------------------------
|
||
|
||
|
||
This is the area where a "Higher than Normal" knowledge of
|
||
Assembly Language and DOS Diskette structures, so first of
|
||
all, the Basic's.
|
||
|
||
|
||
The Disk's Physical Structure
|
||
|
||
Data is recorded on a disk in a series of concentric circles,
|
||
called Tracks. Each track if further divided into segments,
|
||
called Sectors. The standard double-density drives can
|
||
record 40 tracks of data, while the new quad-density drives
|
||
can record 80 tracks.
|
||
|
||
However, the location, size, and number of the sectors within
|
||
a track are under software control. This is why the PC's
|
||
diskettes are known as soft-sectored. The characteristics of
|
||
a diskette's sectors (Their size, and the number per track)
|
||
are set when each track is formatted. Disk Formatting can be
|
||
done either by the operating system or by the ROM-BIOS format
|
||
service. A lot of self booters and almost all forms of copy
|
||
protection create unusual formats via the ROM-BIOS diskette
|
||
services.
|
||
|
||
The 5 1/4-inch diskettes supported by the standard PC BIOS
|
||
may have sectors that are 128,256,512, or 1,024 bytes in
|
||
size. DOS, from versions 1.00 through 4.01 has consistently
|
||
used sectors of 512 bytes, and it is quite possible that this
|
||
will continue.
|
||
|
||
Here is a table displaying 6 of the most common disk formats:
|
||
_____________________________________________________________
|
||
|
||
Type Sides Sectors Tracks Size(bytes)
|
||
_____________________________________________________________
|
||
|
||
S-8 1 8 40 160K
|
||
D-8 2 8 40 320K
|
||
S-9 1 9 40 180K
|
||
D-9 2 9 40 360K
|
||
QD-9 2 9 80 720K
|
||
QD-15 2 15 80 1,200K
|
||
_____________________________________________________________
|
||
|
||
|
||
|
||
S - Single Density
|
||
D - Double Density
|
||
QD - Quad Density
|
||
|
||
Of all these basic formats, only two are in widespread use:
|
||
S-8 and D-9. The newer Quad Density formats are for the 3
|
||
1/2" and 5 1/4" high density diskettes.
|
||
|
||
|
||
The Disk's Logical Structure
|
||
|
||
So, as we have already mentioned, the 5 1/4-inch diskette
|
||
formats have 40 tracks, numbered from 0 (the outside track)
|
||
through 39 (the inside track, closest to the center). On a
|
||
double sided diskette, the two sides are numbered 0 and 1
|
||
(the two recording heads of a double-sided disk drive are
|
||
also numbered 0 and 1).
|
||
|
||
The BIOS locates the sectors on a disk by a three-dimensional
|
||
coordinate composed of a track number (also referred to as
|
||
the cylinder number), a side number (also called the head
|
||
number), and a sector number. DOS, on the other hand, lo-
|
||
cates information by sector number, and numbers the sectors
|
||
sequentially from the outside to inside.
|
||
|
||
We can refer to particular sectors either by their
|
||
three-dimensional coordinates or by their sequential order.
|
||
All ROM-BIOS operations use the three-dimensional coordinates
|
||
to locate a sector. All DOS operations and tools such as DE-
|
||
BUG use the DOS sequential notation.
|
||
|
||
The BASIC formula that converts the three-dimensional coordi-
|
||
nates used by the ROM-BIOS to the sequential sector numbers
|
||
used by DOS is as follows:
|
||
|
||
DOS.SECTOR.NUMBER = (BIOS.SECTOR - 1) + DIOS.SIDE
|
||
* SECTORS.PER.SIDE + BIOS.TRACK * SECTORS.PER.SIDE
|
||
* SIDES.PER.DISK
|
||
|
||
And here are the formulas for converting sequential sector
|
||
numbers to three-dimensional coordinates:
|
||
|
||
BIOS.SECTOR = 1 + DOS.SECTOR.NUMBER MOD SECTORS.PER.SIDE
|
||
BIOS.SIDE = (DOS.SECTOR.NUMBER \ SECTORS.PER.SIDE)
|
||
MOD SIDE.PER.DISK
|
||
BIOS.TRACK = DOS.SECTOR.NUMBER \ (SECTORS.PER.SIDE
|
||
* SIDES.PER.DISK)
|
||
|
||
(Note: For double-sided nine-sector diskettes, the PC's
|
||
most common disk format, the value of SECTORS.PER.SIDE
|
||
is 9 and the value of SIDES.PER.DISK is 2. Also note
|
||
that sides and tracks are numbered differently in the
|
||
ROM-BIOS numbering system: The sides and tracks are num-
|
||
bered from 0, but the sectors are numbered from 1.)
|
||
|
||
Diskette Space Allocation
|
||
|
||
The formatting process divides the sectors on a disk into
|
||
four sections, for four different uses. The sections, in the
|
||
order they are stored, are the boot record, the file alloca-
|
||
tion table (FAT), the directory, and the data space. The
|
||
size of each section varies between formats, but the struc-
|
||
ture and the order of the sections don't vary.
|
||
|
||
The Boot Record:
|
||
|
||
This section is always a single sector located at sector
|
||
1 of track 0, side 0. The boot record contains, among other
|
||
things, a short program to start the process of loading the
|
||
operating system on it. All diskettes have the boot record
|
||
on them even if they don't have the operating system. Asisde
|
||
from the start-up program, the exact contents of the boot
|
||
record vary from format to format.
|
||
|
||
The File Allocation Table:
|
||
|
||
The FAT follows the boot record, usually starting at
|
||
sector 2 of track 0, side 0. The FAT contains the official
|
||
record of the disk's format and maps out the location of the
|
||
sectors used by the disk files. DOS uses the FAT to keep a
|
||
record of the data-space usage. Each entry in the table con-
|
||
tains a specific code to indicate what space is being used,
|
||
what space is available, and what space is unusable (Due to
|
||
defects on the disk).
|
||
|
||
The File Directory:
|
||
|
||
The file directory is the next item on the disk. It is
|
||
used as a table of contents, identifying each file on the
|
||
disk with a directory entry that contains several pieces of
|
||
information, including the file's name and size. One part of
|
||
the entry is a number that points to the first group of sec-
|
||
tors used by the file (this number is also the first entry
|
||
for this file in the FAT).
|
||
|
||
The Data Space:
|
||
|
||
Occupies the bulk of the diskette (from the directory
|
||
through the last sector), is used to store data, while the
|
||
other three sections are used to support the data space.
|
||
Sectors in the data space are allocated to files on an
|
||
as-needed basis, in units known as clusters. The clusters
|
||
are one sector long and on double-sided diskettes, they are a
|
||
pair of adjacent sectors.
|
||
|
||
|
||
|
||
(From here on I'll continue to describe the basics of DOS
|
||
disk structures, and assembly language addressing technics.
|
||
|
||
|
||
-------------------------------------------------------------
|
||
Here is a simple routine to just make a backup copy of the
|
||
Flight Simulator Version 1.0 by Microsoft. I know the latest
|
||
version is 3.x but this version will serve the purpose of
|
||
demonstrating how to access the data and program files of a
|
||
selfbooter.
|
||
-------------------------------------------------------------
|
||
|
||
|
||
By: PTL
|
||
Title: Microsoft Flight Simulator 1.00 Unprotect
|
||
|
||
|
||
This procedure will NOT convert the Flight Simulator disk to
|
||
files that can be loaded on a hard drive. But... it will
|
||
read off the data from the original and put it onto another
|
||
floppy. And this should give you an idea of how to read data
|
||
directly from a disk and write it back out to another disk.
|
||
|
||
First of all take UNFORMATTED disk and place it in drive B:.
|
||
This will be the target disk.
|
||
|
||
Now place your DOS disk (which has Debug) into drive A:, or
|
||
just load Debug off you hard disk.
|
||
|
||
A>DEBUG
|
||
|
||
Then we are going to enter (manually) a little program to
|
||
load the FS files off the disk.
|
||
|
||
-E CS:0000 B9 01 00 BA 01 00 BB 00
|
||
01 0E 07 06 1F 88 E8 53
|
||
5F AA 83 C7 03 81 FF 1C
|
||
01 76 F6 B8 08 05 CD 13
|
||
73 01 90 FE C5 80 FD 0C
|
||
76 E1 90 CD 20
|
||
|
||
-E CS:0100 00 00 01 02 00 00 02 02 00 00 03 02
|
||
00 00 04 02 00 00 05 02 00 00 06 02
|
||
00 00 07 02 00 00 08 02
|
||
|
||
Next we'll [R]eset the IP Register by typing.
|
||
|
||
-R IP
|
||
|
||
And then typing four zeros after the address prefix.
|
||
|
||
xxxx:0000
|
||
|
||
Next insert the original Flight Simulator disk into drive A:
|
||
and we'll run our little loader.
|
||
|
||
-G =CS:0000 CS:22 CS:2A
|
||
|
||
Now enter a new address to load from.
|
||
|
||
-E CS:02 0E
|
||
-E CS:27 19
|
||
|
||
And run the Loader again.
|
||
|
||
-G =CS:0000 CS:22 CS:2A
|
||
|
||
New address
|
||
|
||
-E CS:02 27
|
||
-E CS:27 27
|
||
|
||
Run Loader
|
||
|
||
-G =CS:0000 CS:22 CS:2A
|
||
|
||
Here we'll do some [L]oading directly from the disk our-
|
||
selves.
|
||
|
||
-L DS:0000 0 0 40
|
||
|
||
And the in turn, write it back out to the B: (1) drive
|
||
|
||
-W DS:0000 1 0 40
|
||
|
||
Etc...
|
||
|
||
-L DS:0000 0 40 28
|
||
-W DS:0000 1 70 30
|
||
-L DS:0000 0 A0 30
|
||
-W DS:0000 1 A0 30
|
||
-L DS:0000 0 138 8
|
||
-W DS:0000 1 138 8
|
||
|
||
When we are all through, [Q]uit from debug and you should
|
||
have a backup copy of the Flight Simulator.
|
||
|
||
-Q
|
||
|
||
And that's all there is to it.
|
||
|
||
END. |