This commit is contained in:
Frater 2017-09-24 01:45:36 +02:00
commit 43352ff262
1291 changed files with 220976 additions and 0 deletions

8
FCP/FCP Normal file
View file

@ -0,0 +1,8 @@
unpack.obj : unpack.asm
tasm /ML /m unpack.asm
fcprot.exe : pack.c unpack.obj
cl /qc /W3 /AL /c pack.c
link /E pack.obj+unpack.obj,fcprot.exe,fcp.map;

3
FCP/FCP.BAT Normal file
View file

@ -0,0 +1,3 @@
echo off
copy prottest.bbk prottest.exe
fcprot prottest %1

45
FCP/FCP.MAP Normal file
View file

@ -0,0 +1,45 @@
Start Stop Length Name Class
00000H 010CAH 010CBH PACK_TEXT CODE
010D0H 01561H 00492H unp_text CODE
01562H 044B6H 02F55H _TEXT CODE
044C0H 044C1H 00002H EMULATOR_TEXT CODE
044C2H 044C2H 00000H C_ETEXT ENDCODE
044D0H 044D0H 00000H EMULATOR_DATA FAR_DATA
044D0H 0A4D3H 06004H FAR_BSS FAR_BSS
0A4E0H 0A521H 00042H NULL BEGDATA
0A522H 0A9E1H 004C0H _DATA DATA
0A9E2H 0A9E3H 00002H XIQC DATA
0A9E4H 0A9F1H 0000EH DBDATA DATA
0A9F2H 0A9FFH 0000EH CDATA DATA
0AA00H 0AA00H 00000H XIFB DATA
0AA00H 0AA00H 00000H XIF DATA
0AA00H 0AA00H 00000H XIFE DATA
0AA00H 0AA00H 00000H XIB DATA
0AA00H 0AA00H 00000H XI DATA
0AA00H 0AA00H 00000H XIE DATA
0AA00H 0AA00H 00000H XPB DATA
0AA00H 0AA03H 00004H XP DATA
0AA04H 0AA04H 00000H XPE DATA
0AA04H 0AA04H 00000H XCB DATA
0AA04H 0AA04H 00000H XC DATA
0AA04H 0AA04H 00000H XCE DATA
0AA04H 0AA04H 00000H XCFB DATA
0AA04H 0AA04H 00000H XCF DATA
0AA04H 0AA04H 00000H XCFE DATA
0AA04H 0ABDBH 001D8H CONST CONST
0ABDCH 0ABE3H 00008H HDR MSG
0ABE4H 0ACB9H 000D6H MSG MSG
0ACBAH 0ACBBH 00002H PAD MSG
0ACBCH 0ACBCH 00001H EPAD MSG
0ACBEH 0ACCBH 0000EH _BSS BSS
0ACCCH 0ACCCH 00000H XOB BSS
0ACCCH 0ACCCH 00000H XO BSS
0ACCCH 0ACCCH 00000H XOE BSS
0ACD0H 0AECFH 00200H c_common BSS
0AED0H 0B6CFH 00800H STACK STACK
Origin Group
0A4E:0 DGROUP
Program entry point at 0156:0012

BIN
FCP/FCPROT.EXE Normal file

Binary file not shown.

BIN
FCP/FCPROT.OLD Normal file

Binary file not shown.

BIN
FCP/K.OBJ Normal file

Binary file not shown.

3
FCP/KOE.BAT Normal file
View file

@ -0,0 +1,3 @@
:alku
exe2
goto alku

1
FCP/MAKE.BAT Normal file
View file

@ -0,0 +1 @@
c:\dos\prg\make fcp

BIN
FCP/MAP.EXE Normal file

Binary file not shown.

BIN
FCP/MAP.OLD Normal file

Binary file not shown.

358
FCP/PACK.C Normal file
View file

