#include <conio.h> #include <string.h> #include <stdio.h> #include <all312.h> #define VERZIA "1.1" void uloz_do_logu(char name[256]); typedef struct SUBOR{ int start; int size; char type; }SUBOR; SUBOR subor[10000]; short num_sub; PACKFILE *s; unsigned char buff[65536+50]; unsigned char buff1[51]; long length; void about_fh() { char tbuf[70]; _box_maker(20,8,60,17,15,7,"About"); textcolor(0); gotoxy(40,10); outtext_centre("Universal File Hacker"); sprintf(tbuf,"version %s (%s,%s)",VERZIA,__DATE__,__TIME__); gotoxy(40,11); outtext_centre(tbuf); gotoxy(40,13); outtext_centre("By Samuel Kupka, IdeaZ 2000"); gotoxy(40,14); outtext_centre("!!! FREEWARE !!!"); textcolor(5); gotoxy(40,16); outtext_centre("Press Enter"); while(!key[KEY_ENTER]); _delete_box(); clear_keybuf(); } void najdi(long pos) { int i; i=look_in_database(buff1); if(i>=0){ subor[num_sub].start=pos-50; subor[num_sub].type=i; num_sub++; } } void prehladaj(char filename[256]) { long l,t,r,i; char tbuf[30]; float per; s=pack_fopen(filename,F_READ); if(s==NULL){ koniec("Error reading file!"); } l=file_size(filename); length=l; t=0; _box_maker(37,16,77,22,14,1,"Reading"); gotoxy(57,18); outtext_centre("0 bytes read (0.0%%)"); textcolor(7+128); gotoxy(57,21); outtext_centre("Press ESC to cancel"); while(l>0){ if(l>65536) r=65536; else r=l; memcpy(buff,buff+65536,50); pack_fread(buff+50,r,s); for(i=0;i<r;i++){ memcpy(buff1,buff+i,50); najdi(t+i); if(key[KEY_ESC]){l=-1;i=r;} } t+=r; l-=r; gotoxy(57,18); per=(float)t/(float)length; sprintf(tbuf,"%ld bytes read (%3.1f%%)",t,per*100); textcolor(14); outtext_centre(tbuf); sprintf(tbuf,"%d file(s) found",num_sub); gotoxy(57,19); textcolor(11); outtext_centre(tbuf); if(key[KEY_ESC]) l=-1; } pack_fclose(s); if(l==0){ uloz_do_logu(filename); textcolor(10); gotoxy(57,21); outtext_centre("Press ENTER to continue"); while(!key[KEY_ENTER]); } _delete_box(); clear_keybuf(); if(l==-1){ koniec("Reading is not completed!"); } } char sel[10000]; short num_sel; void extract_files(char filename[128]) { int ext=0,op=0; FILE *out,*f; char tbuf[80]; int i,r,l; if(num_sel==0){ nekoniec("No files selected!"); return; } if(sel[0]==-1){ nekoniec("First file can't be part of other file!"); return; } for(i=0;i<num_sub-1;i++) subor[i].size=subor[i+1].start-subor[i].start; subor[num_sub-1].size=file_size(filename)-subor[num_sub-1].start; f=fopen(filename,"rb"); if(f==0) koniec("Disk read error!"); _box_maker(37,16,77,22,14,1,"Extracting"); gotoxy(57,18); outtext_centre("0 files extracted"); for(i=0;i<num_sub;i++){ if(sel[i]==1){ if(op==1){ fclose(out); op=0; gotoxy(57,18); sprintf(tbuf,"%d files extracted",ext); outtext_centre(tbuf); } sprintf(tbuf,"file%04d.",i); dopln_ext(tbuf,subor[i].type); ext++; out=fopen(tbuf,"wb+"); if(out==0) koniec("Write error"); op=1; gotoxy(57,19); outtext_centre(tbuf); fseek(f,subor[i].start,0); l=subor[i].size; while(l>0){ if(l>65536) r=65536; else r=l; fread(buff,r,1,f); fwrite(buff,r,1,out); l-=r; } } if(sel[i]==0){ if(op==1){ fclose(out); op=0; gotoxy(57,18); sprintf(tbuf,"%d files extracted",ext); outtext_centre(tbuf); } } if(sel[i]==-1){ fseek(f,subor[i].start,0); l=subor[i].size; while(l>0){ if(l>65536) r=65536; else r=l; fread(buff,r,1,f); fwrite(buff,r,1,out); l-=r; } } } if(op==1) fclose(out); fclose(f); gotoxy(57,18); sprintf(tbuf,"%d files extracted",ext); outtext_centre(tbuf); textcolor(10); gotoxy(57,21); outtext_centre("Press Enter"); while(!key[KEY_ENTER]); _delete_box(); clear_keybuf(); } void upload_files(char filename[128]) { int ext=0; FILE *out,*f; char tbuf[80],op=0; int i,r,l; if(num_sel==0){ nekoniec("No files selected!"); return; } if(sel[0]==-1){ nekoniec("First file can't be part of other file!"); return; } for(i=0;i<num_sub-1;i++) subor[i].size=subor[i+1].start-subor[i].start; subor[num_sub-1].size=file_size(filename)-subor[num_sub-1].start; f=fopen(filename,"r+b"); if(f==0) koniec("Disk read error!"); _box_maker(37,16,77,22,14,1,"Uploading"); gotoxy(57,18); outtext_centre("0 files uploaded"); for(i=0;i<num_sub;i++){ if(sel[i]==1){ if(op==1){ fclose(out); op=0; gotoxy(57,18); sprintf(tbuf,"%d files uploaded",ext); outtext_centre(tbuf); } sprintf(tbuf,"file%04d.",i); dopln_ext(tbuf,subor[i].type); if(exists(tbuf)){ ext++; out=fopen(tbuf,"rb"); if(out==0) koniec("Read error"); op=1; gotoxy(57,19); outtext_centre(tbuf); fseek(f,subor[i].start,0); l=file_size(tbuf); while(l>0){ if(l>65536) r=65536; else r=l; fread(buff,r,1,out); fwrite(buff,r,1,f); l-=r; } } } if(sel[i]==0){ if(op==1){ fclose(out); op=0; gotoxy(57,18); sprintf(tbuf,"%d files uploaded",ext); outtext_centre(tbuf); } } if(sel[i]==-1){ fseek(f,subor[i].start,0); l=subor[i].size; while(l>0){ if(l>65536) r=65536; else r=l; fread(buff,r,1,f); fwrite(buff,r,1,out); l-=r; } } } if(op==1) fclose(out); fclose(f); gotoxy(57,18); sprintf(tbuf,"%d files extracted",ext); outtext_centre(tbuf); textcolor(10); gotoxy(57,21); outtext_centre("Press Enter"); while(!key[KEY_ENTER]); _delete_box(); clear_keybuf(); } static char *typez[]={ "part of previous file", "unselected ", "selected " }; char mainmenu() { short c=1,n=0,f=0,i; char k=1; _box_maker(3,3,11,23,14,1,"Num"); _box_maker(12,3,20,23,14,1,"Ext"); _box_maker(21,3,41,23,14,1,"Filetype"); _box_maker(45,3,77,13,15,1,"Fileinfo"); _box_maker(45,15,77,23,10,3,"Extract info"); textcolor(14);textbackground(1); gotoxy(47,4);cprintf("Number"); gotoxy(47,5);cprintf("Extension"); gotoxy(47,7);cprintf("Type"); gotoxy(47,9);cprintf("Start position"); gotoxy(47,11);cprintf("Flag"); textbackground(3);textcolor(15); gotoxy(61,17); outtext_centre("Total files"); gotoxy(61,20); outtext_centre("Selected files"); textcolor(14); gotoxy(59,18);cprintf("%05d",num_sub); memset(sel,1,10000); num_sel=num_sub; while(k==1){ if(c==1){ for(i=0;i<19;i++){ if(i+n>=num_sub) break; if(sel[i+n]==1) textcolor(15); if(sel[i+n]==0) textcolor(12); if(sel[i+n]==-1) textcolor(8); if(f==i) textbackground(0); else textbackground(1); gotoxy(4,i+4); cprintf(" %05d ",i+n); draw_info_from_db(subor[i+n].type,i+4); } textcolor(11);textbackground(1); gotoxy(63,4);cprintf("%05d",f+n); draw_info_extended_db(subor[f+n].type); gotoxy(50,10);cprintf("%09d",subor[f+n].start); gotoxy(50,12);cprintf("%s",typez[sel[f+n]+1]); textcolor(14);textbackground(3); gotoxy(59,21);cprintf("%05d",num_sel); c=0; } if(key[KEY_DOWN]){ c=1; f++; if(n+f>=num_sub){ f--; c=0; } if(f>=19){ f=18; n++; if(n+f>=num_sub){ n--; c=0; } } } if(key[KEY_INSERT]&&sel[n+f]>=0){ sel[n+f]=!sel[n+f]; if(sel[n+f]==0) num_sel--; else num_sel++; c=1; f++; if(n+f>=num_sub){ f--; } if(f>=19){ f=18; n++; if(n+f>=num_sub){ n--; } } } if(key[KEY_DEL]){ if(sel[n+f]>=0){ if(sel[n+f]==1) num_sel--; sel[n+f]=-1; } else sel[n+f]=0; c=1; f++; if(n+f>=num_sub){ f--; } if(f>=19){ f=18; n++; if(n+f>=num_sub){ n--; } } } if(key[KEY_HOME]){ n=0;f=0;c=1; } if(key[KEY_END]){ if(num_sub<19){ n=0;f=num_sub-1;c=1; } else{ f=18; n=num_sub-19; c=1; } } if(key[KEY_PGUP]){ c=1; for(i=0;i<19;i++){ f--; if(f<0){ f=0; n--; if(n+f<0){ n++; break; } } } } if(key[KEY_PGDN]){ c=1; for(i=0;i<19;i++){ f++; if(n+f>=num_sub){ f--; break; } if(f>=19){ f=18; n++; if(n+f>=num_sub){ n--; break; } } } } if(key[KEY_UP]){ c=1; f--; if(f<0){ f=0; n--; if(n+f<0){ n++; c=0; } } } clear_keybuf(); if(key[KEY_F1]) about_fh(); if(key[KEY_F3]) k=0; if(key[KEY_F5]) k=2; if(key[KEY_F6]) k=3; if(key[KEY_ESC]) k=-1; } _delete_box(); _delete_box(); _delete_box(); _delete_box(); _delete_box(); return k; } int nacitaj_z_logu(char name[256]) { char fname[256]=""; replace_extension(fname,name,"fhl",255); if(exists(fname)==0) return 0; s=pack_fopen(fname,F_READ); if(s==0) return 0; num_sub=pack_igetw(s); pack_fread(subor,sizeof(SUBOR)*num_sub,s); pack_fclose(s); return 1; } void uloz_do_logu(char name[256]) { char fname[256]=""; replace_extension(fname,name,"fhl",255); s=pack_fopen(fname,F_WRITE); if(s==0) return; pack_iputw(num_sub,s); pack_fwrite(subor,sizeof(SUBOR)*num_sub,s); pack_fclose(s); } int main(int argc,char *argv[]) { char k=0,a=0; allegro_init(); install_keyboard(); make_background(); load_database(); // perfect stuff if(argc!=2){ koniec("Usage: FILEHACK.EXE file.in"); } while(k!=-1){ if(k==0){ num_sub=0; if(a==0){ if(nacitaj_z_logu(argv[1])==0) prehladaj(argv[1]); a=1; } else prehladaj(argv[1]); if(num_sub==0) koniec("No files found!"); } k=mainmenu(); if(k==2) extract_files(argv[1]); if(k==3) upload_files(argv[1]); } koniec1(); }