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

这篇具有很好参考价值的文章主要介绍了debug - 只要在内存中有显示相关的数据, 就会被CE找到。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 reason
            show_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 loop

    system("pause");
    return 0;
}

demo运行效果

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

用CE查找实际数据地址

运行程序
用CE附加程序
CE高级选项暂停目标程序.
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE

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

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

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

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

在此处反汇编处上面找一处合适的语句(开始取实际数据的值, 还没开始执行更新实际值的逻辑), 下断点, 手工记录推算一下.
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE
RBP = B083EFF890
RBP + 0xE0 = B083EFF970
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE
[RBP + 0xE0] => 0xB083EFFAC0
执行一句, 走到APP+11B16
RAX = B083EFFAC0, 和推算的一样, 这就是[RBP + 0xE0]的值.

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

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

在codelist中找到自己的调试点, 去反汇编区.
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE

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

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

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

搜索的每个字节之间用空格分开, 否则搜索报错.
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE

打补丁

打补丁, 让实际数据直接锁定为9999.0
合适的补丁点为将实际数据取出的那句.
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE
补丁效果
debug - 只要在内存中有显示相关的数据, 就会被CE找到,# 软件调试,debug,CE

补丁代码如下:

[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
// 打补丁, 让实际数据直接锁定为9999

mov [rax], (float)9999.0

originalcode:
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来做是很方便的.文章来源地址https://www.toymoban.com/news/detail-829303.html

END

到了这里,关于debug - 只要在内存中有显示相关的数据, 就会被CE找到的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决:pycharm绘制词云-中文会被显示成方框乱码

    目录 一.问题1描述 二. 问题1的原因及解决办法 三.问题2描述 四.问题2原因及解决办法        利用大数据进行文本分析,对文本进行处理后,希望直观的将数据绘制成图云查看分词效果,但整个词云全为方框乱码: 此时绘制词云的代码为:           wordcloud默认是不支持显

    2024年02月16日
    浏览(44)
  • 近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)

    🌈个人主页:godspeed_lucip 🔥 系列专栏:C++从基础到进阶 🏆🏆关注博主,随时获取更多关于C++的优质内容!🏆🏆 🍉配套markdown文件下载:请翻阅至文章底部获取 本阶段主要针对C++ 面向对象 编程技术做详细讲解,探讨C++中的核心和精髓。 C++程序在执行时,将内存大方向划

    2024年01月17日
    浏览(47)
  • Linux中与“系统内存”相关的内核数据结构

    【摘要】本文讲述了在Linux中与系统内存相关的内核数据结构,通过逐行分析源代码讲述了内存数据结构之间的关联。 7.1 mm_struct 指向进程所拥有的内存描述符,保存了进程的内存管理信息 7.2 vm_area_struct 进程虚拟内存的每个区域表示为 struct vm_area_struct 的一个实例。 vm_flags是

    2024年02月04日
    浏览(39)
  • 【Oracle】收集Oracle数据库内存相关的信息

    【声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) Oracle数据库包含多个内存区域,每个区域都包含多个子组件。 Oracle Database Memory Structures 根据具体问题的需要,可以通过如下命令收集Oracle数据库内存相关的信息。 例: 注:SET

    2024年01月21日
    浏览(71)
  • 微信小程序踩坑之wxml中有内容,但是页面上不显示

    1,先检查app.json中页面引入的路径正确与否   2,检查当前wxml文件对应的js文件是否为空,如果为空就要加上默认的代码(没有js的处理逻辑,当前的js文件也不能为空),这样问题就解决了 ​​​​​​​      

    2024年02月11日
    浏览(98)
  • QT 实现百万级的数据显示内存消耗几十兆

    用QT 开发了一个上位机的工具用来解析串口的数据,数据量比较大 ,如果QT tableview 控件完全显示,内存消耗较大,所以解析结果先建立sql 数据索引,然后通过垂直滚动条的变化动态地获取数据,每次从数据库中提取50条,测试下来内存消耗较小,可以实现百万或者千万级的

    2024年02月11日
    浏览(41)
  • Debug工具Trace32的ARM内存访问类型详解

    关于Trace32的访问类型的基本概念可以参考博文: Trace32使用教程-访问类型(Access Class)_SOC罗三炮的博客-CSDN博客 本文将以ARMv8为基础,详解Trace32的内存访问类型。 内存访问类型 描述 A 绝对寻址(物理地址),即绕过MMU E 运行时访问。(可以由 SYStem.CpuAccess 和SYStem.MemAccess命令来

    2024年02月16日
    浏览(41)
  • 【elementplus】解决el-table开启show-overflow-tooltip后,tooltip的显示会被表格边框遮挡的问题

    如图所示: 原因: 1. el-table没有设置高度;2.就是被遮住了 解决: 方法一:给el-table设置高度 方法二: 如果不想给el-table设置高度,就直接使用方法二解决即可

    2024年02月12日
    浏览(76)
  • 一看就会;vue实现图片上传回显及修改(element-ui限制一张图片上传,没有图片显示+号,有图片显示图片隐藏+号)

    1.单独封装element-UI的upload文件上传组件; 2.组件完成上传、回显、修改功能; 3.没有图片时,显示上传的+号,有图片时隐藏上传的+号;   父组件:  代码:

    2024年02月15日
    浏览(37)
  • android 如何分析应用的内存(八)——Android 7.0以后的malloc debug

    接上文,介绍六大板块中的第三个————malloc调试和libc回调 上一篇文章中,仅仅是在分配和释放的时候,拦截对应的操作。而不能进一步的去检查内存问题。比如:释放之后再次使用指针,内存泄漏,内存损坏等等。 在这篇文章中,将会介绍malloc调试技术,它可以对nat

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包