@ -0,0 +1,358 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <process.h>
extern char unpack_start,unpack_end;
extern char unpack_crc0,unpack_crc1;
extern char unpack_stack0,unpack_stack1;
extern char unpack_data,unpack_dataend,unpack_data2,unpack_code;
extern char unpack_crypt1;
extern char unpack_crypt2;
extern char unpack_crypt3;
extern char unpack_crypt4;
extern char unpack_crypt10;
extern char unpack_crypt11;
extern char unpack_crypt12;
extern char unpack_crypt13;
extern char unpack_crypt14;
extern char unpack_crypt15;
extern char unpack_crypt16;
extern char unpack_endcrypt;
int unpack_len,unpack_stacklen;
int protect(FILE *fin,FILE *fout,int lastone);
int lzexeoff=0;
int exerand(void)
{
int a;
a=rand();
if(a<4096) return(0);
else if(a<8192) return(rand()&0xf);
else if(a<16384) return(rand()&0x7f);
else return(rand());
}
void error(int a)
{
switch(a)
{
case 0 : printf("Done!\n"); break;
case 1 : printf("File not packed with LZEXE!\n");
if(lzexeoff) return;
break;
case 2 : printf("File input/output error!\n"); break;
case 3 : printf("Internal error #1\n"); break;
case 4 : printf("Internal error #2\n"); break;
case 5 : printf("File open error!\n"); break;
default : printf("Unknown error!\n"); break;
}
exit(1);
}
char storage[8192];
long mcrc=0;
int mcrcon=0;
int passes=2;
main(int argc,char *argv[])
{
FILE *fin,*fout;
char str1[64],str2[64],str3[64];
int a;
time_t tm;
/* logotexts */
printf("Future Protector IV Release 1.1 Copyright (C) 1991 Sami Tammilehto\n");
if(argc==1)
{
printf("To use. Use. Illegal use prohibited. Legal switches allowed.\n");
return(0);
}
for(a=1;a<argc;a++) if(*argv[a]=='/' || *argv[a]=='-') switch(*(argv[a]+1))
{
case '?' :
case 'H' :
//printf("-m######## machine dependant crypt code entry\n");
printf("-l skip LZEXE checks\n");
printf("-1 one pass only\n");
return(0);
case '1' :
passes=1;
break;
case 'm' :
case 'M' :
mcrcon=1;
if(strlen(argv[a])>10) *(argv[a]+2+8)=0;
sscanf(argv[a]+2,"%lX",&mcrc);
case 'l' :
lzexeoff=1;
break;
}
/* inits */
unpack_len=&unpack_end-&unpack_start;
if(unpack_len>4000) error(4);
unpack_stacklen=&unpack_stack1-&unpack_stack0;
srand((unsigned)time(&tm));
memcpy(storage,&unpack_start,unpack_len);
/* filenames/backup handling */
if(strchr(argv[1],'.')) *strchr(argv[1],'.')=0;
strupr(argv[1]);
strcpy(str1,argv[1]);
strcat(str1,".OLD");
strcpy(str2,argv[1]);
strcat(str2,".TMP");
strcpy(str3,argv[1]);
strcat(str3,".EXE");
if(passes==1)
{
strcpy(str2,str3);
}
{
FILE *f1;
printf("Opening %s\n",str3);
f1=fopen(str3,"rb");
if(f1==NULL) error(5);
for(a=0;a<28;a++) fgetc(f1);
if(fgetc(f1)!='L') error(1);
else if(fgetc(f1)!='Z') error(1);
else if(fgetc(f1)!='9') error(1);
else if(fgetc(f1)!='1') error(1);
fclose(f1);
}
remove(str1);
rename(str3,str1);
remove(str2);
printf("Protecting %s (backup saved as %s).\n",str3,str1);
printf("Size increase %i bytes. ",2*(&unpack_end-&unpack_start));
if(mcrc)
{
printf("Machine code %08lXh entered. ",mcrc);
}
printf("\n");
/* protect */
fin=fopen(str1,"rb");
fout=fopen(str2,"wb");
printf("%s->%s\n",str1,str2);
if(!fin || !fout) error(2);
a=protect(fin,fout,0);
if(a) error(a);
fclose(fin);
fclose(fout);
if(passes>1)
{
/* pass 2 */
memcpy(&unpack_start,storage,unpack_len);
fin=fopen(str2,"rb");
fout=fopen(str3,"wb");
printf("%s->%s\n",str2,str3);
if(!fin || !fout) error(2);
a=protect(fin,fout,1/*final*/);
if(a) error(a);
fclose(fin);
fclose(fout);
remove(str2); /* remove tmp */
}
/* return, 0 for no errors */
return(a);
}
int calccrc(char *start,char *end)
{
unsigned char *p;
int len=end-start;
int crc=0,a;
p=(char *)start;
for(a=0;a<len;a++)
{
crc+=*(p++);
_asm
{
mov ax,crc
rol ax,1
mov crc,ax
}
}
return(crc);
}
int crypt(int type,char *start,unsigned key)
{
int a,e;
unsigned *ip=(unsigned *)start;
e=(&unpack_endcrypt-start)/2;
if(type==0) for(a=0;a<e;a++)
{
ip[a]+=key;
}
else if(type==1) for(a=0;a<e;a++)
{
ip[a]^=key;
}
else if(type==10+0) for(a=0;a<e;a++)
{
ip[a]+=key;
key++;
}
else if(type==10+1) for(a=0;a<e;a++)
{
ip[a]^=key;
key++;
}
else if(type==20+0) for(a=0;a<e;a++)
{
ip[a]+=key;
key--;
}
else if(type==20+1) for(a=0;a<e;a++)
{
ip[a]^=key;
key--;
}
return(0);
}
int protect(FILE *fin,FILE *fout,int lastone)
{
int regkey=rand();
int key1=0x1234,key2=0x4321;
static char tmp[16384];
int *ip=(int *)tmp;
int cnt,a,b1,b2,amax;
unsigned int u;
long l;
unsigned cs0para;
unsigned header[16];
fread(header,2,16,fin);
fwrite(header,2,16,fout);
key1=header[11]+header[8]+regkey;
key2=header[10]+header[7]+regkey;
if(mcrc)
{
key1+=mcrc&65535L;
key2+=mcrc>>16L;
}
while(!ferror(fin) && !ferror(fout))
{
cnt=fread(tmp,1,16384,fin);
if(cnt==0) break;
if(cnt<16384)
{
for(cnt;cnt&15;cnt++)
{
tmp[cnt]=(char)exerand();
}
}
if(cnt&15) return(3);
amax=cnt/2;
for(a=0;a<amax;a+=8)
{ /* crypt tmp */
b1=ip[a+0]+ip[a+1]+ip[a+2]+ip[a+3];
b2=ip[a+4]+ip[a+5]+ip[a+6]+ip[a+7];
ip[a+0]+=key1;
ip[a+1]+=key2;
key1^=0x5354;
key2^=0x1525;
ip[a+2]+=key1;
ip[a+3]+=key2;
_asm
{
mov ax,key1
add ax,1234h
ror ax,1
mov key1,ax
mov ax,key2
add ax,4321h
rol ax,1
mov key2,ax
}
ip[a+4]+=key1;
ip[a+5]+=key2;
key1^=0x5354;
key2^=0x1525;
ip[a+6]+=key1;
ip[a+7]+=key2;
_asm
{
mov ax,key1
add ax,1234h
ror ax,1
mov key1,ax
mov ax,key2
add ax,4321h
rol ax,1
mov key2,ax
}
key1+=b1;
key2+=b2;
}
fwrite(tmp,1,cnt,fout);
}
if(ferror(fin) || ferror(fout)) return(2);
l=ftell(fout); cs0para=(unsigned)(l>>4)-2;
/* modify unpacker code */
{
unsigned *p;
p=(unsigned *)&unpack_data;
/* set data1 (addresses) */
p[0]=header[11]; /* cs */
p[1]=header[10]; /* ip */
p[2]=header[7]; /* ss */
p[3]=header[8]; /* sp */
p[4]=cs0para; /* cs0 */
/* set data2 */
p=(unsigned *)&unpack_data2;
p[0]=regkey; /* key */
p[1]=mcrcon; /* MACHINE CRC? */
p[2]=key1; /* key */
p[3]=key2; /* key */
/* randomize stack */
for(a=0;a<unpack_stacklen-2;a++) *(&unpack_stack0+a)=(char)exerand();
/* crypt */
u=calccrc(&unpack_crc0,&unpack_crc1);
crypt(10/*+add*/,&unpack_crypt16,0x3fac);
crypt( 1/* xor*/,&unpack_crypt15,0x5cac);
crypt( 0/* add*/,&unpack_crypt14,0 /*u*/);
crypt( 0/* add*/,&unpack_crypt13,0x0663);
crypt(21/*-xor*/,&unpack_crypt12,0x0466);
crypt(20/*-add*/,&unpack_crypt11,0x0656);
crypt( 1/* xor*/,&unpack_crypt10,0x0666);
crypt( 1/* xor*/,&unpack_crypt4,0x4536);
crypt(10/*+add*/,&unpack_crypt3,0x0073);
crypt(11/*+xor*/,&unpack_crypt2,0x4493);
crypt(10/*+add*/,&unpack_crypt1,0x5f27);
}
/* save unpacker */
fwrite(&unpack_start,1,unpack_len,fout);
if(ferror(fout)) return(2);
/* modify header */
l=ftell(fout)-1;
header[2]=(unsigned)(l/512)+1;
header[1]=(unsigned)l&511;
header[11]=header[7]=cs0para; /* cs/ss */
header[10]=&unpack_code-&unpack_start; /* ip */
header[8]=&unpack_stack1-&unpack_start; /* sp */
if(lastone)
{
header[14]=0;
header[15]=0;
}
/* save header */
fseek(fout,0L,SEEK_SET);
fwrite(header,2,16,fout);
if(ferror(fout)) return(2);
return(0);
}

BIN
FCP/PACK.OBJ Normal file

Binary file not shown.

104
FCP/PRINT.C Normal file
View file

@ -0,0 +1,104 @@
#include <stdio.h>
#include <string.h>
#include <time.h>
main(int argc,char *argv[])
{
FILE *f1;
extern int _osmajor;
extern int _osminor;
unsigned crc0,crc1;
time_t tl,ot;
int a;
double d;
if(argc!=2)
{
return(0);
}
if(memcmp(argv[1],"code",4))
{
return(0);
}
if(_osmajor<3)
{
printf("DOS 3+ required.");
return(0);
}
/*if(*argv[0]!='A' && *argv[0]!='B')
{
printf("Run from the original disk, please.");
return(0);
}*/
if(!strstr(argv[0],"EXE"))
{
printf("Run from the original disk, please..");
return(0);
}
memcpy(strstr(argv[0],"EXE"),"DAT",3);
f1=fopen(argv[0],"at");
if(f1==NULL)
{
printf("Run from the original disk, please...");
return(0);
}
_asm
{
push si
push di
xor si,si
xor di,di
push ds
ers5: mov ax,0ff00h
ers6: mov ds,ax
mov bx,0
mov cx,1024
mcrc1: add si,ds:[bx]
ers1: add di,ds:[bx+2]
ers2: rol si,1
ers3: add bx,4
ers4: loop mcrc1
pop ds
mov crc0,si
mov crc1,di
xor ax,ax
mov cs:[ers1],ax
mov cs:[ers2],ax
mov cs:[ers3],ax
mov cs:[ers4],ax
mov cs:[ers5],ax
mov cs:[ers6],ax
mov cs:[ers1+2],ax
mov cs:[ers2+2],ax
mov cs:[ers3+2],ax
mov cs:[ers4+2],ax
mov cs:[ers5+2],ax
mov cs:[ers6+2],ax
pop di
pop si
mov ah,08h
mov dl,128
mov dh,0
int 13h
cmp dh,0
je jjj1
add crc0,cx
add crc1,dx
jjj1: nop
}
time(&tl);
fprintf(f1,"%sDos version %i.%i",ctime(&tl),_osmajor,_osminor);
fprintf(f1,"\t[");
fprintf(f1,"%04X",crc1);
fprintf(f1,"%04X",crc0);
fprintf(f1,"%04X",(crc1^0xffff));
fprintf(f1,"%04X",(crc0^0xffff));
fprintf(f1,"]\n\n");
fclose(f1);
printf("[");
printf("%04X",crc1);
printf("%04X",crc0);
printf("%04X",(crc1^0xffff));
printf("%04X",(crc0^0xffff));
printf("]");
return(0);
}

