函数的外挂
靶子程序
#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***
//改变一个指针,指针指向数据,需要指针的地址,需要数组的首地址
//函数指针,找到地址,进行类型转型,调用函数。
//地址,操作系统管
//进程的首地址是变动的,变量相对首地址是固定的。
指针只是一个首地址,只知道从哪里开始,并不了解从哪里结束,也不了解数据该怎么解释,所以这中情况下,都需要确定指针类型。
3208

被折叠的 条评论
为什么被折叠?



