游戏黑客是一个瞬息万变的格局,这要求反作弊开发人员必须创新并实施独特的,无法识别的检测机制。在本文中,我将阐明一些神秘的例程,这些例程使塔可夫(Tarkov)逃脱了数百个作弊者。因此,让我们从头开始。
从Tarkov绕过(以下简称“ Tarkov”)在游戏引擎Unity上通过Mono运行,它打开了一些有趣的安全性问题,游戏黑客可以滥用这些安全性问题在玩游戏时获得优势。首先,Unity游戏组件是非常难integry检查他们一直在JIT编译时。这是因为您不能简单地存储代码的哈希值1,因为JIt编译的方法可能会因启用的处理器功能而异。
这使反作弊开发人员处于困境。没有以下两种情况,就无法确保JIT编译器功能的完整性:
- 在游戏开始之前进行初始化,然后挂上负责的JIT引擎。该钩子可用于为所有已编译函数缓存哈希,以供以后比较
- 采取其他方法来确保游戏的完整性,例如检查图像元数据。
BattlEye ..?
虽然Tarkov实际上在其Battlestate Games启动器应用程序中具有完整性检查(简单的文件哈希),但是通过在诸如dnSpy之类的工具中打开启动器可执行文件并简单地删除整个程序,来修补可执行文件并不容易。这种完整性检查(在启动器中内部称为“一致性检查”)是如此容易被绕开的事实,使成千上万的作弊者可以简单地将游戏程序集修补到磁盘上。其中可能包括“ wallhack”,“ no Recoil”等功能。
似乎Battlestate Games厌倦了此漏洞,并且要修复此漏洞,他们可能召集了商业反作弊BattlEye的开发人员,他们已经使用了很长时间了。本文将探讨一个以前未知的反作弊模块,该模块将在大约15-20分钟的突袭中动态流传输并执行给Tarkov玩家。
Shellcode
以下代码段是新的反作弊模块的准确表示,我已对它们进行了反向工程和反编译。如果您对代码感到害怕,请跳过本节,直接继续我的解释!
代码语言:javascript复制auto paths = {
"EscapeFromTarkov_Data\Managed",
"EscapeFromTarkov_Data"
"EscapeFromTarkov_Data\StreamingAssets\Windows\assets\content\characters\character\bear\bear0";
}
auto report_buffer = (std::uint8_t*)malloc(0x5000);
report_buffer[0] = 0x00;
report_buffer[1] = 0x49;
for (auto index = 0; index < 3; index)
{
_mm_lfence();
// CALCULATE CONTAINING PATH
PathCombineA(&combined_path,
&paths[index],
index == 1 ? "sharedassets*.assets" : "*");
auto search_handle = FindFirstFileA(&combined_path, &file);
if (search_handle != INVALID_HANDLE)
{
// LOOP ALL FILES
while (true)
{
// SKIP DIRECTORIES
if (!(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
// CALCULATE STRING LENGTH
for (filename_size = 0; file.cFileName[filename_size]; filename_size)
;
// CHECK FOR BUFFER OVERFLOW
if ((buffer_ptr - report_buffer filename_size 5) > 0x5000)
{
break;
}
// COPY FILENAME
*buffer_ptr = filename_size;
for (i = 0; i < *buffer_ptr; i)
buffer_ptr[i 1] = file.cFileName[i];
// GET FINAL FILENAME
PathCombineA(&combined_path, &paths[index], file.cFileName);
if (index > 0 || memeq_wildmark(file.cFileName, "NLog????.nlo"))
{
buffer_ptr = *buffer_ptr 1;
*(_DWORD *)buffer_ptr = 0;
if (GetFileAttributesExA(&combined_path, false, &file_attributes))
*(_DWORD *)buffer_ptr = file_attributes.nFileSizeLow;
buffer_ptr = 4;
}
// GET MONO INFORMATION FROM MEMORY
else if (GetFullPathNameA(&combined_path, MAX_PATH, &full_path, 0))
{
auto mono_image = mono_image_loaded(&full_path);
if (mono_image)
{
buffer_ptr = *buffer_ptr 1;
*(_DWORD *)buffer_ptr = mono_image->image_size;
buffer_ptr = 4;
}
}
}
// GOT TO NEXT FILE
if (!FindNextFileA(search_handle, &file))
{
break;
}
}
FindClose(search_handle);
}
}
battleye::send_packet(report_buffer, buffer_ptr - report_buffer, false);
free(report_buffer);
功能性
模块本身非常简单。它存储一个硬编码的文件夹列表以扫描所有驻留在Tarkov游戏文件夹中的文件夹:
代码语言:javascript复制EscapeFromTarkov_Data\Managed
EscapeFromTarkov_Data
EscapeFromTarkov_Data\StreamingAssets\Windows\assets\content\characters\character\bear\bear0
扫描这些文件夹中的所有文件,并将其图像大小,文件名和大小上传到BattlEye服务器。特别是,它可以用于检测任何篡改磁盘上程序集的人。这些文件夹包含游戏相关的程序集,角色详细信息和地图数据。但是这个模块有一些巨大的疏漏,作弊者可以并且将继续使用它们来继续在塔尔科夫作弊。
首先,用于迭代文件的API调用是特定于ascii的,这意味着,如果游戏路径的任何部分都使用unicode编码,则此检查只会被反作弊方法跳过。还存在第二个问题:0x5000
字节的硬编码缓冲区长度不一定足够大,无法包含所需的信息。没有什么能阻止作弊者创建100多个文件的,这些文件的名称足够长以占用MAX_PATH
缓冲区中的字符数量。从本质上讲,这将使反作弊仅上传前100个垃圾文件,而不检查实际的游戏程序集。最后,任何具有内存访问权限的游戏黑客都可以轻松覆盖内存中的单声道图像大小。