72
FCP/PRINT.DAT Normal file
View file

@ -0,0 +1,72 @@
Sun Jan 05 19:40:23 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 05 19:51:32 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 05 19:51:47 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Jan 10 19:03:52 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Jan 10 19:57:45 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Mon Jan 13 19:52:57 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 19 17:37:37 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 19 22:00:40 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 19 22:01:07 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 19 22:01:18 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sun Jan 19 22:04:03 1992
Dos version 5.0 [F65CE69909A31966]
Mon Jan 20 17:38:49 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Tue Feb 04 17:38:20 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Tue Feb 04 17:38:43 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Apr 24 16:52:33 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Apr 24 16:52:34 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Apr 24 16:52:36 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Apr 24 16:53:07 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Fri Apr 24 16:54:04 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sat May 02 22:46:04 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sat May 02 22:46:12 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Thu Aug 13 17:46:58 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Wed Nov 04 00:50:37 1992
Dos version 5.0 [432D5E0CBCD2A1F3]
Sat Jan 30 22:22:53 1993
Dos version 5.0 [432D5E0CBCD2A1F3]

BIN
FCP/PRINT.EXE Normal file

Binary file not shown.

BIN
FCP/PROTTEST.EX0 Normal file

Binary file not shown.

BIN
FCP/PROTTEST.EXE Normal file

Binary file not shown.

4
FCP/TEST.BAT Normal file
View file

@ -0,0 +1,4 @@
echo off
:alku
prottest
goto alku

1
FCP/TMP Normal file
View file

@ -0,0 +1 @@
[432D5E0CBCD2A1F3]

471
FCP/UNPACK.ASM Normal file
View file

