2 个版本
0.1.2 | 2021 年 12 月 28 日 |
---|---|
0.1.1 |
|
0.1.0 | 2021 年 12 月 25 日 |
1157 在 游戏开发 中
30KB
442 行
混淆整数 — 针对作弊引擎用户
这是一个库,可能会阻止大多数作弊引擎(及其他变体)程序扫描相对地址,从而阻止进一步的修改。
在 GPL v3 或更高版本下发布。
更新日志
v0.1.1 - v0.1.2
- v0.1.2 中的热修复:删除主函数。
- 添加一个 README.md 文件
- 在库中添加一些不安全代码,使程序更加随机。
v0.1.0
- 初始提交
lib.rs
:
这是一个用于测试的库,可能会阻止大多数作弊引擎(及其他变体)程序扫描相对地址,从而阻止进一步的修改。这里提供的类型大多以 'O' 开头,其余部分与其实际类型相同,例如,Oi32
实际上是一个混淆的 i32
,对于大多数作弊引擎用户来说,即使修改一个非常简单的程序也相当困难。
许可证:GPL-v3 或更高版本
示例
#![feature(bench_black_box)]
use std::hint::black_box;
#[macro_use] // if you want to import the macro
extern crate obfuscate_integer;
use obfuscate_integer::*;
fn main(){cai!{
let mut player_hp:Oi32:=500000;
let mut enemy_hp:Oi32:=1000000;
let mut round:Oi16:=0;
let now=std::time::Instant::now();
loop{
round+=1;
enemy_hp-=1;
if enemy_hp<0 {break}
player_hp-=1;
if player_hp<0 {break}
}
println!("execute 5000000 loops, cost {:?}",now.elapsed());
let mut player_hp:Oi32:=500000;
let mut enemy_hp:Oi32:=1000000;
let mut round:Oi16:=0;
let now=std::time::Instant::now();
loop{
round+=black_box(1);
enemy_hp-=black_box(1);
if enemy_hp<0 {break}
player_hp-=black_box(1);
if player_hp<0 {break}
}
println!("execute 5000000 loops, cost {:?}",now.elapsed());
let mut stdin = std::io::stdin();
let mut player_hp:Oi32:=500000;
let mut enemy_hp:Oi32:=1000000;
let mut round:Oi16:=0;
let mut buffer = String::new();
} // at least 0.1.0, `cai!` does not support complicated instructions like the following one. it might be solved in future versions.
if loop{
round+=1;
println!("Round {} is comming, player's hp is {} and enemy's hp is {}. Press `Enter` to continue.",&round,&player_hp,&enemy_hp);
stdin.read_line(&mut buffer).unwrap();
buffer.clear();
enemy_hp-=1;
if enemy_hp<0 {break true}
player_hp-=1;
if player_hp<0 {break false}
}{
println!("You win!");
}else{
println!("You dead.");
}
}
限制
程序必须使用 overflow-checks = false
编译,因为调试模式无法处理高度可能的环绕操作。使用 std::hint::black_box,不难发现 Oi32 使程序运行速度比使用 i32 慢 100 倍,因此,不要在处理大量计算时使用 Oi* 或 Ou*。对于正常(例如,游戏)使用,这是可以接受的。