467 lines
24 KiB
Plaintext
467 lines
24 KiB
Plaintext
![]() |
|
||
|
HOW TO CRACK, A TUTORIAL - LESSON 2
|
||
|
by +ORC (the old red cracker)
|
||
|
|
||
|
How to crack, an approach LESSON 1
|
||
|
-> How to crack, tools and tricks of the trade LESSON 2
|
||
|
How to crack, hands on, paper protections LESSON 3 (1-2)
|
||
|
How to crack, hands on, time limits LESSON 4
|
||
|
How to crack, hands on, disk-CDrom access LESSON 5
|
||
|
How to crack, funny tricks LESSON 6 (1-2)
|
||
|
How to crack, intuition and luck LESSON 7
|
||
|
How to crack windows, an approach LESSON 8
|
||
|
How to crack windows, tools of the trade LESSON 9
|
||
|
How to crack, advanced cracking LESSON A (1-2)
|
||
|
How to crack, zen-cracking LESSON B
|
||
|
How to crack, cracking as an art LESSON C
|
||
|
How to crack INDEX
|
||
|
|
||
|
LESSON 2- How to crack, tools and tricks of the trade
|
||
|
|
||
|
LOST IN THE DARK CODEWOODS
|
||
|
When you break into a program you end up in portions of code
|
||
|
that are unfamiliar to you. It is also not uncommon for the
|
||
|
breakpoints to occur outside of the confines of the program you
|
||
|
want to crack. Getting your bearings is, in these cases, very
|
||
|
important.
|
||
|
One of the handiest utilities is the memory dump tool -it
|
||
|
tells you where all the device drivers and TSR are loaded, in
|
||
|
which memory locations the program you are cracking dwells, how
|
||
|
much memory is left and what the next program load point is. The
|
||
|
tools you use should report on the following:
|
||
|
- the contents of interrupt vectors
|
||
|
- the state of the BIOS data area, beginning at address 40:0
|
||
|
- internal structures within DOS, such as the MCB chain, the
|
||
|
SFT (System File Table) chain, the chain of installed
|
||
|
device drivers, the PSPs and memory allocations associated
|
||
|
with installed TSRs
|
||
|
- memory allocation statistic from XMS and EMS drivers
|
||
|
|
||
|
When seeking to understand a section of foreign code, you
|
||
|
must be especially careful to seek the real intent of the code.
|
||
|
Consider using a profiler prior to undertaking an analysis of an
|
||
|
unfamiliar program. This will help you by ensuring that you don't
|
||
|
waste time studying sections of the program that aren't even
|
||
|
involved in the protection scheme you are chasing down.
|
||
|
Using a utility that charts a program's calling hierarchy
|
||
|
can give you an important perspective on how your babe conducts
|
||
|
its internal operations.
|
||
|
|
||
|
YOUR DEBUGGER: YOUR FAVOURITE TOOL
|
||
|
First and foremost, your debugger must be designed for use
|
||
|
with resident modules (or must be itself a resident module).
|
||
|
Trying to crack with simplistic [debug.com] is a sure way to get
|
||
|
absolutely nowhere. We recommend Softice.exe from Nu-Mega
|
||
|
technologies (Version 2.6 [S-Ice.exe] has been cracked by MARQUIS
|
||
|
DE SOIREE and its vastly available on the Web). You could also
|
||
|
use [Periscope] or [Codeview] or Borland's Turbodebugger... all
|
||
|
these programs have been boldly cracked and/or distributed and
|
||
|
are now on the Web for free... learn how to use YAHOO and find
|
||
|
them. In emergency cases you could fix some quick cracking
|
||
|
patches using [debug] or [symdeb], but, as said above, most of
|
||
|
the time these older debuggers won't do. I'll nevertheless ALWAYS
|
||
|
give the final crack procedure for [debug.com], in order to
|
||
|
permit even idiots to crack their programs (altruistic, isn't
|
||
|
it... besides, every wizard has started with debug.com).
|
||
|
When you first smell a protection, it can be tempting to
|
||
|
immediately begin your crack using invasive types of techniques.
|
||
|
While there is certainly nothing wrong with this approach,
|
||
|
provided that you are fairly familiar with the protection scheme
|
||
|
used, going in too deep too soon can be a problem when you don't
|
||
|
have a strong hunch. Most of the time you'll end up missing
|
||
|
important details. So first of all sit down and ponder... that's
|
||
|
the zen-way, the only one that really works.
|
||
|
Single-stepping is expensive, not only because of the time
|
||
|
it requires but also because of the amount of detail with which
|
||
|
you must contend. Your immediate goal is to home in on the
|
||
|
protection scheme through a series of successively refined traps,
|
||
|
your broader aim is to get an overview idea of the program's
|
||
|
action... the wise use of breakpoints will condense these
|
||
|
minutiae into an understandable form.
|
||
|
The first step is to try to identify the section of the
|
||
|
program where the protection scheme is snapping.
|
||
|
Once you are able to isolate a certain section of a program,
|
||
|
breakpoints can be used to gather a trace history of the
|
||
|
program's execution. If your debugger sports a backtrace buffer,
|
||
|
logging window, or similar feature, by all means learn how to use
|
||
|
it. The debugger it's your best weapon, you must know all the
|
||
|
possibilities it offers and all the capabilities it possesses.
|
||
|
Having a debugger's display output echoed to a printer is another
|
||
|
possibility.
|
||
|
Using breakpoints is beneficial for two basic reasons: speed
|
||
|
and reduction of detail. Manual single-stepping is invaluable
|
||
|
when you are close to the protection scheme, but too much of it
|
||
|
will bore you to death.
|
||
|
When selecting breakpoint locations and the types of
|
||
|
breakpoint to use, it is important to step back once more, drink
|
||
|
a cool Martini-Wodka (use only Moskovskaja: non-russian Wodkas
|
||
|
are appalling) and ask yourself: "What is this going to tell me?"
|
||
|
and "What else will I need to know once the break occurs?". MOST
|
||
|
IMPORTANT OF ALL: "Is my current cracking approach the simplest
|
||
|
and most direct?", coz you do not want to waste precious cracking
|
||
|
time.
|
||
|
When devising a set of breakpoints it is wise to consider
|
||
|
how "a trail of bread crumbs" can be left. Not allowing for an
|
||
|
execution chronicle from the start can mean having to restart a
|
||
|
cracking session.
|
||
|
Setting breakpoints on certain software interrupt calls is
|
||
|
an excellent way to get an overview of a program's operations.
|
||
|
The INT_21 DOS services interrupt is probably the most universal
|
||
|
useful of these, with BIOS interrupts such as the INT_13 (BIOS
|
||
|
Disk services) and INT_16 (BIOS keyboard services) useful for
|
||
|
specific cracking.
|
||
|
When working with a debugger, evaluative breakpoints are
|
||
|
usually your best shot. To avoid having to deal with a plethora
|
||
|
of calls, you would want to have a debugger capable of being told
|
||
|
to "break on any INT_21 call except where AH == 2C or AH == 0B".
|
||
|
A real understanding of the working of a program is surely
|
||
|
important, but don't overdo it! To reverse-engineer even a small
|
||
|
program can involve many hours of analysis and documentation
|
||
|
work. If you'll not be able to use the zen-cracking techniques
|
||
|
described in this tutorial (sadly not everybody can) pace
|
||
|
yourself and make sure your chair is comfortable: you'll be
|
||
|
sitting for quite a spell.
|
||
|
Much of the work involved in reverse-engineering consist of
|
||
|
chasing down tentacles. In order to understand the operations of
|
||
|
one function, you must understand what happens within each of the
|
||
|
functions it calls- its child functions. To understand these
|
||
|
child functions you must study their children; and so on down the
|
||
|
calling hierarchy tree. Then there is the data. Tracing tentacles
|
||
|
based on a program's calling hierarchy is a directed process.
|
||
|
Each function you encounter is basically a list of other
|
||
|
functions you must reckon with. When it comes to analyzing a
|
||
|
function's interrelationship with the program's data structure,
|
||
|
no such list is provided. You must have instinct, feeling and
|
||
|
luck.
|
||
|
Data analysis requires more of a broad-based inquisition.
|
||
|
For each memory variable you are interested in, you must survey
|
||
|
all functions to determine which ones read and write that
|
||
|
variable. The use of memory conditional breakpoints and of a
|
||
|
disassembler that builds a cross-reference table can make this
|
||
|
task a lot easier. (Use Sourcer! It's a fairly good tool and
|
||
|
version 4.08 of [sr.exe] has been long ago cracked by me, +ORC,
|
||
|
and distributed on the Web).
|
||
|
|
||
|
ALL SYSTEM CALLS IN ONE LOCATION
|
||
|
Remember that if the program you are cracking was written
|
||
|
in assembler in the first place (very unlikely knowing the
|
||
|
laziness of to_days programmers), it is probable that system
|
||
|
calls are made directly from the functions which need them. But
|
||
|
when a program is developed in a high-level language, it is more
|
||
|
likely that common library functions will be used for many
|
||
|
operations involving system calls. When a program makes all of
|
||
|
its INT_21 calls from the same location, you know that this is
|
||
|
certainly the case.
|
||
|
Now, what happens sometimes is that the programmers write
|
||
|
the whole application in a overbloated language like C++, but are
|
||
|
afterwards compelled to "speed up" critical sections of the code
|
||
|
writing them in assembler. And loo! A section where you
|
||
|
repeatedly find assembler crafted patches is precisely the
|
||
|
section containing the protection scheme! So you could have a
|
||
|
program with all INT_21 calls from the same location but for one
|
||
|
or two calls which are coming out of the section where the morons
|
||
|
have "hidden" their protection strategy. By just "looking" at the
|
||
|
dead code of a program, you should be capable to tell wich parts
|
||
|
have been "added on" in a later phase. They presents themselves
|
||
|
as unevenness and irregularities, especially if you use an
|
||
|
utility that represents graphicallly the code of a program.
|
||
|
Protections are often added on at the end.
|
||
|
Should you determine that the system calls relevant to your
|
||
|
cracking are made from common library functions, all is not lost.
|
||
|
The specific function from which these library calls were made,
|
||
|
the function you are seeking to locate, is executing at some
|
||
|
point in between these calls. Break in with your debugger at the
|
||
|
end of the first system call, just where it is returning to the
|
||
|
point of call. From there, trace through the remainder of the
|
||
|
common library routine until it returns to its caller. In short
|
||
|
order, you should find yourself in the function you need to see.
|
||
|
The trick is to be able to identify it for what it is.
|
||
|
|
||
|
ASCIIZ IN CODE
|
||
|
In the interest of gaining an overall familiarity with the
|
||
|
program you want to crack, it can be enlightening to use a hex
|
||
|
dump utility to examine the message strings contained within the
|
||
|
program's binary modules. If the program happens to load its
|
||
|
message strings from separate files, your search has just been
|
||
|
simplified.
|
||
|
Your debugger's memory-dumping feature is one tool that can
|
||
|
be useful for this type of exploration. You could also construct
|
||
|
a filtering program, which would read a binary file and output
|
||
|
all sequences of bytes that are comprised of displayable
|
||
|
characters and are over a certain minimum length (the best
|
||
|
cracker tools are often the ones you write yourself).
|
||
|
When a protection scheme is marked by the issuance of a
|
||
|
specific message on the screen, you could go into the program and
|
||
|
locate the code that emits this message, and then determine what
|
||
|
triggers it. A good way to start the location process is to see
|
||
|
if a system call is used to display the string. Interrupt INT_21,
|
||
|
INT_10 or INT_29 are usually used to display text messages to the
|
||
|
console.
|
||
|
When the message's display is not a result of one of these
|
||
|
system calls, direct video writing is probably being used. If you
|
||
|
know the screen location used, and if that part of video memory
|
||
|
is not used for anything else at the time (a big if), a memory
|
||
|
write breakpoint could be set on the video buffer address
|
||
|
corresponding to the first character's position. If this won't
|
||
|
work, use the step-over/step-around tracing technique while
|
||
|
watching for the message to appear.
|
||
|
Now you found it: from a disassembled listing, you could
|
||
|
locate the address of the message string and then survey the
|
||
|
reminder of the file for any instructions that reference this
|
||
|
address. [Sourcer.exe] can generate labels for specific memory
|
||
|
locations and then generate a cross-reference table showing where
|
||
|
these labelled locations are referenced. Otherwise, load the
|
||
|
disassembled listing file into your editor and use its search
|
||
|
capabilities. Manually searching for such things in a listing
|
||
|
will make you old before your time.
|
||
|
|
||
|
CODE AND DATA
|
||
|
When stepping through code at the assembler level, watch out
|
||
|
for interrupt calls that are followed by data. Sometimes you will
|
||
|
find an interrupt call, typically within the range INT_34 to
|
||
|
INT_3F, where several bytes immediately following the interrupt
|
||
|
instruction will be data rather than code.
|
||
|
Be especially suspicious of this type of code-and-data
|
||
|
mixture when your debugger's disassembly output of the
|
||
|
instructions immediately following an interrupt call doesn't make
|
||
|
sense. Sometimes you can determine the offset of the next true
|
||
|
instruction by inspecting the following code and data. In other
|
||
|
cases, you will have to trace through the interrupt call to see
|
||
|
how it accesses the data following the interrupt call instruction
|
||
|
and how it manipulates the return address on the stack.
|
||
|
|
||
|
HOOKED VECTORS
|
||
|
Seeing what interrupt intercepts already exist within a
|
||
|
system before running the program you want to crack, as well as
|
||
|
what interrupt handlers are established by the target program,
|
||
|
can provide useful clues. For example, if a protection
|
||
|
establishes an INT_09 intercept just before the snapping of a
|
||
|
keyboard verification routine, your range of suspects has just
|
||
|
been narrowed significantly.
|
||
|
To study the interrupt vector activities of an application,
|
||
|
a vector dump map utility is useless. It can't be run while the
|
||
|
application you want to crack is running. One solution is to run
|
||
|
the program under a debugger and watch for system calls to INT_21
|
||
|
functions 25h (set interrupt vector) and 35h (get interrupt
|
||
|
vector), but in the event that the program reads and writes
|
||
|
interrupt vectors directly, this method will not give you a
|
||
|
complete picture. Normally you'll use a spy (trace) utility.
|
||
|
APPLYING A MEMORY WRITE BREAKPOINT TO A SPECIFIC VECTOR OR
|
||
|
TO THE ENTIRE TABLE is another way to deal with this.
|
||
|
Note that some sort of direct vector writing must be
|
||
|
occurring if a vector change is detected between system calls.
|
||
|
If a vector change is detected during a system call but it
|
||
|
isn't function 25h of INT_21, suspect that an IRQ handler may be
|
||
|
effecting the change.
|
||
|
|
||
|
LITTLE TRICKS OF THE TRADE: determining interrupt vector
|
||
|
addresses
|
||
|
How do you determine the interrupt vector addresses? As
|
||
|
example let's find the address of the INT_21 interrupt vector.
|
||
|
Since the interrupt vector table starts at address 0000:0000
|
||
|
(easy to remember, isn't it?) and there are four bytes per
|
||
|
vector, the basic process is to multiply the interrupt number
|
||
|
four times and use the result at the offset with a segment of
|
||
|
zero.
|
||
|
x21h + x21h = x42
|
||
|
x42h + x42h = x84
|
||
|
The int_21 vector is located at address 0000:0084
|
||
|
You could also use a calculator, for instance, the address of
|
||
|
INT_63 is x63*4=x18c = 0000:018C
|
||
|
|
||
|
LITTLE TRICKS OF THE TRADE: address conversion
|
||
|
After a painstaking cracking session, you have finally
|
||
|
determined that a byte of memory at address 6049:891C is the
|
||
|
trigger. But when you isolate the offending instruction, you find
|
||
|
that the address it is generating when the protection occur is
|
||
|
different, being 6109:7D1C instead! How can this be?
|
||
|
An 80x86 type CPU, when running in real or VM86 mode, uses
|
||
|
what is known as segment:offset type addressing. One side effect
|
||
|
of this addressing method is that one physical address can be
|
||
|
equivalent to many different segment:offset addresses.
|
||
|
To find the PHYSICAL ADDRESS for a given segment:offset do
|
||
|
the following:
|
||
|
- convert the segment portion of the address to a 1-based number
|
||
|
by multiplying it by 16 (x10)... it's easy: add 0 at the right
|
||
|
end of the number!...
|
||
|
6049 -> 60490
|
||
|
6109 -> 61090
|
||
|
now all you have to do is to add this value to the offset value
|
||
|
60490+891C -> 68DAC
|
||
|
61090+7D1C -> 68DAC
|
||
|
Got it?
|
||
|
And the other way round? If you have a physical address, say
|
||
|
19AC3, and you want to obtain a segment:offset address you must
|
||
|
first of all decide in which segment you want the address... if,
|
||
|
say, you choose segment 16CC, you proceed as follows:
|
||
|
16CC -> 16CC0
|
||
|
19AC3-16CC0 = 2E03 (offset)
|
||
|
address for 19AC3 in segment 16CC = 16CC:2E03
|
||
|
|
||
|
TOOLS OF THE TRADE
|
||
|
[MEMSCAN.EXE]
|
||
|
One of the most fascinating tools that I have ever seen is
|
||
|
a (very old) program: MEMSCAN.EXE.
|
||
|
This program was originally written in 1988 by Scott A. Mebust,
|
||
|
running in CGA. It's a "visual" utility: it enables you to see
|
||
|
graphically the 1-meg of PC memory in 8 kbyte chunks. It's a
|
||
|
powerful tool in order to locate quickly bit mapped graphics and
|
||
|
other 'objects' in memory, like program data tables, stack areas,
|
||
|
code areas, available RAM, etc. I used this great idea to create
|
||
|
(in C) my own tools: a "dead_programs scanner" and an ameliorate
|
||
|
version of Memscan itself. Looking at the VISUAL STRUCTURE of a
|
||
|
program it's a great help when you'll crack higher levels.
|
||
|
|
||
|
[TRACKMEM.COM]
|
||
|
A very good tool by James W.Birdsall, tracks memory usage
|
||
|
of programs (EMS, XMS, conventional).
|
||
|
|
||
|
[SCANCODE.COM]
|
||
|
"THE" scancode lister, by the code_masters from clockwork
|
||
|
software. The must utility for crackers that do not learn all
|
||
|
scancodes by heart.
|
||
|
|
||
|
[MAP.EXE]
|
||
|
Actually "MAP2", THE memory mapper from the code_masters at
|
||
|
clockwork software. It's a very good tool and an interesting one
|
||
|
too, coz you get it with the "Nigel" nag screens. They are not
|
||
|
difficult to remove (a "passletter" protection scheme, you'll
|
||
|
learn how to find and remove it from [Map.exe] in LESSON 3.2).
|
||
|
|
||
|
[FILEDUMP.COM] [HEXDUMP.COM] [TDUMP.EXE] [DUMP.EXE]
|
||
|
There are hundred of file dump utilities, coz file dumping
|
||
|
is one of the first exercise they learn you at C-school.
|
||
|
Hexdump.com is 558 bytes long, Tdump.exe 120.704, pick the one
|
||
|
you like better or write your own (even better). Filedump.com,
|
||
|
by Daniel M.O'Brien, 1046 bytes long, it's nice.
|
||
|
|
||
|
[SPRAY.COM]
|
||
|
That's a good crack utility indeed! This 1989 program by
|
||
|
Daniel M.O'Brien gives you a "post-mortem" picture of your
|
||
|
memory. You redirect it to <myfile> and study it at ease. It's
|
||
|
difficult to say how many hours of cracking it did spare me (you
|
||
|
should study the program, only 252 bytes long, and will have to
|
||
|
modify it a bit, coz it's pretty primitive, in the original
|
||
|
version, for instance, the redirection to the printer works only
|
||
|
if there is NO SPACE between "spray" and ">").
|
||
|
|
||
|
[VEXE.EXE]
|
||
|
A good EXE files analyzer, useful for windows programs too
|
||
|
(see --> LESSON 7). Some of its functions are present in
|
||
|
TDUMP.EXE too. This 1991 program by S.Krupa it's sometimes very
|
||
|
useful.
|
||
|
|
||
|
[SNOOP UTILITIES --> KGB.EXE INTMON.EXE INTRSPY.EXE etc...]
|
||
|
[TRACE UTILITIES --> TRACE.EXE STEPDOS.EXE etc...]
|
||
|
A must to study the "calling hierarchy" of an unknown
|
||
|
program. KGB.EXE, a 1992 program by Petr Hor k could be the best
|
||
|
one. I'll teach you how to crack without any of them (you do not
|
||
|
need them if you zen-crack), but they can nevertheless be very
|
||
|
useful in some situations. Stepdos.exe is a excellent program:
|
||
|
a pleasure to crack in order to use it for slightly different
|
||
|
purposes :=)
|
||
|
|
||
|
[SOURCERING UTILITIES]
|
||
|
SR.EXE can be used for sourcering unknown programs. It's a
|
||
|
fairly good sourcering tool. Version 4.08 has been long ago
|
||
|
cracked by me (it's a "ORIGINAL NUMBERCODE" protected program)
|
||
|
and distributed on the Web, so you should easily find it. This
|
||
|
said, you should NEVER use such a brute force approach, unless
|
||
|
you are really desperate: I'll teach you how to crack without
|
||
|
sourcering (you don't need to sourcer if you zen-crack).
|
||
|
|
||
|
[HEXEDITORS]
|
||
|
Every idiot has written at least one hexeditor, and you can find
|
||
|
very bad tools everywhere (the SIMTEL collection, on the Web,
|
||
|
lists at least 35 hexeditors). I suggest you write your own and
|
||
|
contribute to the flood, or (better) get PSEDIT.EXE, a good 1990
|
||
|
program by Gary C. Crider (Parity Solutions, 1903 Pavia Ct.
|
||
|
Arlington, TX 76006... sometimes even americans can write good
|
||
|
programs). If you do use it (as you should) disapt the nag screen
|
||
|
as small exercise in cracking.
|
||
|
|
||
|
[DEBUGGER]
|
||
|
Your best friend in cracking, your weapon, your hidecloak...
|
||
|
I suggest [Softice.exe] from Nu-Mega technologies (Version 2.6
|
||
|
has been cracked by MARQUIS DE SOIREE and its vastly available
|
||
|
on the Web). You could also use [Periscope] or [Codeview] or
|
||
|
Borland's Turbodebugger... all these programs have been boldly
|
||
|
cracked and/or distributed and are now on the Web for free...
|
||
|
learn how to use YAHOO and find them. It's the only tool you 'll
|
||
|
REALLY need, believe me. So choose wisely and learn how to use
|
||
|
backtrace ranges and breakpoint on user written qualifications
|
||
|
routines. You 'll be able to crack almost EVERYTHING using these
|
||
|
features in the right way.
|
||
|
|
||
|
You should get all the programs mentioned above (and more)
|
||
|
for free on the Web. Use them, but also modify them recklessly!
|
||
|
REMEMBER THAT YOU ARE (GOING TO BE) A CRACKER! The first programs
|
||
|
you should crack and modify are therefore your very tools! So
|
||
|
steal the code of the best tools you find! Snatch the best
|
||
|
routines and change them for the better! That's the whole point
|
||
|
in cracking: a mission to IMPROVE the best accomplishments of
|
||
|
humanity's genius :).
|
||
|
|
||
|
HOW TO CRACK, ZEN-CRACKING
|
||
|
You 'll learn, beginning with next lesson, how to crack
|
||
|
systematically the different protection schemes: paper & password
|
||
|
protections, time protections, access protections. At the end of
|
||
|
the "methodolocical" part, you'll be able to deprotect programs,
|
||
|
but you will still not be a cracker. In order to crack in a real
|
||
|
effective way you must use what I call (lacking a better
|
||
|
definition) "zen-cracking". I 'll give you right now an example
|
||
|
of this, so that you know what I'm talking about, but -unless you
|
||
|
are already capable- you'll have to finish the tutorial for
|
||
|
"normal" cracking before attempting this techniques. Let's zen-
|
||
|
crack together a password protection scheme (aka "paper
|
||
|
protection", coz you need the original manual of the program in
|
||
|
order to answer). This one is based on the typing, at the nag
|
||
|
screen, of the correct sequence of numbers. We are using as
|
||
|
example a game for the reasons explained in lesson 1, but you 'll
|
||
|
find the SAME protection scheme in the access protection
|
||
|
procedure of the old Tapestry networks... so do not frown upon
|
||
|
games protections.
|
||
|
|
||
|
INDIANAPOLIS 500, Papyrus software & Electronic Arts, 1989
|
||
|
It's a rather widespread program, so you should be able to find
|
||
|
it pretty easily. The nag screen asks for data based on the
|
||
|
historical performances of race cars... that means that the
|
||
|
answers will consist in two to three digits.
|
||
|
Now, the normal way to crack such a program will be
|
||
|
described in lesson 3.1 and embodyes following steps:
|
||
|
- snap save program memory areas before typing your answer
|
||
|
- snap compare after typing, say, "666"
|
||
|
- search for the sequence 36,36,36 (i.e. 666)
|
||
|
- breakpoint on memory range for reading
|
||
|
- look at the program part fetching your data
|
||
|
- find the snap procedure
|
||
|
- disable it.
|
||
|
The above it's a relatively quick crack, and most of the
|
||
|
time 'll be fairly effective, but there is a better way: the "zen
|
||
|
way", the only one that can really bring you to crack peculiar
|
||
|
protection schemes.
|
||
|
- Run the program and break in at the nag screen
|
||
|
- Answer consist of 2-3 digits? Search for "AC" (i.e. the
|
||
|
instruction LODSB, load digit of answer in AL) in the area 500
|
||
|
bytes BEFORE and 500 bytes AFTER your position. You'll get some
|
||
|
locations. (In the case of INDY 500 you get 6 such locations).
|
||
|
- "feel" the locations (that's the tricky part).
|
||
|
- OK, you already made it! Here is the protection strategy:
|
||
|
8BBF28A5 MOV DI,[BX+A528]<-- DI points to coded data area
|
||
|
:compare_loop
|
||
|
AC LODSB <-- load first digit of answer in AL
|
||
|
B4FF MOV AH,FF <-- load mask in AH
|
||
|
2A25 SUB AH,[DI] <-- sub coded data from mask and get
|
||
|
real answer
|
||
|
47 INC DI <-- ready to get next coded data
|
||
|
3AC4 CMP AL,AH <-- user answer = real answer ?
|
||
|
751A JNZ bagger_off_you_do_not_know_the_right_answer
|
||
|
0AC0 OR AL,AL <-- more numbers?
|
||
|
75F2 JNZ compare_loop
|
||
|
59 POP CX <-- nice guy, you may go on
|
||
|
...
|
||
|
And if the protection scheme had been more far away? And if you
|
||
|
cannot "feel" the right one? And if my grandma had wheels? You'll
|
||
|
learn it, believe me.
|
||
|
Now let's quickly crack this crap.
|