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

debug - 只要在内存中有显示相关的数据, 就会被CE找到

文章目录

    • debug - 只要在内存中有显示相关的实际数据, 就会被CE找到
    • 概述
    • 笔记
    • demo实现
    • demo运行效果
    • 用CE查找实际数据地址
    • 找到自己的调试点 - 方法1
    • 找到自己的调试点 - 方法2
    • 打补丁
    • 备注
    • END

debug - 只要在内存中有显示相关的实际数据, 就会被CE找到

概述

自己写了一个demo, 想验证一下, 如果不让显示值和实际值是一个地址(不直接使用结构, 而是用函数从结构中取值, 然后通过函数返回值给显示值用, 是否可以给CE增加一些麻烦? 发现不好使:P 因为实际值也是有地址的, 一样会被CE找到…

CE在查找/定位数据方面, 真是利器.

我在demo中, 还做了显示值和实际值的比对, 如果显示值被改了, 就退出程序.
结果, 程序直接跑. 用CE冻结找到的内存值时, 居然检测不到显示值和实际值不一样. 只有在用CE调试后, 才能检测到显示值和实际值不一样…, 可能是自己写的有bug.

也有可能被锁定的是实际数据, 已经过了作弊检查那个函数.
也有可能, 找到的都不是显示值的地址. 所以能通过作弊检查的函数. 因为每次都只激活一个CE表项.

笔记

demo实现

/*!
* \file Defence_CE_FindData.cpp
* \brief 防止CheatEngine查找数据的方法
*   CE擅长查找数据, 试试能不能给CE找点麻烦(用函数来取显示数据的地址/用函数取要显示的值, 而不是直接用结构指针).
* 
* \note 编程环境: vs2019 x64 debug console
*/#include <Windows.h>#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cstdint>// 游戏UI中元素的显示用地址(e.g. 先使用控件的对象指针)
class game_addr_for_display
{
public:game_addr_for_display() { m_addr = NULL; }void set(float* addr) { m_addr = addr; }float* get() { return m_addr; }private:float* m_addr;
};class game_real_data
{
public:game_real_data() { m_data = .0f; }void set(float data) { m_data = data; }float get() { return m_data; }void res_inc() { m_data++; }private:float m_data;
};class game
{
public:void init(float* _addr_to_disp){m_disp.set(_addr_to_disp);}void run(){printf("please use CE modify real data, not display data, if APP exit(), means failed\n");do {Sleep(1000);m_data.res_inc(); // game resouce inc by some reasonshow_data();if (check_CE_modify()){printf("maybe memory was modify by some tools\n");break;}} while (true);}void show_data(){*m_disp.get() = m_data.get();printf("res disp data = %f\n", *m_disp.get());}bool check_CE_modify(){float f_disp = *m_disp.get();float f_real = m_data.get();return (((f_disp - f_real) < 0.001) ? false : true);}private:game_addr_for_display m_disp;game_real_data m_data;
};int main()
{float val_to_disp;game _game;_game.init(&val_to_disp);_game.run(); // entry game loopsystem("pause");return 0;
}

demo运行效果

在这里插入图片描述

用CE查找实际数据地址

运行程序
用CE附加程序
CE高级选项暂停目标程序.
在这里插入图片描述

查找(浮点数 + 精确值), 填入的值为UI上显示的值为进程暂停后最后的UI值. e.g. 35
用CE恢复目标进程, 让程序接着跑. 等UI显示的值变化了, 再次暂停目标进程, 再Next查找
如果找到的比较多, 就重复上步, 直到找到的值较少.
我这里最后最少只能找到4个, 将这4个都加入CE表.
恢复进程, 让程序正常跑起来.
逐个激活找到的单条CE表项, 每次只激活一条CE表项.
观察是否会使UI上显示的值不变.
最后确定可以使UI值不变的那条CE表项
在这里插入图片描述
现在锁定的那条CE表项, 锁定的值为179, UI值是180. 综合自己写的demo逻辑, 可知, 现在锁定的CE表项是实际值.
用函数返回实际值, 再赋值给UI, 根本对CE没用:)

确定了影响UI显示的确定CE表项后, 将该项的激活选择去掉, 让程序正常跑.
查找该表项对应的写入指令, 如果查到了写入这个地址的指令, 就看反汇编, 应该使用实际数据的逻辑就在附近.
我这里只查到一条指令, 且看到这条指令在不断的更新这个地址(CNT = 12, 不断的再更新UI的值, 使变化的实际数据更新到UI).
如果查找到多条指令, 都逐条看看反汇编, 看看哪条是使用实际数据来更新UI值的实现.
如果找到多条指令, 可以用指令写入次数来判断, 哪条指令是干活的实际指令.
在这里插入图片描述
在这里插入图片描述
进入反汇编窗口, 惊讶. 因为程序是自己写的, 可以很清楚的看懂逻辑, 这里正是更新实际数据的实现
逻辑如下

从保存实际数据的结构中取得实际值(这个数据结构是类的指针, 类数据地址针对类指针有个偏移)
将取到的实际数据放入浮点寄存器.
将浮点寄存器的值 + 1
将更新后的实际数据(在浮点寄存器xmm0中), 更新(回写)到类成员变量中给.

可知, 实际数据(类成员变量)的地址就是 [rbp + 0xE0].

在此处反汇编处上面找一处合适的语句(开始取实际数据的值, 还没开始执行更新实际值的逻辑), 下断点, 手工记录推算一下.
在这里插入图片描述
RBP = B083EFF890
RBP + 0xE0 = B083EFF970
在这里插入图片描述
[RBP + 0xE0] => 0xB083EFFAC0
执行一句, 走到APP+11B16
RAX = B083EFFAC0, 和推算的一样, 这就是[RBP + 0xE0]的值.

在内存区, 去看地址 B083EFFAC0中的值
在这里插入图片描述
[ B083EFFAC0] = 0x44FAE000
用自己做的浮点计算器(小工具 - 浮点计算器)看一下对应的实际浮点值是多少?
在这里插入图片描述
可知, 现在实际值是2007.0
因为现在逻辑是实际值刚取到, 还没更新呢, 应该是UI值一样. 看了一下, 是这样.
在这里插入图片描述
将自己找到的这个合适的补丁点, 在单步调试的界面, 就加入codeList, 后续打补丁(或者供后续调试)用, 防止后续万一找不到了自己辛苦找到的调试点.
在这里插入图片描述
在这里插入图片描述
向下单步执行, 执行完实际数据+1操作后, 看一下xmm0寄存器, 可以看到实际值已经变为了2008.0
在这里插入图片描述
再单步执行到给实际值地址赋值后, 看一下更新后的值, 和自己推算的一样.
在这里插入图片描述

找到自己的调试点 - 方法1

在codelist中找到自己的调试点, 去反汇编区.
在这里插入图片描述

找到自己的调试点 - 方法2

如果下次想根据笔记直接找到调试点(如果脚本没保存), 可以搜索2进制指令
如果搜索到的不是唯一一条, 将目标语句上下文的关联汇编语句加进入一起搜索, 直到能搜索到自己的唯一调试点

48 8B 85 E0 00 00 00 F3 0F 10 00 F3 0F 58 05 AA 92 00 00

搜索的每个字节之间用空格分开, 否则搜索报错.
在这里插入图片描述
在这里插入图片描述

打补丁

打补丁, 让实际数据直接锁定为9999.0
合适的补丁点为将实际数据取出的那句.
在这里插入图片描述
补丁效果
在这里插入图片描述

补丁代码如下:

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048,"Defence_CE_FindData.exe"+11B16) 
label(returnhere)
label(originalcode)
label(exit)newmem: //this is allocated memory, you have read,write,execute access
//place your code here
// 打补丁, 让实际数据直接锁定为9999mov [rax], (float)9999.0originalcode:
movss xmm0,[rax]
addss xmm0,[Defence_CE_FindData.exe+1ADCC]exit:
jmp returnhere"Defence_CE_FindData.exe"+11B16:
jmp newmem
nop 7
returnhere:[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Defence_CE_FindData.exe"+11B16:
db F3 0F 10 00 F3 0F 58 05 AA 92 00 00
//movss xmm0,[rax]
//addss xmm0,[Defence_CE_FindData.exe+1ADCC]

备注

CE适合用来找线索(由可见的外在现象找实际数据的操作逻辑), 缩小调试关注的范围.
找到关键代码附近时, 再用IDA来学习.
如果只是关心数据逻辑, 找到关键数据后, 直接打补丁, 就O了.

如果要打补丁/查找数据, 用CE来做是很方便的.

END

相关文章:

debug - 只要在内存中有显示相关的数据, 就会被CE找到

文章目录 debug - 只要在内存中有显示相关的实际数据, 就会被CE找到概述笔记demo实现demo运行效果用CE查找实际数据地址找到自己的调试点 - 方法1找到自己的调试点 - 方法2打补丁备注END debug - 只要在内存中有显示相关的实际数据, 就会被CE找到 概述 自己写了一个demo, 想验…...

Redis 单个与多节点如何实现分布式锁

分布式锁 在许多环境中&#xff0c;分布式锁是非常有用的原语&#xff0c;在这些环境中&#xff0c;不同的进程必须以互斥的方式操作共享资源。在应对并发问题时&#xff0c;Redis 客户端还可以通过加锁的方式&#xff0c;来控制并发写操作对共享数据的修改&#xff0c;从而保…...

频段划分学习射频知识的意义

一、射频电路设计与低频电路设计的不同点 随着频率提高&#xff0c;相应电磁波的波长与变得可与分立电路元件的尺寸相比拟时&#xff0c;电阻、电容和电感这些元件的电响应&#xff0c;将偏离他们的理想频率特性。以 WIFI 2.4G 频段为例&#xff0c;当频率为 2437MHz&#xff0…...

Effective Objective-C 学习(四)

掌握GCD及操作队列的使用时机 在执行后台任务时&#xff0c;GCD 并不一定是最佳方式。还有一种技术叫做 NSOperationQueue&#xff0c;它虽然与 GCD 不同&#xff0c;但是却与之相关&#xff0c;开发者可以把操作以 NSOperation 子类的形式放在队列中&#xff0c;而这些操作也…...

欢迎来到IT时代----盘点曾经爆火全网的计算机电影

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;这…...

光芒绽放:妙用“GLAD原则”打造标准的数据可视化图表

光芒绽放&#xff1a;妙用“GLAD原则”打造标准的数据可视化图表 文章目录 光芒绽放&#xff1a;妙用“GLAD原则”打造标准的数据可视化图表前言一、可视化工具有哪些&#xff1f;二、那如何做出正确可视化图表 &#xff1f;GLAD原则1.G原则2.L原则3.A原则4.D原则 三、总结最后…...

如何设计出用于喜欢的界面

要设计出用户喜欢的界面&#xff0c;你可以考虑以下几个方面&#xff1a; 用户研究&#xff1a;首先要了解用户的需求和偏好。你可以通过用户调研、用户访谈和数据分析来获取这些信息。了解用户的行为模式、喜好和痛点&#xff0c;有助于设计出更吸引人的界面。 直观的布局&am…...

第三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:pyttsx3实现语音助手经典案例

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录一、项目背景和目标二、雏形示例代码三、扩展思路介绍四、与其他库和API集成示例代码五、自定义语音示例代码六、多语言支持示例代码七、语音控制应用程序示例代码八、文本转语音…...

JS中数组的常用方法

concat() 连接两个或更多的数组&#xff0c;并返回结果。 let array1 [1, 2, 3]; let array2 [4, 5, 6]; let concatenatedArray array1.concat(array2); console.log(concatenatedArray); // [1, 2, 3, 4, 5, 6]join() 把数组的所有元素放入一个字符串。元素通过指定…...

最好用的论文检索网站

网站展示&#xff1a; 网站链接 sci-hub文献检索 用途&#xff1a; 可以用文章的DOI来检索并下载文章...

AI专题:AI巨轮滚滚向前

今天分享的是电子系列深度研究报告&#xff1a;《AI专题&#xff1a;AI巨轮滚滚向前》。 &#xff08;报告出品方&#xff1a;方正证券&#xff09; 报告共计&#xff1a;65页 来源&#xff1a;人工智能学派 Gemini 1.5 Pro 性能显著增强&#xff0c;长上下文理解取得突破 …...

SpringBoot常见问题

1 引言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性&#xff0c;比如自动配置、嵌入式Tomcat等&#xff0c;让开发人员可以更加专注于业务逻辑的实现。   Spring Boot还提供了…...

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…...

用 LangChain 和 Milvus 从零搭建 LLM 应用

如何从零搭建一个 LLM 应用&#xff1f;不妨试试 LangChain Milvus 的组合拳。 作为开发 LLM 应用的框架&#xff0c;LangChain 内部不仅包含诸多模块&#xff0c;而且支持外部集成&#xff1b;Milvus 同样可以支持诸多 LLM 集成&#xff0c;二者结合除了可以轻松搭建一个 LL…...

[Bug解决] Invalid bound statement (not found)出现原因和解决方法

1、问题描述 在写了一个很普通的查询语句之后&#xff0c;出现了下面的报错信息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.oauth.mapper.WxVisitorQrBeanMapper.selectByComIdAndEmpId at org.apache.ibatis.binding.Mappe…...

Qt:Qt3个窗口类的区别、VS与QT项目转换

一、Qt3个窗口类的区别 QMainWindow&#xff1a;包含菜单栏、工具栏、状态栏 QWidget&#xff1a;普通的一个窗口&#xff0c;什么也不包括 QDialog&#xff1a;对话框&#xff0c;常用来做登录窗口、弹出窗口&#xff08;例如设置页面&#xff09; QDialog实现简易登录界面…...

uni-app判断不同端

大家好&#xff0c;今天给大家分享的知识是在uni-app中如何区分是在什么端操作的程序 话不多说直接上代码&#xff1a; // #ifdef APP-PLUS<view>APP端</view>// #endif// #ifdef H5<view>H5端</view>// #endif// #ifdef MP<view>小程序端</v…...

计算机网络-网络设备防火墙是什么?

一、防火墙基本概念 前面我们学习了交换机、路由器是网络中常用的设备&#xff0c;现实中还有一个很重要的设备-防火墙。防火墙这一设备通常用于两个网络之间有针对性的、逻辑意义上的隔离。在网络通信领域&#xff0c;防火墙是一种安全设备。它用于保护一个网络区域免受来自另…...

Code Composer Studio (CCS) - Breakpoint (断点)

Code Composer Studio [CCS] - Breakpoint [断点] 1. BreakpointReferences 1. Breakpoint 选中断点右键 -> Breakpoint Properties… Skip Count&#xff1a;跳过断点总数&#xff0c;在断点执行之前设置总数 Current Count&#xff1a;当前跳过断电累计值 References […...

人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_001---人工智能工作笔记0096

使用centos安装,注意安装之前,保证系统可以联网,然后执行yum update 先去更新一下系统,可以省掉很多麻烦 20240219_150031 这里我们使用centos系统吧,使用习惯了. ChatGlm首先需要一台个人计算机,或者服务器, 要的算力,训练最多,微调次之,推理需要算力最少 其实很多都支持C…...

分层钱包HD钱包

bc1 开头的通常指的是比特币&#xff08;Bitcoin&#xff09;的地址&#xff0c;这种格式遵循了比特币改进提案BIP 0173中定义的Bech32编码格式。Bech32地址也被称为"SegWit"地址&#xff0c;它们支持Segregated Witness功能&#xff0c;这是比特币网络为了提高区块链…...

基于python+mysql的宠物领养网站系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、宠物详情页、用户中心模块。后台功能包括&#xff1a;总览、领养管理、宠物管理、分类…...

机器学习入门--门控循环单元(GRU)原理与实践

GRU模型 随着深度学习领域的快速发展&#xff0c;循环神经网络&#xff08;RNN&#xff09;已成为自然语言处理&#xff08;NLP&#xff09;等领域中常用的模型之一。但是&#xff0c;在RNN中&#xff0c;如果时间步数较大&#xff0c;会导致梯度消失或爆炸的问题&#xff0c;…...

GitHub Actions

GitHub Actions GitHub Actions 是 GitHub 提供的一种持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;解决方案。它可以让你在 GitHub 仓库中直接自动化、定制化和执行软件开发工作流程。 比如&#xff0c;当有新的推送到仓库或者新的 Pull Request…...

harmony 鸿蒙系统学习 安装ohpm报错 ohpm install failed

一. 安装配置 DevEco Studio 安装包时报错 execute ohpm install failed. Install task failed: ArkTS 3.2.12.5. Install ArkTS dependencies failed. 解决办法 找原因&#xff0c;首先&#xff0c;我的电脑中之前安装过node&#xff0c;也许是因为这个。&#xff08;其实…...

MySQL Replication

0 序言 MySQL Replication 是 MySQL 中的一个功能&#xff0c;允许从一个 MySQL 数据库服务器&#xff08;称为主服务器或 master&#xff09;复制数据和数据库结构到另一个服务器&#xff08;称为从服务器或 slave&#xff09;。这种复制是异步的&#xff0c;意味着从服务器不…...

redis分布式锁redisson

文章目录 1. 分布式锁1.1 基本原理和实现方式对比synchronized锁在集群模式下的问题多jvm使用同一个锁监视器分布式锁概念分布式锁须满足的条件分布式锁的实现 1.2 基于Redis的分布式锁获取锁&释放锁操作示例 基于Redis实现分布式锁初级版本ILock接口SimpleRedisLock使用示…...

制作一个简单的html网页

1. 特效按钮 2 可以独立使用的一个页面 3 底部小时钟 <!DOCTYPE html> <html> <head><title>Simple Webpage</title><style>/* 禁止鼠标右键 */body {-webkit-touch-callout: none; /* iOS Safari */-webkit-user-select: none; …...

js filter,every,includes 过滤数组

背景&#xff1a; 页面&#xff1a;在项目中遇到的&#xff0c;前端页面显示为&#xff0c;顶部是下拉搜索条件,下面是一个表格&#xff1b; 数据&#xff1a;接口请求一次性拿到所有&#xff1a;搜索条件里的下拉选项和表格中的数据&#xff1b; 现状&#xff1a;需要前端在搜…...

jenkins自动化部署

Jenkins安装 安装前提条件 yum install java-1.8.0-openjdk* git maven -y ​ 1.下载jenkins wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.346-1.1.noarch.rpm --no-check-certificate ​ jenkins的安装路径&#xff1a; /var/lib/jenkins/ ​ …...