当前位置: 首页 > news >正文

80.游戏的分辨率修改思路与分析

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

内容参考于:易道云信息技术研究院

上一个内容:79.游戏分析工具闪屏问题优化与数据被修改高亮

GAMEHACKER2.exe 工具下载地址:79.游戏分析工具闪屏问题优化与数据被修改高亮

Sword2(剑侠情缘)这个游戏很老,在它的年代显示器分辨率是640*480(640是宽480是高),现在的分辨率最低也是1920*1080,高端显示器分辨率是4K、8K甚至更高的分辨率,用最低的1920*1080分辨率显示640*480看起来是非常的模糊,所以首先要修改游戏的分辨率,至少要改成1920*1080分辨率。

修改分辨率的思路是从游戏如何显示的地方下手,这样才会有机会修改分辨率,首先要搞清楚游戏是如何显示的然后在显示的时候肯定会用到640、480这俩数据,然后找到用640、480这俩数据的位置就可以分析出这俩变量的内存地址在哪了,然后更改这俩变量的值从而达到修改分辨率的效果。

然后显示的方式,显示是一个非常大的工程,做游戏一定会用到游戏引擎也就是会用到显示的技术,显示技术主流的有三种 GDI/GDI+、OpenGL、Direct

GDI/GDI+:微软公司提供比如窗口的界面全部用的GDI/GDI+技术

OpenGL:linux系统下用的多

Direct:是图形加速接口,它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,微软提供的

然后查看游戏使用的是那种技术

首先打开Cheat Engine附加到游戏上并随便搜索一个数据

然后选择浏览相关的内存区域

如果用了某个显示技术一定会加载显示技术提供的类库或者函数,然后选择 枚举DLL和符号表

然后可以看到它有一个GDI32,这说明这个游戏有用到GDI的技术,如果没用到GDI的技术它不可能有GDI32这个模块,但是只看GDI不能作准它有可能用来GDI与OpenGL或GDI与Direct,因为画一个按钮也会用到GDI的技术,GDI的技术太普遍了,然后继续往下看,如果用到了OpenGL一定会有OpenGL.dll或者OpenGL32.dll这样的模块

然后游戏引擎比如Unity,游戏引擎和显示的关系是游戏引擎通过显示技术(或者说绘图技术)开发出的一个程序或者类库,也就是说就算用的引擎最终还是会用到 GDI/GDI+、OpenGL、Direct 这三种技术的

然后继续往下找可以看到它用了一个DDRAW的模块,这个模块是Direct,d3d9_x.dll类库是Direct9的类库,DDRAW.dll是Direct7或8的类库,然后剑侠情缘这个游戏就用的是Direct技术实现的显示,然后下一步弄清楚Direct是如何显示图形的就可以修改分辨率了

Direct是微软提供的所以去微软查资料

传送门:DirectDraw - Win32 apps | Microsoft Learn

不管Direct9还是7它本质上是一个类,是类用的时候就会创建对象,创建对象就有构造方法,所以先从文档中找构造方法,它有两个构造方法DirectDrawCreateEx 与 DirectDrawCreate,有了对象之后就可以利用对象在屏幕上画图了,证明游戏有没有用到那就在游戏一起启动就在这俩函数上下断点

然后使用 DirectDrawCreateEx 或 DirectDrawCreate只是得到了一个绘图对象指针,在绘图开始之前要做有几个函数必然要用到的第一个设置绘图的模式 SetCooperativeLevel 函数,它是一个纯虚函数没有任何实现,需要自己重写

然后还会用到 SetDisplayMode 函数,它也是一个纯虚函数,SetDisplayMode是就是用来设置分辨率的

SetDisplayMode的参数中文翻译,所以我们就拦截 SetDisplayMode 函数就可以反向追踪分辨率的变量在哪了。

然后打开Ollydbg.exe追踪函数,首先打开之前写的 GAMEHACKER2.exe工具,选择暂停和调试然后打开游戏,暂停的原因是我们要在游戏启动前下断点

然后打开可执行模块,随便点一个进去

进来之后CTRL + G,输入,DirectDrawCreate跳转到DirectDrawCreate函数中,原因是设置分辨率的函数是一个虚函数我们不知道函数地址,CTRL + G也跳不过去,所以要通过调用 DirectDrawCreate函数的位置往下找,如果 DirectDrawCreate函数CTRL + G跳不过去说明Ollydbg.exe还没把模块加载全,等待加载完就可以跳了

DirectDrawCreate函数入口打断点并运行游戏让它卡在断点处

卡在断点处了,剑侠情缘这个游戏是有检测多开的,如果卡不住看看是不是打开过游戏了

然后它的返回地址是6A51CB92

然后在6A51CB92处再打断点

