Site hosted by Angelfire.com: Build your free website today!
CRACK IT BUY IT or LEAVE IT !
                                                                                
[TARGET]
HEX WORKSHOP v 2.54
http://www.bpsoft.com
[SOFTICE BREAKPOINT]
BPX GETWINDOWTEXTA
If you had read my other TUTS, then this one won't be HARDER for you and it's 
seems very INTERESTING for your CRACKING knowledge, coz the purpose of this TUTS is
CRACKING in a FAST way. The important thing is to understand what you are dealing with,
you can use a DEAD LISTING trick to do that, just find the PROTECTION SCHEME and setting some BREAKPOINT
in SOFTICE then everything is POSSIBLE ! 
What you have to do is : 
Go to the REGISTRATION AREA in HEX WORKSHOP enter it with some DUMMY CODE then set 
that BREAKPOINT above in SOFTICE, click the REGISTER button then SOFTICE will pops up,  
press F11 to get the CALLER. Finally TRACE along with F10 until you see something like this !
* Possible StringData Ref from Data Obj ->"JN11mARQ"
                                  |
:0042627B 68E8F74700              push 0047F7E8
:00426280 8D45DC                  lea eax, dword ptr [ebp-24]  -----> EAX = address of OUR CODE
:00426283 50                      push eax
:00426284 E867450100              call 0043A7F0    ------> I almost get FOOLED with this 
							   ASS HOLE, coz what inside the CALL 
							   is comparing our CODE with 'JN11mARQ'
						           If EQUAL then EAX = 0
							   (remember that we don't want EAX = 0) 			   												   							   							   													   							  
							   THEN JUMP to 004262A8							   
:00426289 83C408                  add esp, 00000008
:0042628C 85C0                    test eax, eax
:0042628E 0F8414000000            je 004262A8                            
:00426294 8D45DC                  lea eax, dword ptr [ebp-24]
:00426297 50                      push eax
-------------------------------------------------
:00426298 E823110100              call 004373C0              --------> This CALL is counting 
-------------------------------------------------
:0042629D 83C404                  add esp, 00000004                    the lenght of our CODE.    
                                                                       Go inside this IMPORTANT 
                                                                       CALL ! 
                                                                       
-------------------------------------------------------------
:004262A0 8945EC                  mov dword ptr [ebp-14], eax      ------> NOTE that [ebp-14] have his FINAL VALUE from EAX ! 
:004262A3 E907000000              jmp 004262AF			           That mean EAX is the KEY from this STUPID PROTECTION 
-------------------------------------------------------------		   and EAX must contain 1 if you want it to be REGISTERED.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042628E(C)
|
:004262A8 C745EC00000000          mov [ebp-14], 00000000           ---->      BAD !
								        WE WANT [ebp-14] = 1 
 
									
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004262A3(U)
|
:004262AF 837DEC00                cmp dword ptr [ebp-14], 00000000
:004262B3 0F8479000000            je 00426332                        ----->    F@CKIN BAD JUMP !



Let's figure out what inside the CALL 004373C0 !
* Referenced by a CALL at Addresses:
|:00409C7E   , :00426298   
						              ______	
:004373C0 83EC14                  sub esp, 00000014                 |
:004373C3 B9FFFFFFFF              mov ecx, FFFFFFFF		    |
:004373C8 2BC0                    sub eax, eax	                    | 
:004373CA 56                      push esi		            | Some ROUTINE to COUNT
:004373CB 8B74241C                mov esi, dword ptr [esp+1C]       | our CODE Lenght.
:004373CF 57                      push edi                          |
:004373D0 8BFE                    mov edi, esi                      | ECX contain the lenght of 
:004373D2 F2                      repnz 		            | our CODE
:004373D3 AE                      scasb			            |
:004373D4 F7D1                    not ecx		            |
:004373D6 49                      dec ecx                      _____|
:004373D7 83F908                  cmp ecx, 00000008       ---> The LENGHT of the REAL SERIAL MUST 
:004373DA 7408                    je 004373E4                  BE EQUAL TO 8, IF NOT ZERO THE EAX
							       then get out from the CALL.
             						       Now go back to the REGISTRATION AREA 							     
							       and entered the CODE with 8 char of lenght.	
							       	
:004373DC 33C0                    xor eax, eax            ---> BAD ! 
:004373DE 5F                      pop edi
:004373DF 5E                      pop esi
:004373E0 83C414                  add esp, 00000014
:004373E3 C3                      ret

[CONTINUED IF OUR CODE LENGHT = 8]
Before you continued it's IMPORTANT to understand this situation,
what we always want is EAX containing 00000001 then return from the CALL, so have a look
at the end of this DEAD LISTING before returning from the CALL !
:004373E4 6A0A                    push 0000000A
				  
				  -------------
				  -------------               
				  -------------                        SOME JUNKS HERE
				  -------------
				  -------------
------------------------------------------------
:004373FC E83FFFFFFF              call 00437340                        CREATE The first 2 char for the REAL SERIAL
------------------------------------------------                       you can see it by typing D ESP+10 in SOFTICE                                    
								       or go inside the CALL if you don't believe me.		  
				  -------------
				  -------------               
				  -------------                        ANOTHER JUNKS HERE
				  -------------
				  -------------
:00437425 8D742408                lea esi, dword ptr [esp+08]            ------> The first 2 char for the REAL SERIAL
:00437429 8D4C240C                lea ecx, dword ptr [esp+0C]            ------> OUR CODE
:0043742D 51                      push ecx
------------------------------------------------
:0043742E E82D2D0000              call 0043A160                 -------> If you entered some STRINGS as the CODE 
------------------------------------------------                         then this PROC convert it to UPPERCASE.
:00437433 83C404                  add esp, 00000004                      The result is EAX = OUR CODE 
* Possible Reference to Menu: MenuID_0002 
                                  |
* Possible Reference to String Resource ID=00002: "Hex Workshop"
                                  |
:00437436 B902000000              mov ecx, 00000002                 ---> coz ECX = 2 that mean compare only the first 2 char
:0043743B 8BF8                    mov edi, eax                      ---> EDI = OUR CODE , ESI = REAL ONE, Look at the
:0043743D 2BC0                    sub eax, eax			    	 explanation below !	
:0043743F F3                      repz
:00437440 A6                      cmpsb
------------------------------------------------
:00437441 7405                    je 00437448                  ----->  FINAL CHECK !JUMP then everything is fully REGISTERED
------------------------------------------------                       coz it give the value of EAX = 00000001                         
:00437443 1BC0                    sbb eax, eax                         (that's what we want when he get out from the CALL)
:00437445 83D8FF                  sbb eax, FFFFFFFF
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00437441(C)
|
:00437448 85C0                    test eax, eax
:0043744A B800000000              mov eax, 00000000
------------------------------------------------
:0043744F 7505                    jne 00437456
------------------------------------------------
pre>* Possible Reference to String Resource ID=00001: "Hex Workshop Version 2.54" | :00437451 B801000000 mov eax, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043744F(C)
|
:00437456 5F                      pop edi
:00437457 5E                      pop esi
:00437458 83C414                  add esp, 00000014
:0043745B C3                      ret


[EXPLAINED]
:00437436 B902000000              mov ecx, 00000002                 
:0043743B 8BF8                    mov edi, eax                      
:0043743D 2BC0                    sub eax, eax			    
:0043743F F3                      repz
:00437440 A6                      cmpsb
:00437441 7405                    je 00437448             
					                  
REPZ CMPSB ---> Compare string between ES:[EDI] with DS:[ESI] after the comparison EDI and ESI 
                            plus or minus 1 it depend on the DIRECTION FLAG.
So if you entered a DUMMY Code like XXXXXXXX in the REGISTRATION then EDI = XXXXXXXX 
and ESI = SY..XXXXXXXX (The char in ESI is created from the CALL 00437340) 
ECX = 2 that mean COMPARE only 2 times 
in this case COMPARE our first two char with 'SY' if EQUAL then it's REGISTERED !
 
Do you see that ?
I told you before that if you understand the situation then you can crack it much faster,
just by analyzing at the DEAD LISTING in W32DASM then set a BPX GETWINDOWTEXTA
and BPX 0043743F then TYPE D ESI finally you can see the REAL SN# in front of your UGLY FACE !


VOL. 5

OE'97 ITS 4397100xxx
OCHE SATRIANI
OBLEK

oche_satriani@start.com.au
oblek@start.com.au