home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Reverse Code Engineering RCE CD +sandman 2000
/
ReverseCodeEngineeringRceCdsandman2000.iso
/
RCE
/
+Sandman
/
volatility2.txt
< prev
next >
Wrap
Text File
|
2000-05-25
|
13KB
|
260 lines
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓ ____ __ __ ▓▓▀█
▓▓ / _/_ _ __ _ ___ ____/ /____ _/ / ▓▓ █▀█
▓▓ _/ // ' \/ ' \/ _ \/ __/ __/ _ `/ / ▓▓ █ █
▓▓ /___/_/_/_/_/_/_/\___/_/ \__/\_,_/_/ ▓▓ █ █
▓▓ ____ __ __ ▓▓ █ █
▓▓ / __ \___ ___ _______ ___ ___/ /__ ____ / /____▓▓ █ █
▓▓ / /_/ / -_|_-</ __/ -_) _ \/ _ / _ `/ _ \/ __(_-<▓▓ █ █
▓▓/_____/\__/___/\__/\__/_//_/\_,_/\_,_/_//_/\__/___/▓▓ █ █
▓▓ ▓▓ █ █
▓▓ Web: http://www.ImmortalDescendants.com ▓▓ █ █
▓▓ Author: Volatility ▓▓ █ █
▓▓ Date: 04/29/99 ▓▓ █ █
▓▓ Topic: Nag/Time Limit Removal/Disabled Functions ▓▓ █ █
▓▓ Level: Begginer/Intermediate ▓▓ █ █
▓▓ ▓▓ █ █
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ █ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄███████████ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄███████████
INTRODUCTION:
This is going to be a rather "ugly" crack, and is not for COMPLETE newbies.
The purpose of this essay is to approach as many different methods and
techniques as I found in this program. The end result, will be a completely
functional program, which never expires... but there are much easier ways to
reverse this target, in fact, I think there are many other possibilities.
If you want a clean, efficient crack, this essay won't help you much. But
if you're interested in really getting into the code, and maybe learning a
few things, then read on!
TARGET INFORMATION:
Target: CGI*Star Pro v3.6 (csp32.exe) 1,249,280 bytes
Location: http://ftpsearch.lycos.com/cgi-bin/search?form=lycosnet&query=csp32&
doit=Go+Get+It%21&filetype=All+files
Tools: W32dasm, HIEW (or other hex editor), Filemon
PREPARE TO CRACK:
Let's run the program to see what kind of protection(s) it has. First, we're
confronted with a nag screen, that tells us "Note: This is an unregistered
evaluation copy. 30 days remaining...." Just from this, we know we'll have
to remove a nag screen, and a time limit. Make a note of this string.
Click "Ok" on the nag, and the program will load. We can see a message
"CGI*StarPro - 30 days remaining" in the titlebar, another instance of the
time limit check. Make a note of this string too.
We won't worry about the "Register" button in this essay, although the program
is much easier to crack using just this screen. Click on each of the four
buttons in the left-hand toolbar to see if we have any limitations, or disabled
functions. For each of the first three buttons, we're greeted with a message
box, stating "Unregistered evaluation version. The SAVE buttons do not work !"
Make a note of this string, and continue. By clicking on any "save" buttons,
we get the same message. Now we should have enough info to get started.
MAKING THE CRACK:
Disassemble the program in Wdasm. Once disassembled, Check The String Data
Refereneces. Let's look for the string from the initial nag screen "Note: This
is an unregistered evaluation copy. 30 days remaining....". Double click on
it, and you should land here:
-------------------------------------------------------------------------------
:00405067 833DA09A440000 cmp dword ptr [00449AA0], 00000000
:0040506E 7534 jne 004050A4
:00405070 FF358C9A4400 push dword ptr [00449A8C]
* Possible StringData Ref from Data Obj ->"Note: This is an unregistered "
->"evaluation copy. %d days remaining. "
|
:00405076 6852A74400 push 0044A752
:0040507B 68882B4800 push 00482B88
:00405080 E837800100 call 0041D0BC
:00405085 83C40C add esp, 0000000C
:00405088 8B06 mov eax, dword ptr [esi]
:0040508A 6A40 push 00000040
-------------------------------------------------------------------------------
If we follow this routine further down, we can see references to other strings,
such as "CGI*Star Pro has expired". This is a good thing, because it means the
entire routine is all in one place.
Let's change that conditional jump above, from jne to je. Restart the program,
and we have no nag! Since we know the program has a 30-day time limit, let's
set our system clock to at least 30 days ahead, and restart the program.
Now we get a message box stating "PROGRAM HAS EXPIRED. The SAVE buttons do not
work anymore !". So, let's look for this string now. Double click on it, and
you should land here:
-------------------------------------------------------------------------------
:004050A4 833D9C9A440000 cmp dword ptr [00449A9C], 00000000
:004050AB 7430 je 004050DD
:004050AD 8B06 mov eax, dword ptr [esi]
:004050AF 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"CGI*StarPro has expired."
|
:004050B1 6825A94400 push 0044A925
* Possible StringData Ref from Data Obj ->"PROGRAM HAS EXPIRED. The SAVE "
->"buttons do not work anymore !"
|
:004050B6 68E8A84400 push 0044A8E8
:004050BB FF700C push [eax+0C]
:004050BE FF7068 push [eax+68]
:004050C1 E8C62D0300 call 00437E8C
:004050C6 83C414 add esp, 00000014
-------------------------------------------------------------------------------
We can also see further down, a string that says "The program has expired! Will
not write anything to files" This is another good thing, because we know the
entire routine is in one place. So, as before, let's change the above
conditional jump from je to jne. Restart the program, and we have no nag! But,
we forgot to set our system time back, so do that, then restart again. The nag
is back!!! We just changed the conditional jump to it's reverse... so let's
make the jump unconditional.
Change the jne, to a jmp. Restart the program, and the nag is gone. We've
successfully removed the nags and time limit. Now we want to remove the string
that says "CGI*StarPro - 30 days remaining" in the titlebar, so search for this
string. Double click on it, and you should land here:
-------------------------------------------------------------------------------
:00404CC5 8D5DF8 lea ebx, dword ptr [ebp-08]
:00404CC8 B802A34400 mov eax, 0044A302
:00404CCD E80E6C0100 call 0041B8E0
:00404CD2 833DA09A440000 cmp dword ptr [00449AA0], 00000000
:00404CD9 753E jne 00404D19
:00404CDB 833D9C9A440000 cmp dword ptr [00449A9C], 00000000
:00404CE2 7518 jne 00404CFC
:00404CE4 FF358C9A4400 push dword ptr [00449A8C]
* Possible StringData Ref from Data Obj ->"CGI*StarPro - %d days remaining"
|
:00404CEA 681DA54400 push 0044A51D
:00404CEF 68F41B4600 push 00461BF4
:00404CF4 E8C3830100 call 0041D0BC
:00404CF9 83C40C add esp, 0000000C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404CE2(C)
|
:00404CFC 833D9C9A440000 cmp dword ptr [00449A9C], 00000000
:00404D03 7426 je 00404D2B
* Possible StringData Ref from Data Obj ->"CGI*StarPro - Program Expired"
|
:00404D05 683DA54400 push 0044A53D
:00404D0A 68F41B4600 push 00461BF4
:00404D0F E8A8830100 call 0041D0BC
:00404D14 83C408 add esp, 00000008
:00404D17 EB12 jmp 00404D2B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404CD9(C)
|
* Possible StringData Ref from Data Obj ->"CGI*StarPro"
|
:00404D19 685BA54400 push 0044A55B
-------------------------------------------------------------------------------
Again, we see more strings below. This is a good thing. We want the title bar
to display ONLY "CGI*StarPro", and we can see that by changing the FIRST
conditional jump above, we can jump directly to this string. So, change the
first conditional jump from jne to je (it's always best to try and change the
least amount of bytes possible), and restart the program. Now the title bar
always displays only "CGI*StarPro".
Now all we have left are the disabled "Save" nags. Let's search for the string
"Unregistered evaluation version. The SAVE buttons do not work !". Double click
on it, and you should land here:
-------------------------------------------------------------------------------
:0040EACE FF7508 push [ebp+08]
:0040EAD1 E876580000 call 0041434C
:0040EAD6 59 pop ecx
:0040EAD7 833DA09A440000 cmp dword ptr [00449AA0], 00000000
:0040EADE 7536 jne 0040EB16
:0040EAE0 8B5508 mov edx, dword ptr [ebp+08]
:0040EAE3 8B02 mov eax, dword ptr [edx]
:0040EAE5 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"CGI*StarPro Unregistered."
|
:0040EAE7 68E74E4500 push 00454EE7
* Possible StringData Ref from Data Obj ->"Unregistered evaluation version. "
->"The SAVE buttons do not work !"
|
:0040EAEC 685C4E4500 push 00454E5C
-------------------------------------------------------------------------------
I forgot to mention earlier, that it is always a good idea to check for more
than one instance of this string. In the previous cases, we were ok, as there
was only one instance, but in this case, there are FOUR routines. The first
three routines look similar to the above one, but the final instance has the
conditional jump AFTER the string... not before. In any case, let's change
all the conditional jumps from jne to je, and vise versa.
NOTE: Up until this point, the author has kept the routines all in one place.
Now the routine is in four places, which indicates that the check is
performed for each of the four buttons on the toolbar. This is most
likely inefficient programming, as he could have just referenced one
routine for each of the checks. Or, he just decided to make it
tougher for us :)
After changing all the conditional jumps, test all the buttons and functions.
Looks like everything works!
We could quit here, but I decided I wanted to see if I could get rid of that
ugly background bitmap that advertises other programs and such. So, let's
move the bitmap (CSPROBG.BMP) from the program directory, to a different one.
Restart the program, and we get a message box stating "Unable to load
background bitmap from resources". After searching the String Refs of the
program, we know that this comes from somewhere else. So, run Filemon, and
see which files the program accesses.
We can see that the program accesses a .dll file called "pvplus32.dll". It
looks like this is the right file, because the message box said "ProtoView"
in the title bar, and if you view the properties of the .dll, it says
"ProtoView Screen Management" under the Version tab.
Make a copy of the dll, and disassemble it. The string is there, so double
click it, and you should land here:
-------------------------------------------------------------------------------
:10021857 833D8086021000 cmp dword ptr [10028680], 00000000
:1002185E 0F8536000000 jne 1002189A
:10021864 6808750210 push 10027508
* Possible StringData Ref from Data Obj ->"Unable to load background bitmap "
->"from resources."
|
:10021869 681CE00210 push 1002E01C
:1002186E 68A08C0210 push 10028CA0
* Reference To: USER32.wsprintfA, Ord:0249h
|
:10021873 FF154CF80210 Call dword ptr [1002F84C]
-------------------------------------------------------------------------------
Change the above conditional jump from jne to je, and restart the program. No
annoying background!!! You can now safely delete the bitmap, and either move
the .dll back to c:\windows, or directly into the program directory.
NOTE: The LoadBitmapA function in Soft-Ice would have worked equally as well
in removing the bitmap function.
If you have any questions, feel free to e-mail me at
Volatility@ImmortalDescendants.com or Volatility@prodigy.net.
-------------------------------------------------------------------------------
Copyright (c) 1999 Volatility And The Immortal Descendants
All Rights Reserved