21.第二阶段x86游戏实战2-C++实现寻路

news/2024/12/22 0:42:26/

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:20.第二阶段x86游戏实战2-进一步寻找寻路call1

上一个内容里找到了游戏中寻路的call,本次通过C++语言实现寻路功能

首先打开之前的dll项目,然后添加下图所示的三个控件,蓝色的是编辑框,红色的按钮

按钮的属性(编辑的属性是默认的所以编辑框没有属性的截图)

上图属性窗口如果没了,点击下图红框位置可以打开属性框,鼠标右击Dialog任意位置然后鼠标左键单机属性就可以了

然后给输入框添加一个变量

添加变量,如下图,写完点完成

另一个输入框添加变量

添加变量如下图,然后点完成

然后双击下图红框位置

然后就会创建下图红框的代码,本次观看代码的入口就是从下方函数开始(完整代码放到了百度网盘,本次设计代码写到了下方,文件名是CM.cpp)

然后新加一个文件

新加的文件类型与文件名

然后再创建一个文件,这次是在头文件里创建

下方代码中有些函数名用的中文,用中文有时候会有编码问题,编码问题效果就是函数名写的没问题但就是报错,这时把中文改成英文(字母)就可以了

通用.cpp文件的修改

#include "pch.h"
#include "通用.h"/**... 是可变参数,意思是可以给Call_输出调式信息函数传递无限个参数
*/
void Call_输出调式信息(char * pszFormat, ...)
{
#ifdef _DEBUGchar szbufFormat[0x1000];char szbufFormat_Game[0x1100] = "";va_list argList;/**当前函数 Call_输出调式信息(char * pszFormat, ...)这样声明的va_start(argList, pszFormat);意思是获取 ... 这个可变参数它会把 pszFormat 后面都会当做成可变参数赋值给 argList*/va_start(argList, pszFormat);/**vsprintf_s(szbufFormat, pszFormat, argList);意思是把 pszFormat 和 argList数据进行拼接,拼接完放到 szbufFormat 这种通过 vsprintf_s 让Call_输出调式信息函数支持了 %d 替换成数字这样的功能*/vsprintf_s(szbufFormat, pszFormat, argList);/**strcat_s(szbufFormat_Game, szbufFormat);意思是把 szbufFormat 的内容放到 szbufFormat_Game 中*/strcat_s(szbufFormat_Game, szbufFormat);/**OutputDebugStringA(szbufFormat_Game);把 szbufFormat_Game 它的内容打印到日志这个日志可以通过 Dbgview.exe 查看Dbgview放到百度网盘了*/OutputDebugStringA(szbufFormat_Game);// va_end(argList);表示可变参数使用完了va_end(argList);
#endif // _DEBUG}DWORD ReadDword(DWORD Adress) {/*(void*)Adress意思是把Adress的值转成void*也就是void的地址类型也就是把Adress它的值当成内存地址IsBadReadPtr函数是判断传的内存地址是否可读,可以直接复制IsBadReadPtr去百度搜,答案一大堆*(DWORD*)Adress;这个意思(DWORD*)Adress它把Adress的值当成了内存地址然后*(DWORD*)Adress,这个最左边的*意思是把内存地址的值取出来*/if (IsBadReadPtr((void*)Adress, sizeof(DWORD)) == 0)return *(DWORD*)Adress;return 0;
}

通用.h文件的修改

#pragma once
void Call_输出调式信息(char*pszFormat, ...);
DWORD ReadDword(DWORD Adress);

结构.h文件的修改:新加 坐标结构

#pragma once
struct R_人物属性
{DWORD 状态;void 初始化();
};struct 坐标 {FLOAT x;FLOAT y;
};

pch.h文件的修改:新引入多个头文件,方便后续使用

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。#ifndef PCH_H
#define PCH_H// 添加要在此处预编译的标头
#include "framework.h"
#include <afxcontrolbars.h>
#include "通用.h"
#include "结构.h"
#include "Call.h"
#include <Windows.h>#endif //PCH_H

新加的Call.h文件的内容:

#pragma once
void Call_xunlu(DWORD x, DWORD y);

新加的Call.cpp文件的内容:

