/********** UnRec V0.1 *******************/ #include #include #include #include typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; void read_header(FILE *fp); WORD head[13]; DWORD start_adr; DWORD fpos, fpos1; void main (int argc, char *vect[]) { FILE *fp; FILE *sp; WORD crypt1, crypt2, anz_cry, header_size, i; char *filename; BYTE dec_inc, anz, low, test; WORD buffer[0x20]; BYTE buf[10]; printf("\nUnRec V0.2 fr REC 0.04\n\n"); if ((vect[1]==NULL) || (argc!=2)) { printf("usage: UNREC \n\n"); exit(1); } filename=vect[1]; if ((fp = fopen(filename,"r+b")) == NULL) exit(0); read_header(fp); fpos = start_adr+6+0x2b8; /* pos auf 0x0F8A */ fseek(fp, fpos, SEEK_SET); fread(buffer, sizeof buffer[0], 3, fp); crypt1 = buffer[0]; dec_inc = (BYTE) (buffer[2]>>8); if ((sp = fopen("out.exe","wb")) == NULL) exit(0); anz_cry = 0x1c5; fpos -= 0x10; /* pos auf 0x0F7A */ fpos -= 0x1CB; /* pos auf 0x0DAF */ fseek(fp, fpos, SEEK_SET); for(i=0;i in out.exe kopieren */ { fread(buffer, sizeof buffer[0], 1, fp); fwrite(buffer, sizeof buffer[0], 1, sp); fpos+=2; if((fpos+1) >= start_adr) { fseek(sp, fpos, SEEK_SET); fseek(fp, fpos, SEEK_SET); fread(buf, sizeof buf[0], 1, fp); fwrite(buf, sizeof buf[0], 1, sp); fpos+=2; } fseek(fp, fpos, SEEK_SET); fseek(sp, fpos, SEEK_SET); }while (fpos < start_adr); fpos = 8; /* pos auf Headergroesse */ fseek(fp, fpos, SEEK_SET); fread(buffer, sizeof buffer[0], 1, fp); header_size = buffer[0] * 0x10; fpos = (DWORD)header_size; fseek(fp, fpos, SEEK_SET); do /* Programmteil entschluesseln */ { fread(buffer, sizeof buffer[0], 1, fp); low = (BYTE) (buffer[0] >>8); buffer[0] = (buffer[0] <<8) + low; buffer[0] = buffer[0] ^ crypt2; fseek(sp, fpos, SEEK_SET); fwrite(buffer, sizeof buffer[0], 1, sp); fpos+=2; if((fpos+1) >= start_adr) { fseek(sp, fpos, SEEK_SET); fseek(fp, fpos,SEEK_SET); fread(buf, sizeof buf[0], 1, fp); fwrite(buf, sizeof buf[0], 1, sp); fpos+=2; } fseek(fp, fpos, SEEK_SET); }while(fpos