|  | 
| Author | Falcon | 
| Target | cyTom!c's Crackme #2 | 
| Public Release | Friday,23 of June,2000 | 
| Author Contact | falcon_geno@mail.ru | 
| Dedication | Irwin Shaw | 
| Difficulty Level (1..7) | 2-3 (EASY-MEDIUM) | 
| Tools Required | SortIce 3.xx.;Hex WorkShop | 
|  | 
Ok, crackers, today I am going to
explain how to crack another CrackMe with keyfile protection.The crackime,we're
going to examine requires restoring some text,in the file, to make the
program say that we are registered user.Author of the CrackMe also asked
us to create keymaker, so let's do it also, the compiled file with source
you can find in another zip, that was enclosed.
  The crackme is not so hard,the
hardness of this program is to create the right keymaker,to make it let's
examine what the program does itself.If you understand the algorythm,you
will easily be able to restore the text that your keyfile has and coding
a keymaker will be easier.
That's my second tutorial for keyfile,so
I will try to make it very clear, if you're ready then...
 
|  | 
Let’s begin….
1)-First thing we need to do is find
correct keyfile, if we do so then we can calculate the correct contents
of it.
2)-Execute the program and you will
see that it says it could not find correct keyfile...
We need to set a good breakpoint
that will give us the name of the keyfile.So, Activate Soft-Ice and set
bpx CreateFileA.
2)-Press ENTER and you should be
back to Windows.
3)-Press 'Try again' button and
Soft-Ice is activated...you should Press once F11 and you will see this
code...
0040416A    CALL   
KERNEL32!CreateFileA
0040416F    
CMP     EAX,-01
00404172     
JZ        0040419D
First line of this code returns a
certain value to EAX register. CreateFileA procedure
checks if a correct file exists in the same directory with CrackMe.If it
does not exist then value of EAX register becomes EAX=FFFFFFFF or EAX=-01.
The second line compares two values,if
EAX is equal to -01 (If there is no correct keyfile), then Jump to 'Invalid
KeyFile'.
So,to find the correct one you have
to scroll a little bit program code up and you will see this piece of code:
00404165    PUSH   
EAX
00404166    LEA      
EAX,[EBX+48]    {LEA command moves the effective address
where the name of correct keyfile is located.The only thing you have to
do is to type d ebx+48 and in the data window
you will see the name of the correct keyfile,it should be.....ctm_cm02.key
00404169    PUSH   
EAX
Quit Soft-Ice and create file with
this name and extention.As you did it I also advice to edit it a little...If
that's new file type in this file your nick or anything that you will easily
can distinguish from other text,soon you will see why.
As you did it,let's move to the
second objective...That is to find correcr contents of the file...Let's
roll further...
As you created the file-do the same
procedure to get into Soft-Ice and you will see that it passes through
00404172     
JZ        0040419D  this line,not
jumping to the 'Invalid KeyFile'...Ok,let's see the next piece of code.
Trace the program code till you
got here.....
00426592    CALL   
004026E4                           
{This is crap CALL,do not even go inside it}
00426597    TEST    
EAX,EAX                             
{This command checks if value of EAX is zero}
00426599    JNZ      
00426705                           
{Jump to 00426705 if it is zero}
0042659F    LEA      
EAX, [EBP+FFFEFEA8]
004265A5 CALL 00403F04 {To see what code is in this CALL,press F8 and you will see...}
00403F04  
PUSH    EBX                                      
{Stores in the stack
value of EBX register}
00403F05   MOV    
EBX,EAX                              
{Value of EAX is MOVed to EAX....EAX=EBX}
00403F07   MOV    
EDX, [EBP+04]                    
{Here you will see that EDX will be equal to D7B3h}
00403F0A   SUB     
EDX,0000D7B1                    
{Subtraction...EDX=EDX-D7B1=2}
00403F10   CMP     
EDX,02                                  
{CoMPares EDX and
2...}
00403F13   JA        
00403F34                              
{Jump if value of EDX is above than 2}
00403F15   PUSH   
00                                           
{Stores 00}
00403F17   PUSH   
DWORD PTR  [EBX]
00403F19   CALL    
KERNEL32!GetFileSize         {This
procedure returns size of the file you're working with}
00403F1E   CMP     
EAX,-01                                 
{CoMPares EAX with -01 or FFFFFFFF}
00403F21   JZ        
00403F2A                               
{Jump to 'Bad boy' if EAX=FFFFFFFF}
00403F23   XOR     
EDX,EDX                                
{Value of EDX becomes 0}
00403F25   DIV      
DWORD PTR [EBX+08]         
{Divides EAX by value that is located at d ebx+08...It is 1}
00403F28   POP     
EBX                                         
{Restores last PUSHed value in EBX register}
00403F29   RET     
....                                             
{Exits from CALL}
004265AA    CALL   
004026A8                              
{This one is a crap CALL,even do not go there for code}
004265AF    MOV   
[EBP-04],EAX                         
{The size of your keyfile goes at [ebp-04] address}   
004265B2    CMP    
DWORD PTR  [EBP-04],00      {CoMPares
file size with 0}   
004265B6    JNZ     
004265CD                                
{Jump if file size is not equal to 0} 
004265B8    MOV   
EDX,00426764               
{Else,you go to this
piece of code, from here you jump to 'Invalid'}
004265BD    MOV   
EAX,[EBX+000001B0]
004265C3    CALL   
00411C94
004265C8    JMP     
004266F5
004265CD    CMP   
DWORD PTR  [EBP-04],00010000    {Your file size
is CoMPared with 10000h}
004265D4    JLE     
004265DD                                           
{Jump if file size is Less or Equal}
004265D6    MOV   
DWORD PTR  [EBP-04],00010000    {Else,file size
is equal to 10000h}
004265DD    PUSH  
00                                                         
{Stores it to the stack zero value}      
004265DF    LEA     
EDX,[EBP+FFFEFFFC]                        
004265E5    MOV    
ECX,[EBP-04]                              
{File size is MOVed
to ECX}
004265EE    CALL   
00403E64                                     
{This is Cracl CALL,it
again checks if file size bigger than 0}
004265F3    CALL   
004026A8                                     
{This is also crap
CALL...Funny things are below}
004265F8    PUSH  
EBX
004265F9    PUSH  
EDI
004265FA    PUSH  
ESI
004265FB    LEA    
ESI,[EBP-04]                                  
{Moves effective address
of file size to ESI}
004265FE    MOV   
ECX,[ESI]                                        
{Again,file size is
MOVed to ECX}
00426600   
LEA    ESI, [EBP+FFFEFFFC]          
{The address location of your keyfile contents are moved to
esi.Type d esi, and you will see the text from this keyfile.Here is most
significant part of the code,all the calculations start here,so do not
sleep}  
00426606    LEA   
EDI, [EBP+FFFEFFFB]          
{The address is a little bit moved left,It is also moved to EDI }
0042660C    XOR  
EAX,EAX                                  
{XORing of EAX,EAX...EAX=0}                            
0042660E    OR     
EDX,-01                                   
{EDX=EDX or -01}
00426611    XOR   
EBX,EBX                                  
{EBX=0}
00426613    INC    
EAX                                           
{EAX is increased by 1...}
00426614    NOT   
EDX                                           
{Changing of all bits
of Operand...EDX=not EDX}
00426616   
MOV   BL,[EDX+ESI]                         
{As the counter increasing
the program moves all chars, till char with code 00, to BL register.}
00426619    TEST  
BL,BL                                       
{TEST command subtracts bits of 1st Operand from bits of 2nd Operand,
and if final result is zero then zero flag takes value of Zero}
0042661B    JZ      
00426646                                
{Jump if zero flag is equal to Zero}
0042661D    CALL  
00426638                               
{In this CALL, the program stores your name in another string,this
user name will be displayed if you find good contents of the file}
00426622    PUSH   
EDX                                        
{Stores value of EDX register in stack}
00426623    MUL     
EBX                                         
{MULtiplication...EAX=EAX*EBX}
00426625    POP     
EDX                                          
{POP command restores value of EDX from stack}
00426626    XOR     
EAX,63546D32                      
{XORing....EAX=EAX xor 63546D32h}
0042662B    INC      
DL                                            
{Here DL is our counter...Increase DL by 1}
0042662D    CMP    
EDX,ECX                                  
{CoMPares EDX and ECX, if you remember in ECX there is our file size,
the counter, DL, is compared with ECX value} 
0042662F    JZ        
00426673                                
{We have to not allow after this command to jump, we have to edit OUR
KEYFILE a little,...
1)-Clear current breakpoint....bc
*
2)-Set new one, typing bpx 00426614
3)-Open De-Activate SoftIce, and
execute Hex WorkShop
4)-Open our keyfile using it...And
type there your nick
5)-Right after your nick write a
char with 00h code
6)-Type after char,with 00 code,
any 4 bytes. Soon you will see why I asked to do that..
7)-As you did it go back to the
program code where we stopped..
00426631    CMP     
DL,FF                           
{CoMPare DL (counter)
with 255...This is maximum length for string}
00426634    JZ        
00426673                    
{Jump is DL is equal to 255}
00426636    JMP     
00426616                    
{Unconditional Jump to the start of this loop}
COMMENTS:
    Ok,after this
