#include #include #include #include #include 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;a10) *(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>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>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