一步步 扭转 CryEngine 制作一个简易的Internal Cheat[1]

发表于 2019-09-12  198 次阅读


目前不用说什么了 CryEngine5 UnrealEngine4 已经成为目前主流游戏的引擎.

无论是AntiCheat开发人员 还是Cheat制作者 也都需要对其有一定的了解

其中有相当多的英文相关资料其手法已经相当的成熟 但是中文相关资料却是比较匮乏 国内大多数相关人员逆向现代游戏引擎手法还处于一个相当原始的阶段 本文意在提供一种系统性的逆向思路 改变老套的逆向思路 如万事靠CheatEngine 搜+搜的古老手法..

这种逆向思路属于系统性 可参照物强(指 可以直接下载到当前游戏使用的引擎源代码)不在当无头苍蝇. 大家都知道 无论是Exernal/internal cheat,第一步我们需要找到的是actor所属的列表 在现代游戏引擎中这些东西通常为一个巨大的结构体描述了当前引擎的状态 当然其中 也有我们需要的actor count 以及 pActorList.

今天 我们拿一个简单的游戏作为小白鼠 游戏名: Deceit 引擎:CryEngine 5.5 AntiCheat:无 保护壳:无 这里顺便说一下 大多数游戏通常都有保护壳 我们只需要用工具将其解密后的可执行内存dump也是可以正常分析的。

这些有公开资料的东西 我们如何做到相对来讲比较系统的方式去了解它 我比较倾向于 动静态结合 +引擎源代码 作为分析当前游戏的工具 :IDA7.0+ CheatEngine +X64dbg +CryEngine.5.5 src

然后就是编译器优化 众所周知 微软的编译器优化非常厉害,能给你搞成你自己都不认得的样子

class Engine{

public:

void **actorlist;

size_t actor_count;

public:

void ** actor_list(){

return actorlist ;

}

size_t actor_count(){

return actor_count ;

}

};

Engine engine;

for(; i<engine.actor_count();i++){

void * actor =engine.actorlist()[i];

if( !actor ) error("get actor failed!");

actor->health();

}

如以上代码通常可能会被编译器优化 直接拆分 在反编译工具中的表现可能与源代码中的样子有一些不同.

如 for(; i<engine.actor_count();i++){ 中的 engine.actor_count() 可能直接被优化为一个指向 一个整数的指针 如mov eax,[ptr_To_int]而不是 mov rax,[rax]; call [rax+8]这一点在参考引擎时要特别注意.这些比较简单的概念要了解 不然在接下来的你去寻找有用的东西时候可能会绕圈子或者忽略很多东西

好了有个差不多的概念就好 也都不是那种什么都不懂的小白.

接下来进入正题:过两天再写..

本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0

博客管理员