{"id":1818,"date":"2024-01-10T15:03:50","date_gmt":"2024-01-10T18:03:50","guid":{"rendered":"https:\/\/reversingthread.info\/?p=1818"},"modified":"2024-06-20T13:35:32","modified_gmt":"2024-06-20T16:35:32","slug":"the-finals-defeating-theia-packer","status":"publish","type":"post","link":"https:\/\/reversingthread.info\/index.php\/2024\/01\/10\/the-finals-defeating-theia-packer\/","title":{"rendered":"The Finals &#8211; Defeating Theia Anti-Tamper"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">The Finals<\/h2>\n\n\n\n<p>The Finals is a multiplayer first-person shooter game developed by Embark Studios. They were able to attract a lot of users from the beta to the launch, and it&#8217;s currently one of the most played games on steam.<\/p>\n\n\n\n<p>They were successful in attracting a large number of users from the beta phase to the official launch, and currently, they are one of the most popular games being played on Steam.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Theia <\/h2>\n\n\n\n<p>Theia, created by ZeroItLab, is a tool designed to prevent tampering, debugging, and obfuscation in various games such as The Finals, EA FC 24, and the discontinued The Cycle Frontier game. It fills a void left by the acquisition of Byfron Company when Roblox purchased them. Theia offers similar features to Byfron, including anti-debugging, anti-analysis, obfuscation of game pages, and hardware ID tracking. In this post, our main focus will be on decrypting all the game pages.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defeating their Encryption<\/h2>\n\n\n\n<p>Initially, it should be noted that the process at hand is highly time consuming. The individuals responsible for this task have effectively concealed, encrypted, and implemented measures to obstruct analysis of their system. In order to thoroughly examine it, we must overcome certain protective measures, granting us greater freedom to conduct our analysis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Get the game running without EAC<\/h3>\n\n\n\n<p>To achieve greater freedom, we should eliminate EAC (Easy Anti Cheat), thereby allowing us to solely focus on handling user-mode protections and giving us control over the Kernel.<\/p>\n\n\n\n<p>However, the developers of Theia are well aware of this and have not made it easy for us to prevent their Anti-Cheat from loading. They persistently communicate with the driver to confirm its loading status. If it is not loaded, they simply prevent the process from running. So, what we can do about it? Well, we create a fake EAC driver and reply to their requests as they want. <\/p>\n\n\n\n<p>Initially, we need to intercept DeviceIoControl to monitor the exchanged data during communication with the EAC driver. Once we have gathered this information, we can construct our own EAC driver and respond accordingly.<\/p>\n\n\n\n<p>The following is a compilation of IOCTL requests made to the EAC Driver. However, the specific names of these IOCTLs are currently unknown.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>0x226003<\/strong> - We return the following bytes <em>&#91;0x19, 0x04, 0x00, 0x00]<\/em>\n\n<strong>0x226013<\/strong> - If that is the first request we return <em>&#91;0x04, 0x00, 0x00, 0x00]<\/em> else we return <em>&#91;01 00 00 00]<\/em>\n\n<strong>0x22e017<\/strong> - We can just return STATUS_SUCCESS<\/code><\/pre>\n\n\n\n<p>Knowing those IOCTL, our task becomes crafting the fake EAC driver. We should ensure that the driver employs the same device, event names, and effectively handles the IOCTL requests. Then compile and load the driver.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#define IOCTL_UNKNOWN_BASE                                              FILE_DEVICE_UNKNOWN\n#define IOCTL_EAC_DEBUG_ECHO                                            CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0800, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define IOCTL_EAC_UNK0                                                    0x226003\n#define IOCTL_EAC_UNK1                                                    0x226013\n#define IOCTL_EAC_UNK2                                                    0x22e017\n\nPDRIVER_OBJECT g_pDriverObject = nullptr;\nPDEVICE_OBJECT g_pDeviceObject = nullptr;\n\nWCHAR g_szDeviceName[260];\nWCHAR g_szDeviceLnkName[260];\n\nBOOLEAN    g_IsFirstCall = TRUE;\nKSPIN_LOCK g_SpinLock;\n\nHANDLE eventHandle1, eventHandle2, eventHandle3;\n\nPVOID  sectionBaseAddress = NULL;\nHANDLE sectionHandle = NULL;\n\nNTSTATUS CreateNamedEvent(PCWSTR eventName, PHANDLE pEventHandle)\n{\n    UNICODE_STRING    uniName;\n    OBJECT_ATTRIBUTES objAttr;\n    NTSTATUS          status;\n\n    RtlInitUnicodeString(&amp;uniName, eventName);\n    InitializeObjectAttributes(&amp;objAttr, &amp;uniName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);\n\n    status = ZwCreateEvent(pEventHandle, EVENT_ALL_ACCESS, &amp;objAttr, SynchronizationEvent, FALSE);\n\n    return status;\n}\n\nNTSTATUS CreateFakeEACSection(PHANDLE sectionHandlePtr, PLARGE_INTEGER maximumSize)\n{\n    UNICODE_STRING    sectionName;\n    OBJECT_ATTRIBUTES objAttr;\n    NTSTATUS          status;\n\n    RtlInitUnicodeString(&amp;sectionName, L&quot;\\\\BaseNamedObjects\\\\EasyAntiCheat_EOSBin&quot;);\n    InitializeObjectAttributes(&amp;objAttr, &amp;sectionName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);\n\n    maximumSize-&gt;QuadPart = 4096; \/\/ Set the size of the section (e.g., 4 KB)\n\n    status = ZwCreateSection(sectionHandlePtr, SECTION_ALL_ACCESS, &amp;objAttr, maximumSize, PAGE_READWRITE, SEC_COMMIT,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        return status;\n    }\n    return status;\n}\n\n\nVOID DriverUnload(PDRIVER_OBJECT pDriverObj)\n{\n    NTSTATUS status = STATUS_SUCCESS;\n\n    \/\/close events\n    if (eventHandle1 != NULL)\n    {\n        ZwClose(eventHandle1);\n    }\n\n    if (eventHandle2 != NULL)\n    {\n        ZwClose(eventHandle2);\n    }\n\n    if (eventHandle3 != NULL)\n    {\n        ZwClose(eventHandle3);\n    }\n\n    \/\/remove section\n    if (sectionBaseAddress != NULL)\n        ZwUnmapViewOfSection(NtCurrentProcess(), sectionBaseAddress);\n    if (sectionHandle != NULL)\n        ZwClose(sectionHandle);\n\n\n    \/\/Delete Sym link n Device\n    UNICODE_STRING uncLinkName;\n    RtlInitUnicodeString(&amp;uncLinkName, g_szDeviceLnkName);\n\n    status = IoDeleteSymbolicLink(&amp;uncLinkName);\n    if (!NT_SUCCESS(status))\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n            &quot;[EasyAntiCheat_EOS] DriverUnload::Unable to delete SymbolicLink NTSTATUS -&gt; % u \\n&quot;, status);\n    }\n\n    IoDeleteDevice(pDriverObj-&gt;DeviceObject);\n    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]Driver Unload\\n&quot;);\n}\n\nNTSTATUS DispatchUnused(PDEVICE_OBJECT pDevObj, PIRP pIrp)\n{\n    UNREFERENCED_PARAMETER(pDevObj);\n    UNREFERENCED_PARAMETER(pIrp);\n\n\n    NTSTATUS NtStatus = STATUS_SUCCESS;\n    return NtStatus;\n}\n\nNTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)\n{\n    UNREFERENCED_PARAMETER(pDevObj);\n\n    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]Dispatch Create\\n&quot;);\n\n    pIrp-&gt;IoStatus.Status = STATUS_SUCCESS;\n    pIrp-&gt;IoStatus.Information = 0;\n    IoCompleteRequest(pIrp, IO_NO_INCREMENT);\n    return STATUS_SUCCESS;\n}\n\nNTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)\n{\n    UNREFERENCED_PARAMETER(pDevObj);\n\n    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]Dispatch Close\\n&quot;);\n\n    pIrp-&gt;IoStatus.Status = STATUS_SUCCESS;\n    pIrp-&gt;IoStatus.Information = 0;\n    IoCompleteRequest(pIrp, IO_NO_INCREMENT);\n    return STATUS_SUCCESS;\n}\n\nNTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)\n{\n    \/\/UNREFERENCED_PARAMETER(pDevObj);\n\n    NTSTATUS           status = STATUS_INVALID_DEVICE_REQUEST;\n    PIO_STACK_LOCATION pIrpStack;\n    ULONG              uIoControlCode;\n    PVOID              pIoBuffer;\n    ULONG              uInSize;\n    ULONG              uOutSize;\n\n    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);\n    uIoControlCode = pIrpStack-&gt;Parameters.DeviceIoControl.IoControlCode;\n    pIoBuffer = pIrp-&gt;AssociatedIrp.SystemBuffer;\n    uInSize = pIrpStack-&gt;Parameters.DeviceIoControl.InputBufferLength;\n    uOutSize = pIrpStack-&gt;Parameters.DeviceIoControl.OutputBufferLength;\n\n    switch (uIoControlCode)\n    {\n    case IOCTL_EAC_DEBUG_ECHO:\n    {\n        __try\n        {\n            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]Hello from Ring0!\\n&quot;);\n            status = STATUS_SUCCESS;\n        }\n        __except (EXCEPTION_EXECUTE_HANDLER)\n        {\n            status = STATUS_UNSUCCESSFUL;\n        }\n        break;\n    }\n    case IOCTL_EAC_UNK0: \/\/0x226003\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n            &quot;[EasyAntiCheat_EOS] TRIGGERED CHECK 0x226003 (InputBufferLength: %lu) (OutputBufferLength: %lu)\\n&quot;,\n            uInSize, uOutSize);\n\n        unsigned char DummyReturnData[4] = { 0x19, 0x04, 0x00, 0x00 };\n\n        PVOID pBuffer = pIrpStack-&gt;Parameters.DeviceIoControl.Type3InputBuffer;\n\n        \/\/ Ensure pBuffer is valid and large enough\n        if (pBuffer != nullptr &amp;&amp; uOutSize &gt;= sizeof(DummyReturnData))\n        {\n            RtlCopyMemory(pBuffer, &amp;DummyReturnData[0], sizeof(DummyReturnData));\n            uOutSize = sizeof(DummyReturnData);\n            status = STATUS_SUCCESS;\n            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS] RETURNING [19 04 00 00] \\n&quot;);\n\n            KIRQL oldIrql;\n            KeAcquireSpinLock(&amp;g_SpinLock, &amp;oldIrql);\n\n            g_IsFirstCall = FALSE; \/\/ Toggle\n\n            KeReleaseSpinLock(&amp;g_SpinLock, oldIrql);\n        }\n        else\n        {\n            uOutSize = 0;\n            status = STATUS_BUFFER_TOO_SMALL;\n        }\n\n\n        break;\n    }\n    case IOCTL_EAC_UNK1: \/\/0x226013\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS] TRIGGERED CHECK 0x226013 \\n&quot;);\n\n        unsigned char DummyReturnDataA[4] = {\n            0x04, 0x00, 0x00, 0x00\n        };\n\n        unsigned char DummyReturnDataB[4] = {\n            0x01, 0x00, 0x00, 0x00\n        };\n\n\n        PVOID pBuffer = pIrpStack-&gt;Parameters.DeviceIoControl.Type3InputBuffer;\n\n        \/\/ Ensure pBuffer is valid and large enough\n        if (pBuffer != nullptr &amp;&amp; uOutSize &gt;= sizeof(DummyReturnDataA))\n        {\n            KIRQL oldIrql;\n            KeAcquireSpinLock(&amp;g_SpinLock, &amp;oldIrql);\n\n            \/\/ Check the flag and toggle it\n            if (g_IsFirstCall)\n            {\n                RtlCopyMemory(pBuffer, &amp;DummyReturnDataA, sizeof(DummyReturnDataA));\n                DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n                    &quot;[EasyAntiCheat_EOS] RETURNING [04 00 00 00] FIRST CALL \\n&quot;);\n            }\n            else\n            {\n                RtlCopyMemory(pBuffer, &amp;DummyReturnDataB, sizeof(DummyReturnDataB));\n                \/\/g_IsFirstCall = TRUE; \/\/ Reset for the next call\n                DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n                    &quot;[EasyAntiCheat_EOS] RETURNING [01 00 00 00] SEC CALL \\n&quot;);\n            }\n\n            KeReleaseSpinLock(&amp;g_SpinLock, oldIrql);\n\n            uOutSize = sizeof(DummyReturnDataA);\n            status = STATUS_SUCCESS;\n        }\n        else\n        {\n            uOutSize = 0;\n            status = STATUS_BUFFER_TOO_SMALL;\n        }\n\n        break;\n    }\n    case IOCTL_EAC_UNK2: \/\/0x22e017\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS] TRIGGERED CHECK 0x22e017\\n&quot;);\n        status = STATUS_SUCCESS;\n        break;\n    }\n    default:\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS] Triggered Unknown IOCTL: [%x] \\n&quot;,\n            uIoControlCode);\n        break;\n    }\n    } \/\/Switch End\n\n    if (status == STATUS_SUCCESS)\n        pIrp-&gt;IoStatus.Information = uOutSize;\n    else\n        pIrp-&gt;IoStatus.Information = 0;\n\n    pIrp-&gt;IoStatus.Status = status;\n\n    IoCompleteRequest(pIrp, IO_NO_INCREMENT);\n    return status;\n}\n\nNTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING RegistryPath)\n{\n    \/\/UNREFERENCED_PARAMETER(pRegistryString);\n\n    NTSTATUS       status = STATUS_SUCCESS;\n    UNICODE_STRING uncDeviceName;\n    UNICODE_STRING uncLinkName;\n\n    \/\/set global var\n    g_pDriverObject = pDriverObj;\n\n\n    \/\/Check Unicode String\n    status = RtlUnicodeStringValidate(RegistryPath);\n    if (!NT_SUCCESS(status))\n    {\n        return STATUS_INVALID_PARAMETER;\n    }\n\n\n\n    \/\/setup the MajorFunctions to nothing first\n    for (int i = 0; i &lt; IRP_MJ_MAXIMUM_FUNCTION; i++)\n        pDriverObj-&gt;MajorFunction[i] = DispatchUnused;\n\n    pDriverObj-&gt;MajorFunction[IRP_MJ_CREATE] = DispatchCreate;\n    pDriverObj-&gt;MajorFunction[IRP_MJ_CLOSE] = DispatchClose;\n    pDriverObj-&gt;MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;\n    pDriverObj-&gt;DriverUnload = DriverUnload;\n\n\n    \/\/ extract the driver name from the registry path\n    LPCWSTR szDriverName = wcsrchr(RegistryPath-&gt;Buffer, L'\\\\');\n    if (szDriverName == nullptr)\n        return STATUS_INVALID_PARAMETER;\n    szDriverName++;\n\n\n    szDriverName = L&quot;EasyAntiCheat_EOS&quot;;\n\n    \/\/Make Device Name : \\\\Device\\\\BEDaisy\n    status = RtlStringCchPrintfW(g_szDeviceName, ARRAYSIZE(g_szDeviceName), L&quot;\\\\Device\\\\%ws&quot;, szDriverName);\n    if (!NT_SUCCESS(status))\n        return STATUS_INVALID_PARAMETER;\n\n    \/\/convert the device name to a unicode string struct\n    RtlInitUnicodeString(&amp;uncDeviceName, g_szDeviceName);\n\n\n    \/\/Make Symbolic Link : \\\\DosDevices\\\\Global\\\\BEMapr  \\\\DosDevices\\\\BEMapr\n    if (IoIsWdmVersionAvailable(1, 0x10))\n        status = RtlStringCchPrintfW(g_szDeviceLnkName, ARRAYSIZE(g_szDeviceLnkName), L&quot;\\\\DosDevices\\\\Global\\\\%ws&quot;,\n            szDriverName);\n    else\n        status = RtlStringCchPrintfW(g_szDeviceLnkName, ARRAYSIZE(g_szDeviceLnkName), L&quot;\\\\DosDevices\\\\%ws&quot;,\n            szDriverName);\n\n    if (!NT_SUCCESS(status))\n        return STATUS_INVALID_PARAMETER;\n\n\n    \/\/ convert the symlink to a unicode string struct\n    RtlInitUnicodeString(&amp;uncLinkName, g_szDeviceLnkName);\n\n\n    \/\/ create device\n    status = IoCreateDevice(pDriverObj, 0, &amp;uncDeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE,\n        &amp;g_pDeviceObject);\n    if (!NT_SUCCESS(status))\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS] IoCreateDevice Failed %u \\n&quot;, status);\n        return status;\n    }\n\n    \/\/setup flags for buffered io\n    g_pDeviceObject-&gt;Flags |= DO_BUFFERED_IO;\n\n    \/\/ create link\n    status = IoCreateSymbolicLink(&amp;uncLinkName, &amp;uncDeviceName);\n    if (!NT_SUCCESS(status))\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS] IoCreateSymbolicLink Failed %u \\n&quot;,\n            status);\n        IoDeleteDevice(g_pDeviceObject);\n        return status;\n    }\n\n    \/\/init spinlock\n    KeInitializeSpinLock(&amp;g_SpinLock);\n\n    \/\/make events\n    status = CreateNamedEvent(L&quot;\\\\BaseNamedObjects\\\\EasyAntiCheat_EOSEventDriver&quot;, &amp;eventHandle1);\n    if (!NT_SUCCESS(status))\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n            &quot;[EasyAntiCheat_EOS] CreateNamedEvent Failed %u for [EasyAntiCheat_EOSEventDriver] \\n&quot;, status);\n        eventHandle1 = NULL;\n    }\n\n    status = CreateNamedEvent(L&quot;\\\\BaseNamedObjects\\\\EasyAntiCheat_EOSEventGame&quot;, &amp;eventHandle2);\n    if (!NT_SUCCESS(status))\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n            &quot;[EasyAntiCheat_EOS] CreateNamedEvent Failed %u for [EasyAntiCheat_EOSEventGame] \\n&quot;, status);\n        eventHandle2 = NULL;\n    }\n\n    status = CreateNamedEvent(L&quot;\\\\BaseNamedObjects\\\\EasyAntiCheat_EOSEventModule&quot;, &amp;eventHandle3);\n    if (!NT_SUCCESS(status))\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n            &quot;[EasyAntiCheat_EOS] CreateNamedEvent Failed %u for [EasyAntiCheat_EOSEventModule] \\n&quot;, status);\n        eventHandle3 = NULL;\n    }\n\n    \/\/Create section\n    LARGE_INTEGER maximumSize;\n    NTSTATUS      sectionCreateStatus = CreateFakeEACSection(&amp;sectionHandle, &amp;maximumSize);\n    if (NT_SUCCESS(sectionCreateStatus))\n    {\n        sectionBaseAddress = NULL;\n        SIZE_T viewSize = 0;\n        status = ZwMapViewOfSection(sectionHandle, NtCurrentProcess(), &amp;sectionBaseAddress, 0, 0, NULL, &amp;viewSize,\n            ViewShare, 0, PAGE_READWRITE);\n        if (!NT_SUCCESS(status))\n        {\n            ZwClose(sectionHandle);\n            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n                &quot;[EasyAntiCheat_EOS]CreateFakeEACSection ZwMapViewOfSection Failed: %u \\n&quot;, status);\n        }\n        else\n        {\n            RtlZeroMemory(sectionBaseAddress, maximumSize.QuadPart);\n            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,\n                &quot;[EasyAntiCheat_EOS] CreateFakeEACSection [EasyAntiCheat_EOSBin] \\n&quot;);\n        }\n    }\n    else\n    {\n        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]CreateFakeEACSection Failed: %u \\n&quot;,\n            sectionCreateStatus);\n    }\n\n\n    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]Driver Loaded \\n&quot;);\n    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &quot;[EasyAntiCheat_EOS]Name: %wZ LinkName : %wZ \\n&quot;, uncDeviceName,\n        uncLinkName);\n\n    return STATUS_SUCCESS;\n}\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">#define IOCTL_UNKNOWN_BASE                                              FILE_DEVICE_UNKNOWN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">#define IOCTL_EAC_DEBUG_ECHO                                            <\/span><span style=\"color: #62E884\">CTL_CODE<\/span><span style=\"color: #F6F6F4\">(IOCTL_UNKNOWN_BASE, <\/span><span style=\"color: #BF9EEE\">0x0800<\/span><span style=\"color: #F6F6F4\">, METHOD_BUFFERED, FILE_ANY_ACCESS)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">#define IOCTL_EAC_UNK0                                                    <\/span><span style=\"color: #BF9EEE\">0x226003<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">#define IOCTL_EAC_UNK1                                                    <\/span><span style=\"color: #BF9EEE\">0x226013<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">#define IOCTL_EAC_UNK2                                                    <\/span><span style=\"color: #BF9EEE\">0x22e017<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">PDRIVER_OBJECT g_pDriverObject <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> nullptr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">PDEVICE_OBJECT g_pDeviceObject <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> nullptr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">WCHAR g_szDeviceName[<\/span><span style=\"color: #BF9EEE\">260<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">WCHAR g_szDeviceLnkName[<\/span><span style=\"color: #BF9EEE\">260<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">BOOLEAN    g_IsFirstCall <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> TRUE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">KSPIN_LOCK g_SpinLock;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">HANDLE eventHandle1, eventHandle2, eventHandle3;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">PVOID  sectionBaseAddress <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> NULL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">HANDLE sectionHandle <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> NULL;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">CreateNamedEvent<\/span><span style=\"color: #F6F6F4\">(PCWSTR eventName, PHANDLE pEventHandle)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    UNICODE_STRING    uniName;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    OBJECT_ATTRIBUTES objAttr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS          status;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">RtlInitUnicodeString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uniName, eventName);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">InitializeObjectAttributes<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">objAttr, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uniName, OBJ_CASE_INSENSITIVE <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> OBJ_KERNEL_HANDLE, NULL, NULL);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-see-more-line \"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ZwCreateEvent<\/span><span style=\"color: #F6F6F4\">(pEventHandle, EVENT_ALL_ACCESS, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">objAttr, SynchronizationEvent, FALSE);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">CreateFakeEACSection<\/span><span style=\"color: #F6F6F4\">(PHANDLE sectionHandlePtr, PLARGE_INTEGER maximumSize)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    UNICODE_STRING    sectionName;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    OBJECT_ATTRIBUTES objAttr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS          status;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">RtlInitUnicodeString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">sectionName, L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">BaseNamedObjects<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">EasyAntiCheat_EOSBin<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">InitializeObjectAttributes<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">objAttr, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">sectionName, OBJ_CASE_INSENSITIVE <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> OBJ_KERNEL_HANDLE, NULL, NULL);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    maximumSize<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">QuadPart <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">4096<\/span><span style=\"color: #F6F6F4\">; <\/span><span style=\"color: #7B7F8B\">\/\/ Set the size of the section (e.g., 4 KB)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ZwCreateSection<\/span><span style=\"color: #F6F6F4\">(sectionHandlePtr, SECTION_ALL_ACCESS, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">objAttr, maximumSize, PAGE_READWRITE, SEC_COMMIT,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        NULL);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">VOID <\/span><span style=\"color: #62E884\">DriverUnload<\/span><span style=\"color: #F6F6F4\">(PDRIVER_OBJECT pDriverObj)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/close events<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (eventHandle1 <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> NULL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">ZwClose<\/span><span style=\"color: #F6F6F4\">(eventHandle1);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (eventHandle2 <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> NULL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">ZwClose<\/span><span style=\"color: #F6F6F4\">(eventHandle2);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (eventHandle3 <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> NULL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">ZwClose<\/span><span style=\"color: #F6F6F4\">(eventHandle3);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/remove section<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (sectionBaseAddress <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> NULL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">ZwUnmapViewOfSection<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">NtCurrentProcess<\/span><span style=\"color: #F6F6F4\">(), sectionBaseAddress);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (sectionHandle <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> NULL)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">ZwClose<\/span><span style=\"color: #F6F6F4\">(sectionHandle);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/Delete Sym link n Device<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    UNICODE_STRING uncLinkName;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">RtlInitUnicodeString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncLinkName, g_szDeviceLnkName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">IoDeleteSymbolicLink<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncLinkName);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] DriverUnload::Unable to delete SymbolicLink NTSTATUS -&gt; % u <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">IoDeleteDevice<\/span><span style=\"color: #F6F6F4\">(pDriverObj<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">DeviceObject);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]Driver Unload<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">DispatchUnused<\/span><span style=\"color: #F6F6F4\">(PDEVICE_OBJECT pDevObj, PIRP pIrp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">UNREFERENCED_PARAMETER<\/span><span style=\"color: #F6F6F4\">(pDevObj);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">UNREFERENCED_PARAMETER<\/span><span style=\"color: #F6F6F4\">(pIrp);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS NtStatus <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> NtStatus;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">DispatchCreate<\/span><span style=\"color: #F6F6F4\">(PDEVICE_OBJECT pDevObj, PIRP pIrp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">UNREFERENCED_PARAMETER<\/span><span style=\"color: #F6F6F4\">(pDevObj);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]Dispatch Create<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Information <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">IoCompleteRequest<\/span><span style=\"color: #F6F6F4\">(pIrp, IO_NO_INCREMENT);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">DispatchClose<\/span><span style=\"color: #F6F6F4\">(PDEVICE_OBJECT pDevObj, PIRP pIrp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">UNREFERENCED_PARAMETER<\/span><span style=\"color: #F6F6F4\">(pDevObj);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]Dispatch Close<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Information <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">IoCompleteRequest<\/span><span style=\"color: #F6F6F4\">(pIrp, IO_NO_INCREMENT);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">DispatchIoctl<\/span><span style=\"color: #F6F6F4\">(PDEVICE_OBJECT pDevObj, PIRP pIrp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/UNREFERENCED_PARAMETER(pDevObj);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS           status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_INVALID_DEVICE_REQUEST;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    PIO_STACK_LOCATION pIrpStack;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    ULONG              uIoControlCode;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    PVOID              pIoBuffer;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    ULONG              uInSize;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    ULONG              uOutSize;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIrpStack <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">IoGetCurrentIrpStackLocation<\/span><span style=\"color: #F6F6F4\">(pIrp);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    uIoControlCode <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pIrpStack<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Parameters.DeviceIoControl.IoControlCode;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIoBuffer <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">AssociatedIrp.SystemBuffer;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    uInSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pIrpStack<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Parameters.DeviceIoControl.InputBufferLength;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    uOutSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pIrpStack<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Parameters.DeviceIoControl.OutputBufferLength;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">switch<\/span><span style=\"color: #F6F6F4\"> (uIoControlCode)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">case<\/span><span style=\"color: #F6F6F4\"> IOCTL_EAC_DEBUG_ECHO:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        __try<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]Hello from Ring0!<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">__except<\/span><span style=\"color: #F6F6F4\"> (EXCEPTION_EXECUTE_HANDLER)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_UNSUCCESSFUL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">break<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">case<\/span><span style=\"color: #F6F6F4\"> IOCTL_EAC_UNK0: <\/span><span style=\"color: #7B7F8B\">\/\/0x226003<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] TRIGGERED CHECK 0x226003 (InputBufferLength: %lu) (OutputBufferLength: %lu)<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            uInSize, uOutSize);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        unsigned char DummyReturnData[<\/span><span style=\"color: #BF9EEE\">4<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> { <\/span><span style=\"color: #BF9EEE\">0x19<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x04<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><span style=\"color: #F6F6F4\"> };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        PVOID pBuffer <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pIrpStack<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Parameters.DeviceIoControl.Type3InputBuffer;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #7B7F8B\">\/\/ Ensure pBuffer is valid and large enough<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (pBuffer <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> nullptr <\/span><span style=\"color: #F286C4\">&amp;&amp;<\/span><span style=\"color: #F6F6F4\"> uOutSize <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnData))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">RtlCopyMemory<\/span><span style=\"color: #F6F6F4\">(pBuffer, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">DummyReturnData[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">], <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnData));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            uOutSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnData);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] RETURNING [19 04 00 00] <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            KIRQL oldIrql;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">KeAcquireSpinLock<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">g_SpinLock, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">oldIrql);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            g_IsFirstCall <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> FALSE; <\/span><span style=\"color: #7B7F8B\">\/\/ Toggle<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">KeReleaseSpinLock<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">g_SpinLock, oldIrql);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            uOutSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_BUFFER_TOO_SMALL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">break<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">case<\/span><span style=\"color: #F6F6F4\"> IOCTL_EAC_UNK1: <\/span><span style=\"color: #7B7F8B\">\/\/0x226013<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] TRIGGERED CHECK 0x226013 <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        unsigned char DummyReturnDataA[<\/span><span style=\"color: #BF9EEE\">4<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #BF9EEE\">0x04<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        unsigned char DummyReturnDataB[<\/span><span style=\"color: #BF9EEE\">4<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #BF9EEE\">0x01<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        PVOID pBuffer <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pIrpStack<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Parameters.DeviceIoControl.Type3InputBuffer;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #7B7F8B\">\/\/ Ensure pBuffer is valid and large enough<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (pBuffer <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> nullptr <\/span><span style=\"color: #F286C4\">&amp;&amp;<\/span><span style=\"color: #F6F6F4\"> uOutSize <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnDataA))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            KIRQL oldIrql;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">KeAcquireSpinLock<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">g_SpinLock, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">oldIrql);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #7B7F8B\">\/\/ Check the flag and toggle it<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (g_IsFirstCall)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #62E884\">RtlCopyMemory<\/span><span style=\"color: #F6F6F4\">(pBuffer, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">DummyReturnDataA, <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnDataA));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                    <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] RETURNING [04 00 00 00] FIRST CALL <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #62E884\">RtlCopyMemory<\/span><span style=\"color: #F6F6F4\">(pBuffer, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">DummyReturnDataB, <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnDataB));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #7B7F8B\">\/\/g_IsFirstCall = TRUE; \/\/ Reset for the next call<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                    <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] RETURNING [01 00 00 00] SEC CALL <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">KeReleaseSpinLock<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">g_SpinLock, oldIrql);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            uOutSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">sizeof<\/span><span style=\"color: #F6F6F4\">(DummyReturnDataA);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            uOutSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_BUFFER_TOO_SMALL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">break<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">case<\/span><span style=\"color: #F6F6F4\"> IOCTL_EAC_UNK2: <\/span><span style=\"color: #7B7F8B\">\/\/0x22e017<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] TRIGGERED CHECK 0x22e017<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">break<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">default<\/span><span style=\"color: #F6F6F4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] Triggered Unknown IOCTL: [%x] <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            uIoControlCode);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">break<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    } <\/span><span style=\"color: #7B7F8B\">\/\/Switch End<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (status <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Information <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> uOutSize;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Information <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pIrp<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">IoStatus.Status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">IoCompleteRequest<\/span><span style=\"color: #F6F6F4\">(pIrp, IO_NO_INCREMENT);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">NTSTATUS <\/span><span style=\"color: #62E884\">DriverEntry<\/span><span style=\"color: #F6F6F4\">(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING RegistryPath)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/UNREFERENCED_PARAMETER(pRegistryString);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS       status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    UNICODE_STRING uncDeviceName;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    UNICODE_STRING uncLinkName;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/set global var<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    g_pDriverObject <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pDriverObj;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/Check Unicode String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">RtlUnicodeStringValidate<\/span><span style=\"color: #F6F6F4\">(RegistryPath);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_INVALID_PARAMETER;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/setup the MajorFunctions to nothing first<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> (int i <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">; i <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> IRP_MJ_MAXIMUM_FUNCTION; i<\/span><span style=\"color: #F286C4\">++<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        pDriverObj<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">MajorFunction[i] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> DispatchUnused;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pDriverObj<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">MajorFunction[IRP_MJ_CREATE] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> DispatchCreate;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pDriverObj<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">MajorFunction[IRP_MJ_CLOSE] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> DispatchClose;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pDriverObj<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">MajorFunction[IRP_MJ_DEVICE_CONTROL] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> DispatchIoctl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    pDriverObj<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">DriverUnload <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> DriverUnload;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/ extract the driver name from the registry path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    LPCWSTR szDriverName <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">wcsrchr<\/span><span style=\"color: #F6F6F4\">(RegistryPath<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Buffer, L<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (szDriverName <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> nullptr)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_INVALID_PARAMETER;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    szDriverName<\/span><span style=\"color: #F286C4\">++<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    szDriverName <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">EasyAntiCheat_EOS<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/Make Device Name : \\\\Device\\\\BEDaisy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">RtlStringCchPrintfW<\/span><span style=\"color: #F6F6F4\">(g_szDeviceName, <\/span><span style=\"color: #62E884\">ARRAYSIZE<\/span><span style=\"color: #F6F6F4\">(g_szDeviceName), L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">Device<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">%ws<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, szDriverName);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_INVALID_PARAMETER;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/convert the device name to a unicode string struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">RtlInitUnicodeString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncDeviceName, g_szDeviceName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/Make Symbolic Link : \\\\DosDevices\\\\Global\\\\BEMapr  \\\\DosDevices\\\\BEMapr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #62E884\">IoIsWdmVersionAvailable<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0x10<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">RtlStringCchPrintfW<\/span><span style=\"color: #F6F6F4\">(g_szDeviceLnkName, <\/span><span style=\"color: #62E884\">ARRAYSIZE<\/span><span style=\"color: #F6F6F4\">(g_szDeviceLnkName), L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">DosDevices<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">Global<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">%ws<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            szDriverName);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">RtlStringCchPrintfW<\/span><span style=\"color: #F6F6F4\">(g_szDeviceLnkName, <\/span><span style=\"color: #62E884\">ARRAYSIZE<\/span><span style=\"color: #F6F6F4\">(g_szDeviceLnkName), L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">DosDevices<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">%ws<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            szDriverName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_INVALID_PARAMETER;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/ convert the symlink to a unicode string struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">RtlInitUnicodeString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncLinkName, g_szDeviceLnkName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/ create device<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">IoCreateDevice<\/span><span style=\"color: #F6F6F4\">(pDriverObj, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncDeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">g_pDeviceObject);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] IoCreateDevice Failed %u <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/setup flags for buffered io<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    g_pDeviceObject<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Flags <\/span><span style=\"color: #F286C4\">|=<\/span><span style=\"color: #F6F6F4\"> DO_BUFFERED_IO;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/ create link<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">IoCreateSymbolicLink<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncLinkName, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">uncDeviceName);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] IoCreateSymbolicLink Failed %u <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">IoDeleteDevice<\/span><span style=\"color: #F6F6F4\">(g_pDeviceObject);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> status;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/init spinlock<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">KeInitializeSpinLock<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">g_SpinLock);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/make events<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">CreateNamedEvent<\/span><span style=\"color: #F6F6F4\">(L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">BaseNamedObjects<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">EasyAntiCheat_EOSEventDriver<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">eventHandle1);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] CreateNamedEvent Failed %u for [EasyAntiCheat_EOSEventDriver] <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        eventHandle1 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> NULL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">CreateNamedEvent<\/span><span style=\"color: #F6F6F4\">(L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">BaseNamedObjects<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">EasyAntiCheat_EOSEventGame<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">eventHandle2);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] CreateNamedEvent Failed %u for [EasyAntiCheat_EOSEventGame] <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        eventHandle2 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> NULL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">CreateNamedEvent<\/span><span style=\"color: #F6F6F4\">(L<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">BaseNamedObjects<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">EasyAntiCheat_EOSEventModule<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">eventHandle3);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] CreateNamedEvent Failed %u for [EasyAntiCheat_EOSEventModule] <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        eventHandle3 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> NULL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\">\/\/Create section<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    LARGE_INTEGER maximumSize;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    NTSTATUS      sectionCreateStatus <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">CreateFakeEACSection<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">sectionHandle, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">maximumSize);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(sectionCreateStatus))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        sectionBaseAddress <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> NULL;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        SIZE_T viewSize <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        status <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ZwMapViewOfSection<\/span><span style=\"color: #F6F6F4\">(sectionHandle, <\/span><span style=\"color: #62E884\">NtCurrentProcess<\/span><span style=\"color: #F6F6F4\">(), <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">sectionBaseAddress, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">, NULL, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">viewSize,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            ViewShare, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">, PAGE_READWRITE);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #62E884\">NT_SUCCESS<\/span><span style=\"color: #F6F6F4\">(status))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">ZwClose<\/span><span style=\"color: #F6F6F4\">(sectionHandle);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]CreateFakeEACSection ZwMapViewOfSection Failed: %u <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, status);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">RtlZeroMemory<\/span><span style=\"color: #F6F6F4\">(sectionBaseAddress, maximumSize.QuadPart);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS] CreateFakeEACSection [EasyAntiCheat_EOSBin] <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]CreateFakeEACSection Failed: %u <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            sectionCreateStatus);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]Driver Loaded <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">DbgPrintEx<\/span><span style=\"color: #F6F6F4\">(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[EasyAntiCheat_EOS]Name: %wZ LinkName : %wZ <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, uncDeviceName,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        uncLinkName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> STATUS_SUCCESS;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><div class=\"cbp-see-more-container\" style=\"display:flex;flex-direction:column;align-items:center;width:100%;font-size:12px;line-height:1;position:relative;padding-top:4px;margin-bottom:-16px;height:32px\"><div style=\"background-color:#282a36;height:50%;position:absolute;top:0;left:0;right:0\" aria-hidden=\"true\"><\/div><span role=\"button\" tabindex=\"0\" class=\"cbp-see-more-simple-btn cbp-see-more-simple-btn-hover\" style=\"color:#ffffff;background-color:#3e4153;padding:6px 14px;cursor:default;position:relative;border-radius:6px\">Expand<\/span><\/div><\/div>\n\n\n\n<div style=\"height:45px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">2. Creating a custom Launcher<\/h3>\n\n\n\n<p>To directly launch the game without going through the EAC startup, we develop a custom launcher to replace the existing one in the game folder. Another option is to hook Steam when it initiates the process, but we are going with replacing the launcher for this.<\/p>\n\n\n\n<p><strong>Here&#8217;s the code for our launcher:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"void LauncherTest(int argc, char** argv)\n{\n    STARTUPINFOA processStartupInfo{0};\n    processStartupInfo.cb = sizeof(processStartupInfo); \/\/ setup size of strcture in bytes\n    PROCESS_INFORMATION processInfo{nullptr};\n\n\n    \/\/ Main .exe (Like Discovery.exe, FC24.exe, or any other)\n    auto commandLineToExecute = FormarString(xorstr_(R&quot;(&quot;C:\\Program Files (x86)\\Steam\\steamapps\\common\\The Finals\\Discovery\\Binaries\\Win64\\Discovery.exe&quot;)&quot;), ExePath().c_str());\n\n\n    \/\/ Load the arguments passed by the game itself. We can skip any if we want\n    for (int i = 1; i &lt; argc; i++)\n    {\n        \/\/ Add the argument to the command line\n        commandLineToExecute = commandLineToExecute.append(FormarString(&quot; %s&quot;, argv[i]));\n    }\n\n    \/\/ Append Extra commands\n    commandLineToExecute.append(xorstr_(R&quot;( Discovery)&quot;));\n\n    auto result = CreateProcessA(nullptr, (LPSTR)commandLineToExecute.c_str(), nullptr, nullptr, false, 0,\n                                               nullptr,\n                                               nullptr,\n                                               &amp;processStartupInfo, &amp;processInfo);\n\n   auto  getlasterror = GetLastError();\n    std::cout &lt;&lt; &quot;error: &quot; &lt;&lt; getlasterror &lt;&lt; std::endl;\n    std::cout &lt;&lt; &quot;CreateProcessA: &quot; &lt;&lt; result &lt;&lt; std::endl;\n\n    if (getlasterror)\n    {\n        CloseHandle(processInfo.hProcess);\n        CloseHandle(processInfo.hThread);\n    }\n    \n    Sleep(5000);\n}\n\n\nint main(int argc, char** argv)\n{\n    LauncherTest(argc, argv);\n    return 0;\n}\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">LauncherTest<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">int<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">argc<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">char**<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">argv<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    STARTUPINFOA processStartupInfo{<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    processStartupInfo.cb <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">sizeof<\/span><span style=\"color: #F6F6F4\">(processStartupInfo);<\/span><span style=\"color: #7B7F8B\"> \/\/ setup size of strcture in bytes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    PROCESS_INFORMATION processInfo{<\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ Main .exe (Like Discovery.exe, FC24.exe, or any other)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> commandLineToExecute <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">FormarString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">xorstr_<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">R&quot;(<\/span><span style=\"color: #E7EE98\">&quot;C:\\Program Files (x86)\\Steam\\steamapps\\common\\The Finals\\Discovery\\Binaries\\Win64\\Discovery.exe&quot;<\/span><span style=\"color: #DEE492\">)&quot;<\/span><span style=\"color: #F6F6F4\">), <\/span><span style=\"color: #62E884\">ExePath<\/span><span style=\"color: #F6F6F4\">().<\/span><span style=\"color: #62E884\">c_str<\/span><span style=\"color: #F6F6F4\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ Load the arguments passed by the game itself. We can skip any if we want<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">int<\/span><span style=\"color: #F6F6F4\"> i <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">; i <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> argc; i<\/span><span style=\"color: #F286C4\">++<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">        \/\/ Add the argument to the command line<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        commandLineToExecute <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> commandLineToExecute.<\/span><span style=\"color: #62E884\">append<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">FormarString<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\"> <\/span><span style=\"color: #BF9EEE\">%s<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, argv[i]));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ Append Extra commands<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    commandLineToExecute.<\/span><span style=\"color: #62E884\">append<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">xorstr_<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">R&quot;(<\/span><span style=\"color: #E7EE98\"> Discovery<\/span><span style=\"color: #DEE492\">)&quot;<\/span><span style=\"color: #F6F6F4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> result <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">CreateProcessA<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">, (LPSTR)commandLineToExecute.<\/span><span style=\"color: #62E884\">c_str<\/span><span style=\"color: #F6F6F4\">(), <\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">false<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                                               <\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                                               <\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                                               <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">processStartupInfo, <\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">processInfo);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">   <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\">  getlasterror <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">GetLastError<\/span><span style=\"color: #F6F6F4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    std<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #F6F6F4\">cout <\/span><span style=\"color: #F286C4\">&lt;&lt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">error: <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">&lt;&lt;<\/span><span style=\"color: #F6F6F4\"> getlasterror <\/span><span style=\"color: #F286C4\">&lt;&lt;<\/span><span style=\"color: #F6F6F4\"> std<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #F6F6F4\">endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    std<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #F6F6F4\">cout <\/span><span style=\"color: #F286C4\">&lt;&lt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">CreateProcessA: <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">&lt;&lt;<\/span><span style=\"color: #F6F6F4\"> result <\/span><span style=\"color: #F286C4\">&lt;&lt;<\/span><span style=\"color: #F6F6F4\"> std<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #F6F6F4\">endl;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (getlasterror)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">CloseHandle<\/span><span style=\"color: #F6F6F4\">(processInfo.hProcess);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">CloseHandle<\/span><span style=\"color: #F6F6F4\">(processInfo.hThread);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">Sleep<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">5000<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">int<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">main<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">int<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">argc<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">char**<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">argv<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">LauncherTest<\/span><span style=\"color: #F6F6F4\">(argc, argv);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Once compiled, rename it to <strong>Discovery<\/strong>.<strong>exe<\/strong> and replace the one at: <strong>C:\\Program Files (x86)\\Steam\\steamapps\\common\\The Finals<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. EOS SDK<\/h2>\n\n\n\n<p>The EOS SDK, provided by Epic Games, is a comprehensive set of services and tools for streamlined online game development. It offers various functionalities such as cross-platform play, matchmaking, anti-cheat measures, lobbies, achievements, leaderboards, and more. <\/p>\n\n\n\n<p>To be able to get the game running, we need to address EOS as well. Since we are using our fake EAC driver, we have two options: <strong>either simulate the EOS functions by loading a proxy DLL<\/strong> and handling the requests, or <strong>completely remove it. <\/strong><\/p>\n\n\n\n<p>Surprisingly, we can simply delete or rename the<em> EOSSDK-Win64-Shipping.dll<\/em> file located at <em>C:\\Program Files (x86)\\Steam\\steamapps\\common\\The Finals\\Engine\\Binaries\\Win64<\/em>, and the game will still launch successfully.<\/p>\n\n\n\n<p>After that we have the game running. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Understading the page obsfucation<\/h3>\n\n\n\n<p>The <em>Discovery.exe<\/em> game is made up of <strong>three allocations.<\/strong> The first allocation has the encrypted pages marked as <strong>PAGE_NOACCESS<\/strong>, the second allocation <strong>has the pages marked as RW<\/strong> and the <strong>encrypted pages contain the byte 0xCC<\/strong>, and the<strong> third and last page contain the encrypted bytes.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-default\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How the decryption process works?<\/h4>\n\n\n\n<p>When the game attempts to access an encrypted page, it causes an exception known as <strong>EXCEPTION_ACCESS_VIOLATION<\/strong>. This exception is then caught by a handler, where some checks are performed. If everything is deemed fine, the page is decrypted and marked as RX, then the execution resumes. It is important to note that the exception is not triggered by attempting to <strong>READ\/WRITE<\/strong> the page, either from the game module or their module runtime.dll; rather, <em>the page must be executed to initiate the decryption process.<\/em><\/p>\n\n\n\n<p>After a while the pages are encrypted back and marked as <strong>PAGE_NOACCESS<\/strong> again.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Decrypting it<\/h2>\n\n\n\n<p>There are several methods available for decrypting a page. One approach involves executing the page, which triggers the decryption routine. As a result, the page will contain the decrypted code and be marked as RX. Achieving this is relatively straightforward. We can either create an assembly shellcode that jumps or calls a specific function in the encrypted page, or alternatively, we can create a thread and pass the encrypted page address as the routine.<\/p>\n\n\n\n<p>Keep in mind that if we provide an encrypted page address to the CreateThread function and it encounters a faulty instruction, the entire program will crash. However, there is a simple solution available. We can register our own exception handler, catch the error, and exit the thread without any concern. The same applies when creating a shellcode.<\/p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/2024-01-11-03-01-57-1.mp4\"><\/video><figcaption class=\"wp-element-caption\">Decrypting a page.<\/figcaption><\/figure>\n\n\n\n<div style=\"height:54px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Decrypting using their decryption routine<\/h3>\n\n\n\n<p>To locate their decryption routine, we can employ a <strong>VEH handler <\/strong>to capture the <strong>EXCEPTION_ACCESS_VIOLATION<\/strong> exception. Within our handler, we can instruct it to return the value <strong>EXCEPTION_CONTINUE_SEARCH<\/strong>, allowing the search for the decryption routine to continue. In our Debugger, we set a breakpoint in our handler and create a thread that calls the encrypted page. Once our exception captures it, we have the option to single step or generate a trace. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">But what else we could use to find their decryption routine?<\/h4>\n\n\n\n<p><\/p>\n\n\n\n<p>Well, thats pretty easy, remember the three allocations of the game memory I mentioned earlier? Well, they aren&#8217;t just copies without a purpose. Each allocation serves a specific function.<\/p>\n\n\n\n<p><strong>Let&#8217;s assign names to the allocations as per their utility<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Allocation 1<\/strong>:  It&#8217;s where the pages are marked as <strong>PAGE_NOACCESS<\/strong>.<\/li>\n\n\n\n<li><strong>Allocation 2<\/strong>: It&#8217;s a RW allocation, the encrypted pages has <strong>0xCC <\/strong>instead the original bytes.<\/li>\n\n\n\n<li><strong>Allocation 3<\/strong>: It&#8217;s the allocation which has the encrypted code.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO.png\" data-rel=\"penci-gallery-image-content\"  target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"1024\" height=\"486\" data-id=\"2020\" src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO-1024x486.png\" alt=\"\" class=\"wp-image-2020\" srcset=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO-1024x486.png 1024w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO-300x142.png 300w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO-768x364.png 768w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO-1170x555.png 1170w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO-585x278.png 585w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/TWO.png 1256w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Allocation One<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three.png\" data-rel=\"penci-gallery-image-content\"  target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"1024\" height=\"102\" data-id=\"2018\" src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three-1024x102.png\" alt=\"\" class=\"wp-image-2018\" srcset=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three-1024x102.png 1024w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three-300x30.png 300w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three-768x76.png 768w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three-1170x116.png 1170w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three-585x58.png 585w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/allocation_two_and_three.png 1248w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Allocation Two and Three<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Once the game executes an encrypted page, the decryption routine is run. The decrypted code is then copied to Allocation 2. Following this, the page permission at Allocation 1 is set to RWX and then the decrypted code from Allocation 2 is copied to Allocation 1. Finally, Allocation 1 is set to RX. That sparked me a idea: <em>I cannot set a breakpoint in a page with <strong>PAGE_NOACCESS<\/strong>, but I can certainly set a breakpoint in a RW page, which in our case is <strong>Allocation 2<\/strong>.<\/em><\/p>\n\n\n\n<p>Thus, I placed a breakpoint on an Allocation 2 page to catch accesses. After that, I created a thread that will attempt execution inside an encrypted page and voila: the decrypted code was going to be written to the page, then I checked where the write was coming from. It looks like it&#8217;s the code responsible for copying the decrypted code. After some analysis I figured out that this function is actually the page decryption routine.<\/p>\n\n\n\n<p><strong>Here is the pseudo code of the Decrypt function<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Functin offset: 0x694f80\n\nunsigned __int64 __fastcall DECRYPT_PAGE(__int64 page_ptr_in_allocation_two, __int64 page_ptr_in_allocation_three, __int64 encryptionKeyData)\n{\n  unsigned __int64 v6; \/\/ r12\n  __int64 current_ptr_in_page_in_allocation_two; \/\/ r13\n  __int64 current_ptr_in_page_in_allocation_three; \/\/ rbp\n  unsigned __int64 offset; \/\/ r15\n  unsigned __int64 current_index_in_page; \/\/ rax\n  bool is_not_end_of_page; \/\/ cf\n  __int64 i; \/\/ rax\n  __m128i v13[8]; \/\/ [rsp+20h] [rbp-88h] BYREF\n\n  v6 = page_ptr_in_allocation_two - page_ptr_in_allocation_three;\n  current_ptr_in_page_in_allocation_two = page_ptr_in_allocation_two + 1;\n  current_ptr_in_page_in_allocation_three = page_ptr_in_allocation_three + 1;\n  offset = 0;\n  do\n  {\n    GetKeyDataForOffset((Key *)encryptionKeyData, offset, v13[0].m128i_i8, 0x40);\n    if ( v6 &gt; 0xF )\n    {\n      *(__m128i *)(page_ptr_in_allocation_two + offset) = _mm_sub_epi8(_mm_loadu_si128((const __m128i *)(page_ptr_in_allocation_three + offset)), v13[0]);\n      *(__m128i *)(page_ptr_in_allocation_two + (offset | 0x10)) = _mm_sub_epi8(_mm_loadu_si128((const __m128i *)(page_ptr_in_allocation_three + (offset | 0x10))), v13[1]);\n      *(__m128i *)(page_ptr_in_allocation_two + (offset | 0x20)) = _mm_sub_epi8(_mm_loadu_si128((const __m128i *)(page_ptr_in_allocation_three + (offset | 0x20))), v13[2]);\n      *(__m128i *)(page_ptr_in_allocation_two + (offset | 0x30)) = _mm_sub_epi8(_mm_loadu_si128((const __m128i *)(page_ptr_in_allocation_three + (offset | 0x30))), v13[3]);\n    }\n    else\n    {\n      for ( i = 0; i != 64; i += 2 )\n      {\n        *(_BYTE *)(current_ptr_in_page_in_allocation_two + i - 1) = *(_BYTE *)(current_ptr_in_page_in_allocation_three + i - 1) - v13[0].m128i_i8[i];\n        *(_BYTE *)(current_ptr_in_page_in_allocation_two + i) = *(_BYTE *)(current_ptr_in_page_in_allocation_three + i) - v13[0].m128i_i8[i + 1];\n      }\n    }\n\n    current_index_in_page = offset + 0x40;\n    current_ptr_in_page_in_allocation_two += 64;\n    current_ptr_in_page_in_allocation_three += 64;\n    is_not_end_of_page = offset &lt; 4032;\n    offset += 0x40;\n  }\n  while ( is_not_end_of_page );\n\n  return current_index_in_page;\n}\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ Functin offset: 0x694f80<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">unsigned<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1; font-style: italic\">__int64<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">__fastcall<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">DECRYPT_PAGE<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">__int64<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">page_ptr_in_allocation_two<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #97E1F1; font-style: italic\">__int64<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">page_ptr_in_allocation_three<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #97E1F1; font-style: italic\">__int64<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">encryptionKeyData<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">unsigned<\/span><span style=\"color: #F6F6F4\"> __int64 v6;<\/span><span style=\"color: #7B7F8B\"> \/\/ r12<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  __int64 current_ptr_in_page_in_allocation_two;<\/span><span style=\"color: #7B7F8B\"> \/\/ r13<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  __int64 current_ptr_in_page_in_allocation_three;<\/span><span style=\"color: #7B7F8B\"> \/\/ rbp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">unsigned<\/span><span style=\"color: #F6F6F4\"> __int64 offset;<\/span><span style=\"color: #7B7F8B\"> \/\/ r15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">unsigned<\/span><span style=\"color: #F6F6F4\"> __int64 current_index_in_page;<\/span><span style=\"color: #7B7F8B\"> \/\/ rax<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">bool<\/span><span style=\"color: #F6F6F4\"> is_not_end_of_page;<\/span><span style=\"color: #7B7F8B\"> \/\/ cf<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  __int64 i;<\/span><span style=\"color: #7B7F8B\"> \/\/ rax<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  __m128i v13[<\/span><span style=\"color: #BF9EEE\">8<\/span><span style=\"color: #F6F6F4\">];<\/span><span style=\"color: #7B7F8B\"> \/\/ [rsp+20h] [rbp-88h] BYREF<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  v6 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> page_ptr_in_allocation_two <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> page_ptr_in_allocation_three;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  current_ptr_in_page_in_allocation_two <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> page_ptr_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  current_ptr_in_page_in_allocation_three <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> page_ptr_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  offset <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">GetKeyDataForOffset<\/span><span style=\"color: #F6F6F4\">((Key <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)encryptionKeyData, offset, v13[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">].m128i_i8, <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">40<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> ( v6 <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">F<\/span><span style=\"color: #F6F6F4\"> )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(__m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> offset) <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">_mm_sub_epi8<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">_mm_loadu_si128<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">const<\/span><span style=\"color: #F6F6F4\"> __m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> offset)), v13[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(__m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">10<\/span><span style=\"color: #F6F6F4\">)) <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">_mm_sub_epi8<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">_mm_loadu_si128<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">const<\/span><span style=\"color: #F6F6F4\"> __m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">10<\/span><span style=\"color: #F6F6F4\">))), v13[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(__m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">20<\/span><span style=\"color: #F6F6F4\">)) <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">_mm_sub_epi8<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">_mm_loadu_si128<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">const<\/span><span style=\"color: #F6F6F4\"> __m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">20<\/span><span style=\"color: #F6F6F4\">))), v13[<\/span><span style=\"color: #BF9EEE\">2<\/span><span style=\"color: #F6F6F4\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(__m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">30<\/span><span style=\"color: #F6F6F4\">)) <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">_mm_sub_epi8<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #62E884\">_mm_loadu_si128<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">const<\/span><span style=\"color: #F6F6F4\"> __m128i <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(page_ptr_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">30<\/span><span style=\"color: #F6F6F4\">))), v13[<\/span><span style=\"color: #BF9EEE\">3<\/span><span style=\"color: #F6F6F4\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      <\/span><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> ( i <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">; i <\/span><span style=\"color: #F286C4\">!=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">64<\/span><span style=\"color: #F6F6F4\">; i <\/span><span style=\"color: #F286C4\">+=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">2<\/span><span style=\"color: #F6F6F4\"> )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(_BYTE <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(current_ptr_in_page_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> i <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(_BYTE <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(current_ptr_in_page_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> i <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> v13[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">].m128i_i8[i];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(_BYTE <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(current_ptr_in_page_in_allocation_two <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> i) <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(_BYTE <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(current_ptr_in_page_in_allocation_three <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> i) <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> v13[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">].m128i_i8[i <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    current_index_in_page <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> offset <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">40<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    current_ptr_in_page_in_allocation_two <\/span><span style=\"color: #F286C4\">+=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">64<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    current_ptr_in_page_in_allocation_three <\/span><span style=\"color: #F286C4\">+=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">64<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    is_not_end_of_page <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> offset <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">4032<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    offset <\/span><span style=\"color: #F286C4\">+=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">40<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">while<\/span><span style=\"color: #F6F6F4\"> ( is_not_end_of_page );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> current_index_in_page;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Once I figured out what the function was actually doing, I placed a breakpoint on it to determine its arguments. After running it for a few times, I was able to uncover them.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Arguments:<\/strong><\/p>\n\n\n\n<p>&#8211; <strong>First argument:<\/strong> Pointer to an encrypted page in Allocation 2<br>&#8211; <strong>Second argument<\/strong>: Pointer to a page in Allocation 3, which contains the encrypted code<br>&#8211; <strong>Third argument<\/strong>: Decryption data key<\/p>\n\n\n\n<p>To determine the data key structure and its corresponding layout we repeated the previous process a few times. Eventually, we obtained the following struct.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"struct Key\n{\n   m128     key1;\n   m128     key2;\n}\n\nclass decrypt_key_class\n{\npublic:\n    Key       general_one;                      \/\/0x0000\n    Key       general_two;                      \/\/0x0020\n    uint64_t  zero;                             \/\/0x0040\n    Key       unique_key;                       \/\/0x0048\n    int32_t  page_index;                        \/\/0x0068\n    char     pad_006C[28];                      \/\/0x006C\n    uint32_t not_int_a_bunch_of_flags_uint8_t;  \/\/0x0088\n    char     pad_008C[1764];                    \/\/0x008C\n    \n    \/\/ The not_int_a_bunch_of_flags_uint8_t is not actually a int value, but since\n    \/\/ it always the same value, i've just converted to int, they are actually bytes flag.\n   \n}; \" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">struct<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1; font-style: italic\">Key<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">   m128     key1;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">   m128     key2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">decrypt_key_class<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">public:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Key       general_one;<\/span><span style=\"color: #7B7F8B\">                      \/\/0x0000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Key       general_two;<\/span><span style=\"color: #7B7F8B\">                      \/\/0x0020<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">uint64_t<\/span><span style=\"color: #F6F6F4\">  zero;<\/span><span style=\"color: #7B7F8B\">                             \/\/0x0040<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Key       unique_key;<\/span><span style=\"color: #7B7F8B\">                       \/\/0x0048<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">int32_t<\/span><span style=\"color: #F6F6F4\">  page_index;<\/span><span style=\"color: #7B7F8B\">                        \/\/0x0068<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">char<\/span><span style=\"color: #F6F6F4\">     pad_006C[<\/span><span style=\"color: #BF9EEE\">28<\/span><span style=\"color: #F6F6F4\">];<\/span><span style=\"color: #7B7F8B\">                      \/\/0x006C<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">uint32_t<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1; font-style: italic\">not_int_a_bunch_of_flags_uint8_t<\/span><span style=\"color: #F6F6F4\">;<\/span><span style=\"color: #7B7F8B\">  \/\/0x0088<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">char<\/span><span style=\"color: #F6F6F4\">     pad_008C[<\/span><span style=\"color: #BF9EEE\">1764<\/span><span style=\"color: #F6F6F4\">];<\/span><span style=\"color: #7B7F8B\">                    \/\/0x008C<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ The not_int_a_bunch_of_flags_uint8_t is not actually a int value, but since<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ it always the same value, i&#39;ve just converted to int, they are actually bytes flag.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}; <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Explanation of the fields: <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The keys &#8220;<strong>general_one<\/strong>&#8221; and &#8220;<strong>general_two<\/strong>&#8221; are identical, and are both static constants located in runtime.dll. These keys remain unchanged even after process restarts.<\/li>\n\n\n\n<li>The &#8220;<strong>unique_key<\/strong>&#8221; refers to a key that is distinct for every page. These keys are unchanging and can be located in the runtime.dll.  These keys remain unchanged even after process restarts.<\/li>\n\n\n\n<li>&#8220;<strong>zero<\/strong>&#8221; is actually always zero.<\/li>\n\n\n\n<li>&#8220;<strong>page_index<\/strong>&#8221; is actually the index of the page that we are decrypting it.<\/li>\n\n\n\n<li>The variable &#8220;<strong>not_int_a_bunch_of_flags_uint8_t<\/strong>&#8221; is a collection of uint8_t flags whose purpose I didn&#8217;t reverse, considering they had the same value across the pages.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69e07e52be490&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"493\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-1024x493.png\" alt=\"\" class=\"wp-image-2227\" srcset=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-1024x493.png 1024w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-300x144.png 300w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-768x370.png 768w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-1536x740.png 1536w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-1170x563.png 1170w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass-585x282.png 585w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/key_data_struct_in_reclass.png 1603w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Key data structure in runtime.<\/figcaption><\/figure>\n\n\n\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Crafting the encrypted key data<\/h3>\n\n\n\n<p>To obtain the <strong>\u201cgeneral key\u201d<\/strong>, we can hook the decryption routine and check the third argument, which is a pointer to the key structure, and then extract the key from it. Following this, we can search for those values in runtime.dll and make a signature for them.<\/p>\n\n\n\n<p>The unique key can be found by using the same strategy. In this case we&#8217;re interested in current page_index and unique_key. Then we can search for the unique key in runtime.dll and use the page index to find where is the beginning of the encryption key list.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ This give us the page index, we can compare with the page_index in the decryption routine. You will see that we are correct.\n\ncurrent_page_index = ( ptr_page_encrypted - ptr_base ) \/ 0x1000;\ndecryption_key_size = 0x20;\n\n\/\/ So if we can find the page_index, and we know the size of the encryption key, it then calculate where it starts.\n\n\/\/ Step \n\/\/ 1. Find the current encryption key that we got from the hooked function in the runtime.dll\n\/\/ 2. Since we also the index where we are, and we know the size of the encryption key. We do page_index * decryption_key_size.\n\/\/ 3. We the result_value, we subtract the ptr found in runtime.dll - result_value and magic!\n\/\/ 4. We are now in the begin of encryption key list.\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ This give us the page index, we can compare with the page_index in the decryption routine. You will see that we are correct.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">current_page_index <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> ( ptr_page_encrypted <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> ptr_base ) <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">decryption_key_size <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">20<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ So if we can find the page_index, and we know the size of the encryption key, it then calculate where it starts.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ Step <\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ 1. Find the current encryption key that we got from the hooked function in the runtime.dll<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ 2. Since we also the index where we are, and we know the size of the encryption key. We do page_index * decryption_key_size.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ 3. We the result_value, we subtract the ptr found in runtime.dll - result_value and magic!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/ 4. We are now in the begin of encryption key list.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:42px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69e07e52beb18&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1021\" height=\"321\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/unique_keys_in_ida.png\" alt=\"\" class=\"wp-image-2198\" srcset=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/unique_keys_in_ida.png 1021w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/unique_keys_in_ida-300x94.png 300w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/unique_keys_in_ida-768x241.png 768w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/unique_keys_in_ida-585x184.png 585w\" sizes=\"(max-width: 1021px) 100vw, 1021px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Unique key list in IDA<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p> <\/p>\n\n\n\n<p>Finally, we can use the same method again to obtain &#8220;<strong>not_int_a_bunch_of_flags_uint8_t<\/strong>&#8220;. This field receives the same value for all pages.<\/p>\n\n\n\n<p><strong>Crafting a encryption data key:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#define OFFSET_BEGIN_KEY_DECRYPT_LIST 0x41D2A0\n#define FLAG_VALUE = 0x100024\n\n    static decrypt_key_class* GetKeyData(uint32_t pageIndex)\n    {\n        auto result = new decrypt_key_class;\n        RtlZeroMemory(result, sizeof decrypt_key_class);\n\n        auto uniqueKey = (uintptr_t*)(runtime_imageBase + OFFSET_BEGIN_KEY_DECRYPT_LIST +   (pageIndex * 0x20));\n\n\n        result-&gt;page_index = pageIndex;\n\n\n        result-&gt;general_one.key1.m128_u64[0] = 0x98ADD1365BF4D30A;\n        result-&gt;general_one.key1.m128_u64[1] = 0x6D22E7E35A9D06B5;\n        result-&gt;general_one.key2.m128_u64[0] = 0x9EC9C0A169CEB5D3;\n        result-&gt;general_one.key2.m128_u64[1] = 0x7DEC1707A2910127;\n        \n        result-&gt;general_two.key1.m128_u64[0] = 0x98ADD1365BF4D30A;\n        result-&gt;general_two.key1.m128_u64[1] = 0x6D22E7E35A9D06B5;\n        result-&gt;general_two.key2.m128_u64[0] = 0x9EC9C0A169CEB5D3;\n        result-&gt;general_two.key2.m128_u64[1] = 0x7DEC1707A2910127;\n\n\n        result-&gt;unique_key.key1.m128_u64[0] = uniqueKey[0];\n        result-&gt;unique_key.key1.m128_u64[1] = uniqueKey[1];\n        result-&gt;unique_key.key2.m128_u64[0] = uniqueKey[2];\n        result-&gt;unique_key.key2.m128_u64[0] = uniqueKey[3];\n\n        result-&gt;not_int_a_bunch_of_flags_uint8_t = FLAG_VALUE;\n\n\n        return result;\n    }\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">OFFSET_BEGIN_KEY_DECRYPT_LIST<\/span><span style=\"color: #F6F6F4\"> 0x41D2A0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">FLAG_VALUE<\/span><span style=\"color: #F6F6F4\"> = 0x100024<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">static<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1; font-style: italic\">decrypt_key_class<\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">GetKeyData<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">uint32_t<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">pageIndex<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> result <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4; font-weight: bold\">new<\/span><span style=\"color: #F6F6F4\"> decrypt_key_class;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">RtlZeroMemory<\/span><span style=\"color: #F6F6F4\">(result, sizeof decrypt_key_class);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> uniqueKey <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">uintptr_t*<\/span><span style=\"color: #F6F6F4\">)(runtime_imageBase <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> OFFSET_BEGIN_KEY_DECRYPT_LIST <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\">   (pageIndex <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">20<\/span><span style=\"color: #F6F6F4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">page_index <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pageIndex;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_one.key1.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">98ADD1365BF4D30A<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_one.key1.m128_u64[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">6D22E7E35A9D06B5<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_one.key2.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">9EC9C0A169CEB5D3<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_one.key2.m128_u64[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">7DEC1707A2910127<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_two.key1.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">98ADD1365BF4D30A<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_two.key1.m128_u64[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">6D22E7E35A9D06B5<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_two.key2.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">9EC9C0A169CEB5D3<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">general_two.key2.m128_u64[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">7DEC1707A2910127<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">unique_key.key1.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> uniqueKey[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">unique_key.key1.m128_u64[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> uniqueKey[<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">unique_key.key2.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> uniqueKey[<\/span><span style=\"color: #BF9EEE\">2<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">unique_key.key2.m128_u64[<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> uniqueKey[<\/span><span style=\"color: #BF9EEE\">3<\/span><span style=\"color: #F6F6F4\">];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        result<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">not_int_a_bunch_of_flags_uint8_t <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> FLAG_VALUE;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> result;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Calling the Decryption routine<\/h3>\n\n\n\n<p>With all the necessary components in place\u2014the decryption routine, keys, and puzzle pieces\u2014it is now time to execute the function.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"using DecryptPage_t = uintptr_t(__fastcall*)(uintptr_t allocation_2, uintptr_t allocation_3, uintptr_t keyData);\n\nuintptr_t DecryptPage(uint32_t pageIndex)\n{\n   \n        if (pageIndex &gt; 0)\n            pageIndex--;\n\n\n        static DecryptPage_t decryptPage = nullptr;\n        if (!decryptPage)\n        {\n            \/\/ Set Decrypt routine address\n            decryptPage = (DecryptPage_t)(runtime_imageBase + 0x694f80);\n        }\n\n\n        \/\/ Set the page we are looking to decrypt\n        uintptr_t decryptAddrCC        = allocation_2 + pageIndex * 0x1000;\n        uintptr_t decryptAddrEncrypted = allocation_3 + pageIndex * 0x1000;\n\n        \/\/ Get the page Key where we want to look.\n        auto decryptionKeyData = decrypt_key_class::GetKeyData(pageIndex + 1);\n        \n        \n        auto result = decryptPage(decryptAddrCC, decryptAddrEncrypted,\n                                                   (uintptr_t)decryptionKeyData);\n        return result;\n\n}\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">using<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1; font-style: italic\">DecryptPage_t<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\">(__fastcall<\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">)(<\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> allocation_2, <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> allocation_3, <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> keyData);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">DecryptPage<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">uint32_t<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">pageIndex<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (pageIndex <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            pageIndex<\/span><span style=\"color: #F286C4\">--<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">static<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1; font-style: italic\">DecryptPage_t<\/span><span style=\"color: #F6F6F4\"> decryptPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">!<\/span><span style=\"color: #F6F6F4\">decryptPage)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">            \/\/ Set Decrypt routine address<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            decryptPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #97E1F1; font-style: italic\">DecryptPage_t<\/span><span style=\"color: #F6F6F4\">)(runtime_imageBase <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">694f80<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">        \/\/ Set the page we are looking to decrypt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> decryptAddrCC        <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> allocation_2 <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> pageIndex <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> decryptAddrEncrypted <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> allocation_3 <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> pageIndex <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">        \/\/ Get the page Key where we want to look.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> decryptionKeyData <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> decrypt_key_class<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #62E884\">GetKeyData<\/span><span style=\"color: #F6F6F4\">(pageIndex <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> result <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">decryptPage<\/span><span style=\"color: #F6F6F4\">(decryptAddrCC, decryptAddrEncrypted,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                                                   (<\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\">)decryptionKeyData);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\"> result;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:45px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wrapping all together and creating a dumper<\/h3>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"void InitiateDumping()\n{\n    printf(&quot;======== [Initiated dumping] ======== \\n&quot;);\n\n\n    auto baseModuleAddr = base_address_allocation_2;\n\n    \/\/ Get Image Size\n    PIMAGE_NT_HEADERS pNtHeader        = RtlImageNtHeader((PVOID)baseModuleAddr);\n    auto              imageSize        = pNtHeader-&gt;OptionalHeader.SizeOfImage;\n    auto              moduleEndAddress = baseModuleAddr + imageSize;\n\n\n    \/\/ Our current page dumping.\n    uint32_t currentIndexPage = 1;\n\n    \/\/ BlackListed Pages from Byfron\n    constexpr uint32_t blacklistedPagesIndex[1000] = {};\n\n    \/\/ Allocate Memory for saving the dump.\n    auto bufferDataModule = (uintptr_t)VirtualAlloc(nullptr, imageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n\n    RtlZeroMemory((void*)bufferDataModule, moduleEndAddress - baseModuleAddr);\n\n\n    memcpy((void*)bufferDataModule, (void*)baseModuleAddr, 0x1000);\n\n    uintptr_t decryptPage = 0;\n    uintptr_t mybuffer    = 0;\n    do\n    {\n        decryptPage = baseModuleAddr + currentIndexPage * 0x1000;\n        mybuffer    = bufferDataModule + currentIndexPage * 0x1000;\n\n\n        printf(&quot;[%d] Decrypting page: %p\\n&quot;, currentIndexPage, decryptPage);\n\n        \/\/ Are we going to skip the page?\n        bool skipPage = false;\n\n        \/\/ Loop all blacklisted page and check if matches the current one\n        for (const unsigned int i : blacklistedPagesIndex)\n        {\n            if (i == currentIndexPage)\n            {\n                skipPage = true;\n                break;\n            }\n        }\n\n        \/\/ Check if we are going to skip the page.\n        if (skipPage)\n        {\n            currentIndexPage++;                    \/\/ Increment\n            memset((void*)mybuffer, 0x90, 0x1000); \/\/ Nope the page\n            continue;\n        }\n\n\n        auto check = Misc::IsPageNoAcccess(base_address_allocation_1 + currentIndexPage * 0x1000);\n        if (check)\n        {\n            auto result = DecryptPage(currentIndexPage);\n        }\n\n        memcpy((void*)mybuffer, (void*)decryptPage, 0x1000);\n\n\n        currentIndexPage++;\n    }\n    while (baseModuleAddr + (currentIndexPage * 0x1000) &lt; moduleEndAddress);\n\n    Misc::SaveDllToDisk((unsigned char*)bufferDataModule, pNtHeader-&gt;OptionalHeader.SizeOfImage, &quot;C:\\\\dumps\\\\Discovery_dumped.exe&quot;);\n\n    printf(&quot;======== [Dumped] ======== \\n&quot;);\n}\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">InitiateDumping<\/span><span style=\"color: #F6F6F4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">printf<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">======== [Initiated dumping] ======== <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> baseModuleAddr <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> base_address_allocation_2;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ Get Image Size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    PIMAGE_NT_HEADERS pNtHeader        <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">RtlImageNtHeader<\/span><span style=\"color: #F6F6F4\">((PVOID)baseModuleAddr);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\">              imageSize        <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> pNtHeader<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">OptionalHeader.SizeOfImage;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\">              moduleEndAddress <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> baseModuleAddr <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> imageSize;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ Our current page dumping.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">uint32_t<\/span><span style=\"color: #F6F6F4\"> currentIndexPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ BlackListed Pages from Byfron<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">constexpr<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">uint32_t<\/span><span style=\"color: #F6F6F4\"> blacklistedPagesIndex[<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> {};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">    \/\/ Allocate Memory for saving the dump.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> bufferDataModule <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #62E884\">VirtualAlloc<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">nullptr<\/span><span style=\"color: #F6F6F4\">, imageSize, MEM_COMMIT <\/span><span style=\"color: #F286C4\">|<\/span><span style=\"color: #F6F6F4\"> MEM_RESERVE, PAGE_READWRITE);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">RtlZeroMemory<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">void*<\/span><span style=\"color: #F6F6F4\">)bufferDataModule, moduleEndAddress <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> baseModuleAddr);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">memcpy<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">void*<\/span><span style=\"color: #F6F6F4\">)bufferDataModule, (<\/span><span style=\"color: #F286C4\">void*<\/span><span style=\"color: #F6F6F4\">)baseModuleAddr, <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> decryptPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">uintptr_t<\/span><span style=\"color: #F6F6F4\"> mybuffer    <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        decryptPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> baseModuleAddr <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> currentIndexPage <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        mybuffer    <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> bufferDataModule <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> currentIndexPage <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">printf<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">[<\/span><span style=\"color: #BF9EEE\">%d<\/span><span style=\"color: #E7EE98\">] Decrypting page: <\/span><span style=\"color: #BF9EEE\">%p<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">, currentIndexPage, decryptPage);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">        \/\/ Are we going to skip the page?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">bool<\/span><span style=\"color: #F6F6F4\"> skipPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">false<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">        \/\/ Loop all blacklisted page and check if matches the current one<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">const<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">unsigned<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">int<\/span><span style=\"color: #F6F6F4\"> i : blacklistedPagesIndex)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (i <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> currentIndexPage)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                skipPage <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">true<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                <\/span><span style=\"color: #F286C4\">break<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">        \/\/ Check if we are going to skip the page.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (skipPage)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            currentIndexPage<\/span><span style=\"color: #F286C4\">++<\/span><span style=\"color: #F6F6F4\">;<\/span><span style=\"color: #7B7F8B\">                    \/\/ Increment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">memset<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">void*<\/span><span style=\"color: #F6F6F4\">)mybuffer, <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">90<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">);<\/span><span style=\"color: #7B7F8B\"> \/\/ Nope the page<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #F286C4\">continue<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> check <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> Misc<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #62E884\">IsPageNoAcccess<\/span><span style=\"color: #F6F6F4\">(base_address_allocation_1 <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> currentIndexPage <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (check)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #F286C4\">auto<\/span><span style=\"color: #F6F6F4\"> result <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">DecryptPage<\/span><span style=\"color: #F6F6F4\">(currentIndexPage);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">memcpy<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">void*<\/span><span style=\"color: #F6F6F4\">)mybuffer, (<\/span><span style=\"color: #F286C4\">void*<\/span><span style=\"color: #F6F6F4\">)decryptPage, <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        currentIndexPage<\/span><span style=\"color: #F286C4\">++<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">while<\/span><span style=\"color: #F6F6F4\"> (baseModuleAddr <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> (currentIndexPage <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">0x<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> moduleEndAddress);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Misc<\/span><span style=\"color: #F286C4\">::<\/span><span style=\"color: #62E884\">SaveDllToDisk<\/span><span style=\"color: #F6F6F4\">((<\/span><span style=\"color: #F286C4\">unsigned<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">char*<\/span><span style=\"color: #F6F6F4\">)bufferDataModule, pNtHeader<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">OptionalHeader.SizeOfImage, <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">C:<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">dumps<\/span><span style=\"color: #F286C4\">\\\\<\/span><span style=\"color: #E7EE98\">Discovery_dumped.exe<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">printf<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">======== [Dumped] ======== <\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:36px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69e07e52bf1ed&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"550\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-1024x550.png\" alt=\"\" class=\"wp-image-2207\" srcset=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-1024x550.png 1024w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-300x161.png 300w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-768x413.png 768w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-1536x826.png 1536w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-1170x629.png 1170w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia-585x314.png 585w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/clean_dump_discovery_theia.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\"><strong>Result after the decryption. All pages with original code.<\/strong><\/figcaption><\/figure>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Injecting a DLL<\/h2>\n\n\n\n<p>Theia places inline hooks in some modules to strengthen their protection mechanisms. Those include hooks inside ntdll, DirectX modules and user32 callbacks. Here&#8217;s a list of all functions that need to be restored so we can inject a DLL.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>ntdll.dll hooks to be removed: <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"710\" height=\"445\" src=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-11-001237.png\" alt=\"\" class=\"wp-image-2091\" style=\"width:780px;height:auto\" srcset=\"https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-11-001237.png 710w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-11-001237-300x188.png 300w, https:\/\/reversingthread.info\/wp-content\/uploads\/2024\/01\/Screenshot-2024-01-11-001237-585x367.png 585w\" sizes=\"(max-width: 710px) 100vw, 710px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In conclusion, Theia presents a formidable challenge for achieving any desired purpose due to the numerous barriers it imposes. The presence of anti-debuggers, live communication with the kernel driver, hypervisor detection, stack obfuscation, analysis tool detection, and runtime.dll protection further complicate the task. As my experience goes, it is recommended to implement blacklisted pages that can only be decrypted using a special function or key. Additionally, the use of dynamic keys instead of static ones and preventing all pages from being unlocked simultaneously can enhance security. It is also crucial to regularly check if any hooks have been removed and take appropriate action by closing the game if any reversing tool is detected. These improvements may make the Theia more resilient and challenging to overcome.<\/p>\n\n\n\n<p>I had a great fun and headache analyzing it, The journey itself was enjoyable, and I successfully achieved my goal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Thanks<\/h2>\n\n\n\n<p><strong><a href=\"https:\/\/cra0.net\" target=\"_blank\" rel=\"noopener\" title=\"\">Cra0<\/a> <\/strong>for the help provided throughout my journey.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Finals The Finals is a multiplayer first-person shooter game developed by Embark Studios. They were able to attract a lot of users from the beta to the launch, and&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1821,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1818","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/posts\/1818","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/comments?post=1818"}],"version-history":[{"count":416,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/posts\/1818\/revisions"}],"predecessor-version":[{"id":2253,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/posts\/1818\/revisions\/2253"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/media\/1821"}],"wp:attachment":[{"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/media?parent=1818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/categories?post=1818"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/reversingthread.info\/index.php\/wp-json\/wp\/v2\/tags?post=1818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}