/* A simple tool that allows you to dump all the physical memory (RAM) */
/* For more visit: http://vx.netlux.org/wargamevx */
/* greetz: undernet @ #eof-project,#virus and to non3x for the testing */

/* Tested on:
   2.6.20-1.2320.fc5smp i686 athlon
   2.6.22-gentoo-r5 i686 AMD Turion(tm) 64 X2 Mobile Technology TL-50 */
   

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

void Printable(char *str,int size)
{
	int lm = 0;
	while(lm < size)
	{
		if(isprint(str[lm]))
			printf("%c",str[lm]);

		lm++;
	}
}

main(int argc,char *argv[])
{
	int fd,only_print;
	unsigned char *buf = NULL;
	unsigned int addr,page_size = sysconf(_SC_PAGESIZE),tot_mem = page_size*sysconf(_SC_PHYS_PAGES);

	if(argv[1] == NULL)
	{
		printf("DumpRam v0.1 by [WarGame/DoomRiderz]\n");
		printf("Usage: %s [option]\n",argv[0]);
		printf("option can be:\n");	
		printf("-p = only printable chars\n");
		printf("-e = every byte\n");
		exit(EXIT_FAILURE);
	}

	if(getuid() != 0)
	{
		printf("You must be root\n");
		exit(EXIT_FAILURE);
	}
	
	if(strcmp(argv[1],"-p") == 0)
		only_print = 1;
	else if(strcmp(argv[1],"-e") == 0)
		only_print = 0;
	else
	{
		printf("Invalid option\n");
		exit(EXIT_FAILURE);
	}
	
	fd = open("/dev/mem",O_RDONLY);

	if(fd < 0)
	{
		perror("/dev/mem");
		exit(EXIT_FAILURE);
	}

	printf("\n\n\n\t** RAM size in Kb: %d\n",tot_mem/1024);
	printf("\t** Size of a page in bytes: %d\n\n\n\n\n",page_size);

	if((buf = malloc(page_size)) == NULL)
	{
		perror("malloc()");
		exit(EXIT_FAILURE);
	}

	while(read(fd,buf,page_size) != -1)
	{
		if(only_print)
			Printable(buf,page_size);
		else
			write(0,buf,page_size);
	}

	close(fd);
	free(buf);
}
