HelloWorld
#include <stdio.h>
void main(){
printf("hello world\n");
system("pause");
}
其中头文件#include <stdio.h>
表示引入的头文件,头文件当中,只有函数的声明,编译时才会去找函数的实现
1、基本数据类型
int short long float double char 与java稍有不同。
常用占位符为:
int %d
short %d
long %ld
float %f
double %lf
char %c
%x 十六进制
%o 八进制
%s 字符串
2、输入输出函数
int i;
printf("请输入一个整数:");
//赋值
scanf("%d",&i); //控制台输入,&取地址符
//打印
printf("i的值为:%d\n",i);
3、指针
指针是C的核心,大一的时候学习C的时候死活不理解指针的概念。
指针存储的是变量的内存地址,内存地址系统分配给数据分配的编号(通俗点即为门牌号)。一句话简称,内存即地址。
int i = 90;
//指针变量,创建一个int类型的指针
int* p = &i; //p的值就是i这个变量的内存地址
printf("%#x\n",p);
打印结果为:
我们可以通过打印出来的地址找寻到该地址下的值,正好是90.
void change(int p){
p = 300;
}
//变量名,对内存空间上的一段数据的抽象
void main(){
int i = 90;
change(i);
printf("i的值为:%d\n",i);
}
从上面的结果看,打印的值还是原来的是90,而不是300。这是因为改变的只是形参,而i的值没有改变,也就是说i的地址所保存的值没有发生变化。
传递的时候传递&i或者*p=&i。
例子:
游戏外挂也是找到地址值,并且改变相应地址值保存的值得。
void main(){
int time = 600;
printf("time:%#x\n",&time);
while (time > 0){
time--;
printf("游戏时间剩余%d秒\n",time);
//睡眠
Sleep(1000);
}
system("pause");
我们可以得到time的地址值。
__declspec(dllexport) void go() {
//修改time变量的值
int *p = 0x49fe94;
*p = 999999;
}
生成dll文件。再通过DllInject.exe工具进行注入。
C_01程序显示如下:
注入成功,成功更改time的值。