courtesy of fravia+'s searchlore
Everlock by Az-Tech Reversing a Commerical Copy Protection Scheme Part 1 (Introdution) by Tomboy December 7, 1998 Introduction Everlock copy protection has been around since the mid-1980s. It is one of the few survivors from the hey-day of disk based copy protection. Its longevity is due to Az-Tech's continuous improvement with each successive version of Everlock. This has managed to keep them one step ahead of the casual cracker. Although both DOS and Windows programs can be protected with Everlock, this paper deals only with the protection of DOS programs. Part 1 of this series will serve to familiarize you with some of the features of this copy protection scheme and point out possible weaknesses that can be exploited. It should be noted that of late, Az-Tech has been heavily promoting their hardware based copy protection, EverKey (i.e. dongle) instead of Everlock. Recommended Files While there are no essential files for this study, it will be more fun if you have: - Everlock 3.21c upgrade file from www.az-tech.com - CUP 3.4 from www.suddendischarge.com - Any Everlock protected program you might have laying around - The EVREAD.ASM program Elements of the Protection Scheme Everlock is composed of some or all of the following elements: - Specially formatted track on the master (key) or working diskette, - Install counter on master diskette, - Hidden files (EV?1.SYS, EV?2.sys) containing install information, - Deleted file in root directory if hard drive install (FILE0100.CHK), - Copy protection transfer utility (EVMOVE), - Wrapped version of copy protected program (loader), - Liberal use of encryption in all important files The master diskette and working copies created by Everlock (of versions 2.x and up) cannot be copied by any known software only program (e.g. COPYIIPC, COPYRITE...etc.). However, copies can be produced using a Deluxe Option Board (sadly discontinued by Central Point Software cica 1990). Although Business Neverlock by Copyware states it can defeat Everlock, Az-Tech disputes this claim. Many elements of this protection scheme are similar to other commercial schemes (Prolok, Softguard,..etc.). The common thread in all these schemes is the use of a specially formatted track on the floppy diskette. The more difficult it is to reproduce this track, the more secure the protection. Features of the Master Diskette Analysis of the special formatted track (track 6, side 0 for my key diskette) on the Master diskette of an Everlock protected program shows that all sectors except for the last one are normal and readable from DOS. Deeper analysis using the "Track Editor" in the Deluxe Option Board package shows that the last sector is present, but has a non-standard size of 8192 bytes (at least according to the header information) and has an incorrect data CRC. Obviously, the sector data field crosses the index position of the floppy diskette (in the case of 360K and 720K floppies it even crosses the index position a second time). Reading this huge sector gives the protection scheme access to all sector data on the track and the intersector information as well. You would think that creating such a bizarre track would be a major feat requiring special hardware (like the Deluxe Option Board). However, the copy protection tranfer utility (EVMOVE) can create working copies of the key diskette with the same format using a standard floppy drive and controller. If you are curious about the contents of these special sectors, an assembly language program has been written to read and dump the sector to a file. The source code for "EVREAD.ASM" is pasted at the end of this paper. You may need to edit the "drive", "track" and "sector" variables before assembling the file based upon the characteristics of your particular master diskette. It is recommended that the program be run from your hard drive to avoid writing the output file to your key disk. How Everlock Works The wrapped program (actually a loader) employs a combination of encryption and anti-debugger tricks to keep the cracker away from its true code. After the locader decrypts itself in memory, it verifies that the files EV?1.SYS and EV?2.SYS are present, have a hidden attribute, and contain valid information. If the protection is floppy diskette based, it also verifies the presence of the specially formatted track and the contents of the 8192 byte sector. For a hard drive install, the information in the EV??.SYS files is the primary means to assure a valid authorization. However, a zero byte length, deleted file (ċILE0100.CHK) is also placed in the root directory for good measure. The program will automatically search all drives (including network drives) looking for a valid authorization. Failure to find a valid authorization causes the program to reset all changed system parameters, erase itself out of memory and exit to DOS. If all goes right, eventually the original program is reconstructed in memory and executes as normal. On exit, as when the protection check fails, the program resets all changed system parameters and erases itself out of memory. Brief Introduction to EVMOVE EVMOVE (.COM or .EXE) is the name of Everlock's copy protection transfer utility. It is used to create working copies of the program on diskettes or on a hard drive. This program is often renamed to something else like, AUTHORIZ.COM and AUTHMOVE.COM. Because this program can create working copies of the protected program and verify that the master disk is valid, it is a primary target of our reverse engineering efforts. Az-Tech is not dumb and has made this program very tough to attack. It is encrypted (some parts are double encrypted), debugger hostile (various versions commandeer some or all INTs 0, 1, 2, 3, 4 and 5), and destroys itself in memory upon exit to DOS. EVMOVE is an impressive piece of pure assembly language programming that deserves the cracker's respect. EVMOVE can only be decrypted using a good virtual memory debugger to get around some of its anti-debug tricks. The "code digger" debugger built into CUP386 version 3.4 is an excellent choice. If you aren't familar with CUP386, here is a typical command line: C:\>CUP386 evmove.com /3 /d Now start tracing through the code. A standard feature of the .COM versions of EVMOVE is a CALL xxxx to the main decryption routine which is ~8-9 bytes before the encrypted code. Instead of RETing from the decryption CALL, there is a JMP to the decrypted code at the end of the routine. For example: -0100 JMP 10CB . . (Data is stored here) . -10CB MOV AX,CS . . (Some initiation code) . -1106 CALL 32AC ;Call to main decryption routine, ends at 330E . . (~8-9 Byte Gap) . -1110 CMP WORD PTR [01C7],+00 ;First decrypted instruction . (Program execution continues) . . -32AC LDS BX,ES:[0004] ;Main decryption routine . . (Main decryption routine) . -330E JMP 1110 ;This is where you JMP to the decrypted code ;There is no "RET" from the CALL 32AC! At this point, most of the file is decrypted. However, there are usually one or more sections within the code that are still encrypted. These sections are not decrypted until just before they are run and are immediately reencrypted after exit. One known example reads and decrypts the program's serial number. This is important information that is used to link the copy protection to a particular program. Therefore, you can't fool one Everlock protected program into running with the valid installation information from a different Everlock program. So, you can see why the serial decyption routine would be well protected. However, these special double encrypted sections are easy to recognize and decrypt if you know what to look for. They will be examined further in part II of this series. Wrap-up As you can tell from the information presented, Everlock is a very complex copy protection scheme. Even after spending years reversing this program, I still have only scratched the surface. Hey, I could use some help from experienced DOS reversers. With enough knowledge, we can write our own programs to create and strip this protection from disks at our whim. Source code for EVREAD.ASM ========================== ;/--------------------------------------------------------------\ ;| Module..: readev.asm | ;| Program.: readev.com | ;| Author..: Tomboy | ;| Date....: 09/17/93 | ;| Version.: 1.0 for MASM 5.1 | ;| Notes...: Reads data from special 8192 byte sector used in | ;| Everlock copy protection and saves it to a file | ;\--------------------------------------------------------------/ stackseg segment stack ;This placates the linker stackseg ends codeseg segment ;This assures the the code codeseg ends ;segment will come first dataseg segment ;The data segment comes last old_int_offset dw ? ;address of old disk table old_int_segment dw ? new_disk_table db 0bh dup(00h) ;buffer for new disk table sector db 09h ;sector number of 8192 sector track db 06h ;track number drive db 00h ;floppy drive number, A=0, B=1 head db 00h ;side to read, usually 0 error_code dw ? ;diskette read error code output_file db "8192byte.dat",00h sector_buffer label byte ;offset to sector data buffer dataseg ends groupseg group codeseg,dataseg assume cs:groupseg assume ds:groupseg assume es:groupseg codeseg segment org 100h main proc near call save_vector ;save address of old disk table push ds pop es push ds lea di,groupseg:new_disk_table ;offset to new mov si,groupseg:old_int_offset ;disk table buffer mov ds,groupseg:old_int_segment mov cx,000bh ;read old disk table info repz movsb ;to new disk table buffer pop ds mov byte ptr groupseg:new_disk_table+3,06h ;change sector mov al,groupseg:sector ;size to 8192 mov groupseg:new_disk_table+4,al ;last sector number mov cl,al mov ax,0 mov es,ax lea ax,groupseg:new_disk_table mov es:[0078h],ax ;point disk base table INT mov ax,cs ;to new table location mov es:[007ah],ax push cs pop es mov bx,offset groupseg:sector_buffer ;setup for mov ch,groupseg:track ;absolute mov dl,groupseg:drive ;disk read mov dh,groupseg:head mov al,1 mov ah,2 int 13h mov groupseg:error_code,ax ;save error code call restore_vector ;restore pointer to old ;disk base table location sti xor dx,dx ;reset diskette drive mov ah,0 int 13h clc call write_file mov ah,4ch ;exit int 21h save_vector proc near push ax push es mov ax,0 mov es,ax mov ax,es:[0078h] mov groupseg:old_int_offset,ax mov ax,es:[007ah] mov groupseg:old_int_segment,ax pop es pop ax ret save_vector endp restore_vector proc near push ax push es mov ax,0 mov es,ax mov ax,groupseg:old_int_offset mov es:[0078h],ax mov ax,groupseg:old_int_segment mov es:[007ah],ax pop es pop ax ret restore_vector endp write_file proc near sub cx,cx ;open output file mov ax,3c00h ;and get handle mov dx,offset groupseg:output_file int 21h xchg bx,ax ;move file handle to BX mov ax,4000h mov cx,2000h ;number of bytes to write mov dx,offset groupseg:sector_buffer int 21h mov ax,3e00h ;close file int 21h ret write_file endp main endp codeseg ends end main