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++语言学习进阶之旅C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块

我的C/C++语言学习进阶之旅C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块

传智播客c/c++公开课学习笔记--Linux网络流媒体服务器的核心代码揭秘

[linux][c/c++]代码片段01

[linux][c/c++]代码片段02