#include "pch.h"
void Call_xunlu(DWORD x, DWORD y) {// 通过用OD对MessageBoxA函数打断点,然后用CTRL+F9跳转到我们的代码里// 然后就能调试我们写的代码了//MessageBoxA(0,0,0,0);DWORD 寻路基址 = (DWORD)GetModuleHandleA("Game.exe") + 0x5A6A10;DWORD jz = ReadDword(寻路基址);坐标 zb;zb.x = x;zb.y = y;DWORD 坐标的内存地址 = (DWORD)&zb;__asm {pushadmov ecx, jzpush 坐标的内存地址mov eax, [ecx]mov eax, [eax + 0x4C]call eaxpopad}}

CM.cpp文件的内容:新建OnBnClickedButton2函数

// CM.cpp: 实现文件
//#include "pch.h"
#include "tl.h"
#include "CM.h"
#include "afxdialogex.h"// CM 对话框IMPLEMENT_DYNAMIC(CM, CDialogEx)CM::CM(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG1, pParent), edi_x(_T(""))
{}CM::~CM()
{
}void CM::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, edi_x);DDX_Text(pDX, IDC_EDIT2, edi_y);
}BEGIN_MESSAGE_MAP(CM, CDialogEx)ON_BN_CLICKED(IDC_BUTTON1, &CM::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON2, &CM::OnBnClickedButton2)
END_MESSAGE_MAP()// CM 消息处理程序void CM::OnBnClickedButton1()
{R_人物属性 a;a.初始化();Call_输出调式信息("人物信息:人物状态%d",a.状态);
}void CM::OnBnClickedButton2()
{UpdateData(TRUE);CString str1 = edi_x;CString str2 = edi_y;// strtol((const char*)CW2A(str1.GetBuffer(0)), NULL, 10);把字符串转成int数字类型int x = strtol((const char*)CW2A(str1.GetBuffer(0)), NULL, 10);int y = strtol((const char*)CW2A(str2.GetBuffer(0)), NULL, 10);Call_xunlu(x, y);
}

CM.h文件的内容:新加 edi_x、edi_y变量

#pragma once// CM 对话框class CM : public CDialogEx
{DECLARE_DYNAMIC(CM)public:CM(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CM();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG1 };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton2();CString edi_x;CString edi_y;
};

上方的代码不全,只有手写的代码

完整代码:

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5

提取码:q9n5

复制这段内容后打开百度网盘手机App,操作更方便哦


img


http://www.ppmy.cn/news/1535094.html

相关文章

华为 HCIP-Datacom H12-821 题库 (32)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.当一个运行 MSTP 协议的交换设备端口收到一个配置BPDU 时&#xff0c;会与设备保存的全局配…

三、数据链路层(下)

目录 3.6以太网 以太网的分类 Mac地址 以太网数据格式 3.7互联网 数据是如何传输的&#xff1f; 3.8以太网、局域网、互联网的区别 总结&#xff1a; 3.9 vlan基本概念与基本原理 Vlan实现 划分 VLAN 例题 3.10广域网及相关协议 ppp协议 PPP协议所满足的要求 P…

10款好用的开源 HarmonyOS 工具库

大家好&#xff0c;我是 V 哥&#xff0c;今天给大家分享10款好用的 HarmonyOS的工具库&#xff0c;在开发鸿蒙应用时可以用下&#xff0c;好用的工具可以简化代码&#xff0c;让你写出优雅的应用来。废话不多说&#xff0c;马上开整。 1. efTool efTool是一个功能丰富且易用…

flutter_鸿蒙next_Dart基础②List

目录 代码示例 代码逐段解析 1. 创建和打印列表 2. 强类型列表 3. 创建可扩展的空列表 4. 创建填充列表 5. 列表扩展 6. 使用可选展开操作符 7. 获取列表长度 8. 列表反转 9. 添加多个元素 10. 移除元素 11. 根据索引移除元素 12. 在特定位置插入元素 13. 清空列…

数据结构与算法篇((原/反/补)码 进制)

目录 讲解一&#xff1a;原/反/补)码 一、原码 二、反码 三、补码 四、有符号位整型 五、无符号位整型 六、Java中的整型 七、整数在底层存储形式 讲解二&#xff1a;进制 一、简介 二、常用的进制 十进制 二进制 八进制 十六进制 知识补充 三、进制转换 1. 二…

MySQL使用的数据结构

MySQL 作为一个关系型数据库管理系统&#xff0c;内部实现中使用了多种数据结构来优化存储、索引、查询和其他操作。以下是 MySQL 中常用的一些数据结构&#xff1a; 1. B树 用途&#xff1a;B树是 MySQL 最常用的索引数据结构&#xff0c;主要用于InnoDB 和 MyISAM 存储引擎…

cmd命令大全详解

CMD是Windows操作系统中的命令行解释器&#xff0c;它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其简要说明&#xff1a; dir - 显示目录中的文件和子目录。 cmddir cd - 更改当前目录。 cmdcd [目录路径] mkdir - 创建新目录。 cmdmkdir [目录名] rmd…

C++编程:实现简单的高精度时间日志记录小程序

0. 概述 为了检查是否存在系统时间跳变&#xff0c;本文使用C实现了一个简单的高精度时间日志记录小程序。该程序能够每隔指定时间&#xff08;默认40毫秒&#xff09;记录一次系统时间到文件中&#xff0c;并具备以下功能&#xff1a; 自定义时间间隔和文件名&#xff1a;通…