高级指针


函数的外挂

靶子程序

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
void  msg()
{
	MessageBoxA(0,"open","hello world",0);
}
int add(int a,int b)
{
	system("tasklist");
	return a+b;
}
void main()
{
	int numA=100;
	int numB=20000;
	char str[5]={'A','B','C','D','E'};
	int *p1=&numA;
	int *p2=&numB;
	int **pp=&p1;
	char *pch=str;
	printf("\n%x,%x\n",msg,add);
	while(1)
	{
		printf("\n目标%d个",numA);
		printf("\n月薪%d元",numB);
		printf("\n已经%d",*p1);
		printf("\n希望的RMB%d",**pp);
		printf("\n级别:%c",*pch);
		Sleep(10000);
	}
	system("pause");
}


指针模块

#include <Windows.h>
#include <stdio.h>
_declspec(dllexport) void go()
{
	//void msp();
	while(1)
	{
		void(*p)();
		p=(void(*)())0xf01127; //调用的是msg
		p();
		Sleep(5000);
	}
}
_declspec(dllexport) void goA()
{
	//int add(int a,int b);
	int(*p)(int,int);
	p=(int(*)(int,int))0x11d10f5;
	//p(10,30);
	printf("%d",p(10,30));
}


指针数组

#include <stdio.h>
#include <stdlib.h>
void main1233a()
{
	int a[]={1,2,3,4,5,6,7};//a是常量
	int *p=a;
	int i;
	int *px=a;
	printf("%d",sizeof(a));//c语言规定,数组按照整体大小
	printf("\n%d",sizeof(a)/sizeof(int));
	printf("\np的大小 %d",sizeof(p));//p4个字节 
	
	printf("\n%x,%x",a,p);
	for(i=0;i<7;i++)
	{
		printf("\n%d,%x",a[i],&a[i]);
	}
	//数组名就是一个常量指针,p是一个变量指针,[] 不仅作为数组,也作为指针
	//[] 可以根据指针的地址往下找出内容
	printf("\n======");
	for(i=0;i<7;i++)
	{
		printf("\n%d,%x",p[i],&p[i]);
	}
	printf("\n======");
	for(i=0;i<7;i++)
	{
		printf("\n%d,%x",*(p+i),p+i);
		//p+i p往前移动i个元素的地址
		//*(p+i) 取出内容
	}
		printf("\n======zhizhen========");
    for(;px<a+7;px++)
	{
		printf("\npx=%x,*px=%d",px,*px);
	}
	//数组的本质就是指针指向一片连续的内存空间
	getchar();
}

高级指针

#include <stdio.h>
#include <stdlib.h>
//二级指针的作用
//1,函数改变外部变量指针
//2,外挂改变一个指针的值
//指针的意义。
//指针的本质就是一个开始地址。指针类型,确定了从地址开始截取多长。
//如何解析数据,如何解析二进制0与1,函数指针解析为代码,数据解析为数据,按照数据大小。

void main23()
{
   int a=10;
   int b=20;
   int *p1=&a;
   int *p2=&b;
   int **pp=&p1;
   printf("\n%d",**pp);
   printf("\n%x,%x,%x",p1,*pp,&a);
   printf("\n%x",pp);
   pp=&p2;
    printf("\n%d",**pp);
	printf("\n%x,%x,%x",p1,*pp,&b);
	printf("\n%d,%d",*p2,b);
}
void main12()
{
   int a=10;
   int b=20;
   int *p=&a;
     
   int **pp=&p;
   printf("%x",pp);
    **pp=5;
	printf("%d",a);
	*pp=&b;//对应int 指针
	printf("\n%d",**pp);
   system("pause");
}

改变单个的数据

#include <Windows.h>
#include <stdio.h>
_declspec(dllexport) void go()
{
	//void msp();
	while(1)
	{
		void(*p)();
		p=(void(*)())0xf01127; //调用的是msg
		p();
		Sleep(5000);
	}
}
_declspec(dllexport) void goA()
{
	//int add(int a,int b);
	int(*p)(int,int);
	p=(int(*)(int,int))0x11d10f5;
	//p(10,30);
	printf("%d",p(10,30));
	system("title 请你吃饭");
	system("color 3f");
}
_declspec(dllexport)void goB()
{
	int *p=(int*)0x3bf92c;
	int *p1=(int*)0x3bf920;
	*p=100000;
	*p1=1000000;
}



#include<Windows.h>
#include<stdio.h> 
#include<stdlib.h>
//外挂
//改变一个数据,需要数据的地址,也就是指针,int需要int*
//改变一个指针变量,需要指针的地址,二级指针,int*需要int **
//改变一个二级指针,需要二级指针的地址,三级指针,int**需要int ***
//改变一个指针,指针指向数组,需要指针的地址,数组的首地址
//函数指针,找到地址,进行类型转换,调用函数。

_declspec(dllexport)goB()
{
	int *p1 = (int *)0x2ef86c;//改变两个变量
	int *p2 = (int*)0x2ef860;
	*p1 = 10000;
	*p1 = 2147483647;
	int **p3 = (int **)0x2ef854;	
	*p3 = (int *)0x2ef860;	  //改变指针

	int ***p4 = (int ***)0x2ef83c;
	*p4 = (int **)0x2ef848;

	char **pp = (char **)0x2ef820;
	*pp = (char *)(0x2ef82c + 0x1);


}

_declspec(dllexport) goA()
{
	int (*p)(int , int );
	p = (int(*)(int, int))0xd010f0;
	printf("%d", p(10, 30));
	

}


_declspec(dllexport) go()
{

	//void msg();

	while (1)
	{
		void(*p)();
		p = (void(*)())0xd91122;
		p();
		
	}
	




}

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

void msg()
{
	MessageBoxA(0, "open", "阿飞在泡妞",0);
}

int add(int a, int b)
{
	system("title 马化腾请你吃饭");
	system("color 3f");
	system("tasklist");
	return a + b;
}


void main()
{
	int numA = 100;
	int numB = 20000;
	int *p1 = &numA;
	int *p2 = &numB;
	int **pp = &p1;
	char str[5] = { 'A', 'B', 'C', 'D', 'E' };
	char *pch = str;
	//printf("\n%x,%x\n", msg, add);
	printf("\n%x,%x", &numA, &numB);
	printf("\n&p1=%x,&p2=%x,&pp=%x,&pch=%x,str=%x", &p1, &p2,&pp,&pch,str);

	while (1)
	{
		printf("\n");
		printf("\n阿飞的目标是泡%d个妞", numA);
		printf("\n阿飞的月薪是%d元", numB);
		printf("\n阿飞已经泡的妞%d个", *p1);
		printf("\n阿飞希望的RMB%d元", **pp);
		printf("\n阿飞在泡妞界的级别%c", *pch);
		Sleep(12000);
	}





	system("pause");
}


//外挂

//改变一个数据,需要数据的地址,也就是指针,int 需要int*

//改变一个指针变量,需要指针的地址,二级指针int* 需要int**

//改变一个二级指针,需要二级指针的地址,三级指针,int** 需要int***

//改变一个指针,指针指向数据,需要指针的地址,需要数组的首地址

//函数指针,找到地址,进行类型转型,调用函数。

//地址,操作系统管

//进程的首地址是变动的,变量相对首地址是固定的。

指针只是一个首地址,只知道从哪里开始,并不了解从哪里结束,也不了解数据该怎么解释,所以这中情况下,都需要确定指针类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值