然后按F9让它运行到6A51CB92位置,然后按两次f7

然后再按一次f7,这时就来到了游戏模块了

然后按CTRL+F9往前跳然后再按F7就会来到下图,可以看到调用了一排函数,通过上面说的函数调用顺序 DirectDrawCreate -》setcooperativel -》SetDisplayMode,然后下图中可以看到ASCII字符,这时代码中写的程序出错用来调试的提示,这也可以看出我们写代码时,这种提示不要用ASCII这样的明文信息这样就给逆向者提供了很大的助力因为现在我们可以看到它怎么调用的,正确的找SetDisplayMode函数是通过计算SetDisplayMode偏移得到的而不是通过无脑的分析,后面写如果计算SetDisplayMode函数偏移,这里先利用ASCII提示来找SetDisplayMode函数

在调用SetDisplayMode函数的位置打断点按F7

然后进入

然后按F8执行到下图红框位置可以看到EDX的值是取得全局变量然后它的值是十六进制的1E0换成十进制就是480

然后再按F8执行到下图红框位置可以看到edx的值是十六进制的280换成十进制就是640,所以很明显4391F0位置是480、4391EC位置是640这俩就是分辨率

然后我们这俩数据在栈中修改成1980*1080,修改方式是右击选择修改

点击修改之后弹出下图红框位置的弹框

直接写1920然后点确认,480改1080也是这样操作

修改之后的栈数据

然后直接让游戏继续运行

然后分辨率就被修改了


相关文章:

80.游戏的分辨率修改思路与分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:79.游戏分析工具闪屏问题优化与数据被修改高亮 GAMEHACKER2.exe 工具下载地址&#xff…...

MaxKB(二):Ubuntu24.04搭建maxkb开发环境

接上文:windows10搭建maxkb开发环境(劝退指南) 上文在windows10环境搭建maxkb开发环境遇到各种坑,后面就转战ubuntu平台,果然比较顺利的完成开发环境搭建。当然遇到相关的问题还是可以参考上文《windows10搭建maxkb开发…...

c#实现数据导出为PDF的方式

PdfSharp vs iTextSharp: C#中PDF导出功能比较 PdfSharp 优点 轻量级:适合简单的PDF生成任务易于学习:API相对简单,学习曲线较缓开源:提供开源版本,可自由使用和修改纯C#实现:不依赖外部库或COM组件支持…...

【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏

项目场景: 作为一个嵌入式软件开发者,有两个外接屏幕,不足为奇。 但是在今天的使用电脑过程中,出现了接了一个拓展坞上面有HDMI接口,但是HDMI接口接上外接显示屏的时候电脑无法识别到,导致只有电脑直连的HD…...

Verilog刷题笔记53

题目: Fsm serialdata See also: Serial receiver Now that you have a finite state machine that can identify when bytes are correctly received in a serial bitstream, add a datapath that will output the correctly-received data byte. out_byte needs …...

GoFly快速开发后台框架-后端接口请求返回403提示码就跨域问题/请求端域名拦截问题

问题: 大家在本地开发或者部署后请求后端时返回403,只有一个问题就是存在请求端跨域问题。 解决办法: 解决这个问题很简单,跨域的就解决跨域就好了。 我们官方给大家统一解决办法是: 到后端配置文件resource/conf…...

设备实时数据采集:开启制造业智能化、自动化的新篇章

传统制造业在进行生产过程中,会涉及到设备实时数据采集需求,这些数据对于监控生产流程、优化生产效率、保证产品质量以及降低成本等方面至关重要。以下是一些常见的数据采集需求: 1.生产数据:包括生产数量、生产批次、生产速度等&…...

【python与java的区别-03(集合、字典)】

一、Set python: 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数…...

Java继承

目录 一、继承概念 二、语法格式 三、类型及特性 四、关键字 4.1. super 4.2. super与this指针 4.3 final 关键字 一、继承概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进…...

Kafka集群搭建的两种方式

目录 1. 依赖Zookeeper搭建集群 1. 下载Kafka二进制文件 2. 更改kafka配置 3. 启动Zookeeper集群和Kafka集群 4. 验证集群 1.创建主题 2. 检查主题是否存在 3. 创建生产者生产数据 4. 创建消费者消费数据 5. 检查Zookeeper中Kafka集群的元数据 2. 不依赖Zookeeper搭…...

两种变量初始化方法的区别

1. CarriageEntity carriageEntity new CarriageEntity()和 null的区别 1.1 CarriageEntity carriageEntity new CarriageEntity(); 初始化:这行代码创建了一个新的 CarriageEntity 对象,并将其引用赋值给 carriageEntity 变量。对象状态&#xff…...

群晖把硬盘共享给win10(虚拟机或物理机)的两种办法

