WS_FTP Pro 6.02 Eval
[Reversing essay]

Subject: Cracking
Target: WS_FTP Pro 6.02 Eval
URL: http://www.wsftp.com
Author: BlackB
Date: 1999-11-02
Tools used: SoftICE, W32DSM89, HIEW
Difficulty (scale 1-5): 2 ą 3
Requirements: Average cracking knowledge

Before starting!
This essay is for knowledge purposes only!!
Software developers spend much time in making their programs. They live from the money we give them!
Please buy good software!!
I. Introduction
Yeah, another essay! This time on how to crack the WS_FTP Pro 6.02 Eval. I just love the program, rather than CuteFTP
or any other FTP program. It's easy to use, not that big...in one word: great!
First day I tried to crack it I gave up and removed it from my harddisk. But next day I woke up and I realised that I used a
wrong approach. So I reinstalled it, started cracking and the job was done in less than 20 minutes. ;-)
Now before you start the essay, first this: this essay learns you how to crack the ws_ftp main program...not how to crack the
Explorer interface (an util I never use btw) and also not how to crack the ftp finder util! (however it's dead easy)
II. About the protection
Nag/ trial
III. Cracking it
Every time you run ws_ftp it displays a nagscreen. It shows you how many days you have left 
and also when it's going to expire. Setting your clock a month later will show you the
nagscreen again, but you can only click the "Buy now" and "Quit" button. Setting the clock
back will re-enable your trial period.

Disassemble the ftp95pro.exe and save the dead list. When looking to the string references you won't see anything of what is
displayed on the nagscreen. I found out that all strings of that nagscreen are located in the file ws_ftp.key . This file 's probably
also used in the registered version, but it may contain your registration info instead. Anyway, I monitored ws_ftp's behaviour
with FileMon and the ws_ftp.key file is called about a thousand (!) times...impossible to find out what, how, and where about
it. So our cracking approach will be: 1. Removing the nagscreen 2. Removing the 30 day trial.

For removing the nagscreen I developed myself a new method (it probably already exists, but I never 've read it in an essay).
The concept: break SoftICE somewhere in the program BEFORE the nagscreen is drawn. Step over very call you encounter
and look if the nagscreen is drawn (you can do that with F4). Once the nagscreen appeared, clear all breakpoints, and set a
new breakpoint on the call that let appear the nag. Exit SoftICE, quit the program, restart the program....SoftICE will break
on the call that draws the nagscreen.
Trace into the call, then step over all calls until the nagscreen appears, clear all breakpoints, set a new breakpoint on the call
that let appear the nag, etc etc.... . Do this until you 've found the "call nag" procedure. Confused? Here 's a scheme:

call xxxxxxxx
...
instructions
...
call xxxxxxxx (nag appears)
...             |
              trace--push ebp
...                  ...
                     instructions
                     ...
                     call xxxxxxxx (nag appears)
                     ...             |
                                   trace--push ebp
                     ...                  ...
                                          instructions
                                          ...
                                          call xxxxxxxx (real nag procedure)
                                          ... 

For the ones who still don't get it: the only thing you do is refining. You could NOP out the first call that draws the nag, but
that call probably contains other valuable code for the program. So that's why you have to trace into the call and search there
for another call that draws the nag....until you can't refine anymore and then you've found the real nag routine. If still not clear,
just follow how I cracked the prog ;-)

Our first problem is finding a good place to set a breakpoint on. A good place= a place not too far from where the nagscreen
is drawn. Remember that I said that the text on the nag can be found in the file ws_ftp.key? Well, let's search for that in the
dead listing!

***************************Start of partial code***************************

:00427F05 68B6360000              push 000036B6

* Possible StringData Ref from Data Obj ->"ws_ftp.key"
                                  |
:00427F0A 684C224500              push 0045224C <- Let's break here
:00427F0F 6A00                    push 00000000
:00427F11 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"99.08.10"
                                  |
:00427F13 6858224500              push 00452258

* Possible StringData Ref from Data Obj ->"WS_FTP Pro"
                                  |
:00427F18 6864224500              push 00452264
:00427F1D 8B4508                  mov eax, dword ptr [ebp+08]
***************************End of partial code***************************
      

So fire up SoftICE symbol loader, load ftp95pro.exe and run it....when sice breaks set a breakpoint on 427F0A
(=bpx 427F0A). Step over the code (=F10)

***************************Start of partial code***************************

:00427F3D 687C224500              push 0045227C
:00427F42 8B4508                  mov eax, dword ptr [ebp+08]
:00427F45 50                      push eax
:00427F46 6A00                    push 00000000
:00427F48 E85D48FFFF              call 0041C7AA <- This call will draw the nag
:00427F4D 83C410                  add esp, 00000010
:00427F50 85C0                    test eax, eax
:00427F52 0F8F07000000            jg 00427F5F
:00427F58 33C0                    xor eax, eax
:00427F5A E971070000              jmp 004286D0
***************************End of partial code***************************
      

Go ahead and step over the call, the nag appears, clear all breakpoints (bc *), and set a breakpoint on the call (doubleclick
on the call with your mouse). Exit sice (ctrl-d) and quit the program. Fire ws_ftp again from within the symbol loader!! This is
important as otherwise SoftICE won't break, for some odd reason, on the breakpoint you've just set!
Now if SoftICE breaks, trace into the call (=F8). Now step over the code again just as we did in the beginning (=F10).

***************************Start of partial code***************************

:0041C7C8 68284D4500              push 00454D28
:0041C7CD 8D4DEC                  lea ecx, dword ptr [ebp-14]
:0041C7D0 E82B020000              call 0041CA00
:0041C7D5 C745FC00000000          mov [ebp-04], 00000000
:0041C7DC C745F000000000          mov [ebp-10], 00000000
:0041C7E3 6A00                    push 00000000
:0041C7E5 8B4508                  mov eax, dword ptr [ebp+08]
:0041C7E8 50                      push eax
:0041C7E9 E871E9FFFF              call 0041B15F <- This call displays the nag
:0041C7EE 83C408                  add esp, 00000008
:0041C7F1 85C0                    test eax, eax
:0041C7F3 0F8508000000            jne 0041C801
:0041C7F9 E887FAFFFF              call 0041C285
:0041C7FE 8945F0                  mov dword ptr [ebp-10], eax
***************************End of partial code***************************
      

I hope you know how to proceed! Just set a breakpoint on the call and after you restarted ws_ftp, trace into the call....go on
like this until you see this:

***************************Start of partial code***************************

:0041F438 8B85F8DFFFFF            mov eax, dword ptr [ebp+FFFFDFF8]
:0041F43E 8B4010                  mov eax, dword ptr [eax+10]
:0041F441 50                      push eax
:0041F442 8B0DB8034500            mov ecx, dword ptr [004503B8]
:0041F448 E872190000              call 00420DBF
:0041F44D 8985FCEFFFFF            mov dword ptr [ebp+FFFFEFFC], eax
:0041F453 83BDFCEFFFFF00          cmp dword ptr [ebp+FFFFEFFC], 00000000
:0041F45A 0F8505000000            jne 0041F465 <- This jumps to the nag
:0041F460 E9E2000000              jmp 0041F547 <- This executes the main program
***************************End of partial code***************************
      

Voilą! Clear all breakpoints and goto code location 41F45A in your dead listing and get the offset adress. Fire up HIEW and
change the jne 0041F465 into NOP instructions (hex code=90).

If you run ws_ftp, the nag is gone, but the time trial is still active. But this one's quite easy: first make sure your time trial
isn't ended, then set a breakpoint on 00427F0A (that's the first breakpoint we set remember?). When SoftICE breaks, keep
in mind where the program jumps:

