zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Amlegit - amlegit.com 的逆向工程(2)

2023-03-15 22:03:16 时间

由于我们知道 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)

这是作弊行为的视频。由于检测到作弊,证明此作弊的帐户已被禁止。正如你所看到的,它没什么特别的。