loop we get get the idea what happens there.So, the situation is like this:
       
IF <code of char> is not 00h then do Calculations;
           
Else Goto program code that goes after the calulations...
00426646    CALL   
00426638                    
{I was mentioning about this CALL before.It srotes last char in new
string that displays the UserName in the main form(if you find correct
contents)}
0042664B    INC      
EDX                              
{Shifts the address
to the zero char...Increase EDX by 1} 
0042664C    ADD   
EDX,04                           
{ADDition...EDX=EDX+4}
0042664F    CMP   
ECX,EDX                        
{CoMPares two Operands,ECX (our file size) and EDX (our counter)...
I mentioned this too.I was saying
that the file should consist of your Nick,char with 00 code, and 4 more
chars (any)....If this conditions do not appliy,so....}
00426651    JNZ    
00426673                       
{So,it jumps to the 'Invalid KeyFile'}
00426653    SUB    
EDX,04                           
{Subtraction..EDX=EDX-04}
00426656    TEST   
EAX,EAX                         
{Checks if EAX is zero}
00426658    JBE     
0042665C                       
{Jump if Below or Equal to comparison line}
0042665A    SHR    
EAX,1                              
{SHift Operand Right by 2..In fact it is Division by 2}
0042665C    CMP    
EAX,[EDX+ESI]             
{If you reach this line, you can consider that you found the right
contents of the file....By the address of, d EDX+ESI, is those 4 chars
I was talking about.You can see them in Data Window..So, you see what is
the value of EAX...it coresponds to x1x2x3x4...you have to make it in reverse
manner, so it will x4x3x2x1 (Write down this number and go to Hex WorkShop
and write it after 00 char)..
That's it, you just had to know the value of EAX register, as you can see these are straight calculations, that's why the crackme is not so hard...}
If you have anything to say (critics
or ...anything) mail me...
Hope it gave you some more experience
working with files, with this information you can crack similar Programs..
 
 
|  | 
A good practice
crackme.Here you can prctice your skills with working with files..
 
|  | 
All members
from Genocide Crew,
http://www.genocidecrew.cjb.net/
All members
from Hellforge  { Mercution, Acid_Cool_178, Ac|dfusion, Dark_Wolf,
BiSHoP…}
Enormous thanks
goes to Acid_Cool_178 and Mercution {his design of this tut}for providing
me with LOGOs
http://kickme.to/hforge2k
tHe CrEaM members  
{ For their good intend to help everybody }
ImmortalDescendants
People-Elite
To every one
who makes tutorials…
Cool coders:
       
Terminal Cilla, AntiXrist, Chafe, The+Q, LaZaRuS, Lucifer48, FatboyJoe
(great coder)
       
CzDrillard { he is great in making good Math algos}
Reversers 
:
       
Yates,TSCube,  and everybody I forgot to add..
 
|  | 
Any mistakes, corrections, or comments may be mailed to the members individually, or to the group : hellforge@hellforge.org.