@ -0,0 +1,471 @@
NOJUMPS
calccrc MACRO start,end
local l1
mov cx,OFFSET end-OFFSET start
mov si,OFFSET start
l1: add dl,cs:[si]
adc dh,0
rol dx,1
inc si
loop l1
ENDM
uncryptxor MACRO beg,key
local l1
mov bx,OFFSET beg
mov ax,key
mov cx,(OFFSET _unpack_endcrypt-OFFSET beg)/2
l1: xor ds:[bx],ax
add bx,2
dec cx
jnz l1
ENDM
uncryptadd MACRO beg,key ;actually sub, uncrypts add-crypting
local l1
mov bx,OFFSET beg
mov ax,key
mov cx,(OFFSET _unpack_endcrypt-OFFSET beg)/2
l1: sub ds:[bx],ax
add bx,2
dec cx
jnz l1
ENDM
unp_text SEGMENT para public 'CODE'
ASSUME cs:unp_text
PUBLIC _unpack_start,_unpack_end
PUBLIC _unpack_data,_unpack_dataend,_unpack_data2,_unpack_code
PUBLIC _unpack_stack0,_unpack_stack1
PUBLIC _unpack_crc0,_unpack_crc1
PUBLIC _unpack_crypt1 ;add 5f27h - INC
PUBLIC _unpack_crypt2 ;xor 4493h - INC
PUBLIC _unpack_crypt3 ;add 0073h - INC
PUBLIC _unpack_crypt4 ;xor 4536h - none
PUBLIC _unpack_crypt10 ;xor 0666h - none
PUBLIC _unpack_crypt11 ;add 0656h - DEC
PUBLIC _unpack_crypt12 ;xor 0466h - DEC
PUBLIC _unpack_crypt13 ;add 0663h - none
PUBLIC _unpack_crypt14 ;add DX - none
PUBLIC _unpack_crypt15 ;xor 5cach - none
PUBLIC _unpack_crypt16 ;add 3fach - INC
PUBLIC _unpack_endcrypt
_unpack_start LABEL BYTE
db 'FCP/IV' ;Future Protector IV
_unpack_code LABEL BYTE
startup PROC NEAR
mov sp,OFFSET _unpack_stack1
io21data LABEL BYTE
ret
pntds2 LABEL WORd
jmp cs:[farjump+2]
startup ENDP
int_iret PROC FAR
iret
int_iret ENDP
ALIGN 2
_unpack_stack0 LABEL BYTE
dw 50 dup(5555h)
_unpack_stack1 LABEL BYTE
dw OFFSET step1
dw 0 ;popped by step 1 => DS
dw OFFSET step2
dw OFFSET step3
dw OFFSEt step4
stck1: dw OFFSET stepx1 ;the cracker blew it :-)
dw 0fff0h,0000h
disk0 dw 0
disk1 dw 0
vram dw 01234h
hboottxt db '.;*',13,0
pntds dw 0
_unpack_crc0 LABEL BYTE
.386P
step1 PROC NEAR
in al,21h
mov cs:io21data,al
mov al,255
out 21h,al
cli
mov cs:pntds,ds
pop ds
cld
;disk detect
mov ah,08h
mov dl,128
mov dh,0
int 13h
cmp dh,0
je jjj1
mov cs:disk0,cx
mov cs:disk1,dx
jjj1: ;video detect
mov ah,0fh
int 10h
cmp al,7
je ismda
mov cs:vram,0800h+1234h
ismda: add cs:vram,0b000h-01234h
;processor detect, at return: BP=0=real BP=1=protected mode
push sp ; 86/186 will push SP-2;
pop ax ; 286/386 will push SP.
cmp ax, sp
jz not86 ; If equal, SP was pushed
;8086/80186
noprot: mov bp,0
ret
not86: smsw cx ; Protected? Machine status -> CX
ror cx,1 ; Protection bit -> carry flag
jnc noprot ; Real mode if no carry
mov bp,1
ret
step1 ENDP
.8086
step3 PROC NEAR
;DS=CS now (in step 2)
;uncode crap
mov byte ptr cs:int1code,40h ;INC AX
int 3 ;clc set at step2's end
uncryptadd _unpack_crypt1,5f27h
ret
step3 ENDP
ints PROC FAR ;SingleStep/DEBUG
int_01: stc
int_03: push bp
mov bp,sp
jnc int2
push bx
mov bx,ss:[bp+2] ;ip
cmp byte ptr cs:[bx],49h ;inc cx
jne int1
int1code: inc bx
int1: pop bx
int3: pop bp
iret
int2: xor ss:[bp+6],256
mov bp,cs:stck1to
mov word ptr cs:[stck1],bp
jmp int3
ints000:
ints ENDP
_unpack_crc1 LABEL BYTE
itable LABEL WORD
itablelen equ 4
dw OFFSET int_iret,0f000h ;int 0
dw OFFSET int_01,0f000h ;int 1
dw OFFSET int_iret,0f000h ;int 2
dw OFFSET int_03,0f000h ;int 3
;Stack contents on ints:
; [bp+6]: flags
; [bp+4]: cs
; [bp+2]: ip
; [bp+0]: bp
_startzeroing LABEL BYTE
step2 PROC NEAR ;WARNING! ROUTINE OVERWRITTEN BY INNER STACK
mov cs:hboottxt[0],'b'
;set interrupts
mov bx,'FG'
mov si,OFFSET itable
xor di,di
mov cx,itablelen
mov dx,'JM'
mov cs:hboottxt[1],'C'
st2a: segcs
lodsw
xchg ds:[di],ax
mov cs:[si-2],ax
mov ax,cs
xchg ds:[di+2],ax
mov cs:[si],ax
add si,2
add di,4
loop st2a
;carry=0 for di won't rotate
mov di,dx ;='JM'
mov dx,OFFSET hboottxt
mov ax,cs
mov ds,ax
mov si,bx ;='FG' ;if this enabled, ICE will reboot
mov ax,0911h
ret
step2 ENDP
stepx1 PROC NEAR
mov ax,0f000h
retf ;reboots
stepx1 ENDP
_unpack_crypt1 LABEL BYTE
step4 PROC NEAR
;DS=CS
mov ax,cs:pntds
mov cs:pntds2,ax
uncryptxor _unpack_crypt2,4493h
_unpack_crypt2 LABEL BYTE
uncryptadd _unpack_crypt3,0073h
_unpack_crypt3 LABEL BYTE
jmp stp4o
stck1to dw OFFSET step5
hboottxt2 db 'Bc*',13,0
stp4o: sub ax,ax
mov si,'FG'
mov di,'JM'
mov ax,0911h
mov dx,OFFSET hboottxt2
clc
int 3
uncryptxor _unpack_crypt4,4536h
ret ;goes to step5
step4 ENDP
_unpack_crypt4 LABEL BYTE
innerstack LABEL BYTE
dw OFFSET stepx1
step5 PROC NEAR
;enter inner stack
mov sp,OFFSET innerstack
uncryptxor _unpack_crypt10,0666h
_unpack_crypt10 LABEL BYTE
i1c0: mov dx,0656h
sub ax,ax
mov es,ax
mov ax,es:[6]
mov bx,cs
cmp ax,bx
je i1c1
mov word ptr cs:[i1c0+1],0CA3Fh
mov dx,3FC1H
i1c1: cmp word ptr es:[4],OFFSET int_01
je i1c2
mov word ptr cs:[i1c0+1],0CA3Fh
mov dx,3CF2H
i1c2: mov byte ptr cs:int1code,48h ;DEC AX
sub ax,ax
int 3
uncryptadd _unpack_crypt11,dx
_unpack_crypt11 LABEL BYTE
uncryptxor _unpack_crypt12,0466h
_unpack_crypt12 LABEL BYTE
mov byte ptr cs:int1code,40h ;INC AX
sub ax,ax
int 3
uncryptadd _unpack_crypt13,0663h
_unpack_crypt13 LABEL BYTE
;calc checksum of exe start
xor dx,dx
mov byte ptr cs:int1code,43h ;INC BX
calccrc _unpack_crc0,_unpack_crc1
uncryptadd _unpack_crypt14,0 ;dx
_unpack_crypt14 LABEL BYTE
uncryptxor _unpack_crypt15,5CACh
_unpack_crypt15 LABEL BYTE
mov byte ptr cs:int1code,40h ;INC AX
sub ax,ax
int 3
uncryptadd _unpack_crypt16,3FACh
_unpack_crypt16 LABEL BYTE
mov word ptr cs:innerstack,OFFSET execute
sub ax,ax
int 3
ret
step5 ENDP
ALIGN 2
execute PROC NEAR
;unpack data
mov dx,cs:pntds2
add dx,10h
xor si,si
xor di,di
cmp cs:mcrcon,0
je exec11
;calc machine crc
mov ax,0ff00h
mov ds,ax
mov bx,0
mov cx,1024
mcrc1: add si,ds:[bx]
add di,ds:[bx+2]
rol si,1
add bx,4
loop mcrc1
add si,cs:disk0
add di,cs:disk1
exec11: add si,cs:regcs
add di,cs:regip
add si,cs:regsp
add di,cs:regss
add si,cs:regkey
add di,cs:regkey
mov cx,cs:regcs0
exec1: mov ds,dx
sub ds:[0],si
sub ds:[2],di
xor si,5354h
xor di,1525h
sub ds:[4],si
sub ds:[6],di
add si,1234h
ror si,1
add di,4321h
rol di,1
sub ds:[8],si
sub ds:[10],di
xor si,5354h
xor di,1525h
sub ds:[12],si
sub ds:[14],di
add si,1234h
ror si,1
add di,4321h
rol di,1
inc dx
add si,ds:[0]
add di,ds:[8]
add si,ds:[2]
add di,ds:[10]
add si,ds:[4]
add di,ds:[12]
add si,ds:[6]
add di,ds:[14]
loop exec1
mov bp,OFFSET errormsg1
cmp si,cs:keychk0
jne error
cmp di,cs:keychk1
jne error
cld
_endzeroing LABEL BYTE ;may overflow a byte, but who cares
mov dx,cs:pntds2
mov ax,cs
mov es,ax
mov cx,(OFFSET _endzeroing-OFFSET _startzeroing+1)/2
mov di,OFFSET _startzeroing
mov ax,'..'
rep stosw
call resetints
mov al,cs:io21data
out 21h,al
mov ax,cs
mov es,ax
mov cx,OFFSET _startzeroing-OFFSET _unpack_code
mov di,OFFSET _unpack_code
mov al,'.'
rep stosb
;load stack and cs:ip for the actual program and run it.
mov ds,dx
mov es,dx
mov bx,cs
mov cx,cs:regcs0
mov ax,cs:regss
add ax,bx
sub ax,cx
mov ss,ax
mov sp,cs:regsp
add cs:regcs,bx
sub cs:regcs,cx
push cs:regcs
push cs:regip
mov cs:regcs,ax
mov cs:regip,ax
mov cs:regss,ax
mov cs:regcs0,ax
mov cs:keychk1,ax
mov cs:regkey,ax
sti
jmp endprg2
_endzeroing2 LABEL BYTE
error: ;destroy and exit with error at OFFSET BP
cld
mov dx,cs:pntds2
mov ax,cs
mov es,ax
mov cx,(OFFSET _endzeroing2-OFFSET _startzeroing+1)/2
mov di,OFFSET _startzeroing
mov ax,'..'
rep stosw
call resetints
mov al,cs:io21data
out 21h,al
mov ax,cs
mov es,ax
mov di,OFFSET _unpack_code
mov cx,OFFSET _startzeroing-OFFSET _unpack_code
mov al,'.'
rep stosb
mov cs:regcs,ax
mov cs:regip,ax
mov cs:regss,ax
mov cs:regcs0,ax
mov cs:keychk1,ax
mov cs:regkey,ax
mov sp,OFFSET _unpack_data
sti
jmp endprg1
execute ENDP
resetints PROC NEAR
;reset interrupts
xor ax,ax
mov es,ax
mov si,OFFSET itable
xor di,di
mov cx,itablelen*2
st20a: segcs
lodsw
stosw
loop st20a
ret
resetints ENDP
ALIGN 2
_unpack_data LABEL BYTE
farjump LABEL DWORD
regcs dw 0
regip dw 0
regss dw 0
regsp dw 0
regcs0 dw 0
errormsg1 db 'File corrupted!$'
_unpack_data2 LABEL BYTE
regkey dw 0
mcrcon dw 0 ;1=machine crc enabled
keychk0 dw 0
keychk1 dw 0
_unpack_dataend LABEL BYTE
ALIGN 2
endprg1: ;****************
mov dx,bp
mov ax,cs
mov ds,ax
mov ah,9h
int 21h
mov ax,4c03h
int 21h
endprg2: ;****************
retf
ALIGN 2
_unpack_endcrypt LABEL BYTE
db 000h,0fch
_unpack_end LABEL BYTE
unp_text ENDS
END

739
FCP/UNPACK.LST Normal file
View file

