版本:2.4.3
參考:
修改內存工具,類似以前玩仙劍奇俠傳的修改器金手指之類,查找金幣1000,然后金幣改變到1200,再查找1200。
根據多次查找鎖定金幣的內存位置,然后修改為99999.
可以將保存的關鍵數據進行異或后保存,取出來時才經過異或獲取。或者和參考中一樣使用md5等方式將數據改變后再保存,避開內存修改器直接查找數值來進行修改。
@ccclass
export default class test_setShader extends cc.Component {
public num:number = 999;
public key:number = 0;
onLoad() {
this.key = this.num*Math.random();
this.num = this.num^this.key;
console.log(this.num); //隨機值
console.log(this.num^this.key); //999
}
}
做成一個工具類EncodeNumber,將需要防內存修改的屬性傳入。
const { ccclass, property } = cc._decorator;
@ccclass
export default class Test extends cc.Component {
public gold:number = 999; //金幣
onLoad() {
//防內存修改屬性
EncodeNumber.encode(this, "gold");
this.node.on(cc.Node.EventType.TOUCH_END,()=>{
let rand = Math.random()*1000;
this.gold = rand;
console.log("隨機數:",rand, "擁有金幣:", this.gold);
},this);
}
}
class EncodeNumber{
private static num = {}; //存放原始值
private static key = {}; //存放異或的key
private static key_num = {}; //存放異或后的值
public static encode(thisObj:any, propertyKey:string){
Object.defineProperty(thisObj, propertyKey, {
get:()=>{
if(this.key_num[propertyKey] != null && this.key[propertyKey] != null){
console.log("get",this.key[propertyKey], this.key_num[propertyKey]);
if((this.num[propertyKey]^this.key[propertyKey]) != this.key_num[propertyKey]){
console.log("值被修改");
return 0;
}else{
console.log("值正常");
return this.key_num[propertyKey] ^this.key[propertyKey];
}
}else{
console.log("沒有初始值");
return 0;
}
},
set:(value)=>{
this.num[propertyKey] = value;
this.key[propertyKey] = Math.random()*1000;
this.key_num[propertyKey] = this.key[propertyKey]^value;
console.log("set",this.key[propertyKey], this.key_num[propertyKey]);
}
});
}
}
用一個自定義類的方式。 新創建一個自定義number類來進行異或。
const { ccclass, property } = cc._decorator;
@ccclass
export default class Helloworld extends cc.Component {
public gold:EncodeNumber = new EncodeNumber();
start() {
console.log(this.gold.getValue()); //0
this.gold.setValue(99);
console.log(this.gold.getValue()); //99
this.gold.setValue(123);
console.log(this.gold.getValue()); //123
}
}
class EncodeNumber{
private num:number = 0;
private key:number = 0;
/**
* 設置值
* @param value
*/
public setValue(value){
this.key = value*Math.random();
this.num = value^this.key;
console.log("異或值:", this.key, this.num); //保存的num和key都是隨機值
}
/**
* 獲取值
* @returns
*/
public getValue(){
return this.num^this.key;
}
}
