⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dumpmem.c

📁 这是个重量级的东西
💻 C
字号:
/*
	dumpmem.c copyright by luobin @2004.6.27
*/

#include "..\typedef\type.h"
#include "..\txlib\txlib.h"

//#define WIN_DEBUG

#include "string.h"
#include "memory.h"

char strHelp[] = "HELP";
char strSpace[] = " ";
#ifdef WIN_DEBUG
// 用于windows调试
#include "stdio.h"

int GetCommand(char * strCommand,char ** argv)
{
	int argcnt = 0;
	char * com = strCommand;
	while(IS_WHITE_SPACE(*com))
		com++;
	
	for( ; *com != 0 ; )
	{
		argv[argcnt++] = com;
		// 找到下一个分段点
		while(!IS_WHITE_SPACE(*com) && *com != 0)
			com++;

		if(*com == 0) break;
		
		*com = 0;
		com++;
		while(IS_WHITE_SPACE(*com))	
			com++;
	}

	return argcnt;
}

char * upcase(char * str)
{
	char * s = str;
	for( ; *s  ; s++)
	{
		if(*s >= 'a' && *s <= 'z')
			*s -= 0x20;
	}
	return str;
}
// 10进制需要考虑符号问题
int atoi10(const char * num)
{
	int retval;
	int base;
	int sign = 0;
	const char * snum;
	
	// 去掉前导空白
	while(IS_WHITE_SPACE(*num))
		num++;

	// 判断符号
	switch(*num)
	{
	case '-':
		sign = 1;
		num++;
		break;
	case '+':
		num++;
		break;
	}

	snum = num;
	while((!IS_WHITE_SPACE(*snum)) && *snum )
	{
		if(*snum < '0' || *snum > '9')
			return 0;
		snum++;
	}
	snum--;
	retval = 0;
	base = 1;
	for( ; snum >= num ; snum--)
	{
		retval += (*snum - '0') * base;
		base *= 10;
	}

	return sign?(-retval):retval;
}
unsigned int atoi16(const char * num)
{
	unsigned int retval;
	unsigned int base;
	const char * snum;
	
	// 去掉前导空白
	while(IS_WHITE_SPACE(*num))
		num++;

	if(!(num[0] == '0' && ( num[1] == 'x' || num[1] == 'X')))
		return 0;
	num += 2;
	snum = num ;
	while((!IS_WHITE_SPACE(*snum)) && *snum )
	{
		if((*snum >= '0' && *snum <= '9') ||
			(*snum >= 'a' && *snum <= 'f') ||
			(*snum >= 'A' && *snum <= 'F') )
		{
			snum++;
		}
		else
			return 0;
	}

	snum--;	
	retval = 0;	
	base = 1;

	for( ; snum >= num ; snum--)
	{
		if(*snum >= '0' && *snum <= '9')
			retval += (unsigned int)(*snum - '0') * base;
		else if(*snum >= 'a' && *snum <= 'f') 
			retval += (unsigned int)(*snum - 'a' + 10) * base;
		else if(*snum >= 'A' && *snum <= 'F') 
			retval += (unsigned int)(*snum - 'A' + 10) * base;
		base *= 16;
	}
	return retval; 
}
int IsHex(char * strNumber)
{
	char * num = strNumber;


	if(!(num[0] == '0' && (num[1] == 'x' || num[1] == 'X')))
		return 0;
	num += 2;
	for( ; *num != 0 ; num++)
	{
		if(!((*num >= '0' && *num <= '9') || 
			(*num >= 'a' && *num <= 'f') ||
			(*num >= 'A' && *num <= 'F')))
			return 0;
	}

	return 1;
}

int IsDigital(char * strNumber)
{
	char * num = strNumber;


	for( ; *num != 0 ; num++)
	{
		if(*num < '0' || *num > '9')
			return 0;
	}

	return 1;
}

