码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++学习笔记6.27

时间:2016-06-06 16:22:10      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

 

 

 


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

标签:

原文地址:http://www.cnblogs.com/lizhongpingchn/p/5563997.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!