C/C++学习笔记6.27
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++学习笔记6.27相关的知识,希望对你有一定的参考价值。
4.计算机内存CPU执行原理
讲解1:
#include<stdio.h> // 标准输入输出 standard
#include<stdlib.h> // 标准库 含system
void main()
{
int num = 56; // 定义整型变量,初始化为56
printf("天朝有%d个民族\\n", num); // 十进制输出num值
printf("地址%p\\n", &num); // 取地址
// 插入断点,调试
// 查看内存:调试——窗口——内存——内存1——找到后右击带符号显示
printf("锄禾日当午,学C真他妈苦\\n");
system("echo 重剑无锋,大巧无工");
system("pause");
}
输出地址:0018F978
讲解2:
#include<stdio.h> // 标准输入输出 standard
#include<stdlib.h> // 标准库 含system
void main()
{
int num = 1; // 任何变量在内存里都有一个地址
printf("地址%p\\n", &num); // 按照地址的方式打印出num的地址
// 断点
// 内存:0x0018FA50 1
num = 2;
// 断点
// 内存:0x0018FA50 2
num = 3;
// 断点
// 内存:0x0018FA50 3
printf("%d\\n", num); // 按照十进制输出
// 0x0018FA50
system("pause");
}
案例1:修改植物大战僵尸里的阳光值
Cheat Engine——内存修改编辑工具
打开Cheat Engine6.3.exe——进程列表——找到进程(PlantsVsZombies.exe),打开——检索阳光值25,首次扫描——阳光值更新为50,再次扫描——找到地址,右键change value,800。
小结:但凡程序载入内存,就会有变量、数据、代码;都有内存地址,数据可以通过地址更改,代码可以调用。
案例2:调戏植物大战僵尸
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
void changetitle() // 改变游戏窗口标题
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "植物大战僵尸中文版");
SetWindowTextA(win, "锄禾日当午,植物大战僵尸真是苦"); // 设置窗口标题
}
void lock() // 锁定游戏窗口
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "锄禾日当午,植物大战僵尸真是苦");
EnableWindow(win, 0); // 0,代表锁定,1代表解锁
}
void unlock() // 解锁游戏窗口
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "锄禾日当午,植物大战僵尸真是苦");
EnableWindow(win, 1); // 0,代表锁定,1代表解锁
}
void show() // 显示 游戏窗口
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "锄禾日当午,植物大战僵尸真是苦");
ShowWindow(win, SW_SHOW); // 显示
}
void hide() // 隐藏游戏窗口
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "锄禾日当午,植物大战僵尸真是苦");
ShowWindow(win, SW_HIDE); // 隐藏
}
void chose() // 关闭植物大战僵尸
{
system("taskkill /f /im PlantsVsZombies.exe");
}
void open() // 打开,附加游戏资源的游戏,用批处理打开
{
// 打开
// cd C:\\Users\\mingzi\\Desktop\\Plants_vs_Zombies\\植物大战僵尸中文版
// Plan
}
void move()
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "锄禾日当午,植物大战僵尸真是苦");
for (int i = 0; i < 1600; i++)
{
SetWindowPos(win, NULL, i, 0, 500, 600, 0);// 移动之,i,0,横纵坐标
Sleep(20);
}
}
void smalltobig()
{
// 创建一个窗口编号变量,根据类型名与窗口标题寻找植物大战僵尸的窗口
HWND win = FindWindowA("MainWindow", "锄禾日当午,植物大战僵尸真是苦");
for (int i = 0; i < 1600; i++)
{
SetWindowPos(win, NULL, 0, 0, i, i*9/16, 0);// 放大缩小之:宽度,高度
Sleep(20);
}
}
void main()
{
//hide();
//show();
//close();
open();
Sleep(5000);
move();
smalltobig();
}
案例3:加血宝宝
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h> // Sleep函数
// _declspec(dllexport) dll函数导出 接口
_declspec(dllexport) void go()
{
// 一个进程不可以随便更改另外一个进程的内存,保证系统的稳定
int *p = (int *)0x0018FA50;
*p = 100;
}
_declspec(dllexport) void autoadd()
{
int *p = (int *)0x0018FE43;
*p = 0;
while (1) // 死循环,循环检测,是否需要充血
{
if (*p < 100) // 判断血是否小于100
{
*p = 150; // 自动加血
}
}
}
讲解3:
#include<stdio.h> // 标准输入输出 standard #include<stdlib.h> // 标准库 含system void main() { int a = 1; int b = 2; printf("&a = %p,&b = %p", &a, &b); int c = 3; printf("\\n&c = %p", &c); c = a + 3; //加断点 // 内存:0x0018F720 + 3 // 寄存器:EAX = 0000000E EIP = 01053F47 c = a + 4; //加断点 // 内存:0x0018F720 + 4 // 寄存器:EAX = 00000004 EIP = 01053F50 c = a + 5; //加断点 // 内存:0x0018F720 + 5 // 寄存器:EAX = 00000005 EIP = 01053F59 c = a + b; //加断点 // 内存:0x0018F720 + 6 // 寄存器:EAX = 00000006 EIP = 01053F62 system("pause"); }
小结:变量声明分配地址,对变量重新赋值,地址上的相应的数据发生改变;a,b的地址通过控制器读入,数据通过运算器上的寄存器进行运算>>实现c = a + b;
图解:
讲解4:
#include<stdio.h> // 标准输入输出 standard
#include<stdlib.h> // 标准库 含system
void main()
{
int a = 10;
int b = 5;
int c = 0;
printf("%p\\n", &c);
// 嵌入汇编语言
// 功能:c = a + b;
// mov:移动 add:加
_asm
{
mov eax,c // eax 为寄存器 将c的值移动到eax,eax = 0
//加断点
// 内存:0x0018FEB8 0
// 寄存器:EAX = 00000000
add eax,a // eax = 10
//加断点
// 内存:
// 寄存器:EAX = 0000000A
add eax,b // eax = 15
//加断点
// 内存:
// 寄存器:EAX = 0000000F
mov c,eax // eax赋值给c
}
printf("%d\\n", c);
// 加断点
// 内存:0x0018FEB8 +15
// 寄存器:EAX = 0000000F
system("pause");
}
版权所有,转载请注明出处http://www.cnblogs.com/lizhongpingchn/p/5563997.html
以上是关于C/C++学习笔记6.27的主要内容,如果未能解决你的问题,请参考以下文章
我的C/C++语言学习进阶之旅C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块
我的C/C++语言学习进阶之旅C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块