游戏反私服方案思考。

2021-01-21 15:08:49 浏览数 (1)

动态代码下发机制

1. 提供两组宏, 一组代码抽离宏,一组代码抽离并且执行一次后删除宏 TQP_START / TQP_END TQP_CLEAR_START / TQP_CLEAR_END

2. 客户端在需要抽离代码的地方头尾加入宏

3. 代码抽离工具根据识别到的宏,将所有需要抽离的代码抽离出来保存到文件shellcode.dat中,这个文件最后存储到服务器上,为防止被拿走可以做个简单的加密

4. 客户端请求下载shellcode文件的时候,客户端随机生成一个clientkey (这个key是反外挂模块生成和保存的)发送给服务端, 服务端收到指令后随机生成一个serverkey, 然后用这两个key组成一个新key加密压缩shellcode.dat

5. 服务器发送serverkey给客户端,然后再发送加密后的shellcode.dat文件给客户端

6. 客户端收到加密后的shellcode文件,由反外挂模块根据服务器给的serverkey以及自己存储的clientkey, 解密该shellcode文件,调整代码让客户端正确运行起来

7. 客户端解密完成后,clientkey立即清除掉

8. 这整个通讯过程发送的数据包由反外挂模块加密生成,收到的数据包由反外挂模块解密处理,这样包里面的serverkey和加密后的shellcode.dat不好被私服作者发现。

9. 这个通讯过程只能发生一次,反外挂模块记录判断是否通讯过,如果有的话,不再发生二次通讯,否则直接崩溃客户端

作用:

1. 私服没有加密前的shellcode.dat文件,该文件只存在于官方服务器。

1. 即使私服作者拦截到加密后的shellcode文件,但是私服没有解密算法没法解密该文件。。

2. 即使私服作者用反外挂模块来解密该文件 <<拦截到的加密文件>>,但是由于每次key是由服务器随机生成的,没有正确的key反外挂模块解密不了,客户端无法正常运行

3. 即使私服作者拿到一组serverkey和加密后的shellcode文件,然后直接调用反外挂模块来解密,但是由于clientkey在解密过一次后就清除了,所以无法解密 (而且是堆栈中的临时数据,游戏一退出就不存在了)

4. 私服作者多次模拟这个通讯过程的话,则反外挂模块直接崩溃客户端

难度:

1. 代码抽离工具的制作

2. 反外挂模块解密shellcode.dat并保证客户端正确运行

3. 如何保证被抽离的代码块能够打散的分配的动态内存中,从而让私服作者不好还原到对应的客户端地址

4. 能做到抽离的客户端文件只留出一条 call dword ptr [xxx]大小的空间,防止私服作者再次把代码复制原地方(没空间给他复制代码)

5. 最好能够实现代码简单的混淆,这样,私服作者不好整到原先的代码,还原代码比较费力,简单的乱序变形代码都是存储于分配内存中,想整理出原始代码难度较大

6. 乱序变形操作最好在代码抽离工具生成shellcode.dat就已经完成,客户端下载到的就是乱序变形后的代码

0 人点赞