@ -0,0 +1,739 @@
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 1
unpack.ASM
1 NOJUMPS
2
3 calccrc MACRO start,end
4 local l1
5 mov cx,OFFSET end-OFFSET start
6 mov si,OFFSET start
7 l1: add dl,cs:[si]
8 adc dh,0
9 rol dx,1
10 inc si
11 loop l1
12 ENDM
13 uncryptxor MACRO beg,key
14 local l1
15 mov bx,OFFSET beg
16 mov ax,key
17 mov cx,(OFFSET _unpack_endcrypt-OFFSET beg)/2
18 l1: xor ds:[bx],ax
19 add bx,2
20 dec cx
21 jnz l1
22 ENDM
23 uncryptadd MACRO beg,key ;actually sub, uncrypts add-crypting
24 local l1
25 mov bx,OFFSET beg
26 mov ax,key
27 mov cx,(OFFSET _unpack_endcrypt-OFFSET beg)/2
28 l1: sub ds:[bx],ax
29 add bx,2
30 dec cx
31 jnz l1
32 ENDM
33
34 0000 unp_text SEGMENT para public 'CODE'
35 ASSUME cs:unp_text
36 PUBLIC _unpack_start,_unpack_end
37 PUBLIC _unpack_data,_unpack_dataend,_unpack_data2,_unpack_code
38 PUBLIC _unpack_stack0,_unpack_stack1
39 PUBLIC _unpack_crc0,_unpack_crc1
40 PUBLIC _unpack_crypt1 ;add 5f27h - INC
41 PUBLIC _unpack_crypt2 ;xor 4493h - INC
42 PUBLIC _unpack_crypt3 ;add 0073h - INC
43 PUBLIC _unpack_crypt4 ;xor 4536h - none
44 PUBLIC _unpack_crypt10 ;xor 0666h - none
45 PUBLIC _unpack_crypt11 ;add 0656h - DEC
46 PUBLIC _unpack_crypt12 ;xor 0466h - DEC
47 PUBLIC _unpack_crypt13 ;add 0663h - none
48 PUBLIC _unpack_crypt14 ;add DX - none
49 PUBLIC _unpack_crypt15 ;xor 5cach - none
50 PUBLIC _unpack_crypt16 ;add 3fach - INC
51 PUBLIC _unpack_endcrypt
52 0000 _unpack_start LABEL BYTE
53
54 0000 46 43 50 2F 49 56 db 'FCP/IV' ;Future Protector IV
55
56 0006 _unpack_code LABEL BYTE
57 0006 startup PROC NEAR
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 2
unpack.ASM
58 0006 BC 0074r mov sp,OFFSET _unpack_stack1
59 0009 io21data LABEL BYTE
60 0009 C3 ret
61 000A pntds2 LABEL WORd
62 000A 2E: FF 2E 0468r jmp cs:[farjump+2]
63 000F startup ENDP
64 000F int_iret PROC FAR
65 000F CF iret
66 0010 int_iret ENDP
67
68 ALIGN 2
69 0010 _unpack_stack0 LABEL BYTE
70 0010 32*(5555) dw 50 dup(5555h)
71 0074 _unpack_stack1 LABEL BYTE
72 0074 0091r dw OFFSET step1
73 0076 0000 dw 0 ;popped by step 1 => DS
74 0078 0139r dw OFFSET step2
75 007A 00EBr dw OFFSET step3
76 007C 017Er dw OFFSEt step4
77 007E 017Ar stck1: dw OFFSET stepx1 ;the cracker blew it :-)
78 0080 FFF0 0000 dw 0fff0h,0000h
79 0084 0000 disk0 dw 0
80 0086 0000 disk1 dw 0
81 0088 1234 vram dw 01234h
82 008A 2E 3B 2A 0D 00 hboottxt db '.;*',13,0
83 008F 0000 pntds dw 0
84
85 0091 _unpack_crc0 LABEL BYTE
86
87 .386P
88 0091 step1 PROC NEAR
89 0091 E4 21 in al,21h
90 0093 2E: A2 0009r mov cs:io21data,al
91 0097 B0 FF mov al,255
92 0099 E6 21 out 21h,al
93 009B FA cli
94 009C 2E: 8C 1E 008Fr mov cs:pntds,ds
95 00A1 1F pop ds
96 00A2 FC cld
97 ;disk detect
98 00A3 B4 08 mov ah,08h
99 00A5 B2 80 mov dl,128
100 00A7 B6 00 mov dh,0
101 00A9 CD 13 int 13h
102 00AB 80 FE 00 cmp dh,0
103 00AE 74 0C 90 90 je jjj1
104 00B2 2E: 89 0E 0084r mov cs:disk0,cx
105 00B7 2E: 89 16 0086r mov cs:disk1,dx
106 00BC jjj1: ;video detect
107 00BC B4 0F mov ah,0fh
108 00BE CD 10 int 10h
109 00C0 3C 07 cmp al,7
110 00C2 74 09 90 90 je ismda
111 00C6 2E: C7 06 0088r 1A34 mov cs:vram,0800h+1234h
112 00CD 2E: 81 06 0088r 9DCC ismda: add cs:vram,0b000h-01234h
113 ;processor detect, at return: BP=0=real BP=1=protected mode
114 00D4 54 push sp ; 86/186 will push SP-2;
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 3
unpack.ASM
115 00D5 58 pop ax ; 286/386 will push SP.
116 00D6 3B C4 cmp ax, sp
117 00D8 74 06 90 90 jz not86 ; If equal, SP was pushed
118 ;8086/80186
119 00DC BD 0000 noprot: mov bp,0
120 00DF C3 ret
121 00E0 0F 01 E1 not86: smsw cx ; Protected? Machine status -> CX
122 00E3 D1 C9 ror cx,1 ; Protection bit -> carry flag
123 00E5 73 F5 jnc noprot ; Real mode if no carry
124 00E7 BD 0001 mov bp,1
125 00EA C3 ret
126 00EB step1 ENDP
127 .8086
128
129 00EB step3 PROC NEAR
130 ;DS=CS now (in step 2)
131 ;uncode crap
132 00EB 2E: C6 06 0114r 40 mov byte ptr cs:int1code,40h ;INC AX
133 00F1 CC int 3 ;clc set at step2's end
134 uncryptadd _unpack_crypt1,5f27h
1 135 00F2 BB 017Er mov bx,OFFSET _unpack_crypt1
1 136 00F5 B8 5F27 mov ax,5f27h
1 137 00F8 B9 018D mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt1)/2
1 138 00FB 29 07 ??0000: sub ds:[bx],ax
1 139 00FD 83 C3 02 add bx,2
1 140 0100 49 dec cx
1 141 0101 75 F8 jnz ??0000
142 0103 C3 ret
143 0104 step3 ENDP
144
145 0104 ints PROC FAR ;SingleStep/DEBUG
146 0104 F9 int_01: stc
147 0105 55 int_03: push bp
148 0106 8B EC mov bp,sp
149 0108 73 0E jnc int2
150 010A 53 push bx
151 010B 8B 5E 02 mov bx,ss:[bp+2] ;ip
152 010E 2E: 80 3F 49 cmp byte ptr cs:[bx],49h ;inc cx
153 0112 75 01 jne int1
154 0114 43 int1code: inc bx
155 0115 5B int1: pop bx
156 0116 5D int3: pop bp
157 0117 CF iret
158 0118 81 76 06 0100 int2: xor ss:[bp+6],256
159 011D 2E: 8B 2E 01ABr mov bp,cs:stck1to
160 0122 2E: 89 2E 007Er mov word ptr cs:[stck1],bp
161 0127 EB ED jmp int3
162 0129 ints000:
163 0129 ints ENDP
164
165 0129 _unpack_crc1 LABEL BYTE
166
167 0129 itable LABEL WORD
168 = 0004 itablelen equ 4
169 0129 000Fr F000 dw OFFSET int_iret,0f000h ;int 0
170 012D 0104r F000 dw OFFSET int_01,0f000h ;int 1
171 0131 000Fr F000 dw OFFSET int_iret,0f000h ;int 2
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 4
unpack.ASM
172 0135 0105r F000 dw OFFSET int_03,0f000h ;int 3
173 ;Stack contents on ints:
174 ; [bp+6]: flags
175 ; [bp+4]: cs
176 ; [bp+2]: ip
177 ; [bp+0]: bp
178
179 0139 _startzeroing LABEL BYTE
180
181 0139 step2 PROC NEAR ;WARNING! ROUTINE OVERWRITTEN BY INNER STACK
182 0139 2E: C6 06 008Ar 62 mov cs:hboottxt[0],'b'
183 ;set interrupts
184 013F BB 4647 mov bx,'FG'
185 0142 BE 0129r mov si,OFFSET itable
186 0145 33 FF xor di,di
187 0147 B9 0004 mov cx,itablelen
188 014A BA 4A4D mov dx,'JM'
189 014D 2E: C6 06 008Br 43 mov cs:hboottxt[1],'C'
190 0153 2E: st2a: segcs
191 0154 AD lodsw
192 0155 87 05 xchg ds:[di],ax
193 0157 2E: 89 44 FE mov cs:[si-2],ax
194 015B 8C C8 mov ax,cs
195 015D 87 45 02 xchg ds:[di+2],ax
196 0160 2E: 89 04 mov cs:[si],ax
197 0163 83 C6 02 add si,2
198 0166 83 C7 04 add di,4
199 0169 E2 E8 loop st2a
200 ;carry=0 for di won't rotate
201 016B 8B FA mov di,dx ;='JM'
202 016D BA 008Ar mov dx,OFFSET hboottxt
203 0170 8C C8 mov ax,cs
204 0172 8E D8 mov ds,ax
205 0174 8B F3 mov si,bx ;='FG' ;if this enabled, ICE will reboot
206 0176 B8 0911 mov ax,0911h
207 0179 C3 ret
208 017A step2 ENDP
209
210 017A stepx1 PROC NEAR
211 017A B8 F000 mov ax,0f000h
212 017D CB retf ;reboots
213 017E stepx1 ENDP
214
215 017E _unpack_crypt1 LABEL BYTE
216
217 017E step4 PROC NEAR
218 ;DS=CS
219 017E 2E: A1 008Fr mov ax,cs:pntds
220 0182 2E: A3 000Ar mov cs:pntds2,ax
221 uncryptxor _unpack_crypt2,4493h
1 222 0186 BB 0197r mov bx,OFFSET _unpack_crypt2
1 223 0189 B8 4493 mov ax,4493h
1 224 018C B9 0180 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt2)/2
1 225 018F 31 07 ??0001: xor ds:[bx],ax
1 226 0191 83 C3 02 add bx,2
1 227 0194 49 dec cx
1 228 0195 75 F8 jnz ??0001
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 5
unpack.ASM
229 0197 _unpack_crypt2 LABEL BYTE
230 uncryptadd _unpack_crypt3,0073h
1 231 0197 BB 01A8r mov bx,OFFSET _unpack_crypt3
1 232 019A B8 0073 mov ax,0073h
1 233 019D B9 0178 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt3)/2
1 234 01A0 29 07 ??0002: sub ds:[bx],ax
1 235 01A2 83 C3 02 add bx,2
1 236 01A5 49 dec cx
1 237 01A6 75 F8 jnz ??0002
238 01A8 _unpack_crypt3 LABEL BYTE
239 01A8 EB 08 90 jmp stp4o
240 01AB 01D6r stck1to dw OFFSET step5
241 01AD 42 63 2A 0D 00 hboottxt2 db 'Bc*',13,0
242 01B2 2B C0 stp4o: sub ax,ax
243 01B4 BE 4647 mov si,'FG'
244 01B7 BF 4A4D mov di,'JM'
245 01BA B8 0911 mov ax,0911h
246 01BD BA 01ADr mov dx,OFFSET hboottxt2
247 01C0 F8 clc
248 01C1 CC int 3
249 uncryptxor _unpack_crypt4,4536h
1 250 01C2 BB 01D4r mov bx,OFFSET _unpack_crypt4
1 251 01C5 B8 4536 mov ax,4536h
1 252 01C8 B9 0162 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt4)/2
1 253 01CB 31 07 ??0003: xor ds:[bx],ax
1 254 01CD 83 C3 02 add bx,2
1 255 01D0 49 dec cx
1 256 01D1 75 F8 jnz ??0003
257 01D3 C3 ret ;goes to step5
258 01D4 step4 ENDP
259
260 01D4 _unpack_crypt4 LABEL BYTE
261
262 01D4 innerstack LABEL BYTE
263 01D4 017Ar dw OFFSET stepx1
264
265 01D6 step5 PROC NEAR
266 ;enter inner stack
267 01D6 BC 01D4r mov sp,OFFSET innerstack
268 uncryptxor _unpack_crypt10,0666h
1 269 01D9 BB 01EAr mov bx,OFFSET _unpack_crypt10
1 270 01DC B8 0666 mov ax,0666h
1 271 01DF B9 0157 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt10)/2
1 272 01E2 31 07 ??0004: xor ds:[bx],ax
1 273 01E4 83 C3 02 add bx,2
1 274 01E7 49 dec cx
1 275 01E8 75 F8 jnz ??0004
276 01EA _unpack_crypt10 LABEL BYTE
277 01EA BA 0656 i1c0: mov dx,0656h
278 01ED 2B C0 sub ax,ax
279 01EF 8E C0 mov es,ax
280 01F1 26: A1 0006 mov ax,es:[6]
281 01F5 8C CB mov bx,cs
282 01F7 3B C3 cmp ax,bx
283 01F9 74 0A je i1c1
284 01FB 2E: C7 06 01EBr CA3F mov word ptr cs:[i1c0+1],0CA3Fh
285 0202 BA 3FC1 mov dx,3FC1H
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 6
unpack.ASM
286 0205 26: 81 3E 0004 0104r i1c1: cmp word ptr es:[4],OFFSET int_01
287 020C 74 0A je i1c2
288 020E 2E: C7 06 01EBr CA3F mov word ptr cs:[i1c0+1],0CA3Fh
289 0215 BA 3CF2 mov dx,3CF2H
290 0218 2E: C6 06 0114r 48 i1c2: mov byte ptr cs:int1code,48h ;DEC AX
291 021E 2B C0 sub ax,ax
292 0220 CC int 3
293 uncryptadd _unpack_crypt11,dx
1 294 0221 BB 0231r mov bx,OFFSET _unpack_crypt11
1 295 0224 8B C2 mov ax,dx
1 296 0226 B9 0133 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt11)/2
1 297 0229 29 07 ??0005: sub ds:[bx],ax
1 298 022B 83 C3 02 add bx,2
1 299 022E 49 dec cx
1 300 022F 75 F8 jnz ??0005
301 0231 _unpack_crypt11 LABEL BYTE
302 uncryptxor _unpack_crypt12,0466h
1 303 0231 BB 0242r mov bx,OFFSET _unpack_crypt12
1 304 0234 B8 0466 mov ax,0466h
1 305 0237 B9 012B mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt12)/2
1 306 023A 31 07 ??0006: xor ds:[bx],ax
1 307 023C 83 C3 02 add bx,2
1 308 023F 49 dec cx
1 309 0240 75 F8 jnz ??0006
310 0242 _unpack_crypt12 LABEL BYTE
311 0242 2E: C6 06 0114r 40 mov byte ptr cs:int1code,40h ;INC AX
312 0248 2B C0 sub ax,ax
313 024A CC int 3
314 uncryptadd _unpack_crypt13,0663h
1 315 024B BB 025Cr mov bx,OFFSET _unpack_crypt13
1 316 024E B8 0663 mov ax,0663h
1 317 0251 B9 011E mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt13)/2
1 318 0254 29 07 ??0007: sub ds:[bx],ax
1 319 0256 83 C3 02 add bx,2
1 320 0259 49 dec cx
1 321 025A 75 F8 jnz ??0007
322 025C _unpack_crypt13 LABEL BYTE
323 ;calc checksum of exe start
324 025C 33 D2 xor dx,dx
325 025E 2E: C6 06 0114r 43 mov byte ptr cs:int1code,43h ;INC BX
326 calccrc _unpack_crc0,_unpack_crc1
1 327 0264 B9 0098 mov cx,OFFSET _unpack_crc1-OFFSET _unpack_crc0
1 328 0267 BE 0091r mov si,OFFSET _unpack_crc0
1 329 026A 2E: 02 14 ??0008: add dl,cs:[si]
1 330 026D 80 D6 00 adc dh,0
1 331 0270 D1 C2 rol dx,1
1 332 0272 46 inc si
1 333 0273 E2 F5 loop ??0008
334 uncryptadd _unpack_crypt14,0 ;dx
1 335 0275 BB 0286r mov bx,OFFSET _unpack_crypt14
1 336 0278 B8 0000 mov ax,0
1 337 027B B9 0109 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt14)/2
1 338 027E 29 07 ??0009: sub ds:[bx],ax
1 339 0280 83 C3 02 add bx,2
1 340 0283 49 dec cx
1 341 0284 75 F8 jnz ??0009
342 0286 _unpack_crypt14 LABEL BYTE
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 7
unpack.ASM
343 uncryptxor _unpack_crypt15,5CACh
1 344 0286 BB 0297r mov bx,OFFSET _unpack_crypt15
1 345 0289 B8 5CAC mov ax,5CACh
1 346 028C B9 0100 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt15)/2
1 347 028F 31 07 ??000A: xor ds:[bx],ax
1 348 0291 83 C3 02 add bx,2
1 349 0294 49 dec cx
1 350 0295 75 F8 jnz ??000A
351 0297 _unpack_crypt15 LABEL BYTE
352 0297 2E: C6 06 0114r 40 mov byte ptr cs:int1code,40h ;INC AX
353 029D 2B C0 sub ax,ax
354 029F CC int 3
355 uncryptadd _unpack_crypt16,3FACh
1 356 02A0 BB 02B1r mov bx,OFFSET _unpack_crypt16
1 357 02A3 B8 3FAC mov ax,3FACh
1 358 02A6 B9 00F3 mov cx,(OFFSET _unpack_endcrypt-OFFSET _unpack_crypt16)/2
1 359 02A9 29 07 ??000B: sub ds:[bx],ax
1 360 02AB 83 C3 02 add bx,2
1 361 02AE 49 dec cx
1 362 02AF 75 F8 jnz ??000B
363 02B1 _unpack_crypt16 LABEL BYTE
364 02B1 2E: C7 06 01D4r + mov word ptr cs:innerstack,OFFSET execute
365 02BCr
366 02B8 2B C0 sub ax,ax
367 02BA CC int 3
368 02BB C3 ret
369 02BC step5 ENDP
370
371 ALIGN 2
372
373 02BC execute PROC NEAR
374 ;unpack data
375 02BC 2E: 8B 16 000Ar mov dx,cs:pntds2
376 02C1 83 C2 10 add dx,10h
377 02C4 33 F6 xor si,si
378 02C6 33 FF xor di,di
379 02C8 2E: 83 3E 0482r 00 cmp cs:mcrcon,0
380 02CE 74 21 je exec11
381 ;calc machine crc
382 02D0 B8 FF00 mov ax,0ff00h
383 02D3 8E D8 mov ds,ax
384 02D5 BB 0000 mov bx,0
385 02D8 B9 0400 mov cx,1024
386 02DB 03 37 mcrc1: add si,ds:[bx]
387 02DD 03 7F 02 add di,ds:[bx+2]
388 02E0 D1 C6 rol si,1
389 02E2 83 C3 04 add bx,4
390 02E5 E2 F4 loop mcrc1
391 02E7 2E: 03 36 0084r add si,cs:disk0
392 02EC 2E: 03 3E 0086r add di,cs:disk1
393 02F1 2E: 03 36 0466r exec11: add si,cs:regcs
394 02F6 2E: 03 3E 0468r add di,cs:regip
395 02FB 2E: 03 36 046Cr add si,cs:regsp
396 0300 2E: 03 3E 046Ar add di,cs:regss
397 0305 2E: 03 36 0480r add si,cs:regkey
398 030A 2E: 03 3E 0480r add di,cs:regkey
399 030F 2E: 8B 0E 046Er mov cx,cs:regcs0
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 8
unpack.ASM
400 0314 8E DA exec1: mov ds,dx
401 0316 29 36 0000 sub ds:[0],si
402 031A 29 3E 0002 sub ds:[2],di
403 031E 81 F6 5354 xor si,5354h
404 0322 81 F7 1525 xor di,1525h
405 0326 29 36 0004 sub ds:[4],si
406 032A 29 3E 0006 sub ds:[6],di
407 032E 81 C6 1234 add si,1234h
408 0332 D1 CE ror si,1
409 0334 81 C7 4321 add di,4321h
410 0338 D1 C7 rol di,1
411 033A 29 36 0008 sub ds:[8],si
412 033E 29 3E 000A sub ds:[10],di
413 0342 81 F6 5354 xor si,5354h
414 0346 81 F7 1525 xor di,1525h
415 034A 29 36 000C sub ds:[12],si
416 034E 29 3E 000E sub ds:[14],di
417 0352 81 C6 1234 add si,1234h
418 0356 D1 CE ror si,1
419 0358 81 C7 4321 add di,4321h
420 035C D1 C7 rol di,1
421 035E 42 inc dx
422 035F 03 36 0000 add si,ds:[0]
423 0363 03 3E 0008 add di,ds:[8]
424 0367 03 36 0002 add si,ds:[2]
425 036B 03 3E 000A add di,ds:[10]
426 036F 03 36 0004 add si,ds:[4]
427 0373 03 3E 000C add di,ds:[12]
428 0377 03 36 0006 add si,ds:[6]
429 037B 03 3E 000E add di,ds:[14]
430 037F E2 93 loop exec1
431 0381 BD 0470r mov bp,OFFSET errormsg1
432 0384 2E: 3B 36 0484r cmp si,cs:keychk0
433 0389 75 7D jne error
434 038B 2E: 3B 3E 0486r cmp di,cs:keychk1
435 0390 75 76 jne error
436 0392 FC cld
437 0393 _endzeroing LABEL BYTE ;may overflow a byte, but who cares
438 0393 2E: 8B 16 000Ar mov dx,cs:pntds2
439 0398 8C C8 mov ax,cs
440 039A 8E C0 mov es,ax
441 039C B9 012D mov cx,(OFFSET _endzeroing-OFFSET _startzeroing+1)/2
442 039F BF 0139r mov di,OFFSET _startzeroing
443 03A2 B8 2E2E mov ax,'..'
444 03A5 F3> AB rep stosw
445 03A7 E8 00A9 call resetints
446 03AA 2E: A0 0009r mov al,cs:io21data
447 03AE E6 21 out 21h,al
448 03B0 8C C8 mov ax,cs
449 03B2 8E C0 mov es,ax
450 03B4 B9 0133 mov cx,OFFSET _startzeroing-OFFSET _unpack_code
451 03B7 BF 0006r mov di,OFFSET _unpack_code
452 03BA B0 2E mov al,'.'
453 03BC F3> AA rep stosb
454 ;load stack and cs:ip for the actual program and run it.
455 03BE 8E DA mov ds,dx
456 03C0 8E C2 mov es,dx
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 9
unpack.ASM
457 03C2 8C CB mov bx,cs
458 03C4 2E: 8B 0E 046Er mov cx,cs:regcs0
459 03C9 2E: A1 046Ar mov ax,cs:regss
460 03CD 03 C3 add ax,bx
461 03CF 2B C1 sub ax,cx
462 03D1 8E D0 mov ss,ax
463 03D3 2E: 8B 26 046Cr mov sp,cs:regsp
464 03D8 2E: 01 1E 0466r add cs:regcs,bx
465 03DD 2E: 29 0E 0466r sub cs:regcs,cx
466 03E2 2E: FF 36 0466r push cs:regcs
467 03E7 2E: FF 36 0468r push cs:regip
468 03EC 2E: A3 0466r mov cs:regcs,ax
469 03F0 2E: A3 0468r mov cs:regip,ax
470 03F4 2E: A3 046Ar mov cs:regss,ax
471 03F8 2E: A3 046Er mov cs:regcs0,ax
472 03FC 2E: A3 0486r mov cs:keychk1,ax
473 0400 2E: A3 0480r mov cs:regkey,ax
474 0404 FB sti
475 0405 E9 008F jmp endprg2
476
477 0408 _endzeroing2 LABEL BYTE
478 0408 error: ;destroy and exit with error at OFFSET BP
479 0408 FC cld
480 0409 2E: 8B 16 000Ar mov dx,cs:pntds2
481 040E 8C C8 mov ax,cs
482 0410 8E C0 mov es,ax
483 0412 B9 0168 mov cx,(OFFSET _endzeroing2-OFFSET _startzeroing+1)/2
484 0415 BF 0139r mov di,OFFSET _startzeroing
485 0418 B8 2E2E mov ax,'..'
486 041B F3> AB rep stosw
487 041D E8 0033 call resetints
488 0420 2E: A0 0009r mov al,cs:io21data
489 0424 E6 21 out 21h,al
490 0426 8C C8 mov ax,cs
491 0428 8E C0 mov es,ax
492 042A BF 0006r mov di,OFFSET _unpack_code
493 042D B9 0133 mov cx,OFFSET _startzeroing-OFFSET _unpack_code
494 0430 B0 2E mov al,'.'
495 0432 F3> AA rep stosb
496 0434 2E: A3 0466r mov cs:regcs,ax
497 0438 2E: A3 0468r mov cs:regip,ax
498 043C 2E: A3 046Ar mov cs:regss,ax
499 0440 2E: A3 046Er mov cs:regcs0,ax
500 0444 2E: A3 0486r mov cs:keychk1,ax
501 0448 2E: A3 0480r mov cs:regkey,ax
502 044C BC 0466r mov sp,OFFSET _unpack_data
503 044F FB sti
504 0450 EB 36 90 jmp endprg1
505 0453 execute ENDP
506
507 0453 resetints PROC NEAR
508 ;reset interrupts
509 0453 33 C0 xor ax,ax
510 0455 8E C0 mov es,ax
511 0457 BE 0129r mov si,OFFSET itable
512 045A 33 FF xor di,di
513 045C B9 0008 mov cx,itablelen*2
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 10
unpack.ASM
514 045F 2E: st20a: segcs
515 0460 AD lodsw
516 0461 AB stosw
517 0462 E2 FB loop st20a
518 0464 C3 ret
519 0465 resetints ENDP
520
521 0465 90 ALIGN 2
522 0466 _unpack_data LABEL BYTE
523 0466 farjump LABEL DWORD
524 0466 0000 regcs dw 0
525 0468 0000 regip dw 0
526 046A 0000 regss dw 0
527 046C 0000 regsp dw 0
528 046E 0000 regcs0 dw 0
529 0470 46 69 6C 65 20 63 6F+ errormsg1 db 'File corrupted!$'
530 72 72 75 70 74 65 64+
531 21 24
532 0480 _unpack_data2 LABEL BYTE
533 0480 0000 regkey dw 0
534 0482 0000 mcrcon dw 0 ;1=machine crc enabled
535 0484 0000 keychk0 dw 0
536 0486 0000 keychk1 dw 0
537 0488 _unpack_dataend LABEL BYTE
538
539 ALIGN 2
540
541 0488 endprg1: ;****************
542 0488 8B D5 mov dx,bp
543 048A 8C C8 mov ax,cs
544 048C 8E D8 mov ds,ax
545 048E B4 09 mov ah,9h
546 0490 CD 21 int 21h
547 0492 B8 4C03 mov ax,4c03h
548 0495 CD 21 int 21h
549 0497 endprg2: ;****************
550 0497 CB retf
551
552 ALIGN 2
553 0498 _unpack_endcrypt LABEL BYTE
554 0498 00 FC db 000h,0fch
555 049A _unpack_end LABEL BYTE
556 049A unp_text ENDS
557 END
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 11
Symbol Table
Symbol Name Type Value
??0000 Near UNP_TEXT:00FB
??0001 Near UNP_TEXT:018F
??0002 Near UNP_TEXT:01A0
??0003 Near UNP_TEXT:01CB
??0004 Near UNP_TEXT:01E2
??0005 Near UNP_TEXT:0229
??0006 Near UNP_TEXT:023A
??0007 Near UNP_TEXT:0254
??0008 Near UNP_TEXT:026A
??0009 Near UNP_TEXT:027E
??000A Near UNP_TEXT:028F
??000B Near UNP_TEXT:02A9
??DATE Text "05/06/93"
??FILENAME Text "unpack "
??TIME Text "20:32:49"
??VERSION Number 0205
@CPU Text 0101H
@CURSEG Text UNP_TEXT
@FILENAME Text UNPACK
@WORDSIZE Text 2
DISK0 Word UNP_TEXT:0084
DISK1 Word UNP_TEXT:0086
ENDPRG1 Near UNP_TEXT:0488
ENDPRG2 Near UNP_TEXT:0497
ERROR Near UNP_TEXT:0408
ERRORMSG1 Byte UNP_TEXT:0470
EXEC1 Near UNP_TEXT:0314
EXEC11 Near UNP_TEXT:02F1
EXECUTE Near UNP_TEXT:02BC
FARJUMP Dword UNP_TEXT:0466
HBOOTTXT Byte UNP_TEXT:008A
HBOOTTXT2 Byte UNP_TEXT:01AD
I1C0 Near UNP_TEXT:01EA
I1C1 Near UNP_TEXT:0205
I1C2 Near UNP_TEXT:0218
INNERSTACK Byte UNP_TEXT:01D4
INT1 Near UNP_TEXT:0115
INT1CODE Near UNP_TEXT:0114
INT2 Near UNP_TEXT:0118
INT3 Near UNP_TEXT:0116
INTS Far UNP_TEXT:0104
INTS000 Near UNP_TEXT:0129
INT_01 Near UNP_TEXT:0104
INT_03 Near UNP_TEXT:0105
INT_IRET Far UNP_TEXT:000F
IO21DATA Byte UNP_TEXT:0009
ISMDA Near UNP_TEXT:00CD
ITABLE Word UNP_TEXT:0129
ITABLELEN Number 0004
JJJ1 Near UNP_TEXT:00BC
KEYCHK0 Word UNP_TEXT:0484
KEYCHK1 Word UNP_TEXT:0486
MCRC1 Near UNP_TEXT:02DB
MCRCON Word UNP_TEXT:0482
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 12
Symbol Table
NOPROT Near UNP_TEXT:00DC
NOT86 Near UNP_TEXT:00E0
PNTDS Word UNP_TEXT:008F
PNTDS2 Word UNP_TEXT:000A
REGCS Word UNP_TEXT:0466
REGCS0 Word UNP_TEXT:046E
REGIP Word UNP_TEXT:0468
REGKEY Word UNP_TEXT:0480
REGSP Word UNP_TEXT:046C
REGSS Word UNP_TEXT:046A
RESETINTS Near UNP_TEXT:0453
ST20A Near UNP_TEXT:045F
ST2A Near UNP_TEXT:0153
STARTUP Near UNP_TEXT:0006
STCK1 Near UNP_TEXT:007E
STCK1TO Word UNP_TEXT:01AB
STEP1 Near UNP_TEXT:0091
STEP2 Near UNP_TEXT:0139
STEP3 Near UNP_TEXT:00EB
STEP4 Near UNP_TEXT:017E
STEP5 Near UNP_TEXT:01D6
STEPX1 Near UNP_TEXT:017A
STP4O Near UNP_TEXT:01B2
VRAM Word UNP_TEXT:0088
_ENDZEROING Byte UNP_TEXT:0393
_ENDZEROING2 Byte UNP_TEXT:0408
_STARTZEROING Byte UNP_TEXT:0139
_UNPACK_CODE Byte UNP_TEXT:0006
_UNPACK_CRC0 Byte UNP_TEXT:0091
_UNPACK_CRC1 Byte UNP_TEXT:0129
_UNPACK_CRYPT1 Byte UNP_TEXT:017E
_UNPACK_CRYPT10 Byte UNP_TEXT:01EA
_UNPACK_CRYPT11 Byte UNP_TEXT:0231
_UNPACK_CRYPT12 Byte UNP_TEXT:0242
_UNPACK_CRYPT13 Byte UNP_TEXT:025C
_UNPACK_CRYPT14 Byte UNP_TEXT:0286
_UNPACK_CRYPT15 Byte UNP_TEXT:0297
_UNPACK_CRYPT16 Byte UNP_TEXT:02B1
_UNPACK_CRYPT2 Byte UNP_TEXT:0197
_UNPACK_CRYPT3 Byte UNP_TEXT:01A8
_UNPACK_CRYPT4 Byte UNP_TEXT:01D4
_UNPACK_DATA Byte UNP_TEXT:0466
_UNPACK_DATA2 Byte UNP_TEXT:0480
_UNPACK_DATAEND Byte UNP_TEXT:0488
_UNPACK_END Byte UNP_TEXT:049A
_UNPACK_ENDCRYPT Byte UNP_TEXT:0498
_UNPACK_STACK0 Byte UNP_TEXT:0010
_UNPACK_STACK1 Byte UNP_TEXT:0074
_UNPACK_START Byte UNP_TEXT:0000
Macro Name
CALCCRC
UNCRYPTADD
UNCRYPTXOR
Turbo Assembler Version 2.5 05/06/93 20:32:49 Page 13
Symbol Table
Groups & Segments Bit Size Align Combine Class
UNP_TEXT 16 049A Para Public CODE

BIN
FCP/UNPACK.OBJ Normal file

Binary file not shown.

1
FCP/ZIP.BAT Normal file
View file

@ -0,0 +1 @@
pkzip %1 *.c *.asm fcp