1. 通过SMB共享 NAS地址:192.168.3.100 打开“此电脑”,在win10地址栏输入 \192.168.3.100\video,提示输入用户名、密码。在video文件夹右击,点击“映射网络驱动器” 在win10电脑上,复制文件到T盘上,在T盘…...

Java-Web面试题汇总

一、TCP 和 UDP 的区别 在网络通信中,TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种常见的协议,它们在多个方面存在显著差…...

数字化技术分别有哪些,数字化技术特点和优势是什么?

​随着企业数字化进程的加速,人工智能、工业互联网、低代码等底层技术正全面重塑企业运营生产体系,推动新的生产要素、研发范式和商业模式的建立。 这个变革过程不仅是对原有制造体系的颠覆,而且会影响各行各业的所有细分行业和产业链价值链…...

微服务CI/CD实践(一)环境准备及虚拟机创建

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)gitlabs部署 微服务CI/CD实践(三)nexus3部署 微服务CI/CD实践(四)数据库,redis,n…...

【SpringBoot】优化慢启动应用的用户体验

通过深入分析SpringBoot中WebServer的启动流程,插入自定义的Loading页面展示逻辑,优化软件使用时的用户体验。 背景 Java本身的特点,再加上开发人员能力差,软件开发工程化程度低等等问题,经过一段时间的迭代之后&…...

String str=“i“ 与 String str=new String (“i“) 一样吗?

String str"i" 与 String strnew String ("i") String str"i" 这种形式声明了一个 String 对象,其中 "i" 字符串字面量直接赋值给 str。在 Java 中,字符串字面量会自动放入字符串常量池中,这是一个…...

【数据结构】二叉树链式结构的实现

前置声明:在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉…...

如何有效找到目标客户群体?

在激烈的市场竞争中,找到并锁定目标客户群体是企业成功的关键。以下是几种有效的策略,帮助您精准定位并吸引目标客户。 1. 明确市场定位与客户画像 首先,企业需要明确市场定位,并绘制详细的客户画像,包括年龄、性别、…...

机器学习-混淆矩阵

文章目录 一、混淆矩阵1.混淆矩阵简介2.混淆矩阵图列 二、混淆矩阵指标1. 准确率(Accuracy)2. 精确率(Precision)3. 召回率(Recall)4. F1分数(F1 Score) 三、总结 一、混淆矩阵 1.混…...

数据结构----栈

一丶概念 只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底 二丶特点 先进后出 FILO first in last out 后进先出 LIFO last in first out 三丶顺序栈 逻辑结构&…...

STL六大组件

STL(Standard Template Library,标准模板库)是C标准库的一部分,提供了丰富且高效的数据结构和算法。STL主要由6大组件构成,分别是容器、算法、迭代器、适配器、仿函数和空间配置器。 容器(Containers&#…...

【机器学习】CNN的数学基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 CNN的数学基础1. 引言2. 卷积运算2.1 连续卷积2.2 离散卷积2.3 互相关 3. 激活函…...

最小路径和[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[…...

【题库】——数组 小鱼比可爱

#include<bits/stdc.h> using namespace std; int main() {int n,m,i;cin>>n;int arr[n]; for(i0;i<n;i) {int count 0;cin>>arr[i];for(mi;m>0;m--){if(arr[i]>arr[m])count;} cout<<count<<" "; } return 0; }...

基于飞腾平台的Hbase的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…...

【springboot】springboot接口参数全局解密,解决request内容修改后如何重新设置回去的问题

文章目录 核心思路spring&servelt基础核心接口类核心代码 body解密核心原理讲解get解密核心原理讲解get query请求讲解get pathVariables请求讲解 总结 本文不仅介绍了body内容修改后如何传递&#xff0c;也介绍了get请求 在修改内容后如何继续传递。 【原创作者 csdn: 孟秋…...

yml基本语法

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种简洁且易读的数据序列化格式&#xff0c;常用于配置文件。Spring Boot 中的 application.yml 文件使用 YAML 来配置应用程序的属性。 YAML 基本语法 1. 键值对 基本的键值对表示形式为&#xff1a;key: value…...

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称&#xff1a;酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 带采集&#xff0c;可以挂着电脑上自动采集发布&#xff0c;无需人工操作&#xff01; 橙色简洁大气体育直播自适应模板赛事直播门户…...

【启明智显技术分享】工业级HMI芯片Model系列GUI合成到项目中的指南

在工业自动化、智能终端HMI、车载仪表盘等领域&#xff0c;高性能的HMI&#xff08;人机界面&#xff09;芯片是不可或缺的核心组件。启明智显推出的Model系列&#xff08;如Model3C、Model3、Model4&#xff09;HMI芯片&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c…...