int sendfile(int sockfd,int fd) { char buf[LEN]; int nread,count=0; int size=file_size_fd(fd); while((nread=Read(fd,buf,sizeof(buf)))>0) { Writen(sockfd,buf,nread); count+=nread; progress_bar((count/size)*100); } return 0; }
// WTF int main(int argc, char **argv) { ut64 i, c, src; ut64 offset = 0; ut64 from = 1, to = INT_MAX; ut64 sa; if (argc==2) if (!strcmp(argv[1],"-V")) { printf("%s\n", VERSION); return 0; } if (argc<3) return show_usage(); /* parse arguments */ while ((c = getopt(argc, argv, "qa:d:hves:f:t:r:X:b:")) != -1) { switch( c ) { case 'q': quite = 1; break; case 'a': if (!strcmp(optarg, "intel")) arch = ARCH_X86; else if (!strcmp(optarg, "x86")) arch = ARCH_X86; else if (!strcmp(optarg, "arm")) arch = ARCH_ARM; else if (!strcmp(optarg, "ppc")) { arch = ARCH_PPC; } else { printf("arm ppc x86\n"); return 1; } break; case 'b': base = get_value32(optarg); break; case 'd': delta = get_value32(optarg); break; case 'X': xylum = get_value32(optarg); break; case 'e': endian = 1; break; case 'r': range = get_value32(optarg); if (range<0) range = -range; break; case 'v': verbose = 1; break; case 'f': from = get_value32(optarg); break; case 't': to = get_value32(optarg); break; case 's': size = get_value32(optarg); break; case 'h': return show_usage(); } } if (optind+2 != argc) { fprintf(stderr, "Plz. gimmie a file and offset.\n"); return 1; } /* openning stuff */ src = open(argv[optind], O_RDONLY); if (src == -1) { fprintf(stderr, "Cannot open file source %s\n", argv[optind]); return -1; } offset = get_value32(argv[optind+1]); if (offset >= base) offset -= base; sa = file_size_fd(src) - size; #if __UNIX__ ma = mmap(NULL, sa, PROT_READ, MAP_SHARED, src, 0); if (sa < 0x50) { fprintf(stderr, "Minimum length is 0x50 bytes.\n"); return 1; } #elif __WINDOWS__ fprintf(stderr, "Not yet implemented\n"); #else fprintf(stderr, "No MMAP for this platform? report it!\n"); #endif if (!ma) { perror("Error mmaping"); fprintf(stderr, "cannot open %s\n", argv[optind]); return 1; } /* configure environment */ sysendian = get_system_endian(); while( set_arch_settings() ); if (endian == -1) endian = 0; /* loopize looking for xrefs */ for(i=from; i<sa && i<to; i++) { ut32 value = offset - i + delta; ut32 ovalue = value; ut32 tmpvalue = 0; unsigned char *buf = (unsigned char *)&value; if (range!=0) { if (value<0 && -value>range) continue; else if (value>0 && value>range) continue; } if (verbose) printf("0x%08"PFMT64x" try %02x %02x %02x %02x (0x%08"PFMT64x") - %"PFMT64d"\n", (ut64)i, buf[0], buf[1], buf[2], buf[3], (ut64) base+value, (ut64) (base+value)); if (xylum && i == xylum) { printf("# offset: 0x%08"PFMT64x"\n", (ut64)i); printf("# delta: %"PFMT64d"\n", (ut64)delta); printf("# size: %"PFMT64d"\n", (ut64)size); printf("# value: %"PFMT64d"\n", (ut64)value); printf("# bytes: %02x %02x %02x %02x (0x%08"PFMT64x") - %"PFMT64d"\n", buf[0], buf[1], buf[2], buf[3], (ut64)value, (ut64)value); tmpvalue = ma[i+gamme]; printf("# found: %02x %02x %02x %02x\n", ma[i+gamme+0], ma[i+gamme+1], ma[i+gamme+2], ma[i+gamme+3]); } switch(arch) { case ARCH_ARM: value = (value-8)/4; break; case ARCH_X86: value-=5; break; default: break; } // force little endian // if (sysendian) { unsigned char tmp; tmp = buf[0]; buf[0]= buf[3]; buf[3] = tmp; tmp = buf[1]; buf[1]= buf[2]; buf[2] = tmp; } // target architecture endian // if (endian) { unsigned char tmp; tmp = buf[0]; buf[0] = buf[3]; buf[3] = tmp; tmp = buf[1]; buf[1] = buf[2]; buf[2] = tmp; } if (arch==ARCH_ARM) { buf[3] = buf[2]; buf[2] = buf[1]; buf[1] = buf[0]; } if (xylum && ovalue == xylum) { printf("# buf: %02x %02x %02x %02x (+%"PFMT64d")\n", buf[0], buf[1], buf[2], buf[3], (ut64)(4-size)); printf("# map: %02x %02x %02x \n", ma[i+gamme], ma[i+1+gamme], ma[i+2+gamme]); printf("# cmp: %02x %02x %02x\n", ma[i], ma[i+1], ma[i+2]); } if (xylum && i == xylum) { printf("# a: %02x %02x %02x %02x\n", ma[i+gamme+0], ma[i+gamme+1], ma[i+gamme+2], ma[i+gamme+3]); printf("# b: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]); } if (memcmp((unsigned char *)ma+i+gamme, (unsigned char *)buf+(4-size), size) == 0) { if (quite) printf("0x%08"PFMT64x"\n", (ut64)i); else printf("match value 0x%08"PFMT64x" (%02x%02x%02x) at offset 0x%08"PFMT64x"\n", (ut64)ovalue, buf[0+(4-size)], buf[1+(4-size)], buf[2+(4-size)], (ut64)((ut32)i)+((gamme<0)?-1:0)); found++; } } if (found == 0 && !quite) puts("no matches found."); return 0; }