| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 730 人关注过本帖
标题:关于CE的一个问题
只看楼主 加入收藏
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
结帖率:81.71%
收藏
已结贴  问题点数:20 回复次数:4 
关于CE的一个问题
程序代码:
int main()
{
    int gold = 1000;
    char* p = (char*)&gold;
    char* mem[4]{};
    mem[0] = new char;
    mem[1] = new char;
    mem[2] = new char;
    mem[3] = new char;
    mem[0][0] = p[3];
    mem[1][0] = p[0];
    mem[2][0] = p[2];
    mem[3][0] = p[1];
    int val = 0;
    char* p1 = (char*)&val;
    p1[0] = mem[1][0];
    p1[1] = mem[3][0];
    p1[2] = mem[2][0];
    p1[3] = mem[0][0];
    gold=val;
    while (1)
    {
        std::cout << "gold的数量为===>" << gold;
        system("pause");
        gold += 100;
    }
    system("pause");
}

今天做了一个实验,不想让别人用CE搜到gold的值,像上面这样写,可以吗?
搜索更多相关主题的帖子: new char pause system int 
2023-04-27 11:47
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
有个朋友说
在游戏里面,可以通过把数据打乱的方式保证游戏数据不会被搜索到
比如int gold=1000
当我们用CE在程序中搜1000时,可能就会找到gold的真实地址,
但是如果我们把gold在内存中的存储方式打乱,比如
gold=1000四个字节,然后把每个字节打乱并将每一份保存起来
当需要显示gold时,再把保存好的一份重新组合就能显示
我知识水平不够,不理解的地方是,当把它重新组合的时候,组合完毕后
不就再内存中有一个完整的gold了吗,不还是能被搜索到??
2023-04-27 19:08
东海ECS
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:7 
以下是引用后卿在2023-4-27 11:47:51的发言:


int main()
{
    int gold = 1000;
    char* p = (char*)&gold;
    char* mem[4]{};
    mem[0] = new char;
    mem[1] = new char;
    mem[2] = new char;
    mem[3] = new char;
    mem[0][0] = p[3];
    mem[1][0] = p[0];
    mem[2][0] = p[2];
    mem[3][0] = p[1];
    int val = 0;
    char* p1 = (char*)&val;
    p1[0] = mem[1][0];
    p1[1] = mem[3][0];
    p1[2] = mem[2][0];
    p1[3] = mem[0][0];
    gold=val;
    while (1)
    {
        std::cout << "gold的数量为===>" << gold;
        system("pause");
        gold += 100;
    }
    system("pause");
}

今天做了一个实验,不想让别人用CE搜到gold的值,像上面这样写,可以吗?

不可以。CE(Cheat Engine)是一种内存修改工具,可以通过读取内存中的数值并进行修改。无论你将gold的值存在哪里,只要在内存中,就有可能被CE找到并修改。如果你希望防止使用CE修改金币数量,需要使用其他方法,比如加密金币数量或进行服务器端验证。

会当凌绝顶,一览众山小.
2023-04-27 19:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:7 
回复 3楼 东海ECS
我有个猜想
Cheat Engine 搜索的类型的位数是有限的
假如我用一个16bytes的内存,并保证每次数值变化后都会保证之前变化的那部分不动
比如 2bits的索引+62bits的加密数据 + 2bits的索引+62bits的加密数据
     索引1与索引0同时存在,只索引1有效
     索引2与索引1同时存在,只索引2有效
     索引3与索引2同时存在,只索引3有效
     索引0与索引3同时存在,只索引0有效
那么每次数值更改都会有一个8bytes的块并不变化,这就导致Cheat Engine的模糊查找失效。

然后还要保证永远不将解密后的数据完整送往GUI,以防Cheat Engine通过精确查找后反汇编。
这可以将解密后的数据分段送给GUI,送一段销毁一段。
2023-04-28 00:04
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 3楼 东海ECS
程序代码:
#include <iostream>
class hint
{
private:
    char* mem[4]{};
public:
    hint(int val);
    operator int();
    void operator =(int f_gold);
    ~hint();
};
hint::hint(int val)
{
    mem[0] = new char;
    mem[1] = new char;
    mem[2] = new char;
    mem[3] = new char;
    *this = val;
}
hint::~hint()
{
    delete mem[0];
    delete mem[1];
    delete mem[2];
    delete mem[3];
}
hint::operator int()
{
    int val{};
    char* read = (char*)&val;
    read[0] = mem[1][0];
    read[1] = mem[3][0];
    read[2] = mem[2][0];
    read[3] = mem[0][0];
    return  val;
}
void hint::operator=(int val)
{
    char* p = (char*)&val;
    mem[0][0] = p[3];
    mem[1][0] = p[0];
    mem[2][0] = p[2];
    mem[3][0] = p[1];
}
int main()
{
    hint gold{ 100 };
    while (1)
    {
        std::cout << "gold的数量为===>" <<gold;
        system("pause");
        gold = gold + 100;
    }
    system("pause");
}

那为什么我这么写,CE 就搜索不到gold的数值了呢
我的意思是最简单的搜索搜索不到,如果是高手 的话可能还是会搜素到

[此贴子已经被作者于2023-4-28 10:55编辑过]

2023-04-28 09:51
快速回复:关于CE的一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034824 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved