滴水逆向作业——指针04

题目1

题目1
方法1:


char data[] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,					
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,					
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,					
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,					
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,					
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,					
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,					
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,					
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,					
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00					
}; 
// 注意memory中小端存储


void search_fun(int type,int num)
{
	char* start = data;
	int length = sizeof(data)/sizeof(data[0]);
	int i = 0;
	while(i<=length-type)   // 例如Type=4 ,四个字节查询一次就行(4-4),五个字节需要查询两次(5-4)注意是小于号
	{
		if(type==4)
		{
			if(num==*(int*)&data[i])
			{
				printf("type = 4  address:%x  data:%d\n",&data[i],int(num));  //必须写int(num),而不是data[i](它不是int型) 
			}
		}
		else if(type==2)
		{
			if(num == *(short*)&data[i])  //(short*)&data[i] 将&data[i]的地址强制转化为short型的,实现一个挨着一字节地查询  
			{
				printf("type = 2  address:%x  data:%d\n",&data[i],short(num));
			}
		}
		else 
		{
			if(num == *(char*)&data[i])
			{
				printf("type = 1  address:%x  data:%d\n",&data[i],char(num));
			}
		}
		i++;
	}
}

int main(int argc, char* argv[])
{	
	printf("data start from:%x\n",data);
	search_fun(4,100);
	getchar();
	return 0;
}

方法2:

char data[] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,					
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,					
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,					
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,					
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,					
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,					
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,					
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,					
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,					
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00					
}; 
// 注意memory中小端存储

void search_type_4(int num, int length)
{	
	int i = 0;
	while(i<=length-4)
	{
		if(num == *(int*)&data[i])
		{
			printf("type = 4  address:%x  data:%d\n",&data[i],int(num));
		}
		i++;
	}
}

void search_type_2(int num,int length)
{
	int i = 0;
	while(i<=length-2)
	{
		if(num == *(short*)&data[i])
		{
			printf("type = 2 address:%x  data:%d\n",&data[i],short(num));
		}
		i++;
	}
}

void search_type_1(int num ,int length)
{	
	int i = 0;
	while(i<=length-1)
	{
		if(num == *(char*)&data[i])
		{
			printf("type = 1 address:%x  data:%d\n",&data[i],char(num));
		}
		i++;
	}
}

void search_fun(int type ,int num)
{
	int length = sizeof(data)/sizeof(data[0]);
	// int i = 0;
	typedef void (*funcptr)(int,int);
	funcptr p;
	
	if(type == 4)
	{
		p = search_type_4;
	}
	else if(type == 2)
	{
		p = search_type_2;
	}
	else
	{
		p = search_type_1;
	}
	p(num,length);
}

int main(int argc, char* argv[])
{	
	printf("data start from:%x\n",data);
	search_fun(1,100);
	getchar();
	return 0;
}

题目2

题目2
1.

char data[]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,              
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,              
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,              
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,              
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,              
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,              
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,              
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,              
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,              
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};

char* find_role_name(char* pData,char* name)
{
	int data_size = sizeof(data)/sizeof(data[0]);
	int name_len = strlen(name);
	int i=0;
	
	for(;i<data_size-name_len;i++)
	{
		if(strncmp(&pData[i],name,name_len)==0)
		{
			return &pData[i];
			break;
		}
	}
	return NULL;
}
/*
strncmp函数为字符串比较函数,字符串大小的比较是以ASCII 码表上的顺序来决定,
此顺序亦为字符的值。其函数声明为int strncmp ( const char * str1, const char * str2, size_t n );
功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;
若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。

*/

int main(int argc, char* argv[])
{	
	char * result_addr = find_role_name(data,"WOW");
	if(result_addr!= NULL)
	{
		printf("地址为:%p",result_addr); // %p是专门用来打印指针的值、地址。系统的寻址范围为取值范围。与%x不同,它是输出一个无符号的的16进制的表达形式
	}
	else
	{
		printf("not found!");
	}
	getchar();
	return 0;
}

char data[]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,              
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,              
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,              
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,              
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,              
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,              
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,              
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,              
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,              
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};

void print_role_name(char* pData)
{
	int data_size = sizeof(data)/sizeof(data[0]);
	int i =0;
	for(;i<data_size-4;i++)
	{
		for(int j = 0;j<4;j++)
		{
			printf("%c",pData[i+j]);
		}
		printf("\t");
	}
}
int main(int argc, char* argv[])
{	
	print_role_name(data);
	getchar();
	return 0;
}

补充:字符串做函数参数,退化为指针

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//字符串做函数参数,退化为指针

//字符串copy,str1 拷贝到 str2;
int copy_str(char *from, char *to )
{
    int ret = 0;
    if (from == NULL || to == NULL)
    {
        ret = - 1;
        return ret;
    }
    printf("from:%s \n", from);
    char *tmpfrom = NULL;
    char *tmpto = NULL;
    tmpfrom = from;
    tmpto = to;
//form形参 形参to 的值 不停的在变化....
//不断的修改了myfrom和myto的指向
    while (*tmpto++ = *tmpfrom++) //*操作 和++的操作; ++ 优先级高 //  后置++,先 *to = *from;  再from++, to++
    {
        ; 
    }
    return ret;
}
int main()
{
    int ret = 0;
    char *from = "abcd";
    char to[100];
    copy_str(from, to);
    printf("to:%s \n", to);

    system("pause");
    return 0;
}

题目3

在这里插入图片描述

typedef struct TagPlayer		
{		
	int id;	
	int level;	
}Player;		


char a[]={				
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,					
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,					
0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,					
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,					
0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x00,					
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,					
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,					
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,					
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,					
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00					
};				

int fun_found(struct TagPlayer* splayer)
{
	int nsum = 0;  // 初始化一个计数器
	for(int i =0;i<sizeof(a)-sizeof(*splayer);i++) //挨个循环
	{
		splayer = (Player*)&a[i];  // 强转
		if(splayer->id==1 && splayer->level==8)
		{
			nsum++;
		}
	}
	return nsum;
}	

int main(int argc, char* argv[])
{	
	Player* splayer; // 实例化一个结构体指针
	int num = fun_found(splayer); // 将结构体指针作为参数传入
	printf("结构体个数为:%d\n",num);
	getchar();
	return 0;
}
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值