Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
EAC-Kernel-Packet-Fucker — 逆向工程 Easy Anti-Cheat 内核驱动绕过,通过拦截内存分配来抑制违规数据包,并包含报告解密例程和分析笔记。 | Kitploit
工具/GitHubGitHub/gmh5225/eac-kernel-packet-fucker
加密/解密工具内存取证漏洞利用IDS/IPS规避逆向工程恶意软件分析二进制分析红队反机器人
GitHubgmh5225/eac-kernel-packet-fucker

EAC-Kernel-Packet-Fucker

逆向工程 Easy Anti-Cheat 内核驱动绕过,通过拦截内存分配来抑制违规数据包,并包含报告解密例程和分析笔记。

174314年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库网站

EAC-Kernel-Packet-Fucker

不是我的代码。仅用于保存 https://www.unknowncheats.me/forum/anti-cheat-bypass/503052-easy-anti-cheat-kernel-packet-fucker.html

这是 Easy Anti-Cheat 内核数据包干扰器(简称 EACKPFucker)。 这是什么?基本上,通过它们的内核模式驱动发送的数据包将不会被发送给它们,这意味着你的 pasta pasta 2023 kdmapper FUD 绕过可以毫无阻碍地使用。

好吧,你让我大吃一惊。这他妈是怎么工作的? 只需更改一个地址。现在,让我们深入了解 EAC 实际上是如何工作的。

从一开始,Easy Anti-Cheat 必须实际获取你的数据才能封禁你。这些数据包通过它们的 Hydra 通道发送,并且是加密安全的。对于这个绕过来说,这就是你需要知道的全部,我不会对此进行更详细的说明。

让我们看看这在它们的内核驱动内部是如何工作的,以一个随机违规为例:

image

这对你来说看起来不是很容易受到攻击吗?因为对我来说确实如此。 让我们看看我们的第一个函数:kalloc_rt image 嗯,好吧。让我们跳进 alloc_pool_with_tag image 它动态导入 ExAllocatePoolWithTag。嗯……我想知道如果有人把那个 qword 修改为他们修改过的 malloc 函数会发生什么……(是的,它有效——而且由于你修改的是一个可写段,EAC 完全不会察觉)

好吧,现在我们控制了内存分配。酷!我们能用它做什么?

我很高兴你问了!事情是这样的:来自内核模式的所有数据包大小都是 33096i64……而且之前我们看到,如果内存没有被分配,EAC 就……忽略这个违规。

好吧,假设有人只是……这样做:

image

image

image

---------------------------------------------------------------------------------------------------------------------------------------```C++ // report encryption looks like this (some parts may vary for each report, i believe they use key1, key2, key3 to use only 1 function for decryption) static report_t* encrypt(uint8_t* data, uint64_t size) {

report_t* packet = (report_t*)malloc(sizeof(report_t));
if (!packet) return nullptr;

uint32_t seed = 0x80BE5ED5 * ((uint64_t)&data >> 2);

memset(&packet->key1, 0, 0x8200);
packet->raw_size = 0;
packet->key1 = 0x66259F86; // gives key4?
packet->key2 = 0x21EBA81; // gives key5?
packet->key3 = 0xACE987AF; // gives key6?
packet->key4 = 0x50BFC583; // gives seed
packet->key5 = 0x3C61A927; // gives dynamic_key (from end)
packet->key6 = 0x70881859; // gives actual payload size

uint8_t* raw_data = packet->raw;
uint64_t raw_size = 24;
uint8_t* payload_data = packet->payload;
uint64_t payload_size = 0;

uint32_t dynamic_key = seed ^ 0x6957FDB6;
while (payload_size < size && payload_size < 0x8000) {

	uint32_t a = (dynamic_key << 0xD) ^ dynamic_key;
	uint32_t b = (a >> 0x11) ^ a;
	uint32_t c = (b << 0x5) ^ b;
	uint32_t d = _rotr(c, 2);

	uint8_t shift = 8 * (payload_size & 3);
	payload_data[payload_size] = data[payload_size] ^ (d >> shift);
	dynamic_key = data[payload_size] ^ d;

	payload_size++;
	raw_size++;
}

uint64_t aligned_size = (raw_size + 0xFF) & ~0xFF; // align up by 0x100
while (raw_size < aligned_size) {
	dynamic_key *= 0x80BE5ED5;
	raw_data[raw_size++] = dynamic_key;
}

packet->key4 ^= seed;
packet->key5 ^= dynamic_key;
packet->key6 ^= payload_size;
packet->raw_size = raw_size;
return packet;

}

// thus my decryption looks like this static void decrypt(report_t* packet) {

uint32_t seed = packet->key4 ^ 0x50BFC583;
uint32_t dynamic_key = seed ^ 0x6957FDB6;
//uint32_t dynamic_key = packet->key5 ^ 0x3C61A927;

uint8_t* payload_data = packet->payload;
uint32_t payload_size = packet->key6 ^ 0x70881859;


for (uint32_t i = 0; i < payload_size; i++) {
	uint32_t a = (dynamic_key << 0xD) ^ dynamic_key;
	uint32_t b = (a >> 0x11) ^ a;
	uint32_t c = (b << 0x5) ^ b;
	uint32_t d = _rotr(c, 2);

	uint8_t shift = 8 * (i & 3);
	payload_data[i] ^= (d >> shift);
	dynamic_key = payload_data[i] ^ d;
}

}

在导出一些报告并解密后:
下载工具