通过重载INT,隐藏内存中的数据,来避免CE等内存搜索工具对内存的锁定与修改。
1 普通程序模拟。输入'A'增加金钱,’S‘减少金钱,’X'用于退出程序。
#include <iostream>
using namespace std;
int money = 2000;
int main()
{
cout << "A 增加,S减少,X退出\n";
do
{
char x;
cin >> x;
if (x=='x'||x=='X') break;
if (x == 'a' || x == 'A') money = money + 10;
if (x == 's' || x == 'S') money = money - 10;
cout << "金钱为:" << money << endl;
} while (true);
}
程序执行截图:
执行
2 Cheat Engine分析
操作
输入2000后,进行搜索。
结果
可以很轻松的找到在内存中的地址,并修改。
并可能通过谁修改了这个值,来找到相应位置的汇编代码,来更改程序。
3 加密程序
原理:将INT在内存中的位置给打乱,防止内存搜索软件对程序进行搜索。程序只是简单介绍了实现该方法的技巧。
class hint
{
char* mem[4];//4个字节的内存空间
public:
hint(int val = 0);
~hint();
operator int();//重载int
void operator=(int val);//重载=
};
hint::hint(int val)
{
mem[0] = new char;//动态分配内存
mem[1] = new char;
mem[2] = new char;
mem[3] = new char;
cout << "mem[0]" <<(void*) (mem[0]) << " mem[1]" << (void*)mem[1] << " mem[2]" <<(void*)mem[2] << " mem[3]" << (void*)mem[3] << endl;
*this = val;
}
hint::~hint()
{
delete mem[1];//删除内存
delete mem[2];
delete mem[3];
delete mem[0];
}
hint::operator int()
{
int val;
char* read = (char*)&val;
read[3] = mem[0][0];
read[1] = mem[1][0];
read[0] = mem[2][0]^ 0x21;//防止只剩个位数时,对内存的搜索
read[2] = mem[3][0];
return val;
}
void hint::operator=(int val)
{
char* read = (char*)&val; //读取int值的地址
mem[0][0] = read[3]; //打乱放入内存中
mem[1][0] = read[1];
mem[2][0] = read[0]^ 0x21;
mem[3][0] = read[2];
}
hint money=2000;//其它程序不变
4 后记
此笔记是根据腾讯课堂上某某云培训机构的C++课堂的一节内容进行整理,为避免广告嫌疑,就不提该机构的名称了。程序看上去简单,但包含的知识不少。指针数组,动态内存分配,类的重载等,值得好好研究掌握,特此分享共同进步。
|