void main()
{
	int argc;
	char * argv[32];
	char com[] = "dumpmem/G etCommand( com,a rgv )etCo m mand(co   m,argv)etCommand(com,argv)";
	//argc = GetCommand(com,argv);
	//DumpMemory(argc,argv);
	DumpMemoryA(com,strlen(com));
}

#else

	#include "txstdio.h"


	#define printf kprintf

#endif // WIN_DEBUG

#include "string.h"

void DumpMemUsage();
int DumpMemoryA(void * buffer,DWORD dwLeng);

int DumpMemory(int argc,char ** argv)
{
	int i = 0;
	char buf[256];

	DWORD dwAddress = 0;
	DWORD dwLeng	= 0;
	DWORD dwHelpFlag= 0;

	for( i = 1 ; i < argc ; i++)
	{
		if(argv[i][0] == '-' || argv[i][0] == '/')
		{
			if(argv[i][1] == 'a' || argv[i][1] == 'A')
			{
				if(IsHex(&(argv[i][3])) == 0){
					printf("memory address invalid,please check it out!");
					return 0;
				}
				dwAddress = atoi16(&(argv[i][3]));
			}
			else if(argv[i][1] == 'l' || argv[i][1] == 'L')
			{
				if(IsDigital(&(argv[i][3])) == 0){
					printf("leng invalid,please check it out!");
					return 0;
				}
				dwLeng = atoi10(&(argv[i][3]));
			}
			else if(argv[i][1] == 'h' || argv[i][1] == 'H')
			{
				upcase(argv[i]);
				if(strcmp(&(argv[i][1]),strHelp) == 0) dwHelpFlag = 1;
				else {
					printf("some parameter invalid,check it out!");
					return 0;
				}
			}
		}
		else{
			printf("some parameter invalid,check it out!");
			return 0;
		}
	}

	if( argc == 1 ) {
		DumpMemUsage();
		return 1;
	}

	if( dwLeng > 256) dwLeng = 256;
	memcpy(buf,(char *)dwAddress,dwLeng);
	if(dwHelpFlag) DumpMemUsage();
	else DumpMemoryA(buf,dwLeng);

	return 0;
}

void DumpMemUsage()
{

	printf("Usage: dumpmem [/a:address],[/l:leng],[/help]\n");
	printf("    address : only use hex , exampl: 0xcdcdcdcd.\n");
	printf("    leng    : only user digital.\n");
	printf("    help    : show how to use.\n");
	printf("    the parameter order can not chang.\n");

}
int DumpMemoryA(void * buffer,DWORD dwLeng)
{
	DWORD l = dwLeng; // 剩余
	DWORD i = 0;
	DWORD j = 0;
	DWORD k = 0;
	char * buf = (char *)buffer;
	int c = 0;
	for ( i = 0 ; i < l ; i++)
	{
		/*c = (buf[i] >> 4) & 0x0f;
		if( c < 10)
			printf("%c",c + '0');
		else
			printf("%c",c - 10 + 'A');

		c = buf[i] & 0x0f;
		if( c < 10)
			printf("%c ",c +'0');
		else
			printf("%c ",c - 10 + 'A');*/

		printf("%02x ",(buf[i])&0xff);

		if( i > 0 && ((i + 1) % 8) == 0)
		{
			if( (( (i + 1) / 8) % 2) == 1)
				printf("-- ");
			else {
				j = i & 0xfffffff0;
				printf("    ");
				for( k = 0 ; k < 16 ; k++)
				{
					c = buf[j + k];
					if(c <= 32 || c >= 127)
						printf("%c",'.');
					else
						printf("%c",c);
				}
				printf(" \n");
			}
		}

	}

	k = i;

	if( (k % 16) < 8)
		printf("   ");
	for ( ; (k % 16) != 0 ; k++)
		printf("   ");

	j = i & 0xfffffff0;
	printf("    ");
	for( k = 0 ; k < (i & 0x0f) ; k++)
		printf("%c",buf[j + k]);
	
	printf(" \n");
	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -