Amlegit - amlegit.com 的逆向工程(2)
由于我们知道 GetDriver 的参数和返回类型,我们实际上可以用我们自己的代码调用这个函数。为了清楚起见,函数原型看起来像这样std::uintptr_t GetDriver(unsigned* size);
//--- amlegit dll functions.
namespace amlegit
{
//--- function is only for extracting the driver
static std::tuple<std::uintptr_t, std::size_t> get_driver()
{
auto get_driver_temp =
reinterpret_cast<__int64(*)(unsigned*)>(
GetProcAddress(LoadLibrary(L"buffer.dll"), "GetDriver"));
unsigned driver_size;
if (get_driver_temp)
return { get_driver_temp(&driver_size), driver_size };
return { {}, {} };
}
}
//--- calling example.
auto [driver_ptr, driver_size] = amlegit::get_driver();
司机
现在我们有了驱动程序,让我们看看它如何与作弊用户模式对应物进行通信。这个欺骗 IOCTL 钩子通过改变合法的 Windows 驱动程序的主要函数指针来指向它们的 ioctl 函数。他们还将卸载函数更改为指向他们的,因此如果/当该驱动程序被卸载时,他们可以删除 IOCTL 钩子。
INIT:000000014000C268 ; ---------------------------------------------------------------------------
INIT:000000014000C268
INIT:000000014000C268 loc_14000C268: ; CODE XREF: ioctl_hook_setup+FFA
INIT:000000014000C268 lea rax, IRP_MJ_CREATE
INIT:000000014000C26F mov [rbx+70h], rax
INIT:000000014000C273 lea rax, IRP_MJ_CLOSE
INIT:000000014000C27A mov [rbx+80h], rax
INIT:000000014000C281 lea rax, IOCTL_HOOK_FUNCTION
INIT:000000014000C288 mov [rbx+0E0h], rax
INIT:000000014000C28F mov rcx, cs:hooked_driver_object_ptr
INIT:000000014000C296 mov cs:pdriver_obj, rbx
INIT:000000014000C29D call create_symbolic_link
INIT:000000014000C2A2 or eax, eax
INIT:000000014000C2A4 jns short loc_14000C2B2
INIT:000000014000C2A6 lea rcx, aFailedToCreate_0 ; "Failed to create symlink
"
INIT:000000014000C2AD call debug_with_prefix
考虑到我们知道驱动程序如何与用户模式进程通信,让我们看看 IOCTL 钩子函数本身。IOCTL 支持从给定 PID 的进程读取,根据其 PID 写入进程,在给定 PID 的进程中分配内存,以及欺骗 hwid。对我来说最突出的两个选项是 hwid 欺骗器和内存分配,因为请记住,这种作弊是内部的,所以他们必须隐藏自己的内存,对吗?错误,正如您将看到的,他们只是在调用 ZwOpenProcess 后调用 ZwAllocateVirtualMemory。他们根本不隐藏自己的记忆。
if (IOCTL_CODE == 0x224986)
{
v18 = * (unsigned int ** )(PIRP_1 + 24);
PsLookupProcessByProcessId( * v18, & v25);
debug_with_prefix((__int64) "Allocating with size %llu...
", v18[4]);
v19 = * (_QWORD * )(PIRP_1 + 8);
if ( * (_BYTE * )(v19 + 10) & 5)
v20 = * (_QWORD ** )(v19 + 24);
else
v20 = MmMapLockedPagesSpecifyCache((PMDL) v19, 0, MmCached, 0 i64, 0, (MM_PAGE_PRIORITY) 0x40000010);
v26 = * v18;
v27 = 0 i64;
v28 = 48;
v29 = 0 i64;
v31 = 0;
v30 = 0 i64;
_mm_storeu_si128((__m128i * ) & v32, (__m128i) 0 i64);
v4 = (unsigned int) ZwOpenProcess( & v34, 0x1FFFFF i64, & v28, & v26);
debug_with_prefix((__int64)
"Got process handle %x with status %x
", v34, v4);
v21 = 0 i64;
v33 = 0 i64;
v35 = v18[4];
if ((int) v4 >= 0) {
v4 = (unsigned int) ZwAllocateVirtualMemory(v34, & v33, 0 i64, & v35, 4096, 64);
debug_with_prefix((__int64)
"Allocated at %llx with status %x
", v33, v4);
v21 = v33;
}* v20 = v21;
v20[2] = 0 i64;
v20[1] = 0 i64;
}
在我深入研究欺骗者之前,我只想说明 amlegit 的开发人员没有发现一种欺骗 hwid 的新方法。换句话说,他们只是将公共代码粘贴在一起并开始销售。如果您不想阅读有关 github 存储库的内容,那么您可以跳过本节并进入下一节。
此驱动程序中的欺骗者是可在此处找到的公共代码。它绝不是未被发现的,使用它会导致禁令。我们先来看看 IOCTL 选项来欺骗 hwid。调试打印语句告诉我们每个后续函数与什么相关。这使得交叉引用公共 github 存储库变得非常容易,以确保我们正在寻找的东西确实是其他人的作品。
if (IOCTL_CODE == 0x235C42)
{
debug_with_prefix((__int64)
"Initializing...
");
init_spoof();
debug_with_prefix((__int64)
"Disks...
");
spoof_disk();
debug_with_prefix((__int64)
"Volumes...
");
spoof_volumes();
debug_with_prefix((__int64)
"NIC...
");
spoof_nic(0 i64);
debug_with_prefix((__int64)
"SMBIOS...
");
spoof_smbios();
debug_with_prefix((__int64)
"GPU...
");
spoof_gpu();
v22 = "Done
";
}
我们先来看看spoof_disk。如您所见,此函数与公共源是 1:1 的。由于该函数非常大,我将把它放在另一个页面上,以便您与 github 存储库交叉引用它。
媒体
这是演示启动器的 youtube 视频副本,以防万一它变为私有或删除。正如您将在视频中看到的,打开的控制台包含的信息与您运行 btbd 的欺骗者、公然粘贴时打印的信息相同。(1:50)
这是作弊行为的视频。由于检测到作弊,证明此作弊的帐户已被禁止。正如你所看到的,它没什么特别的。
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十