***************************Start of partial code***************************

* Possible StringData Ref from Data Obj ->"ws_ftp.key"
                                  |
:00427F0A 684C224500              push 0045224C <- Break here
:00427F0F 6A00                    push 00000000
:00427F11 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"99.08.10"
                                  |
:00427F13 6858224500              push 00452258

* Possible StringData Ref from Data Obj ->"WS_FTP Pro"
                                  |
:00427F18 6864224500              push 00452264
:00427F1D 8B4508                  mov eax, dword ptr [ebp+08]
:00427F20 50                      push eax
:00427F21 E81A26FFFF              call 0041A540
:00427F26 83C424                  add esp, 00000024
:00427F29 85C0                    test eax, eax
:00427F2B 0F8D07000000            jnl 00427F38 <- Jump
:00427F31 33C0                    xor eax, eax
:00427F33 E998070000              jmp 004286D0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00427F2B(C)
|

* Possible StringData Ref from Data Obj ->"CyberSuite"
                                  |
:00427F38 6870224500              push 00452270

* Possible StringData Ref from Data Obj ->"ipswitch.key"
                                  |
:00427F3D 687C224500              push 0045227C
:00427F42 8B4508                  mov eax, dword ptr [ebp+08]
:00427F45 50                      push eax
:00427F46 6A00                    push 00000000
:00427F48 E85D48FFFF              call 0041C7AA
:00427F4D 83C410                  add esp, 00000010
:00427F50 85C0                    test eax, eax
:00427F52 0F8F07000000            jg 00427F5F <- Jump
:00427F58 33C0                    xor eax, eax
:00427F5A E971070000              jmp 004286D0
***************************End of partial code***************************
      

So we 've got two conditional jumps:
1. jnl 00427F38
2. jg 00427F5F

Now do the same but with the program expired! You will see that the "jnl 00427F38" still jumps but the "jg 00427F5F"
doesn't!! Could this be our check-if-expired-jump ?? Let's check it out and change it in HIEW into "jmp 00427F5F".
Run ws_ftp.....we've made it (finally!) it's cracked! ;-)) Congrats if you made it this far *g*

IV. In the end

I know there's also the Explorer and FTP find thing. Cracking the FTP find prog isn't difficult: the protection is in the
ftppro32.dll .Just run the program when the time trial is expired and you'll see a messagebox...the rest is up to you now!
I didn't check out the explorer thing....i just don't use it and i don't have it installed, but I know that the protection is in the
ftpproex.dll file. Success!!

I want to dedicated this essay to all the fellow crackers on #cracking4newbies and #evc99...thx guyz for everything and
see you some time on the net!

Greetings
BlackB

Endnote:
Essay written by The Blackbird © 1999-2000
This essay can be freely distributed/ published/ printed etc... as long as no modifications are made.