Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}