Compare commits
2 Commits
7ce2ded971
...
e91e372b19
| Author | SHA1 | Date | |
|---|---|---|---|
| e91e372b19 | |||
| 9b00c5f6eb |
@@ -0,0 +1,185 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{5cabfae0-d81b-47a9-a7ba-bc7510be19df}</ProjectGuid>
|
||||||
|
<RootNamespace>AnitCheatDLL</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>Anit_Cheat_DLL_x32</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>Anit_Cheat_DLL_x64</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableUAC>false</EnableUAC>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableUAC>false</EnableUAC>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableUAC>false</EnableUAC>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
|
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableUAC>false</EnableUAC>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="active_check.cpp" />
|
||||||
|
<ClCompile Include="client_comm_shared.cpp" />
|
||||||
|
<ClCompile Include="client_palpit.cpp" />
|
||||||
|
<ClCompile Include="client_pipe.cpp" />
|
||||||
|
<ClCompile Include="dllmain.cpp" />
|
||||||
|
<ClCompile Include="client_driver.cpp" />
|
||||||
|
<ClCompile Include="driver_func.cpp" />
|
||||||
|
<ClCompile Include="exprots_api_func.cpp" />
|
||||||
|
<ClCompile Include="private_funcion.cpp" />
|
||||||
|
<ClCompile Include="utils.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="active_check.h" />
|
||||||
|
<ClInclude Include="Base.h" />
|
||||||
|
<ClInclude Include="client_comm_shared.h" />
|
||||||
|
<ClInclude Include="client_driver.h" />
|
||||||
|
<ClInclude Include="client_palpit.h" />
|
||||||
|
<ClInclude Include="client_pipe.h" />
|
||||||
|
<ClInclude Include="driver_func.h" />
|
||||||
|
<ClInclude Include="exprots_api_func.h" />
|
||||||
|
<ClInclude Include="private_funcion.h" />
|
||||||
|
<ClInclude Include="utils.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="源文件">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="头文件">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="资源文件">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="exprots_api_func">
|
||||||
|
<UniqueIdentifier>{4cff08df-0e1b-481a-942d-bd70368f6d90}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Driver">
|
||||||
|
<UniqueIdentifier>{3b6d2fba-e76e-479d-b0da-d175d4c27e2f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="utils">
|
||||||
|
<UniqueIdentifier>{fc2d9f5d-5c5f-45c0-8b29-64c039ca6699}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="private_funcion">
|
||||||
|
<UniqueIdentifier>{6b86d410-ce98-4b8b-b00f-80a32eeeb438}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="comm_shared">
|
||||||
|
<UniqueIdentifier>{76008651-8a11-42af-b854-41f7cd04a319}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="client_palpit">
|
||||||
|
<UniqueIdentifier>{f04162c8-3fb0-4100-822c-af77bb70dbf5}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="active_check">
|
||||||
|
<UniqueIdentifier>{bdfbbba6-e274-4b3c-9f2e-0c2285fb3868}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="client_pipe">
|
||||||
|
<UniqueIdentifier>{f1272f12-b056-43cc-840b-af2cacdf461e}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="dllmain.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="exprots_api_func.cpp">
|
||||||
|
<Filter>exprots_api_func</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="client_driver.cpp">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="client_comm_shared.cpp">
|
||||||
|
<Filter>comm_shared</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="utils.cpp">
|
||||||
|
<Filter>utils</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="private_funcion.cpp">
|
||||||
|
<Filter>private_funcion</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="client_palpit.cpp">
|
||||||
|
<Filter>client_palpit</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="driver_func.cpp">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="active_check.cpp">
|
||||||
|
<Filter>active_check</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="client_pipe.cpp">
|
||||||
|
<Filter>client_pipe</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Base.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="exprots_api_func.h">
|
||||||
|
<Filter>exprots_api_func</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="client_driver.h">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="client_comm_shared.h">
|
||||||
|
<Filter>comm_shared</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="utils.h">
|
||||||
|
<Filter>utils</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="private_funcion.h">
|
||||||
|
<Filter>private_funcion</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="client_palpit.h">
|
||||||
|
<Filter>client_palpit</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="driver_func.h">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="active_check.h">
|
||||||
|
<Filter>active_check</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="client_pipe.h">
|
||||||
|
<Filter>client_pipe</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup />
|
||||||
|
</Project>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef BASE_H
|
||||||
|
#define BASE_H
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <TlHelp32.h>
|
||||||
|
#include <mutex>
|
||||||
|
#include <deque>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !BASE_H
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#include "active_check.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
namespace active_check
|
||||||
|
{
|
||||||
|
auto check_awesun_process() -> bool
|
||||||
|
{
|
||||||
|
auto dwPid = utils::GetProcessByName(L"AweSun.exe");
|
||||||
|
|
||||||
|
auto hwnd = FindWindow(L"FLUTTERVIEW", NULL);
|
||||||
|
|
||||||
|
if (dwPid || hwnd)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto check_todesk_process() -> bool
|
||||||
|
{
|
||||||
|
auto dwPid = utils::GetProcessByName(L"ToDesk.exe");
|
||||||
|
|
||||||
|
auto hwnd = FindWindow(NULL, L"ToDesk");
|
||||||
|
|
||||||
|
if (dwPid || hwnd)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto check_asklink_process() -> bool
|
||||||
|
{
|
||||||
|
auto dwPid = utils::GetProcessByName(L"AskLink.exe");
|
||||||
|
|
||||||
|
auto hwnd = FindWindow(NULL, L"AskLink");
|
||||||
|
|
||||||
|
if (dwPid || hwnd)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto check_uu_remote_process() -> bool
|
||||||
|
{
|
||||||
|
auto dwPid = utils::GetProcessByName(L"GameViewer.exe");
|
||||||
|
|
||||||
|
auto hwnd = FindWindow(NULL, L"ÍøÒ×UUÔ¶³Ì");
|
||||||
|
|
||||||
|
if (dwPid || hwnd)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto check_remote_app_process() -> bool
|
||||||
|
{
|
||||||
|
if (check_awesun_process() ||
|
||||||
|
check_todesk_process() ||
|
||||||
|
check_asklink_process() ||
|
||||||
|
check_uu_remote_process())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
namespace active_check
|
||||||
|
{
|
||||||
|
//检测向日葵进程
|
||||||
|
auto check_awesun_process() -> bool;
|
||||||
|
|
||||||
|
//检测Todesk进程
|
||||||
|
auto check_todesk_process() -> bool;
|
||||||
|
|
||||||
|
//检测连连控进程
|
||||||
|
auto check_asklink_process() -> bool;
|
||||||
|
|
||||||
|
//检测网易UU远程进程
|
||||||
|
auto check_uu_remote_process() -> bool;
|
||||||
|
|
||||||
|
//检测远程软件进程
|
||||||
|
auto check_remote_app_process() -> bool;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
#include "client_comm_shared.h"
|
||||||
|
#include "private_funcion.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "client_palpit.h"
|
||||||
|
#include "driver_func.h"
|
||||||
|
|
||||||
|
HANDLE hMapHandle;
|
||||||
|
PMAPPING_USER_MEMORY pMapping_Memory;
|
||||||
|
|
||||||
|
namespace client_shared_mapping
|
||||||
|
{
|
||||||
|
auto open_shared_mapping() -> HANDLE
|
||||||
|
{
|
||||||
|
//尝试打开管道建立通信
|
||||||
|
//Anit-Server进程没有起来就就等死
|
||||||
|
static int break_byte_count = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (break_byte_count > 10)
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, SHARED_NAME);
|
||||||
|
if (hMap)
|
||||||
|
return hMap;
|
||||||
|
|
||||||
|
break_byte_count++;
|
||||||
|
Sleep(1000);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto mapping_shared_memory(HANDLE hMap) -> PMAPPING_USER_MEMORY
|
||||||
|
{
|
||||||
|
auto pData = (_MAPPING_USER_MEMORY*)MapViewOfFile(
|
||||||
|
hMap,
|
||||||
|
FILE_MAP_ALL_ACCESS,
|
||||||
|
0, 0,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
return pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto StartServerProcess(CONST char* Path) -> BOOL
|
||||||
|
{
|
||||||
|
if (GetFileAttributesA(Path) != INVALID_FILE_ATTRIBUTES)
|
||||||
|
{
|
||||||
|
char buf[256]{ 0 };
|
||||||
|
sprintf_s(buf, "%s\\Anit-Seriver.exe", Path);
|
||||||
|
|
||||||
|
if (private_funcion::create_start_process(buf))
|
||||||
|
{
|
||||||
|
/*hMapHandle = client_shared_mapping::open_shared_mapping();
|
||||||
|
if (hMapHandle)
|
||||||
|
{
|
||||||
|
pMapping_Memory = client_shared_mapping::mapping_shared_memory(hMapHandle);
|
||||||
|
if (pMapping_Memory)
|
||||||
|
{
|
||||||
|
client_palpit::create_papit_thread(pMapping_Memory);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto string = "[Anit-Cheat]系统运行发生致命错误,错误代码:" + to_string(GetLastError());
|
||||||
|
MessageBoxA(NULL, string.c_str(), "您似乎遇到了一些问题", MB_OK);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//auto anit_cheat_create_process() -> BOOL
|
||||||
|
//{
|
||||||
|
// BOOL bIsSrc;
|
||||||
|
// CHAR* lastSlash;
|
||||||
|
|
||||||
|
// CONST char* path = "C:\\Program Files\\AnitCheatFile\\Anit-Seriver.exe";
|
||||||
|
|
||||||
|
// if (GetFileAttributesA(path) != INVALID_FILE_ATTRIBUTES)
|
||||||
|
// {
|
||||||
|
// DWORD size = 0;
|
||||||
|
// auto filebuff = utils::ReadBinaryFile(path, &size);
|
||||||
|
// if (!filebuff)
|
||||||
|
// return FALSE;
|
||||||
|
|
||||||
|
// auto pNThander = reinterpret_cast<PIMAGE_NT_HEADERS>(filebuff + reinterpret_cast<PIMAGE_DOS_HEADER>(filebuff)->e_lfanew);
|
||||||
|
// auto pFilehander = &pNThander->FileHeader;
|
||||||
|
// if (!pFilehander->TimeDateStamp)
|
||||||
|
// return FALSE;
|
||||||
|
|
||||||
|
// auto buff_doshander = reinterpret_cast<PIMAGE_DOS_HEADER>(Anit_Cheat_EXE);
|
||||||
|
// auto buff_nthander = reinterpret_cast<PIMAGE_NT_HEADERS>((DWORD64)buff_doshander + buff_doshander->e_lfanew);
|
||||||
|
// auto buff_FileHander = &buff_nthander->FileHeader;
|
||||||
|
// if (!buff_FileHander->TimeDateStamp)
|
||||||
|
// return FALSE;
|
||||||
|
|
||||||
|
// if (buff_FileHander->TimeDateStamp != pFilehander->TimeDateStamp)
|
||||||
|
// goto create;
|
||||||
|
|
||||||
|
// goto run;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// create:
|
||||||
|
// char dirPath[MAX_PATH];
|
||||||
|
// strcpy_s(dirPath, path);
|
||||||
|
|
||||||
|
// lastSlash = strrchr(dirPath, '\\');
|
||||||
|
// if (lastSlash) {
|
||||||
|
// *lastSlash = '\0';
|
||||||
|
|
||||||
|
// // 2. 创建目录(如果不存在)
|
||||||
|
// if (!utils::CreateDirectoryRecursive(dirPath)) {
|
||||||
|
// return FALSE;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// bIsSrc = utils::WriteShellcodeToFile(path, Anit_Cheat_EXE, sizeof(Anit_Cheat_EXE));
|
||||||
|
// if (bIsSrc)
|
||||||
|
// {
|
||||||
|
// run:
|
||||||
|
// bIsSrc = private_funcion::create_start_process(path);
|
||||||
|
// if (bIsSrc)
|
||||||
|
// return TRUE;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return FALSE;
|
||||||
|
//}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef COMM_PIPE
|
||||||
|
#define COMM_PIPE
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
#define SHARED_NAME "ServerMappingMmeory"
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _MAPPING_USER_MEMORY
|
||||||
|
{
|
||||||
|
char str[256];
|
||||||
|
|
||||||
|
//驱动执行
|
||||||
|
DWORD load_driver_code;
|
||||||
|
//轮巡
|
||||||
|
DWORD add_index_code;
|
||||||
|
|
||||||
|
DWORD server_pid;
|
||||||
|
DWORD client_pid;
|
||||||
|
|
||||||
|
//轮巡返回数
|
||||||
|
DWORD Index;
|
||||||
|
|
||||||
|
|
||||||
|
//返回状态
|
||||||
|
BOOL bIsSuc;
|
||||||
|
}MAPPING_USER_MEMORY, * PMAPPING_USER_MEMORY;
|
||||||
|
|
||||||
|
|
||||||
|
enum TYPE_COOM
|
||||||
|
{
|
||||||
|
BASE = 0x1000,
|
||||||
|
KD_LOAD_DRIVER,
|
||||||
|
ADD_INDEX_VAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
namespace client_shared_mapping
|
||||||
|
{
|
||||||
|
//打开共享内存
|
||||||
|
auto open_shared_mapping()->HANDLE;
|
||||||
|
|
||||||
|
//映射共享内存
|
||||||
|
auto mapping_shared_memory(HANDLE hMap)->PMAPPING_USER_MEMORY;
|
||||||
|
|
||||||
|
//启动服务进程
|
||||||
|
auto StartServerProcess(CONST char* Path)->BOOL;
|
||||||
|
|
||||||
|
//启动目标通信进程
|
||||||
|
auto anit_cheat_create_process()->BOOL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extern HANDLE hMapHandle;
|
||||||
|
extern PMAPPING_USER_MEMORY pMapping_Memory;
|
||||||
|
|
||||||
|
#endif // !comm_pipe
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
#include "client_driver.h"
|
||||||
|
#include "driver_func.h"
|
||||||
|
#include "client_pipe.h"
|
||||||
|
|
||||||
|
|
||||||
|
client_driver* client_driver::instance = nullptr;
|
||||||
|
PMAPPING_USER_MEMORY client_driver::mapping_data = nullptr;
|
||||||
|
|
||||||
|
auto client_driver::fn_get_instance() -> client_driver*
|
||||||
|
{
|
||||||
|
if (instance == nullptr)
|
||||||
|
{
|
||||||
|
instance = new client_driver;
|
||||||
|
}
|
||||||
|
if (mapping_data == nullptr)
|
||||||
|
{
|
||||||
|
mapping_data = pMapping_Memory;
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::driver_map_load() -> BOOL
|
||||||
|
{
|
||||||
|
return HBClientLoadDriverW();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::check_load_driver() -> BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::DRIVER_COMM_TEST;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
|
||||||
|
return NT_SUCCESS(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::add_process_protect(DWORD Pid) ->BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
IOCTL_PROCESS process{ 0 };
|
||||||
|
process.Pid = Pid;
|
||||||
|
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::DRIVER_PROTECT_PROCESS;
|
||||||
|
data.Buf = (DWORD64)&process;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return NT_SUCCESS(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::delete_process_protect(DWORD Pid)->BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
IOCTL_PROCESS process{ 0 };
|
||||||
|
process.Pid = Pid;
|
||||||
|
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::DRIVER_CANCEL_PROTECT_PROCESS;
|
||||||
|
data.Buf = (DWORD64)&process;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return NT_SUCCESS(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::window_anit_screen(HWND hwnd, UINT Flags) -> BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
IOCTL_WINDOW window{ 0 };
|
||||||
|
|
||||||
|
window.HWND = (DWORD64)hwnd;
|
||||||
|
window.Flags = Flags;
|
||||||
|
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::WINDOW_ANIT_SCREEN;
|
||||||
|
data.Buf = (DWORD64)&window;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::install_mouse_keyboard() -> BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
CMD_COMM data;
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::INSTALL_MOUSE_KEYBOARD;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::unload_mouse_keyboard()->BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::UNLOAD_MOUSE_KEYBOARD;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
auto client_driver::add_white_mouse_keyoard_process(DWORD Pid) -> BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
IOCTL_PROCESS process{ 0 };
|
||||||
|
process.Pid = Pid;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::ADD_WHITE_PROCESS;
|
||||||
|
data.Buf = (DWORD64)&process;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client_driver::enjoin_remote_thread(BOOL val) -> BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
IOCTL_PROCESS process{ 0 };
|
||||||
|
process.is_no_create_remote_thread = val;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::PROTECT_THREAD_CONTRL;
|
||||||
|
data.Buf = (DWORD64)&process;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef DRIVER_API_FUNC
|
||||||
|
#define DRIVER_API_FUNC
|
||||||
|
#include "Base.h"
|
||||||
|
#include "client_comm_shared.h"
|
||||||
|
|
||||||
|
|
||||||
|
class client_driver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static auto fn_get_instance()->client_driver*;
|
||||||
|
|
||||||
|
auto driver_map_load()->BOOL;
|
||||||
|
|
||||||
|
auto check_load_driver()->BOOL;
|
||||||
|
|
||||||
|
auto add_process_protect(DWORD Pid)->BOOL;
|
||||||
|
|
||||||
|
auto delete_process_protect(DWORD Pid)->BOOL;
|
||||||
|
|
||||||
|
auto window_anit_screen(HWND hwnd, UINT Flags)->BOOL;
|
||||||
|
|
||||||
|
auto install_mouse_keyboard()->BOOL;
|
||||||
|
|
||||||
|
auto unload_mouse_keyboard()->BOOL;
|
||||||
|
|
||||||
|
auto add_white_mouse_keyoard_process(DWORD Pid)->BOOL;
|
||||||
|
|
||||||
|
auto enjoin_remote_thread(BOOL val)->BOOL;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static client_driver* instance;
|
||||||
|
|
||||||
|
static PMAPPING_USER_MEMORY mapping_data;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !DRIVER_API_FUNC
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
#include "client_palpit.h"
|
||||||
|
#include "client_comm_shared.h"
|
||||||
|
|
||||||
|
namespace client_palpit
|
||||||
|
{
|
||||||
|
DWORD WINAPI palpit_thread(LPVOID parmar)
|
||||||
|
{
|
||||||
|
static int break_count_fail = 0;
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
auto mapping_data = reinterpret_cast<PMAPPING_USER_MEMORY>(parmar);
|
||||||
|
|
||||||
|
/*strcpy_s(mapping_data->str, "fail");
|
||||||
|
mapping_data->add_index_code = TRUE;
|
||||||
|
|
||||||
|
auto val = 100;
|
||||||
|
mapping_data->Index = val;
|
||||||
|
|
||||||
|
while (strcmp(mapping_data->str, "ok")) {
|
||||||
|
|
||||||
|
if (break_count_fail > 5) {
|
||||||
|
MessageBoxA(NULL, "[client] 请求超时 错误代码:-502", NULL, NULL);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break_count_fail++;
|
||||||
|
|
||||||
|
Sleep(1000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((val + 1) != mapping_data->Index)
|
||||||
|
{
|
||||||
|
MessageBoxA(NULL, "[client] 组件发生异常 错误代码:-501", NULL, NULL);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break_count_fail = 0;*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// 检测进程是否退出
|
||||||
|
//
|
||||||
|
if (!mapping_data->client_pid)
|
||||||
|
mapping_data->client_pid = GetCurrentProcessId();
|
||||||
|
|
||||||
|
//static int fail_index = 0;
|
||||||
|
//static HANDLE hProcess = 0;
|
||||||
|
|
||||||
|
//auto server_pid = mapping_data->server_pid;
|
||||||
|
//if (hProcess == NULL)
|
||||||
|
//{
|
||||||
|
// if (fail_index > 3) {
|
||||||
|
// exit(0);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
|
||||||
|
// hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, server_pid);
|
||||||
|
// fail_index++;
|
||||||
|
// continue;
|
||||||
|
//}
|
||||||
|
|
||||||
|
////
|
||||||
|
////监控客户端进程是否退出
|
||||||
|
////
|
||||||
|
//DWORD exitCode;
|
||||||
|
//if (GetExitCodeProcess(hProcess, &exitCode)) {
|
||||||
|
// if (exitCode != STILL_ACTIVE) {
|
||||||
|
// exit(0);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
Sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
auto create_papit_thread(LPVOID parmar) -> void
|
||||||
|
{
|
||||||
|
CloseHandle(CreateThread(nullptr, 0, palpit_thread, parmar, 0, nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef CHLENT_PALPIT
|
||||||
|
#define CHLENT_PALPIT
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace client_palpit
|
||||||
|
{
|
||||||
|
auto create_papit_thread(LPVOID parmar) -> void;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !client_palpit
|
||||||
@@ -0,0 +1,657 @@
|
|||||||
|
#include "client_pipe.h"
|
||||||
|
|
||||||
|
|
||||||
|
static LONG g_started = 0;
|
||||||
|
static HANDLE g_stop_event = nullptr;
|
||||||
|
static HANDLE g_queue_event = nullptr;
|
||||||
|
static HANDLE g_connected_event = nullptr;
|
||||||
|
static HANDLE g_worker_thread = nullptr;
|
||||||
|
static HANDLE g_pipe = INVALID_HANDLE_VALUE;
|
||||||
|
static std::atomic<DWORD> g_client_id{ 0 };
|
||||||
|
static std::atomic<uint64_t> g_session_id{ 0 };
|
||||||
|
static std::atomic<uint64_t> g_next_request_id{ 1 };
|
||||||
|
static std::mutex g_queue_mutex;
|
||||||
|
static std::deque<std::shared_ptr<PendingCommand>> g_queue;
|
||||||
|
|
||||||
|
|
||||||
|
static void LogA(const char* fmt, ...)
|
||||||
|
{
|
||||||
|
char buf[512]{};
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vsnprintf_s(buf, sizeof(buf), _TRUNCATE, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
OutputDebugStringA(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ExitInjectedProcess(UINT exit_code)
|
||||||
|
{
|
||||||
|
LogA("[dll-client] ExitProcess code=%u\n", exit_code);
|
||||||
|
ExitProcess(exit_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ReadExact(HANDLE pipe, void* buffer, DWORD size)
|
||||||
|
{
|
||||||
|
BYTE* ptr = static_cast<BYTE*>(buffer);
|
||||||
|
DWORD total = 0;
|
||||||
|
while (total < size)
|
||||||
|
{
|
||||||
|
DWORD got = 0;
|
||||||
|
if (!ReadFile(pipe, ptr + total, size - total, &got, nullptr))
|
||||||
|
return false;
|
||||||
|
if (got == 0)
|
||||||
|
return false;
|
||||||
|
total += got;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool WriteExact(HANDLE pipe, const void* buffer, DWORD size)
|
||||||
|
{
|
||||||
|
const BYTE* ptr = static_cast<const BYTE*>(buffer);
|
||||||
|
DWORD total = 0;
|
||||||
|
while (total < size)
|
||||||
|
{
|
||||||
|
DWORD wrote = 0;
|
||||||
|
if (!WriteFile(pipe, ptr + total, size - total, &wrote, nullptr))
|
||||||
|
return false;
|
||||||
|
if (wrote == 0)
|
||||||
|
return false;
|
||||||
|
total += wrote;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool WideToUtf8(const std::wstring& input, char* output, size_t output_size)
|
||||||
|
{
|
||||||
|
if (!output || output_size == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
output[0] = '\0';
|
||||||
|
if (input.empty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int written = WideCharToMultiByte(
|
||||||
|
CP_UTF8,
|
||||||
|
0,
|
||||||
|
input.c_str(),
|
||||||
|
static_cast<int>(input.size()),
|
||||||
|
output,
|
||||||
|
static_cast<int>(output_size - 1),
|
||||||
|
nullptr,
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
if (written <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
output[written] = '\0';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void QueuePush(const std::shared_ptr<PendingCommand>& cmd)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_queue_mutex);
|
||||||
|
g_queue.push_back(cmd);
|
||||||
|
SetEvent(g_queue_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<PendingCommand> QueuePop()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_queue_mutex);
|
||||||
|
if (g_queue.empty())
|
||||||
|
{
|
||||||
|
ResetEvent(g_queue_event);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cmd = g_queue.front();
|
||||||
|
g_queue.pop_front();
|
||||||
|
if (g_queue.empty())
|
||||||
|
ResetEvent(g_queue_event);
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void FailPendingCommands(DWORD status, const char* reply)
|
||||||
|
{
|
||||||
|
(void)reply;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
auto cmd = QueuePop();
|
||||||
|
if (!cmd)
|
||||||
|
break;
|
||||||
|
|
||||||
|
cmd->status = status;
|
||||||
|
if (cmd->done_event)
|
||||||
|
SetEvent(cmd->done_event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RequestStopNoWait()
|
||||||
|
{
|
||||||
|
if (g_stop_event)
|
||||||
|
SetEvent(g_stop_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CleanupClientStateNoWait()
|
||||||
|
{
|
||||||
|
RequestStopNoWait();
|
||||||
|
|
||||||
|
if (g_worker_thread)
|
||||||
|
{
|
||||||
|
CloseHandle(g_worker_thread);
|
||||||
|
g_worker_thread = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_stop_event)
|
||||||
|
{
|
||||||
|
CloseHandle(g_stop_event);
|
||||||
|
g_stop_event = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_queue_event)
|
||||||
|
{
|
||||||
|
CloseHandle(g_queue_event);
|
||||||
|
g_queue_event = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_connected_event)
|
||||||
|
{
|
||||||
|
CloseHandle(g_connected_event);
|
||||||
|
g_connected_event = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ConnectToServer(HANDLE& pipe)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pipe = CreateFileW(
|
||||||
|
kPipeName,
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
if (pipe != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DWORD mode = PIPE_READMODE_MESSAGE;
|
||||||
|
SetNamedPipeHandleState(pipe, &mode, nullptr, nullptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
if (err == ERROR_PIPE_BUSY)
|
||||||
|
{
|
||||||
|
if (!WaitNamedPipeW(kPipeName, 1000))
|
||||||
|
Sleep(250);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool SendHello(HANDLE pipe)
|
||||||
|
{
|
||||||
|
Msg hello{};
|
||||||
|
hello.type = static_cast<uint32_t>(MsgType::Hello);
|
||||||
|
hello.pid = GetCurrentProcessId();
|
||||||
|
hello.version = kProtocolVersion;
|
||||||
|
hello.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
hello.session_id = 0;
|
||||||
|
|
||||||
|
if (!WriteExact(pipe, &hello, sizeof(hello)))
|
||||||
|
{
|
||||||
|
LogA("[dll-client] hello write failed: %lu\n", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Msg ack{};
|
||||||
|
if (!ReadExact(pipe, &ack, sizeof(ack)) || ack.type != static_cast<uint32_t>(MsgType::HelloAck))
|
||||||
|
{
|
||||||
|
LogA("[dll-client] hello ack failed: %lu\n", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_client_id.store(ack.client_id);
|
||||||
|
g_session_id.store(ack.session_id);
|
||||||
|
SetEvent(g_connected_event);
|
||||||
|
|
||||||
|
LogA("[dll-client] connected client_id=%lu session=%llu\n",
|
||||||
|
g_client_id.load(),
|
||||||
|
static_cast<unsigned long long>(g_session_id.load()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool SendHeartbeat(HANDLE pipe)
|
||||||
|
{
|
||||||
|
Msg heartbeat{};
|
||||||
|
heartbeat.type = static_cast<uint32_t>(MsgType::Heartbeat);
|
||||||
|
heartbeat.client_id = g_client_id.load();
|
||||||
|
heartbeat.pid = GetCurrentProcessId();
|
||||||
|
heartbeat.version = kProtocolVersion;
|
||||||
|
heartbeat.session_id = g_session_id.load();
|
||||||
|
heartbeat.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
|
||||||
|
if (!WriteExact(pipe, &heartbeat, sizeof(heartbeat)))
|
||||||
|
{
|
||||||
|
LogA("[dll-client] heartbeat write failed: %lu\n", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool PumpServerMessages(HANDLE pipe)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
DWORD available = 0;
|
||||||
|
if (!PeekNamedPipe(pipe, nullptr, 0, nullptr, &available, nullptr))
|
||||||
|
{
|
||||||
|
LogA("[dll-client] server disconnected: %lu\n", GetLastError());
|
||||||
|
ExitInjectedProcess(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (available < sizeof(Msg))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Msg msg{};
|
||||||
|
if (!ReadExact(pipe, &msg, sizeof(msg)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (msg.type == static_cast<uint32_t>(MsgType::Exit))
|
||||||
|
{
|
||||||
|
LogA("[dll-client] exit requested by server\n");
|
||||||
|
SetEvent(g_stop_event);
|
||||||
|
ExitInjectedProcess(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool SendCommand(HANDLE pipe, PendingCommand& cmd)
|
||||||
|
{
|
||||||
|
Msg req{};
|
||||||
|
req.type = static_cast<uint32_t>(MsgType::CommandRequest);
|
||||||
|
req.client_id = g_client_id.load();
|
||||||
|
req.pid = GetCurrentProcessId();
|
||||||
|
req.version = kProtocolVersion;
|
||||||
|
req.command = cmd.command;
|
||||||
|
req.status = 0;
|
||||||
|
req.input_size = static_cast<uint32_t>(cmd.input.size());
|
||||||
|
req.output_size = static_cast<uint32_t>(cmd.output.size());
|
||||||
|
req.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
req.session_id = g_session_id.load();
|
||||||
|
req.request_id = cmd.request_id;
|
||||||
|
|
||||||
|
if (cmd.input.size() > kPayloadBytes || cmd.output.size() > kPayloadBytes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!cmd.input.empty())
|
||||||
|
memcpy(req.payload, cmd.input.data(), cmd.input.size());
|
||||||
|
|
||||||
|
if (!WriteExact(pipe, &req, sizeof(req)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Msg resp{};
|
||||||
|
if (!ReadExact(pipe, &resp, sizeof(resp)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (resp.type != static_cast<uint32_t>(MsgType::CommandReply))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (resp.request_id != cmd.request_id || resp.command != cmd.command)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cmd.status = resp.status;
|
||||||
|
if (resp.output_size && resp.output_size <= cmd.output.size())
|
||||||
|
memcpy(cmd.output.data(), resp.payload, resp.output_size);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI WorkerThreadProc(LPVOID)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
HANDLE pipe = INVALID_HANDLE_VALUE;
|
||||||
|
if (!ConnectToServer(pipe))
|
||||||
|
break;
|
||||||
|
|
||||||
|
g_pipe = pipe;
|
||||||
|
ResetEvent(g_connected_event);
|
||||||
|
|
||||||
|
if (!SendHello(pipe))
|
||||||
|
{
|
||||||
|
CloseHandle(pipe);
|
||||||
|
g_pipe = INVALID_HANDLE_VALUE;
|
||||||
|
Sleep(500);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD last_heartbeat = static_cast<DWORD>(NowMs());
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (WaitForSingleObject(g_queue_event, 0) == WAIT_OBJECT_0)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
auto cmd = QueuePop();
|
||||||
|
if (!cmd)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!SendCommand(pipe, *cmd))
|
||||||
|
{
|
||||||
|
cmd->status = GetLastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd->done_event)
|
||||||
|
SetEvent(cmd->done_event);
|
||||||
|
|
||||||
|
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const DWORD now = static_cast<DWORD>(NowMs());
|
||||||
|
if (now - last_heartbeat >= kHeartbeatIntervalMs)
|
||||||
|
{
|
||||||
|
if (!SendHeartbeat(pipe))
|
||||||
|
{
|
||||||
|
LogA("[dll-client] server heartbeat failed, exit process\n");
|
||||||
|
ExitInjectedProcess(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_heartbeat = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PumpServerMessages(pipe))
|
||||||
|
break;
|
||||||
|
|
||||||
|
Sleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetEvent(g_connected_event);
|
||||||
|
|
||||||
|
if (pipe != INVALID_HANDLE_VALUE)
|
||||||
|
CloseHandle(pipe);
|
||||||
|
|
||||||
|
g_pipe = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Sleep(250);
|
||||||
|
}
|
||||||
|
|
||||||
|
FailPendingCommands(ERROR_CANCELLED, "client stopped");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL DllClientStart()
|
||||||
|
{
|
||||||
|
if (InterlockedCompareExchange(&g_started, 1, 0) != 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
g_stop_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
|
||||||
|
g_queue_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
|
||||||
|
g_connected_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
|
||||||
|
if (!g_stop_event || !g_queue_event || !g_connected_event)
|
||||||
|
{
|
||||||
|
CleanupClientStateNoWait();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_worker_thread = CreateThread(nullptr, 0, WorkerThreadProc, nullptr, 0, nullptr);
|
||||||
|
if (!g_worker_thread)
|
||||||
|
{
|
||||||
|
CleanupClientStateNoWait();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL HBClientEnsureStarted()
|
||||||
|
{
|
||||||
|
return DllClientStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL HBClientCall(
|
||||||
|
uint32_t command,
|
||||||
|
const void* input,
|
||||||
|
uint32_t input_size,
|
||||||
|
void* output,
|
||||||
|
uint32_t output_size,
|
||||||
|
uint32_t* bytes_returned)
|
||||||
|
{
|
||||||
|
if (bytes_returned)
|
||||||
|
*bytes_returned = 0;
|
||||||
|
|
||||||
|
if (input_size > kPayloadBytes || output_size > kPayloadBytes)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (input_size && !input)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (output_size && !output)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (InterlockedCompareExchange(&g_started, 0, 0) == 0)
|
||||||
|
{
|
||||||
|
if (!DllClientStart())
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cmd = std::make_shared<PendingCommand>();
|
||||||
|
cmd->command = command;
|
||||||
|
cmd->request_id = g_next_request_id.fetch_add(1);
|
||||||
|
cmd->done_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
|
||||||
|
if (!cmd->done_event)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (input_size)
|
||||||
|
{
|
||||||
|
const auto* ptr = static_cast<const uint8_t*>(input);
|
||||||
|
cmd->input.assign(ptr, ptr + input_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (output_size)
|
||||||
|
cmd->output.resize(output_size);
|
||||||
|
|
||||||
|
QueuePush(cmd);
|
||||||
|
|
||||||
|
HANDLE waits[2] = { cmd->done_event, g_stop_event };
|
||||||
|
DWORD wait = WaitForMultipleObjects(2, waits, FALSE, 10000);
|
||||||
|
BOOL ok = (wait == WAIT_OBJECT_0 && cmd->status == ERROR_SUCCESS);
|
||||||
|
|
||||||
|
if (ok && output && !cmd->output.empty())
|
||||||
|
{
|
||||||
|
memcpy(output, cmd->output.data(), cmd->output.size());
|
||||||
|
if (bytes_returned)
|
||||||
|
*bytes_returned = static_cast<uint32_t>(cmd->output.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(cmd->done_event);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL HBClientSendPrintfW(const wchar_t* text)
|
||||||
|
{
|
||||||
|
return DllClientPrintfW(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool PipeReadMsgTimeout(HANDLE pipe, Msg& msg, DWORD timeout_ms)
|
||||||
|
{
|
||||||
|
const DWORD begin = GetTickCount();
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
DWORD available = 0;
|
||||||
|
if (!PeekNamedPipe(pipe, nullptr, 0, nullptr, &available, nullptr))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (available >= sizeof(Msg))
|
||||||
|
{
|
||||||
|
DWORD got = 0;
|
||||||
|
return ReadFile(pipe, &msg, sizeof(msg), &got, nullptr) && got == sizeof(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetTickCount() - begin >= timeout_ms)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Sleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool PipeWriteMsg(HANDLE pipe, const Msg& msg)
|
||||||
|
{
|
||||||
|
DWORD wrote = 0;
|
||||||
|
return WriteFile(pipe, &msg, sizeof(msg), &wrote, nullptr) && wrote == sizeof(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL QueryServerAlreadyOpen()
|
||||||
|
{
|
||||||
|
HANDLE pipe = CreateFileW(
|
||||||
|
kPipeName,
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
if (pipe == INVALID_HANDLE_VALUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
DWORD mode = PIPE_READMODE_MESSAGE;
|
||||||
|
SetNamedPipeHandleState(pipe, &mode, nullptr, nullptr);
|
||||||
|
|
||||||
|
Msg hello{};
|
||||||
|
hello.type = static_cast<uint32_t>(MsgType::Hello);
|
||||||
|
hello.pid = GetCurrentProcessId();
|
||||||
|
hello.version = kProtocolVersion;
|
||||||
|
hello.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
|
||||||
|
Msg ack{};
|
||||||
|
if (!PipeWriteMsg(pipe, hello) ||
|
||||||
|
!PipeReadMsgTimeout(pipe, ack, 500) ||
|
||||||
|
ack.type != static_cast<uint32_t>(MsgType::HelloAck))
|
||||||
|
{
|
||||||
|
CloseHandle(pipe);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Msg req{};
|
||||||
|
req.type = static_cast<uint32_t>(MsgType::CommandRequest);
|
||||||
|
req.client_id = ack.client_id;
|
||||||
|
req.pid = GetCurrentProcessId();
|
||||||
|
req.version = kProtocolVersion;
|
||||||
|
req.command = static_cast<uint32_t>(CommandId::QueryStatus);
|
||||||
|
req.session_id = ack.session_id;
|
||||||
|
req.request_id = 1;
|
||||||
|
req.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
|
||||||
|
Msg resp{};
|
||||||
|
BOOL already_open =
|
||||||
|
PipeWriteMsg(pipe, req) &&
|
||||||
|
PipeReadMsgTimeout(pipe, resp, 500) &&
|
||||||
|
resp.type == static_cast<uint32_t>(MsgType::CommandReply) &&
|
||||||
|
resp.command == static_cast<uint32_t>(CommandId::QueryStatus);
|
||||||
|
|
||||||
|
Msg bye{};
|
||||||
|
bye.type = static_cast<uint32_t>(MsgType::Goodbye);
|
||||||
|
bye.client_id = ack.client_id;
|
||||||
|
bye.pid = GetCurrentProcessId();
|
||||||
|
bye.version = kProtocolVersion;
|
||||||
|
bye.session_id = ack.session_id;
|
||||||
|
PipeWriteMsg(pipe, bye);
|
||||||
|
|
||||||
|
CloseHandle(pipe);
|
||||||
|
return already_open;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL HBClientLoadDriverW()
|
||||||
|
{
|
||||||
|
LoadDriverRequest req{};
|
||||||
|
//wcsncpy_s(req.service_name, service_name, _TRUNCATE);
|
||||||
|
//wcsncpy_s(req.driver_path, driver_path, _TRUNCATE);
|
||||||
|
|
||||||
|
return HBClientCall(
|
||||||
|
static_cast<uint32_t>(CommandId::LoadDriver),
|
||||||
|
&req,
|
||||||
|
sizeof(req),
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL HBClientUnloadDriverW(const wchar_t* service_name)
|
||||||
|
{
|
||||||
|
if (!service_name)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
UnloadDriverRequest req{};
|
||||||
|
wcsncpy_s(req.service_name, service_name, _TRUNCATE);
|
||||||
|
|
||||||
|
return HBClientCall(
|
||||||
|
static_cast<uint32_t>(CommandId::UnloadDriver),
|
||||||
|
&req,
|
||||||
|
sizeof(req),
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL HBClientNotifyBreakpointRemoved(uint32_t thread_id, uint64_t dr0, uint64_t dr7)
|
||||||
|
{
|
||||||
|
BreakpointRemovedRequest req{};
|
||||||
|
req.thread_id = thread_id;
|
||||||
|
req.dr0 = dr0;
|
||||||
|
req.dr7 = dr7;
|
||||||
|
|
||||||
|
return HBClientCall(
|
||||||
|
static_cast<uint32_t>(CommandId::BreakpointRemoved),
|
||||||
|
&req,
|
||||||
|
sizeof(req),
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL DllClientPrintfW(const wchar_t* text)
|
||||||
|
{
|
||||||
|
if (!text)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
PrintfRequest req{};
|
||||||
|
if (!WideToUtf8(text, req.text, sizeof(req.text)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return HBClientCall(
|
||||||
|
static_cast<uint32_t>(CommandId::Printf),
|
||||||
|
&req,
|
||||||
|
sizeof(req),
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
static constexpr wchar_t kPipeName[] = L"\\\\.\\pipe\\HB_PIPE_DEMO";
|
||||||
|
static constexpr DWORD kHeartbeatIntervalMs = 250;
|
||||||
|
static constexpr DWORD kHeartbeatTimeoutMs = 2000;
|
||||||
|
static constexpr uint32_t kProtocolVersion = 4;
|
||||||
|
static constexpr size_t kPayloadBytes = 1024;
|
||||||
|
|
||||||
|
enum class MsgType : uint32_t
|
||||||
|
{
|
||||||
|
Hello = 1,
|
||||||
|
HelloAck = 2,
|
||||||
|
Heartbeat = 3,
|
||||||
|
Exit = 4,
|
||||||
|
Goodbye = 5,
|
||||||
|
CommandRequest = 6,
|
||||||
|
CommandReply = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class CommandId : uint32_t
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Printf = 1,
|
||||||
|
LoadDriver = 2,
|
||||||
|
UnloadDriver = 3,
|
||||||
|
QueryStatus = 4,
|
||||||
|
BreakpointRemoved = 5,
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
struct Msg
|
||||||
|
{
|
||||||
|
uint32_t type;
|
||||||
|
uint32_t client_id;
|
||||||
|
uint32_t pid;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t command;
|
||||||
|
uint32_t status;
|
||||||
|
uint32_t input_size;
|
||||||
|
uint32_t output_size;
|
||||||
|
uint32_t reserved;
|
||||||
|
uint64_t tick;
|
||||||
|
uint64_t session_id;
|
||||||
|
uint64_t request_id;
|
||||||
|
uint8_t payload[kPayloadBytes];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PrintfRequest
|
||||||
|
{
|
||||||
|
char text[512];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LoadDriverRequest
|
||||||
|
{
|
||||||
|
wchar_t service_name[128];
|
||||||
|
wchar_t driver_path[MAX_PATH];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UnloadDriverRequest
|
||||||
|
{
|
||||||
|
wchar_t service_name[128];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BreakpointRemovedRequest
|
||||||
|
{
|
||||||
|
uint32_t thread_id;
|
||||||
|
uint32_t reserved;
|
||||||
|
uint64_t dr0;
|
||||||
|
uint64_t dr7;
|
||||||
|
};
|
||||||
|
struct QueryStatusReply
|
||||||
|
{
|
||||||
|
DWORD server_pid;
|
||||||
|
DWORD already_open;
|
||||||
|
char text[128];
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
static_assert(sizeof(PrintfRequest) <= kPayloadBytes, "PrintfRequest too large");
|
||||||
|
static_assert(sizeof(LoadDriverRequest) <= kPayloadBytes, "LoadDriverRequest too large");
|
||||||
|
static_assert(sizeof(UnloadDriverRequest) <= kPayloadBytes, "UnloadDriverRequest too large");
|
||||||
|
static_assert(sizeof(BreakpointRemovedRequest) <= kPayloadBytes, "BreakpointRemovedRequest too large");
|
||||||
|
static_assert(sizeof(QueryStatusReply) <= kPayloadBytes, "QueryStatusReply too large");
|
||||||
|
|
||||||
|
inline LONG64 NowMs()
|
||||||
|
{
|
||||||
|
return static_cast<LONG64>(GetTickCount64());
|
||||||
|
}
|
||||||
|
|
||||||
|
struct PendingCommand
|
||||||
|
{
|
||||||
|
uint32_t command = static_cast<uint32_t>(CommandId::None);
|
||||||
|
DWORD status = ERROR_GEN_FAILURE;
|
||||||
|
uint64_t request_id = 0;
|
||||||
|
std::vector<uint8_t> input;
|
||||||
|
std::vector<uint8_t> output;
|
||||||
|
HANDLE done_event = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
BOOL QueryServerAlreadyOpen(char* out_text, size_t out_text_size);
|
||||||
|
|
||||||
|
BOOL DllClientStart();
|
||||||
|
|
||||||
|
BOOL HBClientCall(
|
||||||
|
uint32_t command,
|
||||||
|
const void* input,
|
||||||
|
uint32_t input_size,
|
||||||
|
void* output,
|
||||||
|
uint32_t output_size,
|
||||||
|
uint32_t* bytes_returned);
|
||||||
|
|
||||||
|
bool WideToUtf8(const std::wstring& input, char* output, size_t output_size);
|
||||||
|
|
||||||
|
BOOL DllClientPrintfW(const wchar_t* text);
|
||||||
|
|
||||||
|
BOOL HBClientLoadDriverW();
|
||||||
|
|
||||||
|
BOOL QueryServerAlreadyOpen();
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
// dllmain.cpp : 定义 DLL 应用程序的入口点。
|
||||||
|
#include "Base.h"
|
||||||
|
#include "client_comm_shared.h"
|
||||||
|
#include "driver_func.h"
|
||||||
|
#include "client_pipe.h"
|
||||||
|
|
||||||
|
auto MainThread()->void
|
||||||
|
{
|
||||||
|
if (!driver_func::init())
|
||||||
|
{
|
||||||
|
auto string = "[Anit-Cheat]系统运行发生致命错误,错误代码:" + to_string(GetLastError());
|
||||||
|
MessageBoxA(NULL, string.c_str(), "您似乎遇到了一些问题", MB_OK);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL APIENTRY DllMain( HMODULE hModule,
|
||||||
|
DWORD ul_reason_for_call,
|
||||||
|
LPVOID lpReserved
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
|
||||||
|
{
|
||||||
|
//AllocConsole();
|
||||||
|
//freopen("CONOUT$", "w+", stdout);
|
||||||
|
|
||||||
|
DllClientStart();
|
||||||
|
|
||||||
|
MainThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
#include "driver_func.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef ULONG(WINAPI* NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)(char a1, PVOID a2, PVOID a3, PVOID a4);
|
||||||
|
NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc gNtConvertBetweenAuxiliary = NULL;
|
||||||
|
|
||||||
|
HANDLE null_device_handle;
|
||||||
|
|
||||||
|
OSVERSIONINFOW os{ 0 };
|
||||||
|
|
||||||
|
namespace driver_func
|
||||||
|
{
|
||||||
|
auto GetVersion() -> OSVERSIONINFOW
|
||||||
|
{
|
||||||
|
OSVERSIONINFOW os{ 0 };
|
||||||
|
typedef NTSTATUS(WINAPI* PFNRtlGetVersion)(PRTL_OSVERSIONINFOW);
|
||||||
|
static PFNRtlGetVersion RtlGetVersion = nullptr;
|
||||||
|
if (RtlGetVersion == nullptr)
|
||||||
|
{
|
||||||
|
HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
|
||||||
|
if (hNtdll != NULL)
|
||||||
|
{
|
||||||
|
RtlGetVersion = (PFNRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlGetVersion(&os);
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto init() -> BOOL
|
||||||
|
{
|
||||||
|
os = GetVersion();
|
||||||
|
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
|
||||||
|
{
|
||||||
|
null_device_handle = CreateFileA("\\\\.\\Nul", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
||||||
|
if (null_device_handle != NULL && null_device_handle != INVALID_HANDLE_VALUE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if (os.dwBuildNumber >= 14393)
|
||||||
|
{
|
||||||
|
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (ntdll)
|
||||||
|
{
|
||||||
|
if (gNtConvertBetweenAuxiliary == nullptr)
|
||||||
|
{
|
||||||
|
gNtConvertBetweenAuxiliary = (NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)
|
||||||
|
GetProcAddress(ntdll, "NtConvertBetweenAuxiliaryCounterAndPerformanceCounter");
|
||||||
|
|
||||||
|
return gNtConvertBetweenAuxiliary ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL
|
||||||
|
{
|
||||||
|
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
|
||||||
|
{
|
||||||
|
DWORD retlen = 0;
|
||||||
|
return DeviceIoControl(null_device_handle, 0x12345678, Buf, bufSize, Buf, bufSize, &retlen, NULL);
|
||||||
|
}
|
||||||
|
else if (os.dwBuildNumber >= 14393)
|
||||||
|
{
|
||||||
|
ULONG64 xxx = 0;
|
||||||
|
auto data = (ULONG64)Buf;
|
||||||
|
gNtConvertBetweenAuxiliary(1, &data, (PVOID)&xxx, NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef DRIVER_BULID_FUNC
|
||||||
|
#define DRIVER_BULID_FUNC
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
|
||||||
|
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
|
||||||
|
|
||||||
|
struct CMD_COMM
|
||||||
|
{
|
||||||
|
DWORD64 CommID;
|
||||||
|
DWORD64 Buf;
|
||||||
|
DWORD64 status;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IOCTL_PROCESS
|
||||||
|
{
|
||||||
|
DWORD64 Pid;
|
||||||
|
BOOL is_no_create_remote_thread;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IOCTL_WINDOW
|
||||||
|
{
|
||||||
|
DWORD64 HWND;
|
||||||
|
DWORD64 Flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum DRIVER_COOM_TYPE
|
||||||
|
{
|
||||||
|
MSG_BASE = 0x10000,
|
||||||
|
DRIVER_COMM_TEST,
|
||||||
|
DRIVER_PROTECT_PROCESS,
|
||||||
|
DRIVER_CANCEL_PROTECT_PROCESS,
|
||||||
|
ADD_WHITE_PROCESS,
|
||||||
|
WINDOW_ANIT_SCREEN,
|
||||||
|
USER_EVENT_HANDLE,
|
||||||
|
PROTECT_THREAD_CONTRL,
|
||||||
|
INSTALL_MOUSE_KEYBOARD,
|
||||||
|
UNLOAD_MOUSE_KEYBOARD,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
namespace driver_func
|
||||||
|
{
|
||||||
|
auto init()->BOOL;
|
||||||
|
|
||||||
|
auto kdmaper_load_driver()->BOOL;
|
||||||
|
|
||||||
|
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !DRIVER_BULID_FUNC
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
#include "exprots_api_func.h"
|
||||||
|
#include "client_driver.h"
|
||||||
|
#include "client_comm_shared.h"
|
||||||
|
#include "active_check.h"
|
||||||
|
#include "client_pipe.h"
|
||||||
|
|
||||||
|
MYAPI_API BOOL set_server_process_path(const char* Path)
|
||||||
|
{
|
||||||
|
return client_shared_mapping::StartServerProcess(Path);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL check_server_process()
|
||||||
|
{
|
||||||
|
return QueryServerAlreadyOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL driver_install_load()
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->driver_map_load();
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL check_install_status()
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->check_load_driver();
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL add_process_protect(DWORD Pid)
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->add_process_protect(Pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL sub_process_protect(DWORD Pid)
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->delete_process_protect(Pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL enjoin_remote_thread(BOOL val)
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->enjoin_remote_thread(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL enable_reg_mouse_key()
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->install_mouse_keyboard();
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL disable_reg_mouse_key()
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->unload_mouse_keyboard();
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL add_mouse_key_white_process(DWORD Pid)
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->add_white_mouse_keyoard_process(Pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL anit_window_scrren(HWND hwnd,UINT Flags)
|
||||||
|
{
|
||||||
|
return client_driver::fn_get_instance()->window_anit_screen(hwnd, Flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYAPI_API BOOL check_remote_app_process()
|
||||||
|
{
|
||||||
|
return active_check::check_remote_app_process();
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#ifndef EXPROTS_API_FUNC
|
||||||
|
#define EXPROTS_API_FUNC
|
||||||
|
|
||||||
|
#ifdef EXPROTS_API_FUNC
|
||||||
|
#define MYAPI_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define MYAPI_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//设置服务进程目录
|
||||||
|
EXTERN_C MYAPI_API BOOL set_server_process_path(CONST char* Path);
|
||||||
|
|
||||||
|
//服务进程是否已加载
|
||||||
|
EXTERN_C MYAPI_API BOOL check_server_process();
|
||||||
|
|
||||||
|
//驱动安装
|
||||||
|
EXTERN_C MYAPI_API BOOL driver_install_load();
|
||||||
|
|
||||||
|
//驱动是否安装成功
|
||||||
|
EXTERN_C MYAPI_API BOOL check_install_status();
|
||||||
|
|
||||||
|
//添加进程防护
|
||||||
|
EXTERN_C MYAPI_API BOOL add_process_protect(DWORD Pid);
|
||||||
|
|
||||||
|
//移除进程防护
|
||||||
|
EXTERN_C MYAPI_API BOOL sub_process_protect(DWORD Pid);
|
||||||
|
|
||||||
|
//是否启用禁止远程线程
|
||||||
|
EXTERN_C MYAPI_API BOOL enjoin_remote_thread(BOOL val);
|
||||||
|
|
||||||
|
//启用键鼠保护回调
|
||||||
|
EXTERN_C MYAPI_API BOOL enable_reg_mouse_key();
|
||||||
|
|
||||||
|
//禁用键鼠保护回调
|
||||||
|
EXTERN_C MYAPI_API BOOL disable_reg_mouse_key();
|
||||||
|
|
||||||
|
//添加键鼠移动白名单进程
|
||||||
|
EXTERN_C MYAPI_API BOOL add_mouse_key_white_process(DWORD Pid);
|
||||||
|
|
||||||
|
//设置窗口反截图
|
||||||
|
EXTERN_C MYAPI_API BOOL anit_window_scrren(HWND hwnd, UINT Flags);
|
||||||
|
|
||||||
|
//检测远程软件进程
|
||||||
|
EXTERN_C MYAPI_API BOOL check_remote_app_process();
|
||||||
|
|
||||||
|
#endif // !exprots_api_func
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#include "private_funcion.h"
|
||||||
|
|
||||||
|
namespace private_funcion
|
||||||
|
{
|
||||||
|
auto create_start_process(LPCSTR path) -> BOOL
|
||||||
|
{
|
||||||
|
STARTUPINFOA si = { sizeof(si) };
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
auto bOk = CreateProcessA(
|
||||||
|
path,
|
||||||
|
NULL, NULL, NULL, FALSE,
|
||||||
|
CREATE_NEW_CONSOLE,
|
||||||
|
NULL, NULL,
|
||||||
|
&si, &pi
|
||||||
|
);
|
||||||
|
if (bOk)
|
||||||
|
{
|
||||||
|
CloseHandle(pi.hProcess);
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef PRIVATE_FUNCTION
|
||||||
|
#define PRIVATE_FUNCTION
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
namespace private_funcion
|
||||||
|
{
|
||||||
|
auto create_start_process(LPCSTR path)->BOOL;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !PRIVATE_FUNCTION
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
namespace utils
|
||||||
|
{
|
||||||
|
// 读取二进制文件到内存
|
||||||
|
BYTE* ReadBinaryFile(const char* filePath, DWORD* outSize) {
|
||||||
|
HANDLE hFile = CreateFileA(
|
||||||
|
filePath,
|
||||||
|
GENERIC_READ,
|
||||||
|
FILE_SHARE_READ,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||||||
|
printf("打开文件失败: %s\n", filePath);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD fileSize = GetFileSize(hFile, NULL);
|
||||||
|
if (fileSize == INVALID_FILE_SIZE) {
|
||||||
|
printf("获取文件大小失败\n");
|
||||||
|
CloseHandle(hFile);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
BYTE* buffer = (BYTE*)malloc(fileSize);
|
||||||
|
if (!buffer) {
|
||||||
|
printf("内存分配失败\n");
|
||||||
|
CloseHandle(hFile);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD bytesRead = 0;
|
||||||
|
BOOL result = ReadFile(hFile, buffer, fileSize, &bytesRead, NULL);
|
||||||
|
CloseHandle(hFile);
|
||||||
|
|
||||||
|
if (!result || bytesRead != fileSize) {
|
||||||
|
printf("读取文件失败\n");
|
||||||
|
free(buffer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*outSize = bytesRead;
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
BOOL WriteShellcodeToFile(const char* filePath, const BYTE* shellcode, SIZE_T shellcodeSize) {
|
||||||
|
// 1. 创建文件
|
||||||
|
HANDLE hFile = CreateFileA(
|
||||||
|
filePath,
|
||||||
|
GENERIC_WRITE,
|
||||||
|
0, // 独占访问
|
||||||
|
NULL,
|
||||||
|
CREATE_ALWAYS, // 总是创建新文件
|
||||||
|
FILE_ATTRIBUTE_NORMAL, // 普通文件
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||||||
|
//printf("CreateFile 失败: %d\n", GetLastError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 写入 shellcode
|
||||||
|
DWORD bytesWritten = 0;
|
||||||
|
BOOL result = WriteFile(hFile, shellcode, (DWORD)shellcodeSize, &bytesWritten, NULL);
|
||||||
|
|
||||||
|
if (!result || bytesWritten != shellcodeSize) {
|
||||||
|
//printf("WriteFile 失败: %d\n", GetLastError());
|
||||||
|
CloseHandle(hFile);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 刷新缓冲区并关闭
|
||||||
|
FlushFileBuffers(hFile);
|
||||||
|
CloseHandle(hFile);
|
||||||
|
|
||||||
|
//printf("Shellcode 写入成功: %s (大小: %d 字节)\n", filePath, bytesWritten);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
// 创建多级目录(递归创建)
|
||||||
|
BOOL CreateDirectoryRecursive(const char* path) {
|
||||||
|
char tempPath[MAX_PATH];
|
||||||
|
strcpy_s(tempPath, path);
|
||||||
|
|
||||||
|
// 去掉末尾的反斜杠
|
||||||
|
size_t len = strlen(tempPath);
|
||||||
|
if (len > 0 && tempPath[len - 1] == '\\') {
|
||||||
|
tempPath[len - 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查目录是否已存在
|
||||||
|
DWORD attrs = GetFileAttributesA(tempPath);
|
||||||
|
if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)) {
|
||||||
|
return TRUE; // 目录已存在
|
||||||
|
}
|
||||||
|
|
||||||
|
// 递归创建父目录
|
||||||
|
char* lastSlash = strrchr(tempPath, '\\');
|
||||||
|
if (lastSlash) {
|
||||||
|
*lastSlash = '\0';
|
||||||
|
if (!CreateDirectoryRecursive(tempPath)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
*lastSlash = '\\';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建当前目录
|
||||||
|
if (!CreateDirectoryA(tempPath, NULL)) {
|
||||||
|
if (GetLastError() == ERROR_ALREADY_EXISTS) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
//printf("创建目录失败: %s (错误: %d)\n", tempPath, GetLastError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("创建目录成功: %s\n", tempPath);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
auto GetProcessByName(CONST wchar_t* Name) -> DWORD
|
||||||
|
{
|
||||||
|
DWORD Pid = 0;
|
||||||
|
|
||||||
|
auto SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||||
|
if (SnapshotHandle == INVALID_HANDLE_VALUE)
|
||||||
|
return Pid;
|
||||||
|
|
||||||
|
PROCESSENTRY32 pe32{ 0 };
|
||||||
|
pe32.dwSize = sizeof(pe32);
|
||||||
|
|
||||||
|
if (Process32First(SnapshotHandle, &pe32))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!wcscmp(pe32.szExeFile, Name))
|
||||||
|
{
|
||||||
|
Pid = pe32.th32ProcessID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (Process32Next(SnapshotHandle, &pe32));
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(SnapshotHandle);
|
||||||
|
|
||||||
|
return Pid;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef UTILS_H
|
||||||
|
#define UTILS_H
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
namespace utils
|
||||||
|
{
|
||||||
|
BYTE* ReadBinaryFile(const char* filePath, DWORD* outSize);
|
||||||
|
|
||||||
|
BOOL WriteShellcodeToFile(const char* filePath, const BYTE* shellcode, SIZE_T shellcodeSize);
|
||||||
|
BOOL CreateDirectoryRecursive(const char* path);
|
||||||
|
|
||||||
|
auto GetProcessByName(CONST wchar_t* Name)->DWORD;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !UTILS_h
|
||||||
Binary file not shown.
@@ -0,0 +1,71 @@
|
|||||||
|
// Microsoft Visual C++ generated resource script.
|
||||||
|
//
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
|
//
|
||||||
|
#include "winres.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 中文(简体,中国) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
|
||||||
|
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
|
||||||
|
#pragma code_page(936)
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TEXTINCLUDE
|
||||||
|
//
|
||||||
|
|
||||||
|
1 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"resource.h\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
2 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"#include ""winres.h""\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
3 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Icon
|
||||||
|
//
|
||||||
|
|
||||||
|
// Icon with lowest ID value placed first to ensure application icon
|
||||||
|
// remains consistent on all systems.
|
||||||
|
IDI_ICON1 ICON "D:\\Apps\\Tencent\\WeChat\\Documents\\xwechat_files\\wxid_tmmv70cpqylp12_ec35\\msg\\file\\2026-07\\图层-5.ico"
|
||||||
|
|
||||||
|
#endif // 中文(简体,中国) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{17dde567-4eaa-4e85-b533-02c4e6451072}</ProjectGuid>
|
||||||
|
<RootNamespace>AnitCheatEXE</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>Anit-Seriver</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
|
||||||
|
<GenerateManifest>false</GenerateManifest>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Label="LLVM" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<UseLldLink>false</UseLldLink>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||||
|
<LanguageStandard>Default</LanguageStandard>
|
||||||
|
<AdditionalOptions>-mllvm -bcf -mllvm -bcf_prob=70 -mllvm -bcf_loop=1 -mllvm -sub -mllvm -sub_loop=1 -mllvm -fla -mllvm -split_num=1 -mllvm -aesSeed=DEADBEEFDEADCODEDEADBEEFDEADCODE</AdditionalOptions>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<TreatLinkerWarningAsErrors>false</TreatLinkerWarningAsErrors>
|
||||||
|
<AdditionalDependencies>d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="comm.cpp" />
|
||||||
|
<ClCompile Include="Driver.cpp" />
|
||||||
|
<ClCompile Include="driver_func.cpp" />
|
||||||
|
<ClCompile Include="Gui.cpp" />
|
||||||
|
<ClCompile Include="ImGui\imgui.cpp" />
|
||||||
|
<ClCompile Include="ImGui\imgui_draw.cpp" />
|
||||||
|
<ClCompile Include="ImGui\imgui_impl_dx11.cpp" />
|
||||||
|
<ClCompile Include="ImGui\imgui_impl_win32.cpp" />
|
||||||
|
<ClCompile Include="ImGui\imgui_tables.cpp" />
|
||||||
|
<ClCompile Include="ImGui\imgui_widgets.cpp" />
|
||||||
|
<ClCompile Include="kdmapper\kdmapper.cpp" />
|
||||||
|
<ClCompile Include="kdmapper\kd_driver.cpp" />
|
||||||
|
<ClCompile Include="kdmapper\ntstruct.cpp" />
|
||||||
|
<ClCompile Include="kdmapper\utils.cpp" />
|
||||||
|
<ClCompile Include="main.cpp" />
|
||||||
|
<ClCompile Include="Mapping.cpp" />
|
||||||
|
<ClCompile Include="server_palpit.cpp" />
|
||||||
|
<ClCompile Include="server_pipe.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Base.h" />
|
||||||
|
<ClInclude Include="comm.h" />
|
||||||
|
<ClInclude Include="Driver.h" />
|
||||||
|
<ClInclude Include="driver_func.h" />
|
||||||
|
<ClInclude Include="Gui.h" />
|
||||||
|
<ClInclude Include="ImGui\imconfig.h" />
|
||||||
|
<ClInclude Include="ImGui\imgui.h" />
|
||||||
|
<ClInclude Include="ImGui\imgui_impl_dx11.h" />
|
||||||
|
<ClInclude Include="ImGui\imgui_impl_win32.h" />
|
||||||
|
<ClInclude Include="ImGui\imgui_internal.h" />
|
||||||
|
<ClInclude Include="ImGui\imstb_rectpack.h" />
|
||||||
|
<ClInclude Include="ImGui\imstb_textedit.h" />
|
||||||
|
<ClInclude Include="ImGui\imstb_truetype.h" />
|
||||||
|
<ClInclude Include="kdmapper\drv.h" />
|
||||||
|
<ClInclude Include="kdmapper\kdmapper.h" />
|
||||||
|
<ClInclude Include="kdmapper\kd_driver.h" />
|
||||||
|
<ClInclude Include="kdmapper\ntstruct.h" />
|
||||||
|
<ClInclude Include="kdmapper\utils.h" />
|
||||||
|
<ClInclude Include="Mapping.h" />
|
||||||
|
<ClInclude Include="resource.h" />
|
||||||
|
<ClInclude Include="server_palpit.h" />
|
||||||
|
<ClInclude Include="server_pipe.h" />
|
||||||
|
<ClInclude Include="Vmp\Vmp.h" />
|
||||||
|
<ClInclude Include="Vmp\VMProtectSDK.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="Anit-Cheat_EXE.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Image Include="D:\Apps\Tencent\WeChat\Documents\xwechat_files\wxid_tmmv70cpqylp12_ec35\msg\file\2026-07\图层-5.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="源文件">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="头文件">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="资源文件">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="kdmpaer">
|
||||||
|
<UniqueIdentifier>{20724fc8-4769-4482-a7db-5af8e4d19f75}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Vmp">
|
||||||
|
<UniqueIdentifier>{b4904683-791d-437b-948f-96a0a413d118}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Driver">
|
||||||
|
<UniqueIdentifier>{5c551474-28ae-4fe2-9ee6-54819f554d88}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Mapping">
|
||||||
|
<UniqueIdentifier>{48b29237-d19e-4cce-8bd3-577a98dd5be2}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="comm">
|
||||||
|
<UniqueIdentifier>{dd44ac39-a7fb-4eec-8788-f6951a9ea85f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="palpit">
|
||||||
|
<UniqueIdentifier>{1472b722-9fe0-4049-abd6-81b3d536d78a}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="pipe">
|
||||||
|
<UniqueIdentifier>{ff137c34-0307-4719-82f3-ddf570188059}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="EspGui">
|
||||||
|
<UniqueIdentifier>{11cc3256-8c5c-4ca1-8c9e-4b11f12fad5d}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="EspGui\ImGui">
|
||||||
|
<UniqueIdentifier>{a33f7a19-8c02-4e2f-8edc-0294dc92cbce}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="main.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="kdmapper\kd_driver.cpp">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="kdmapper\kdmapper.cpp">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="kdmapper\ntstruct.cpp">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="kdmapper\utils.cpp">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="comm.cpp">
|
||||||
|
<Filter>comm</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Driver.cpp">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="driver_func.cpp">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Mapping.cpp">
|
||||||
|
<Filter>Mapping</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="server_palpit.cpp">
|
||||||
|
<Filter>palpit</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="server_pipe.cpp">
|
||||||
|
<Filter>pipe</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImGui\imgui_draw.cpp">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImGui\imgui_impl_dx11.cpp">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImGui\imgui_impl_win32.cpp">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImGui\imgui_tables.cpp">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImGui\imgui_widgets.cpp">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImGui\imgui.cpp">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Gui.cpp">
|
||||||
|
<Filter>EspGui</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Base.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="kdmapper\kd_driver.h">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="kdmapper\kdmapper.h">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="kdmapper\ntstruct.h">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="kdmapper\utils.h">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="kdmapper\drv.h">
|
||||||
|
<Filter>kdmpaer</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Vmp\VMProtectSDK.h">
|
||||||
|
<Filter>Vmp</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Vmp\Vmp.h">
|
||||||
|
<Filter>Vmp</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="comm.h">
|
||||||
|
<Filter>comm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Driver.h">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="driver_func.h">
|
||||||
|
<Filter>Driver</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Mapping.h">
|
||||||
|
<Filter>Mapping</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="server_palpit.h">
|
||||||
|
<Filter>palpit</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="server_pipe.h">
|
||||||
|
<Filter>pipe</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="resource.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imgui.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imgui_impl_dx11.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imgui_impl_win32.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imgui_internal.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imstb_rectpack.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imstb_textedit.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imstb_truetype.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImGui\imconfig.h">
|
||||||
|
<Filter>EspGui\ImGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Gui.h">
|
||||||
|
<Filter>EspGui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="Anit-Cheat_EXE.rc">
|
||||||
|
<Filter>资源文件</Filter>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Image Include="D:\Apps\Tencent\WeChat\Documents\xwechat_files\wxid_tmmv70cpqylp12_ec35\msg\file\2026-07\图层-5.ico">
|
||||||
|
<Filter>资源文件</Filter>
|
||||||
|
</Image>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup />
|
||||||
|
</Project>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <mutex>
|
||||||
|
#include <vector>
|
||||||
|
#include <d3d11.h>
|
||||||
|
|
||||||
|
#include "ImGui/imgui.h"
|
||||||
|
#include "ImGui/imgui_impl_dx11.h"
|
||||||
|
#include "ImGui/imgui_impl_win32.h"
|
||||||
|
|
||||||
|
#include "Vmp/Vmp.h"
|
||||||
|
#include "XorStr.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
#include "Driver.h"
|
||||||
|
|
||||||
|
#include "driver_func.h"
|
||||||
|
|
||||||
|
Driver* Driver::instance = nullptr;
|
||||||
|
auto Driver::fn_get_instance() -> Driver*
|
||||||
|
{
|
||||||
|
if (!instance) {
|
||||||
|
|
||||||
|
instance = new Driver;
|
||||||
|
driver_func::init();
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto Driver::driver_install() -> BOOL
|
||||||
|
{
|
||||||
|
if (!is_driver_load())
|
||||||
|
{
|
||||||
|
if (driver_func::kdmaper_load_driver())
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto Driver::is_driver_load() -> BOOL
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
CMD_COMM data;
|
||||||
|
data.CommID = DRIVER_COOM_TYPE::DRIVER_COMM_TEST;
|
||||||
|
data.status = (DWORD64)&status;
|
||||||
|
|
||||||
|
driver_func::driver_comm_func(&data, sizeof(data));
|
||||||
|
|
||||||
|
return NT_SUCCESS(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef DRIVER_H
|
||||||
|
#define DRIVER_H
|
||||||
|
#include "Base.h"
|
||||||
|
#include "driver_func.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Driver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static auto fn_get_instance()->Driver*;
|
||||||
|
|
||||||
|
//驱动加载
|
||||||
|
auto driver_install()->BOOL;
|
||||||
|
|
||||||
|
//判断是否加载驱动
|
||||||
|
auto is_driver_load()->BOOL;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static Driver* instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !DRIVER_H
|
||||||
@@ -0,0 +1,567 @@
|
|||||||
|
#include "Gui.h"
|
||||||
|
#include <wincodec.h>
|
||||||
|
#include "shield_image_data.h"
|
||||||
|
|
||||||
|
static ID3D11Device* g_pd3dDevice = nullptr;
|
||||||
|
static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr;
|
||||||
|
static IDXGISwapChain* g_pSwapChain = nullptr;
|
||||||
|
static bool g_SwapChainOccluded = false;
|
||||||
|
static UINT g_ResizeWidth = 0, g_ResizeHeight = 0;
|
||||||
|
static ID3D11RenderTargetView* g_mainRenderTargetView = nullptr;
|
||||||
|
|
||||||
|
static HWND g_OverlayHwnd = nullptr;
|
||||||
|
|
||||||
|
|
||||||
|
static ID3D11ShaderResourceView* g_ShieldTexture = nullptr;
|
||||||
|
static int g_ShieldWidth = 0;
|
||||||
|
static int g_ShieldHeight = 0;
|
||||||
|
static double g_LoaderStartTime = -1.0;
|
||||||
|
static bool g_ComInitialized = false;
|
||||||
|
|
||||||
|
struct DecodedImage
|
||||||
|
{
|
||||||
|
int width = 0;
|
||||||
|
int height = 0;
|
||||||
|
std::vector<unsigned char> rgba;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Forward declare message handler from imgui_impl_win32.cpp
|
||||||
|
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
static float Clamp01(float value)
|
||||||
|
{
|
||||||
|
return value < 0.0f ? 0.0f : (value > 1.0f ? 1.0f : value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static float SmoothStep01(float value)
|
||||||
|
{
|
||||||
|
value = Clamp01(value);
|
||||||
|
return value * value * (3.0f - 2.0f * value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool DecodePngFromMemory(const unsigned char* data, size_t data_size, DecodedImage& image)
|
||||||
|
{
|
||||||
|
IWICImagingFactory* factory = nullptr;
|
||||||
|
IWICStream* stream = nullptr;
|
||||||
|
IWICBitmapDecoder* decoder = nullptr;
|
||||||
|
IWICBitmapFrameDecode* frame = nullptr;
|
||||||
|
IWICFormatConverter* converter = nullptr;
|
||||||
|
UINT width = 0;
|
||||||
|
UINT height = 0;
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if (FAILED(CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&factory))))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (FAILED(factory->CreateStream(&stream)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (FAILED(stream->InitializeFromMemory(const_cast<BYTE*>(data), static_cast<DWORD>(data_size))))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (FAILED(factory->CreateDecoderFromStream(stream, nullptr, WICDecodeMetadataCacheOnLoad, &decoder)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (FAILED(decoder->GetFrame(0, &frame)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
|
||||||
|
if (FAILED(frame->GetSize(&width, &height)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (FAILED(factory->CreateFormatConverter(&converter)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (FAILED(converter->Initialize(
|
||||||
|
frame,
|
||||||
|
GUID_WICPixelFormat32bppRGBA,
|
||||||
|
WICBitmapDitherTypeNone,
|
||||||
|
nullptr,
|
||||||
|
0.0,
|
||||||
|
WICBitmapPaletteTypeCustom)))
|
||||||
|
{
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
image.width = static_cast<int>(width);
|
||||||
|
image.height = static_cast<int>(height);
|
||||||
|
image.rgba.resize(static_cast<size_t>(width) * static_cast<size_t>(height) * 4);
|
||||||
|
|
||||||
|
if (FAILED(converter->CopyPixels(
|
||||||
|
nullptr,
|
||||||
|
width * 4,
|
||||||
|
static_cast<UINT>(image.rgba.size()),
|
||||||
|
image.rgba.data())))
|
||||||
|
{
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (converter) converter->Release();
|
||||||
|
if (frame) frame->Release();
|
||||||
|
if (decoder) decoder->Release();
|
||||||
|
if (stream) stream->Release();
|
||||||
|
if (factory) factory->Release();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool CreateTextureFromRgba(const DecodedImage& image, ID3D11ShaderResourceView** out_srv)
|
||||||
|
{
|
||||||
|
if (!g_pd3dDevice || image.rgba.empty() || image.width <= 0 || image.height <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
|
desc.Width = static_cast<UINT>(image.width);
|
||||||
|
desc.Height = static_cast<UINT>(image.height);
|
||||||
|
desc.MipLevels = 1;
|
||||||
|
desc.ArraySize = 1;
|
||||||
|
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
desc.SampleDesc.Count = 1;
|
||||||
|
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
|
||||||
|
D3D11_SUBRESOURCE_DATA sub_resource;
|
||||||
|
ZeroMemory(&sub_resource, sizeof(sub_resource));
|
||||||
|
sub_resource.pSysMem = image.rgba.data();
|
||||||
|
sub_resource.SysMemPitch = static_cast<UINT>(image.width * 4);
|
||||||
|
|
||||||
|
ID3D11Texture2D* texture = nullptr;
|
||||||
|
if (FAILED(g_pd3dDevice->CreateTexture2D(&desc, &sub_resource, &texture)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
|
||||||
|
ZeroMemory(&srv_desc, sizeof(srv_desc));
|
||||||
|
srv_desc.Format = desc.Format;
|
||||||
|
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||||
|
srv_desc.Texture2D.MipLevels = 1;
|
||||||
|
|
||||||
|
HRESULT hr = g_pd3dDevice->CreateShaderResourceView(texture, &srv_desc, out_srv);
|
||||||
|
texture->Release();
|
||||||
|
|
||||||
|
return SUCCEEDED(hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RemoveNearBlackBackground(DecodedImage& image)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i + 3 < image.rgba.size(); i += 4)
|
||||||
|
{
|
||||||
|
unsigned char r = image.rgba[i + 0];
|
||||||
|
unsigned char g = image.rgba[i + 1];
|
||||||
|
unsigned char b = image.rgba[i + 2];
|
||||||
|
unsigned char max_channel = r > g ? r : g;
|
||||||
|
max_channel = max_channel > b ? max_channel : b;
|
||||||
|
|
||||||
|
if (r < 32 && g < 32 && b < 32)
|
||||||
|
{
|
||||||
|
image.rgba[i + 3] = 0;
|
||||||
|
}
|
||||||
|
else if (max_channel < 58)
|
||||||
|
{
|
||||||
|
float t = (static_cast<float>(max_channel) - 32.0f) / 26.0f;
|
||||||
|
t = Clamp01(t);
|
||||||
|
image.rgba[i + 3] = static_cast<unsigned char>(static_cast<float>(image.rgba[i + 3]) * t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool LoadShieldTextureFromGlobalMemory()
|
||||||
|
{
|
||||||
|
DecodedImage image;
|
||||||
|
if (!DecodePngFromMemory(g_ShieldPngData, sizeof(g_ShieldPngData), image))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
RemoveNearBlackBackground(image);
|
||||||
|
|
||||||
|
if (!CreateTextureFromRgba(image, &g_ShieldTexture))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
g_ShieldWidth = image.width;
|
||||||
|
g_ShieldHeight = image.height;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetupTransparentOverlayWindow(HWND hwnd)
|
||||||
|
{
|
||||||
|
LONG_PTR ex_style = ::GetWindowLongPtrW(hwnd, GWL_EXSTYLE);
|
||||||
|
ex_style |= WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
|
||||||
|
::SetWindowLongPtrW(hwnd, GWL_EXSTYLE, ex_style);
|
||||||
|
|
||||||
|
// Pure black pixels become transparent. Global alpha is used for fade in/out
|
||||||
|
// to avoid blending image edges into the black backbuffer.
|
||||||
|
::SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 255, LWA_COLORKEY | LWA_ALPHA);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CleanupShieldTexture()
|
||||||
|
{
|
||||||
|
if (g_ShieldTexture)
|
||||||
|
{
|
||||||
|
g_ShieldTexture->Release();
|
||||||
|
g_ShieldTexture = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_ShieldWidth = 0;
|
||||||
|
g_ShieldHeight = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool DrawAceStyleLoader()
|
||||||
|
{
|
||||||
|
ImGuiViewport* viewport = ImGui::GetMainViewport();
|
||||||
|
ImDrawList* draw = ImGui::GetBackgroundDrawList();
|
||||||
|
|
||||||
|
ImVec2 vp_pos = viewport->Pos;
|
||||||
|
ImVec2 vp_size = viewport->Size;
|
||||||
|
|
||||||
|
if (!g_ShieldTexture || g_ShieldWidth <= 0 || g_ShieldHeight <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (g_LoaderStartTime < 0.0)
|
||||||
|
g_LoaderStartTime = ImGui::GetTime();
|
||||||
|
|
||||||
|
const float fade_in_seconds = 1.0f;
|
||||||
|
const float glow_seconds = 3.0f;
|
||||||
|
const float hold_seconds = 1.0f;
|
||||||
|
const float fade_out_seconds = 1.0f;
|
||||||
|
const float fade_out_start = fade_in_seconds + glow_seconds + hold_seconds;
|
||||||
|
const float close_time = fade_out_start + fade_out_seconds;
|
||||||
|
|
||||||
|
const float elapsed = static_cast<float>(ImGui::GetTime() - g_LoaderStartTime);
|
||||||
|
const float fade_in = SmoothStep01(elapsed / fade_in_seconds);
|
||||||
|
const float fade_out = elapsed <= fade_out_start ? 1.0f : 1.0f - SmoothStep01((elapsed - fade_out_start) / fade_out_seconds);
|
||||||
|
const float fade = Clamp01(fade_in * fade_out);
|
||||||
|
const BYTE window_alpha = static_cast<BYTE>(255.0f * fade);
|
||||||
|
|
||||||
|
if (g_OverlayHwnd)
|
||||||
|
::SetLayeredWindowAttributes(g_OverlayHwnd, RGB(0, 0, 0), window_alpha, LWA_COLORKEY | LWA_ALPHA);
|
||||||
|
|
||||||
|
const ImVec2 uv0(0.0f, 0.0f);
|
||||||
|
const ImVec2 uv1(1.0f, 1.0f);
|
||||||
|
const float texture_aspect = static_cast<float>(g_ShieldHeight) / static_cast<float>(g_ShieldWidth);
|
||||||
|
const float wanted_width = vp_size.x * 0.34f;
|
||||||
|
float image_width = wanted_width < 420.0f ? wanted_width : 420.0f;
|
||||||
|
if (image_width < 300.0f)
|
||||||
|
image_width = 300.0f;
|
||||||
|
const float image_height = image_width * texture_aspect;
|
||||||
|
|
||||||
|
RECT work_area;
|
||||||
|
work_area.left = 0;
|
||||||
|
work_area.top = 0;
|
||||||
|
work_area.right = static_cast<LONG>(vp_size.x);
|
||||||
|
work_area.bottom = static_cast<LONG>(vp_size.y);
|
||||||
|
::SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0);
|
||||||
|
|
||||||
|
const float visible_right = 568.0f / 601.0f;
|
||||||
|
const float visible_bottom = 215.0f / 254.0f;
|
||||||
|
const float margin_x = 20.0f;
|
||||||
|
const float margin_y = 8.0f;
|
||||||
|
|
||||||
|
ImVec2 image_pos(
|
||||||
|
vp_pos.x + static_cast<float>(work_area.right) - image_width * visible_right - margin_x,
|
||||||
|
vp_pos.y + static_cast<float>(work_area.bottom) - image_height * visible_bottom - margin_y);
|
||||||
|
ImVec2 image_end(image_pos.x + image_width, image_pos.y + image_height);
|
||||||
|
|
||||||
|
draw->AddImage(
|
||||||
|
g_ShieldTexture,
|
||||||
|
image_pos,
|
||||||
|
image_end,
|
||||||
|
uv0,
|
||||||
|
uv1,
|
||||||
|
IM_COL32(255, 255, 255, 255));
|
||||||
|
|
||||||
|
const float glow_elapsed = elapsed - fade_in_seconds;
|
||||||
|
if (glow_elapsed < 0.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const float sweep_t = SmoothStep01(glow_elapsed / glow_seconds);
|
||||||
|
const int glow_alpha = glow_elapsed <= glow_seconds ? static_cast<int>(95.0f * fade_out) : 0;
|
||||||
|
const int edge_alpha = glow_elapsed <= glow_seconds ? static_cast<int>(178.0f * fade_out) : 0;
|
||||||
|
const int core_alpha = glow_elapsed <= glow_seconds ? static_cast<int>(238.0f * fade_out) : 0;
|
||||||
|
|
||||||
|
// Restrict the ACE-style glow to the blue rectangular notification area.
|
||||||
|
const ImVec2 panel_pos(
|
||||||
|
image_pos.x + image_width * (183.0f / 601.0f),
|
||||||
|
image_pos.y + image_height * (50.0f / 254.0f));
|
||||||
|
const ImVec2 panel_end(
|
||||||
|
image_pos.x + image_width * (568.0f / 601.0f),
|
||||||
|
image_pos.y + image_height * (200.0f / 254.0f));
|
||||||
|
const float panel_width = panel_end.x - panel_pos.x;
|
||||||
|
const float panel_height = panel_end.y - panel_pos.y;
|
||||||
|
|
||||||
|
const float beam_width = panel_width * 0.18f;
|
||||||
|
const float beam_x = panel_pos.x - beam_width * 1.15f + (panel_width + beam_width * 2.30f) * sweep_t;
|
||||||
|
const float beam_slant = panel_width * 0.17f;
|
||||||
|
|
||||||
|
draw->PushClipRect(panel_pos, panel_end, true);
|
||||||
|
|
||||||
|
const ImVec2 glow_top(beam_x - beam_width * 0.30f, panel_pos.y);
|
||||||
|
const ImVec2 glow_bottom(beam_x + beam_slant - beam_width * 0.30f, panel_end.y);
|
||||||
|
draw->AddLine(glow_top, glow_bottom, IM_COL32(45, 220, 255, glow_alpha), 32.0f);
|
||||||
|
draw->AddLine(glow_top, glow_bottom, IM_COL32(115, 240, 255, edge_alpha), 13.0f);
|
||||||
|
|
||||||
|
const ImVec2 core_top(beam_x, panel_pos.y);
|
||||||
|
const ImVec2 core_bottom(beam_x + beam_slant, panel_end.y);
|
||||||
|
draw->AddLine(core_top, core_bottom, IM_COL32(245, 255, 255, core_alpha), 3.0f);
|
||||||
|
|
||||||
|
const ImVec2 side_top(beam_x + beam_width * 0.18f, panel_pos.y);
|
||||||
|
const ImVec2 side_bottom(beam_x + beam_slant + beam_width * 0.18f, panel_end.y);
|
||||||
|
draw->AddLine(side_top, side_bottom, IM_COL32(175, 250, 255, edge_alpha), 7.0f);
|
||||||
|
|
||||||
|
draw->PopClipRect();
|
||||||
|
|
||||||
|
return elapsed >= close_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Gui
|
||||||
|
{
|
||||||
|
auto MessageDispatch() -> void;
|
||||||
|
|
||||||
|
bool CreateDeviceD3D(HWND hWnd);
|
||||||
|
void CleanupDeviceD3D();
|
||||||
|
void CreateRenderTarget();
|
||||||
|
void CleanupRenderTarget();
|
||||||
|
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"Esp Style Loader", nullptr };
|
||||||
|
|
||||||
|
auto CreateGuiWindow() -> BOOL
|
||||||
|
{
|
||||||
|
HRESULT com_hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
||||||
|
g_ComInitialized = SUCCEEDED(com_hr);
|
||||||
|
|
||||||
|
ImGui_ImplWin32_EnableDpiAwareness();
|
||||||
|
float main_scale = ImGui_ImplWin32_GetDpiScaleForMonitor(::MonitorFromPoint(POINT{ 0, 0 }, MONITOR_DEFAULTTOPRIMARY));
|
||||||
|
|
||||||
|
::RegisterClassExW(&wc);
|
||||||
|
int screen_width = ::GetSystemMetrics(SM_CXSCREEN);
|
||||||
|
int screen_height = ::GetSystemMetrics(SM_CYSCREEN);
|
||||||
|
|
||||||
|
HWND hwnd = ::CreateWindowExW(
|
||||||
|
WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT,
|
||||||
|
wc.lpszClassName,
|
||||||
|
L"Esp Style Loader",
|
||||||
|
WS_POPUP,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
screen_width,
|
||||||
|
screen_height,
|
||||||
|
nullptr,
|
||||||
|
nullptr,
|
||||||
|
wc.hInstance,
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
g_OverlayHwnd = hwnd;
|
||||||
|
|
||||||
|
::SetWindowPos(
|
||||||
|
hwnd,
|
||||||
|
HWND_TOPMOST,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
screen_width,
|
||||||
|
screen_height,
|
||||||
|
SWP_NOACTIVATE | SWP_SHOWWINDOW);
|
||||||
|
|
||||||
|
// Initialize Direct3D
|
||||||
|
if (!CreateDeviceD3D(hwnd))
|
||||||
|
{
|
||||||
|
CleanupDeviceD3D();
|
||||||
|
::UnregisterClassW(wc.lpszClassName, wc.hInstance);
|
||||||
|
|
||||||
|
if (g_ComInitialized)
|
||||||
|
CoUninitialize();
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupTransparentOverlayWindow(hwnd);
|
||||||
|
|
||||||
|
if (!LoadShieldTextureFromGlobalMemory())
|
||||||
|
{
|
||||||
|
CleanupDeviceD3D();
|
||||||
|
::DestroyWindow(hwnd);
|
||||||
|
::UnregisterClassW(wc.lpszClassName, wc.hInstance);
|
||||||
|
if (g_ComInitialized)
|
||||||
|
CoUninitialize();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pure black pixels become transparent. Global alpha is used for fade in/out
|
||||||
|
// to avoid blending image edges into the black backbuffer.
|
||||||
|
|
||||||
|
|
||||||
|
// Show the window
|
||||||
|
::ShowWindow(hwnd, SW_SHOW);
|
||||||
|
::UpdateWindow(hwnd);
|
||||||
|
|
||||||
|
// Setup Dear ImGui context
|
||||||
|
IMGUI_CHECKVERSION();
|
||||||
|
ImGui::CreateContext();
|
||||||
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
|
||||||
|
|
||||||
|
// Setup Dear ImGui style
|
||||||
|
ImGui::StyleColorsDark();
|
||||||
|
|
||||||
|
// Setup scaling
|
||||||
|
ImGuiStyle& style = ImGui::GetStyle();
|
||||||
|
style.ScaleAllSizes(main_scale);
|
||||||
|
style.FontScaleDpi = main_scale;
|
||||||
|
|
||||||
|
// Setup Platform/Renderer backends
|
||||||
|
ImGui_ImplWin32_Init(hwnd);
|
||||||
|
ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);
|
||||||
|
|
||||||
|
|
||||||
|
MessageDispatch();
|
||||||
|
|
||||||
|
//CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MessageDispatch, NULL, 0, NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto MessageDispatch() -> void
|
||||||
|
{
|
||||||
|
bool done = false;
|
||||||
|
while (!done)
|
||||||
|
{
|
||||||
|
MSG msg;
|
||||||
|
while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE))
|
||||||
|
{
|
||||||
|
::TranslateMessage(&msg);
|
||||||
|
::DispatchMessage(&msg);
|
||||||
|
if (msg.message == WM_QUIT)
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (done)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED)
|
||||||
|
{
|
||||||
|
::Sleep(10);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
g_SwapChainOccluded = false;
|
||||||
|
|
||||||
|
if (g_ResizeWidth != 0 && g_ResizeHeight != 0)
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0);
|
||||||
|
g_ResizeWidth = g_ResizeHeight = 0;
|
||||||
|
CreateRenderTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui_ImplDX11_NewFrame();
|
||||||
|
ImGui_ImplWin32_NewFrame();
|
||||||
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
if (DrawAceStyleLoader())
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::Render();
|
||||||
|
const float clear_color_with_alpha[4] = { 0.0f, 0.0f, 0.0f, 1.00f };
|
||||||
|
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr);
|
||||||
|
g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha);
|
||||||
|
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
|
||||||
|
HRESULT hr = g_pSwapChain->Present(1, 0);
|
||||||
|
g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED);
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanupShieldTexture();
|
||||||
|
ImGui_ImplDX11_Shutdown();
|
||||||
|
ImGui_ImplWin32_Shutdown();
|
||||||
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
|
CleanupDeviceD3D();
|
||||||
|
::DestroyWindow(g_OverlayHwnd);
|
||||||
|
::UnregisterClassW(wc.lpszClassName, wc.hInstance);
|
||||||
|
|
||||||
|
if (g_ComInitialized)
|
||||||
|
CoUninitialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
bool CreateDeviceD3D(HWND hWnd)
|
||||||
|
{
|
||||||
|
DXGI_SWAP_CHAIN_DESC sd;
|
||||||
|
ZeroMemory(&sd, sizeof(sd));
|
||||||
|
sd.BufferCount = 2;
|
||||||
|
sd.BufferDesc.Width = 0;
|
||||||
|
sd.BufferDesc.Height = 0;
|
||||||
|
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
sd.BufferDesc.RefreshRate.Numerator = 60;
|
||||||
|
sd.BufferDesc.RefreshRate.Denominator = 1;
|
||||||
|
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
||||||
|
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||||
|
sd.OutputWindow = hWnd;
|
||||||
|
sd.SampleDesc.Count = 1;
|
||||||
|
sd.SampleDesc.Quality = 0;
|
||||||
|
sd.Windowed = TRUE;
|
||||||
|
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
||||||
|
|
||||||
|
UINT createDeviceFlags = 0;
|
||||||
|
D3D_FEATURE_LEVEL featureLevel;
|
||||||
|
const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, };
|
||||||
|
HRESULT res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext);
|
||||||
|
if (res == DXGI_ERROR_UNSUPPORTED)
|
||||||
|
res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext);
|
||||||
|
if (res != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
CreateRenderTarget();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupDeviceD3D()
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; }
|
||||||
|
if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; }
|
||||||
|
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateRenderTarget()
|
||||||
|
{
|
||||||
|
ID3D11Texture2D* pBackBuffer;
|
||||||
|
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
||||||
|
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView);
|
||||||
|
pBackBuffer->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupRenderTarget()
|
||||||
|
{
|
||||||
|
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Win32 message handler
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_SIZE:
|
||||||
|
if (wParam == SIZE_MINIMIZED)
|
||||||
|
return 0;
|
||||||
|
g_ResizeWidth = (UINT)LOWORD(lParam);
|
||||||
|
g_ResizeHeight = (UINT)HIWORD(lParam);
|
||||||
|
return 0;
|
||||||
|
case WM_SYSCOMMAND:
|
||||||
|
if ((wParam & 0xfff0) == SC_KEYMENU)
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
::PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ::DefWindowProcW(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef GUI_H
|
||||||
|
#define GUI_H
|
||||||
|
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Gui
|
||||||
|
{
|
||||||
|
|
||||||
|
//´´˝¨ťćÖĆ´°żÚ
|
||||||
|
auto CreateGuiWindow()->BOOL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !GUI_H
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// DEAR IMGUI COMPILE-TIME OPTIONS
|
||||||
|
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
|
||||||
|
// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it)
|
||||||
|
// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp
|
||||||
|
// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures.
|
||||||
|
// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
|
||||||
|
// Call IMGUI_CHECKVERSION() from your .cpp file to verify that the data structures your files are using are matching the ones imgui.cpp is using.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//---- Define assertion handler. Defaults to calling assert().
|
||||||
|
// - If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
|
||||||
|
// - Compiling with NDEBUG will usually strip out assert() to nothing, which is NOT recommended because we use asserts to notify of programmer mistakes.
|
||||||
|
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
|
||||||
|
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
|
||||||
|
|
||||||
|
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
|
||||||
|
// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
|
||||||
|
// - Windows DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
|
||||||
|
// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
|
||||||
|
//#define IMGUI_API __declspec(dllexport) // MSVC Windows: DLL export
|
||||||
|
//#define IMGUI_API __declspec(dllimport) // MSVC Windows: DLL import
|
||||||
|
//#define IMGUI_API __attribute__((visibility("default"))) // GCC/Clang: override visibility when set is hidden
|
||||||
|
|
||||||
|
//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to clean your code of obsolete function/names.
|
||||||
|
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||||
|
|
||||||
|
//---- Disable all of Dear ImGui or don't implement standard windows/tools.
|
||||||
|
// It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp.
|
||||||
|
//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty.
|
||||||
|
//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty.
|
||||||
|
//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowIDStackToolWindow() will be empty.
|
||||||
|
|
||||||
|
//---- Don't implement some functions to reduce linkage requirements.
|
||||||
|
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a)
|
||||||
|
//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW)
|
||||||
|
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a)
|
||||||
|
//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, IME).
|
||||||
|
//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
|
||||||
|
//#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS // Don't implement default platform_io.Platform_OpenInShellFn() handler (Win32: ShellExecute(), require shell32.lib/.a, Mac/Linux: use system("")).
|
||||||
|
//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
|
||||||
|
//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
|
||||||
|
//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
|
||||||
|
//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
|
||||||
|
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
|
||||||
|
//#define IMGUI_DISABLE_DEFAULT_FONT // Disable default embedded fonts (ProggyClean/ProggyForever), remove ~9 KB + ~14 KB from output binary. AddFontDefaultXXX() functions will assert.
|
||||||
|
//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available
|
||||||
|
|
||||||
|
//---- Enable Test Engine / Automation features.
|
||||||
|
//#define IMGUI_ENABLE_TEST_ENGINE // Enable imgui_test_engine hooks. Generally set automatically by include "imgui_te_config.h", see Test Engine for details.
|
||||||
|
|
||||||
|
//---- Include imgui_user.h at the end of imgui.h as a convenience
|
||||||
|
// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included.
|
||||||
|
//#define IMGUI_INCLUDE_IMGUI_USER_H
|
||||||
|
//#define IMGUI_USER_H_FILENAME "my_folder/my_imgui_user.h"
|
||||||
|
|
||||||
|
//---- Pack vertex colors as BGRA8 instead of RGBA8 (to avoid converting from one to another). Need dedicated backend support.
|
||||||
|
//#define IMGUI_USE_BGRA_PACKED_COLOR
|
||||||
|
|
||||||
|
//---- Use legacy CRC32-adler tables (used before 1.91.6), in order to preserve old .ini data that you cannot afford to invalidate.
|
||||||
|
//#define IMGUI_USE_LEGACY_CRC32_ADLER
|
||||||
|
|
||||||
|
//---- Use 32-bit for ImWchar (default is 16-bit) to support Unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
|
||||||
|
//#define IMGUI_USE_WCHAR32
|
||||||
|
|
||||||
|
//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
|
||||||
|
// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files.
|
||||||
|
//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h"
|
||||||
|
//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h"
|
||||||
|
//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if IMGUI_USE_STB_SPRINTF is defined.
|
||||||
|
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
|
||||||
|
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
||||||
|
//#define IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION // only disabled if IMGUI_USE_STB_SPRINTF is defined.
|
||||||
|
|
||||||
|
//---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined)
|
||||||
|
// Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h.
|
||||||
|
//#define IMGUI_USE_STB_SPRINTF
|
||||||
|
|
||||||
|
//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui)
|
||||||
|
// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided).
|
||||||
|
// Note that imgui_freetype.cpp may be used _without_ this define, if you manually call ImFontAtlas::SetFontLoader(). The define is simply a convenience.
|
||||||
|
// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
|
||||||
|
//#define IMGUI_ENABLE_FREETYPE
|
||||||
|
|
||||||
|
//---- Use FreeType + plutosvg or lunasvg to render OpenType SVG fonts (SVGinOT)
|
||||||
|
// Only works in combination with IMGUI_ENABLE_FREETYPE.
|
||||||
|
// - plutosvg is currently easier to install, as e.g. it is part of vcpkg. It will support more fonts and may load them faster. See misc/freetype/README for instructions.
|
||||||
|
// - Both require headers to be available in the include path + program to be linked with the library code (not provided).
|
||||||
|
// - (note: lunasvg implementation is based on Freetype's rsvg-port.c which is licensed under CeCILL-C Free Software License Agreement)
|
||||||
|
//#define IMGUI_ENABLE_FREETYPE_PLUTOSVG
|
||||||
|
//#define IMGUI_ENABLE_FREETYPE_LUNASVG
|
||||||
|
|
||||||
|
//---- Use stb_truetype to build and rasterize the font atlas (default)
|
||||||
|
// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend.
|
||||||
|
//#define IMGUI_ENABLE_STB_TRUETYPE
|
||||||
|
|
||||||
|
//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
|
||||||
|
// This will be inlined as part of ImVec2 and ImVec4 class declarations.
|
||||||
|
/*
|
||||||
|
#define IM_VEC2_CLASS_EXTRA \
|
||||||
|
constexpr ImVec2(const MyVec2& f) : x(f.x), y(f.y) {} \
|
||||||
|
operator MyVec2() const { return MyVec2(x,y); }
|
||||||
|
|
||||||
|
#define IM_VEC4_CLASS_EXTRA \
|
||||||
|
constexpr ImVec4(const MyVec4& f) : x(f.x), y(f.y), z(f.z), w(f.w) {} \
|
||||||
|
operator MyVec4() const { return MyVec4(x,y,z,w); }
|
||||||
|
*/
|
||||||
|
//---- ...Or use Dear ImGui's own very basic math operators.
|
||||||
|
//#define IMGUI_DEFINE_MATH_OPERATORS
|
||||||
|
|
||||||
|
//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices.
|
||||||
|
// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices).
|
||||||
|
// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
|
||||||
|
// Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
|
||||||
|
//#define ImDrawIdx unsigned int
|
||||||
|
|
||||||
|
//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly)
|
||||||
|
//struct ImDrawList;
|
||||||
|
//struct ImDrawCmd;
|
||||||
|
//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data);
|
||||||
|
//#define ImDrawCallback MyImDrawCallback
|
||||||
|
|
||||||
|
//---- Debug Tools: Macro to break in Debugger (we provide a default implementation of this in the codebase)
|
||||||
|
// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.)
|
||||||
|
//#define IM_DEBUG_BREAK IM_ASSERT(0)
|
||||||
|
//#define IM_DEBUG_BREAK __debugbreak()
|
||||||
|
|
||||||
|
//---- Debug Tools: Enable highlight ID conflicts _before_ hovering items. When io.ConfigDebugHighlightIdConflicts is set.
|
||||||
|
// (THIS WILL SLOW DOWN DEAR IMGUI. Only use occasionally and disable after use)
|
||||||
|
//#define IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS
|
||||||
|
|
||||||
|
//---- Debug Tools: Enable slower asserts
|
||||||
|
//#define IMGUI_DEBUG_PARANOID
|
||||||
|
|
||||||
|
//---- Tip: You can add extra functions within the ImGui:: namespace from anywhere (e.g. your own sources/header files)
|
||||||
|
/*
|
||||||
|
namespace ImGui
|
||||||
|
{
|
||||||
|
void MyFunction(const char* name, MyMatrix44* mtx);
|
||||||
|
}
|
||||||
|
*/
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,685 @@
|
|||||||
|
// dear imgui: Renderer Backend for DirectX11
|
||||||
|
// This needs to be used along with a Platform Backend (e.g. Win32)
|
||||||
|
|
||||||
|
// Implemented features:
|
||||||
|
// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
|
||||||
|
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
|
||||||
|
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
|
||||||
|
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
|
||||||
|
|
||||||
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||||
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||||
|
// Learn about Dear ImGui:
|
||||||
|
// - FAQ https://dearimgui.com/faq
|
||||||
|
// - Getting Started https://dearimgui.com/getting-started
|
||||||
|
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
|
||||||
|
// - Introduction, links and more at the top of imgui.cpp
|
||||||
|
|
||||||
|
// CHANGELOG
|
||||||
|
// (minor and older changes stripped away, please see git history for details)
|
||||||
|
// 2026-01-19: DirectX11: Added 'SamplerNearest' in ImGui_ImplDX11_RenderState. Renamed 'SamplerDefault' to 'SamplerLinear'.
|
||||||
|
// 2025-09-18: Call platform_io.ClearRendererHandlers() on shutdown.
|
||||||
|
// 2025-06-11: DirectX11: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas.
|
||||||
|
// 2025-05-07: DirectX11: Honor draw_data->FramebufferScale to allow for custom backends and experiment using it (consistently with other renderer backends, even though in normal condition it is not set under Windows).
|
||||||
|
// 2025-01-06: DirectX11: Expose VertexConstantBuffer in ImGui_ImplDX11_RenderState. Reset projection matrix in ImDrawCallback_ResetRenderState handler.
|
||||||
|
// 2024-10-07: DirectX11: Changed default texture sampler to Clamp instead of Repeat/Wrap.
|
||||||
|
// 2024-10-07: DirectX11: Expose selected render state in ImGui_ImplDX11_RenderState, which you can access in 'void* platform_io.Renderer_RenderState' during draw callbacks.
|
||||||
|
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
|
||||||
|
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
|
||||||
|
// 2021-05-19: DirectX11: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
|
||||||
|
// 2021-02-18: DirectX11: Change blending equation to preserve alpha in output buffer.
|
||||||
|
// 2019-08-01: DirectX11: Fixed code querying the Geometry Shader state (would generally error with Debug layer enabled).
|
||||||
|
// 2019-07-21: DirectX11: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX11_RenderDrawData. Clearing Hull/Domain/Compute shaders without backup/restore.
|
||||||
|
// 2019-05-29: DirectX11: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
|
||||||
|
// 2019-04-30: DirectX11: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
|
||||||
|
// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
|
||||||
|
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
|
||||||
|
// 2018-08-01: DirectX11: Querying for IDXGIFactory instead of IDXGIFactory1 to increase compatibility.
|
||||||
|
// 2018-07-13: DirectX11: Fixed unreleased resources in Init and Shutdown functions.
|
||||||
|
// 2018-06-08: Misc: Extracted imgui_impl_dx11.cpp/.h away from the old combined DX11+Win32 example.
|
||||||
|
// 2018-06-08: DirectX11: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
|
||||||
|
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX11_RenderDrawData() in the .h file so you can call it yourself.
|
||||||
|
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
|
||||||
|
// 2016-05-07: DirectX11: Disabling depth-write.
|
||||||
|
|
||||||
|
#include "imgui.h"
|
||||||
|
#ifndef IMGUI_DISABLE
|
||||||
|
#include "imgui_impl_dx11.h"
|
||||||
|
|
||||||
|
// DirectX
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <d3d11.h>
|
||||||
|
#include <d3dcompiler.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Clang/GCC warnings with -Weverything
|
||||||
|
#if defined(__clang__)
|
||||||
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
|
||||||
|
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// DirectX11 data
|
||||||
|
struct ImGui_ImplDX11_Texture
|
||||||
|
{
|
||||||
|
ID3D11Texture2D* pTexture;
|
||||||
|
ID3D11ShaderResourceView* pTextureView;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ImGui_ImplDX11_Data
|
||||||
|
{
|
||||||
|
ID3D11Device* pd3dDevice;
|
||||||
|
ID3D11DeviceContext* pd3dDeviceContext;
|
||||||
|
IDXGIFactory* pFactory;
|
||||||
|
ID3D11Buffer* pVB;
|
||||||
|
ID3D11Buffer* pIB;
|
||||||
|
ID3D11VertexShader* pVertexShader;
|
||||||
|
ID3D11InputLayout* pInputLayout;
|
||||||
|
ID3D11Buffer* pVertexConstantBuffer;
|
||||||
|
ID3D11PixelShader* pPixelShader;
|
||||||
|
ID3D11SamplerState* pTexSamplerLinear;
|
||||||
|
ID3D11SamplerState* pTexSamplerNearest;
|
||||||
|
ID3D11RasterizerState* pRasterizerState;
|
||||||
|
ID3D11BlendState* pBlendState;
|
||||||
|
ID3D11DepthStencilState* pDepthStencilState;
|
||||||
|
int VertexBufferSize;
|
||||||
|
int IndexBufferSize;
|
||||||
|
|
||||||
|
ImGui_ImplDX11_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VERTEX_CONSTANT_BUFFER_DX11
|
||||||
|
{
|
||||||
|
float mvp[4][4];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
|
||||||
|
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
|
||||||
|
static ImGui_ImplDX11_Data* ImGui_ImplDX11_GetBackendData()
|
||||||
|
{
|
||||||
|
return ImGui::GetCurrentContext() ? (ImGui_ImplDX11_Data*)ImGui::GetIO().BackendRendererUserData : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Functions
|
||||||
|
static void ImGui_ImplDX11_SetupRenderState(const ImDrawData* draw_data, ID3D11DeviceContext* device_ctx)
|
||||||
|
{
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
|
||||||
|
// Setup viewport
|
||||||
|
D3D11_VIEWPORT vp = {};
|
||||||
|
vp.Width = draw_data->DisplaySize.x * draw_data->FramebufferScale.x;
|
||||||
|
vp.Height = draw_data->DisplaySize.y * draw_data->FramebufferScale.y;
|
||||||
|
vp.MinDepth = 0.0f;
|
||||||
|
vp.MaxDepth = 1.0f;
|
||||||
|
vp.TopLeftX = vp.TopLeftY = 0;
|
||||||
|
device_ctx->RSSetViewports(1, &vp);
|
||||||
|
|
||||||
|
// Setup orthographic projection matrix into our constant buffer
|
||||||
|
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mapped_resource;
|
||||||
|
if (device_ctx->Map(bd->pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) == S_OK)
|
||||||
|
{
|
||||||
|
VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mapped_resource.pData;
|
||||||
|
float L = draw_data->DisplayPos.x;
|
||||||
|
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
|
||||||
|
float T = draw_data->DisplayPos.y;
|
||||||
|
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
|
||||||
|
float mvp[4][4] =
|
||||||
|
{
|
||||||
|
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
||||||
|
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
||||||
|
{ 0.0f, 0.0f, 0.5f, 0.0f },
|
||||||
|
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
||||||
|
};
|
||||||
|
memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
|
||||||
|
device_ctx->Unmap(bd->pVertexConstantBuffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup shader and vertex buffers
|
||||||
|
unsigned int stride = sizeof(ImDrawVert);
|
||||||
|
unsigned int offset = 0;
|
||||||
|
device_ctx->IASetInputLayout(bd->pInputLayout);
|
||||||
|
device_ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset);
|
||||||
|
device_ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
|
||||||
|
device_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
|
device_ctx->VSSetShader(bd->pVertexShader, nullptr, 0);
|
||||||
|
device_ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer);
|
||||||
|
device_ctx->PSSetShader(bd->pPixelShader, nullptr, 0);
|
||||||
|
device_ctx->PSSetSamplers(0, 1, &bd->pTexSamplerLinear);
|
||||||
|
device_ctx->GSSetShader(nullptr, nullptr, 0);
|
||||||
|
device_ctx->HSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used..
|
||||||
|
device_ctx->DSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used..
|
||||||
|
device_ctx->CSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used..
|
||||||
|
|
||||||
|
// Setup render state
|
||||||
|
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
|
||||||
|
device_ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff);
|
||||||
|
device_ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0);
|
||||||
|
device_ctx->RSSetState(bd->pRasterizerState);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render function
|
||||||
|
void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data)
|
||||||
|
{
|
||||||
|
// Avoid rendering when minimized
|
||||||
|
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
ID3D11DeviceContext* device = bd->pd3dDeviceContext;
|
||||||
|
|
||||||
|
// Catch up with texture updates. Most of the times, the list will have 1 element with an OK status, aka nothing to do.
|
||||||
|
// (This almost always points to ImGui::GetPlatformIO().Textures[] but is part of ImDrawData to allow overriding or disabling texture updates).
|
||||||
|
if (draw_data->Textures != nullptr)
|
||||||
|
for (ImTextureData* tex : *draw_data->Textures)
|
||||||
|
if (tex->Status != ImTextureStatus_OK)
|
||||||
|
ImGui_ImplDX11_UpdateTexture(tex);
|
||||||
|
|
||||||
|
// Create and grow vertex/index buffers if needed
|
||||||
|
if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
|
||||||
|
{
|
||||||
|
if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; }
|
||||||
|
bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
|
||||||
|
D3D11_BUFFER_DESC desc = {};
|
||||||
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert);
|
||||||
|
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
||||||
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
desc.MiscFlags = 0;
|
||||||
|
if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVB) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
|
||||||
|
{
|
||||||
|
if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; }
|
||||||
|
bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
|
||||||
|
D3D11_BUFFER_DESC desc = {};
|
||||||
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx);
|
||||||
|
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||||
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pIB) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upload vertex/index data into a single contiguous GPU buffer
|
||||||
|
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
|
||||||
|
if (device->Map(bd->pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
|
||||||
|
return;
|
||||||
|
if (device->Map(bd->pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
|
||||||
|
return;
|
||||||
|
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
|
||||||
|
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
|
||||||
|
for (const ImDrawList* draw_list : draw_data->CmdLists)
|
||||||
|
{
|
||||||
|
memcpy(vtx_dst, draw_list->VtxBuffer.Data, draw_list->VtxBuffer.Size * sizeof(ImDrawVert));
|
||||||
|
memcpy(idx_dst, draw_list->IdxBuffer.Data, draw_list->IdxBuffer.Size * sizeof(ImDrawIdx));
|
||||||
|
vtx_dst += draw_list->VtxBuffer.Size;
|
||||||
|
idx_dst += draw_list->IdxBuffer.Size;
|
||||||
|
}
|
||||||
|
device->Unmap(bd->pVB, 0);
|
||||||
|
device->Unmap(bd->pIB, 0);
|
||||||
|
|
||||||
|
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
|
||||||
|
struct BACKUP_DX11_STATE
|
||||||
|
{
|
||||||
|
UINT ScissorRectsCount, ViewportsCount;
|
||||||
|
D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||||
|
D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||||
|
ID3D11RasterizerState* RS;
|
||||||
|
ID3D11BlendState* BlendState;
|
||||||
|
FLOAT BlendFactor[4];
|
||||||
|
UINT SampleMask;
|
||||||
|
UINT StencilRef;
|
||||||
|
ID3D11DepthStencilState* DepthStencilState;
|
||||||
|
ID3D11ShaderResourceView* PSShaderResource;
|
||||||
|
ID3D11SamplerState* PSSampler;
|
||||||
|
ID3D11PixelShader* PS;
|
||||||
|
ID3D11VertexShader* VS;
|
||||||
|
ID3D11GeometryShader* GS;
|
||||||
|
UINT PSInstancesCount, VSInstancesCount, GSInstancesCount;
|
||||||
|
ID3D11ClassInstance *PSInstances[256], *VSInstances[256], *GSInstances[256]; // 256 is max according to PSSetShader documentation
|
||||||
|
D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology;
|
||||||
|
ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
|
||||||
|
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
|
||||||
|
DXGI_FORMAT IndexBufferFormat;
|
||||||
|
ID3D11InputLayout* InputLayout;
|
||||||
|
};
|
||||||
|
BACKUP_DX11_STATE old = {};
|
||||||
|
old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
|
||||||
|
device->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
|
||||||
|
device->RSGetViewports(&old.ViewportsCount, old.Viewports);
|
||||||
|
device->RSGetState(&old.RS);
|
||||||
|
device->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
|
||||||
|
device->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);
|
||||||
|
device->PSGetShaderResources(0, 1, &old.PSShaderResource);
|
||||||
|
device->PSGetSamplers(0, 1, &old.PSSampler);
|
||||||
|
old.PSInstancesCount = old.VSInstancesCount = old.GSInstancesCount = 256;
|
||||||
|
device->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount);
|
||||||
|
device->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount);
|
||||||
|
device->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
|
||||||
|
device->GSGetShader(&old.GS, old.GSInstances, &old.GSInstancesCount);
|
||||||
|
|
||||||
|
device->IAGetPrimitiveTopology(&old.PrimitiveTopology);
|
||||||
|
device->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
|
||||||
|
device->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
|
||||||
|
device->IAGetInputLayout(&old.InputLayout);
|
||||||
|
|
||||||
|
// Setup desired DX state
|
||||||
|
ImGui_ImplDX11_SetupRenderState(draw_data, device);
|
||||||
|
|
||||||
|
// Setup render state structure (for callbacks and custom texture bindings)
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
ImGui_ImplDX11_RenderState render_state;
|
||||||
|
render_state.Device = bd->pd3dDevice;
|
||||||
|
render_state.DeviceContext = bd->pd3dDeviceContext;
|
||||||
|
render_state.SamplerLinear = bd->pTexSamplerLinear;
|
||||||
|
render_state.SamplerNearest = bd->pTexSamplerNearest;
|
||||||
|
render_state.VertexConstantBuffer = bd->pVertexConstantBuffer;
|
||||||
|
platform_io.Renderer_RenderState = &render_state;
|
||||||
|
|
||||||
|
// Render command lists
|
||||||
|
// (Because we merged all buffers into a single one, we maintain our own offset into them)
|
||||||
|
int global_idx_offset = 0;
|
||||||
|
int global_vtx_offset = 0;
|
||||||
|
ImVec2 clip_off = draw_data->DisplayPos;
|
||||||
|
ImVec2 clip_scale = draw_data->FramebufferScale;
|
||||||
|
for (const ImDrawList* draw_list : draw_data->CmdLists)
|
||||||
|
{
|
||||||
|
for (int cmd_i = 0; cmd_i < draw_list->CmdBuffer.Size; cmd_i++)
|
||||||
|
{
|
||||||
|
const ImDrawCmd* pcmd = &draw_list->CmdBuffer[cmd_i];
|
||||||
|
if (pcmd->UserCallback != nullptr)
|
||||||
|
{
|
||||||
|
// User callback, registered via ImDrawList::AddCallback()
|
||||||
|
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
|
||||||
|
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
|
||||||
|
ImGui_ImplDX11_SetupRenderState(draw_data, device);
|
||||||
|
else
|
||||||
|
pcmd->UserCallback(draw_list, pcmd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Project scissor/clipping rectangles into framebuffer space
|
||||||
|
ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
|
||||||
|
ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
|
||||||
|
if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Apply scissor/clipping rectangle
|
||||||
|
const D3D11_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y };
|
||||||
|
device->RSSetScissorRects(1, &r);
|
||||||
|
|
||||||
|
// Bind texture, Draw
|
||||||
|
ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID();
|
||||||
|
device->PSSetShaderResources(0, 1, &texture_srv);
|
||||||
|
device->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
global_idx_offset += draw_list->IdxBuffer.Size;
|
||||||
|
global_vtx_offset += draw_list->VtxBuffer.Size;
|
||||||
|
}
|
||||||
|
platform_io.Renderer_RenderState = nullptr;
|
||||||
|
|
||||||
|
// Restore modified DX state
|
||||||
|
device->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
|
||||||
|
device->RSSetViewports(old.ViewportsCount, old.Viewports);
|
||||||
|
device->RSSetState(old.RS); if (old.RS) old.RS->Release();
|
||||||
|
device->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
|
||||||
|
device->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();
|
||||||
|
device->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
|
||||||
|
device->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
|
||||||
|
device->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release();
|
||||||
|
for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release();
|
||||||
|
device->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release();
|
||||||
|
device->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
|
||||||
|
device->GSSetShader(old.GS, old.GSInstances, old.GSInstancesCount); if (old.GS) old.GS->Release();
|
||||||
|
for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release();
|
||||||
|
device->IASetPrimitiveTopology(old.PrimitiveTopology);
|
||||||
|
device->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
|
||||||
|
device->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
|
||||||
|
device->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplDX11_DestroyTexture(ImTextureData* tex)
|
||||||
|
{
|
||||||
|
if (ImGui_ImplDX11_Texture* backend_tex = (ImGui_ImplDX11_Texture*)tex->BackendUserData)
|
||||||
|
{
|
||||||
|
IM_ASSERT(backend_tex->pTextureView == (ID3D11ShaderResourceView*)(intptr_t)tex->TexID);
|
||||||
|
backend_tex->pTextureView->Release();
|
||||||
|
backend_tex->pTexture->Release();
|
||||||
|
IM_DELETE(backend_tex);
|
||||||
|
|
||||||
|
// Clear identifiers and mark as destroyed (in order to allow e.g. calling InvalidateDeviceObjects while running)
|
||||||
|
tex->SetTexID(ImTextureID_Invalid);
|
||||||
|
tex->BackendUserData = nullptr;
|
||||||
|
}
|
||||||
|
tex->SetStatus(ImTextureStatus_Destroyed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplDX11_UpdateTexture(ImTextureData* tex)
|
||||||
|
{
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
if (tex->Status == ImTextureStatus_WantCreate)
|
||||||
|
{
|
||||||
|
// Create and upload new texture to graphics system
|
||||||
|
//IMGUI_DEBUG_LOG("UpdateTexture #%03d: WantCreate %dx%d\n", tex->UniqueID, tex->Width, tex->Height);
|
||||||
|
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == nullptr);
|
||||||
|
IM_ASSERT(tex->Format == ImTextureFormat_RGBA32);
|
||||||
|
unsigned int* pixels = (unsigned int*)tex->GetPixels();
|
||||||
|
ImGui_ImplDX11_Texture* backend_tex = IM_NEW(ImGui_ImplDX11_Texture)();
|
||||||
|
|
||||||
|
// Create texture
|
||||||
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
|
desc.Width = (UINT)tex->Width;
|
||||||
|
desc.Height = (UINT)tex->Height;
|
||||||
|
desc.MipLevels = 1;
|
||||||
|
desc.ArraySize = 1;
|
||||||
|
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
desc.SampleDesc.Count = 1;
|
||||||
|
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
desc.CPUAccessFlags = 0;
|
||||||
|
D3D11_SUBRESOURCE_DATA subResource;
|
||||||
|
subResource.pSysMem = pixels;
|
||||||
|
subResource.SysMemPitch = desc.Width * 4;
|
||||||
|
subResource.SysMemSlicePitch = 0;
|
||||||
|
bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &backend_tex->pTexture);
|
||||||
|
IM_ASSERT(backend_tex->pTexture != nullptr && "Backend failed to create texture!");
|
||||||
|
|
||||||
|
// Create texture view
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||||
|
ZeroMemory(&srvDesc, sizeof(srvDesc));
|
||||||
|
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||||
|
srvDesc.Texture2D.MipLevels = desc.MipLevels;
|
||||||
|
srvDesc.Texture2D.MostDetailedMip = 0;
|
||||||
|
bd->pd3dDevice->CreateShaderResourceView(backend_tex->pTexture, &srvDesc, &backend_tex->pTextureView);
|
||||||
|
IM_ASSERT(backend_tex->pTextureView != nullptr && "Backend failed to create texture!");
|
||||||
|
|
||||||
|
// Store identifiers
|
||||||
|
tex->SetTexID((ImTextureID)(intptr_t)backend_tex->pTextureView);
|
||||||
|
tex->SetStatus(ImTextureStatus_OK);
|
||||||
|
tex->BackendUserData = backend_tex;
|
||||||
|
}
|
||||||
|
else if (tex->Status == ImTextureStatus_WantUpdates)
|
||||||
|
{
|
||||||
|
// Update selected blocks. We only ever write to textures regions which have never been used before!
|
||||||
|
// This backend choose to use tex->Updates[] but you can use tex->UpdateRect to upload a single region.
|
||||||
|
ImGui_ImplDX11_Texture* backend_tex = (ImGui_ImplDX11_Texture*)tex->BackendUserData;
|
||||||
|
IM_ASSERT(backend_tex->pTextureView == (ID3D11ShaderResourceView*)(intptr_t)tex->TexID);
|
||||||
|
for (ImTextureRect& r : tex->Updates)
|
||||||
|
{
|
||||||
|
D3D11_BOX box = { (UINT)r.x, (UINT)r.y, (UINT)0, (UINT)(r.x + r.w), (UINT)(r.y + r .h), (UINT)1 };
|
||||||
|
bd->pd3dDeviceContext->UpdateSubresource(backend_tex->pTexture, 0, &box, tex->GetPixelsAt(r.x, r.y), (UINT)tex->GetPitch(), 0);
|
||||||
|
}
|
||||||
|
tex->SetStatus(ImTextureStatus_OK);
|
||||||
|
}
|
||||||
|
if (tex->Status == ImTextureStatus_WantDestroy && tex->UnusedFrames > 0)
|
||||||
|
ImGui_ImplDX11_DestroyTexture(tex);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui_ImplDX11_CreateDeviceObjects()
|
||||||
|
{
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
if (!bd->pd3dDevice)
|
||||||
|
return false;
|
||||||
|
ImGui_ImplDX11_InvalidateDeviceObjects();
|
||||||
|
|
||||||
|
// By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
|
||||||
|
// If you would like to use this DX11 sample code but remove this dependency you can:
|
||||||
|
// 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
|
||||||
|
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
|
||||||
|
// See https://github.com/ocornut/imgui/pull/638 for sources and details.
|
||||||
|
|
||||||
|
// Create the vertex shader
|
||||||
|
{
|
||||||
|
static const char* vertexShader =
|
||||||
|
"cbuffer vertexBuffer : register(b0) \
|
||||||
|
{\
|
||||||
|
float4x4 ProjectionMatrix; \
|
||||||
|
};\
|
||||||
|
struct VS_INPUT\
|
||||||
|
{\
|
||||||
|
float2 pos : POSITION;\
|
||||||
|
float4 col : COLOR0;\
|
||||||
|
float2 uv : TEXCOORD0;\
|
||||||
|
};\
|
||||||
|
\
|
||||||
|
struct PS_INPUT\
|
||||||
|
{\
|
||||||
|
float4 pos : SV_POSITION;\
|
||||||
|
float4 col : COLOR0;\
|
||||||
|
float2 uv : TEXCOORD0;\
|
||||||
|
};\
|
||||||
|
\
|
||||||
|
PS_INPUT main(VS_INPUT input)\
|
||||||
|
{\
|
||||||
|
PS_INPUT output;\
|
||||||
|
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
|
||||||
|
output.col = input.col;\
|
||||||
|
output.uv = input.uv;\
|
||||||
|
return output;\
|
||||||
|
}";
|
||||||
|
|
||||||
|
ID3DBlob* vertexShaderBlob;
|
||||||
|
if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), nullptr, nullptr, nullptr, "main", "vs_4_0", 0, 0, &vertexShaderBlob, nullptr)))
|
||||||
|
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
|
||||||
|
if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), nullptr, &bd->pVertexShader) != S_OK)
|
||||||
|
{
|
||||||
|
vertexShaderBlob->Release();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the input layout
|
||||||
|
D3D11_INPUT_ELEMENT_DESC local_layout[] =
|
||||||
|
{
|
||||||
|
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)offsetof(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
|
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)offsetof(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
|
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)offsetof(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
|
};
|
||||||
|
if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK)
|
||||||
|
{
|
||||||
|
vertexShaderBlob->Release();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
vertexShaderBlob->Release();
|
||||||
|
|
||||||
|
// Create the constant buffer
|
||||||
|
{
|
||||||
|
D3D11_BUFFER_DESC desc = {};
|
||||||
|
desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11);
|
||||||
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
|
||||||
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
desc.MiscFlags = 0;
|
||||||
|
bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVertexConstantBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the pixel shader
|
||||||
|
{
|
||||||
|
static const char* pixelShader =
|
||||||
|
"struct PS_INPUT\
|
||||||
|
{\
|
||||||
|
float4 pos : SV_POSITION;\
|
||||||
|
float4 col : COLOR0;\
|
||||||
|
float2 uv : TEXCOORD0;\
|
||||||
|
};\
|
||||||
|
sampler sampler0;\
|
||||||
|
Texture2D texture0;\
|
||||||
|
\
|
||||||
|
float4 main(PS_INPUT input) : SV_Target\
|
||||||
|
{\
|
||||||
|
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
|
||||||
|
return out_col; \
|
||||||
|
}";
|
||||||
|
|
||||||
|
ID3DBlob* pixelShaderBlob;
|
||||||
|
if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), nullptr, nullptr, nullptr, "main", "ps_4_0", 0, 0, &pixelShaderBlob, nullptr)))
|
||||||
|
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
|
||||||
|
if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), nullptr, &bd->pPixelShader) != S_OK)
|
||||||
|
{
|
||||||
|
pixelShaderBlob->Release();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pixelShaderBlob->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the blending setup
|
||||||
|
{
|
||||||
|
D3D11_BLEND_DESC desc;
|
||||||
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
|
desc.AlphaToCoverageEnable = false;
|
||||||
|
desc.RenderTarget[0].BlendEnable = true;
|
||||||
|
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
|
||||||
|
desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
|
||||||
|
desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
|
||||||
|
desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
|
||||||
|
desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
|
||||||
|
desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
|
||||||
|
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
|
||||||
|
bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the rasterizer state
|
||||||
|
{
|
||||||
|
D3D11_RASTERIZER_DESC desc;
|
||||||
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
|
desc.FillMode = D3D11_FILL_SOLID;
|
||||||
|
desc.CullMode = D3D11_CULL_NONE;
|
||||||
|
desc.ScissorEnable = true;
|
||||||
|
desc.DepthClipEnable = true;
|
||||||
|
bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create depth-stencil State
|
||||||
|
{
|
||||||
|
D3D11_DEPTH_STENCIL_DESC desc;
|
||||||
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
|
desc.DepthEnable = false;
|
||||||
|
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
|
||||||
|
desc.DepthFunc = D3D11_COMPARISON_ALWAYS;
|
||||||
|
desc.StencilEnable = false;
|
||||||
|
desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
|
||||||
|
desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
|
||||||
|
desc.BackFace = desc.FrontFace;
|
||||||
|
bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create texture sampler
|
||||||
|
// (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
|
||||||
|
{
|
||||||
|
D3D11_SAMPLER_DESC desc;
|
||||||
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
|
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||||
|
desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||||
|
desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||||
|
desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||||
|
desc.MipLODBias = 0.f;
|
||||||
|
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
|
||||||
|
desc.MinLOD = 0.f;
|
||||||
|
desc.MaxLOD = 0.f;
|
||||||
|
bd->pd3dDevice->CreateSamplerState(&desc, &bd->pTexSamplerLinear);
|
||||||
|
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
|
||||||
|
bd->pd3dDevice->CreateSamplerState(&desc, &bd->pTexSamplerNearest);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplDX11_InvalidateDeviceObjects()
|
||||||
|
{
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
if (!bd->pd3dDevice)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Destroy all textures
|
||||||
|
for (ImTextureData* tex : ImGui::GetPlatformIO().Textures)
|
||||||
|
if (tex->RefCount == 1)
|
||||||
|
ImGui_ImplDX11_DestroyTexture(tex);
|
||||||
|
|
||||||
|
if (bd->pTexSamplerLinear) { bd->pTexSamplerLinear->Release(); bd->pTexSamplerLinear = nullptr; }
|
||||||
|
if (bd->pTexSamplerNearest) { bd->pTexSamplerNearest->Release(); bd->pTexSamplerNearest = nullptr; }
|
||||||
|
if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; }
|
||||||
|
if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; }
|
||||||
|
if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = nullptr; }
|
||||||
|
if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = nullptr; }
|
||||||
|
if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = nullptr; }
|
||||||
|
if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = nullptr; }
|
||||||
|
if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = nullptr; }
|
||||||
|
if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = nullptr; }
|
||||||
|
if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = nullptr; }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context)
|
||||||
|
{
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
IMGUI_CHECKVERSION();
|
||||||
|
IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
|
||||||
|
|
||||||
|
// Setup backend capabilities flags
|
||||||
|
ImGui_ImplDX11_Data* bd = IM_NEW(ImGui_ImplDX11_Data)();
|
||||||
|
io.BackendRendererUserData = (void*)bd;
|
||||||
|
io.BackendRendererName = "imgui_impl_dx11";
|
||||||
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
||||||
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
|
||||||
|
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
|
||||||
|
|
||||||
|
// Get factory from device
|
||||||
|
IDXGIDevice* pDXGIDevice = nullptr;
|
||||||
|
IDXGIAdapter* pDXGIAdapter = nullptr;
|
||||||
|
IDXGIFactory* pFactory = nullptr;
|
||||||
|
|
||||||
|
if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK)
|
||||||
|
if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK)
|
||||||
|
if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK)
|
||||||
|
{
|
||||||
|
bd->pd3dDevice = device;
|
||||||
|
bd->pd3dDeviceContext = device_context;
|
||||||
|
bd->pFactory = pFactory;
|
||||||
|
}
|
||||||
|
if (pDXGIDevice) pDXGIDevice->Release();
|
||||||
|
if (pDXGIAdapter) pDXGIAdapter->Release();
|
||||||
|
bd->pd3dDevice->AddRef();
|
||||||
|
bd->pd3dDeviceContext->AddRef();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplDX11_Shutdown()
|
||||||
|
{
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?");
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
|
||||||
|
ImGui_ImplDX11_InvalidateDeviceObjects();
|
||||||
|
if (bd->pFactory) { bd->pFactory->Release(); }
|
||||||
|
if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
|
||||||
|
if (bd->pd3dDeviceContext) { bd->pd3dDeviceContext->Release(); }
|
||||||
|
|
||||||
|
io.BackendRendererName = nullptr;
|
||||||
|
io.BackendRendererUserData = nullptr;
|
||||||
|
io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures);
|
||||||
|
platform_io.ClearRendererHandlers();
|
||||||
|
IM_DELETE(bd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplDX11_NewFrame()
|
||||||
|
{
|
||||||
|
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
|
||||||
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX11_Init()?");
|
||||||
|
|
||||||
|
if (!bd->pVertexShader)
|
||||||
|
if (!ImGui_ImplDX11_CreateDeviceObjects())
|
||||||
|
IM_ASSERT(0 && "ImGui_ImplDX11_CreateDeviceObjects() failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#endif // #ifndef IMGUI_DISABLE
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
// dear imgui: Renderer Backend for DirectX11
|
||||||
|
// This needs to be used along with a Platform Backend (e.g. Win32)
|
||||||
|
|
||||||
|
// Implemented features:
|
||||||
|
// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
|
||||||
|
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
|
||||||
|
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
|
||||||
|
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
|
||||||
|
|
||||||
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||||
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||||
|
// Learn about Dear ImGui:
|
||||||
|
// - FAQ https://dearimgui.com/faq
|
||||||
|
// - Getting Started https://dearimgui.com/getting-started
|
||||||
|
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
|
||||||
|
// - Introduction, links and more at the top of imgui.cpp
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "imgui.h" // IMGUI_IMPL_API
|
||||||
|
#ifndef IMGUI_DISABLE
|
||||||
|
|
||||||
|
struct ID3D11Device;
|
||||||
|
struct ID3D11DeviceContext;
|
||||||
|
struct ID3D11SamplerState;
|
||||||
|
struct ID3D11Buffer;
|
||||||
|
|
||||||
|
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
|
||||||
|
IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context);
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data);
|
||||||
|
|
||||||
|
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||||
|
IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects();
|
||||||
|
|
||||||
|
// (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = nullptr to handle this manually.
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplDX11_UpdateTexture(ImTextureData* tex);
|
||||||
|
|
||||||
|
// [BETA] Selected render state data shared with callbacks.
|
||||||
|
// This is temporarily stored in GetPlatformIO().Renderer_RenderState during the ImGui_ImplDX11_RenderDrawData() call.
|
||||||
|
// (Please open an issue if you feel you need access to more data)
|
||||||
|
struct ImGui_ImplDX11_RenderState
|
||||||
|
{
|
||||||
|
ID3D11Device* Device;
|
||||||
|
ID3D11DeviceContext* DeviceContext;
|
||||||
|
ID3D11SamplerState* SamplerLinear;
|
||||||
|
ID3D11SamplerState* SamplerNearest;
|
||||||
|
ID3D11Buffer* VertexConstantBuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef IMGUI_DISABLE
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,53 @@
|
|||||||
|
// dear imgui: Platform Backend for Windows (standard windows API for 32-bits AND 64-bits applications)
|
||||||
|
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
|
||||||
|
|
||||||
|
// Implemented features:
|
||||||
|
// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
|
||||||
|
// [X] Platform: Mouse support. Can discriminate Mouse/TouchScreen/Pen.
|
||||||
|
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values are obsolete since 1.87 and not supported since 1.91.5]
|
||||||
|
// [X] Platform: Gamepad support.
|
||||||
|
// [X] Platform: Mouse cursor shape and visibility (ImGuiBackendFlags_HasMouseCursors). Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
||||||
|
|
||||||
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||||
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||||
|
// Learn about Dear ImGui:
|
||||||
|
// - FAQ https://dearimgui.com/faq
|
||||||
|
// - Getting Started https://dearimgui.com/getting-started
|
||||||
|
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
|
||||||
|
// - Introduction, links and more at the top of imgui.cpp
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "imgui.h" // IMGUI_IMPL_API
|
||||||
|
#ifndef IMGUI_DISABLE
|
||||||
|
|
||||||
|
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
|
||||||
|
IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd);
|
||||||
|
IMGUI_IMPL_API bool ImGui_ImplWin32_InitForOpenGL(void* hwnd);
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplWin32_Shutdown();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame();
|
||||||
|
|
||||||
|
// Win32 message handler your application needs to call.
|
||||||
|
// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on <windows.h> from this helper.
|
||||||
|
// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it.
|
||||||
|
// - Call from your application's message handler. Keep calling your message handler unless this function returns TRUE.
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// DPI-related helpers (optional)
|
||||||
|
// - Use to enable DPI awareness without having to create an application manifest.
|
||||||
|
// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps.
|
||||||
|
// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc.
|
||||||
|
// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime,
|
||||||
|
// neither of which we want to require the user to have. So we dynamically select and load those functions to avoid dependencies.
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplWin32_EnableDpiAwareness();
|
||||||
|
IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd); // HWND hwnd
|
||||||
|
IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); // HMONITOR monitor
|
||||||
|
|
||||||
|
// Transparency related helpers (optional) [experimental]
|
||||||
|
// - Use to enable alpha compositing transparency with the desktop.
|
||||||
|
// - Use together with e.g. clearing your framebuffer with zero-alpha.
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd
|
||||||
|
|
||||||
|
#endif // #ifndef IMGUI_DISABLE
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,627 @@
|
|||||||
|
// [DEAR IMGUI]
|
||||||
|
// This is a slightly modified version of stb_rect_pack.h 1.01.
|
||||||
|
// Grep for [DEAR IMGUI] to find the changes.
|
||||||
|
//
|
||||||
|
// stb_rect_pack.h - v1.01 - public domain - rectangle packing
|
||||||
|
// Sean Barrett 2014
|
||||||
|
//
|
||||||
|
// Useful for e.g. packing rectangular textures into an atlas.
|
||||||
|
// Does not do rotation.
|
||||||
|
//
|
||||||
|
// Before #including,
|
||||||
|
//
|
||||||
|
// #define STB_RECT_PACK_IMPLEMENTATION
|
||||||
|
//
|
||||||
|
// in the file that you want to have the implementation.
|
||||||
|
//
|
||||||
|
// Not necessarily the awesomest packing method, but better than
|
||||||
|
// the totally naive one in stb_truetype (which is primarily what
|
||||||
|
// this is meant to replace).
|
||||||
|
//
|
||||||
|
// Has only had a few tests run, may have issues.
|
||||||
|
//
|
||||||
|
// More docs to come.
|
||||||
|
//
|
||||||
|
// No memory allocations; uses qsort() and assert() from stdlib.
|
||||||
|
// Can override those by defining STBRP_SORT and STBRP_ASSERT.
|
||||||
|
//
|
||||||
|
// This library currently uses the Skyline Bottom-Left algorithm.
|
||||||
|
//
|
||||||
|
// Please note: better rectangle packers are welcome! Please
|
||||||
|
// implement them to the same API, but with a different init
|
||||||
|
// function.
|
||||||
|
//
|
||||||
|
// Credits
|
||||||
|
//
|
||||||
|
// Library
|
||||||
|
// Sean Barrett
|
||||||
|
// Minor features
|
||||||
|
// Martins Mozeiko
|
||||||
|
// github:IntellectualKitty
|
||||||
|
//
|
||||||
|
// Bugfixes / warning fixes
|
||||||
|
// Jeremy Jaussaud
|
||||||
|
// Fabian Giesen
|
||||||
|
//
|
||||||
|
// Version history:
|
||||||
|
//
|
||||||
|
// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section
|
||||||
|
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
|
||||||
|
// 0.99 (2019-02-07) warning fixes
|
||||||
|
// 0.11 (2017-03-03) return packing success/fail result
|
||||||
|
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
|
||||||
|
// 0.09 (2016-08-27) fix compiler warnings
|
||||||
|
// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
|
||||||
|
// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0)
|
||||||
|
// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort
|
||||||
|
// 0.05: added STBRP_ASSERT to allow replacing assert
|
||||||
|
// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
|
||||||
|
// 0.01: initial release
|
||||||
|
//
|
||||||
|
// LICENSE
|
||||||
|
//
|
||||||
|
// See end of file for license information.
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INCLUDE SECTION
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef STB_INCLUDE_STB_RECT_PACK_H
|
||||||
|
#define STB_INCLUDE_STB_RECT_PACK_H
|
||||||
|
|
||||||
|
#define STB_RECT_PACK_VERSION 1
|
||||||
|
|
||||||
|
#ifdef STBRP_STATIC
|
||||||
|
#define STBRP_DEF static
|
||||||
|
#else
|
||||||
|
#define STBRP_DEF extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct stbrp_context stbrp_context;
|
||||||
|
typedef struct stbrp_node stbrp_node;
|
||||||
|
typedef struct stbrp_rect stbrp_rect;
|
||||||
|
|
||||||
|
typedef int stbrp_coord;
|
||||||
|
|
||||||
|
#define STBRP__MAXVAL 0x7fffffff
|
||||||
|
// Mostly for internal use, but this is the maximum supported coordinate value.
|
||||||
|
|
||||||
|
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
|
||||||
|
// Assign packed locations to rectangles. The rectangles are of type
|
||||||
|
// 'stbrp_rect' defined below, stored in the array 'rects', and there
|
||||||
|
// are 'num_rects' many of them.
|
||||||
|
//
|
||||||
|
// Rectangles which are successfully packed have the 'was_packed' flag
|
||||||
|
// set to a non-zero value and 'x' and 'y' store the minimum location
|
||||||
|
// on each axis (i.e. bottom-left in cartesian coordinates, top-left
|
||||||
|
// if you imagine y increasing downwards). Rectangles which do not fit
|
||||||
|
// have the 'was_packed' flag set to 0.
|
||||||
|
//
|
||||||
|
// You should not try to access the 'rects' array from another thread
|
||||||
|
// while this function is running, as the function temporarily reorders
|
||||||
|
// the array while it executes.
|
||||||
|
//
|
||||||
|
// To pack into another rectangle, you need to call stbrp_init_target
|
||||||
|
// again. To continue packing into the same rectangle, you can call
|
||||||
|
// this function again. Calling this multiple times with multiple rect
|
||||||
|
// arrays will probably produce worse packing results than calling it
|
||||||
|
// a single time with the full rectangle array, but the option is
|
||||||
|
// available.
|
||||||
|
//
|
||||||
|
// The function returns 1 if all of the rectangles were successfully
|
||||||
|
// packed and 0 otherwise.
|
||||||
|
|
||||||
|
struct stbrp_rect
|
||||||
|
{
|
||||||
|
// reserved for your use:
|
||||||
|
int id;
|
||||||
|
|
||||||
|
// input:
|
||||||
|
stbrp_coord w, h;
|
||||||
|
|
||||||
|
// output:
|
||||||
|
stbrp_coord x, y;
|
||||||
|
int was_packed; // non-zero if valid packing
|
||||||
|
|
||||||
|
}; // 16 bytes, nominally
|
||||||
|
|
||||||
|
|
||||||
|
STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);
|
||||||
|
// Initialize a rectangle packer to:
|
||||||
|
// pack a rectangle that is 'width' by 'height' in dimensions
|
||||||
|
// using temporary storage provided by the array 'nodes', which is 'num_nodes' long
|
||||||
|
//
|
||||||
|
// You must call this function every time you start packing into a new target.
|
||||||
|
//
|
||||||
|
// There is no "shutdown" function. The 'nodes' memory must stay valid for
|
||||||
|
// the following stbrp_pack_rects() call (or calls), but can be freed after
|
||||||
|
// the call (or calls) finish.
|
||||||
|
//
|
||||||
|
// Note: to guarantee best results, either:
|
||||||
|
// 1. make sure 'num_nodes' >= 'width'
|
||||||
|
// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1'
|
||||||
|
//
|
||||||
|
// If you don't do either of the above things, widths will be quantized to multiples
|
||||||
|
// of small integers to guarantee the algorithm doesn't run out of temporary storage.
|
||||||
|
//
|
||||||
|
// If you do #2, then the non-quantized algorithm will be used, but the algorithm
|
||||||
|
// may run out of temporary storage and be unable to pack some rectangles.
|
||||||
|
|
||||||
|
STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem);
|
||||||
|
// Optionally call this function after init but before doing any packing to
|
||||||
|
// change the handling of the out-of-temp-memory scenario, described above.
|
||||||
|
// If you call init again, this will be reset to the default (false).
|
||||||
|
|
||||||
|
|
||||||
|
STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic);
|
||||||
|
// Optionally select which packing heuristic the library should use. Different
|
||||||
|
// heuristics will produce better/worse results for different data sets.
|
||||||
|
// If you call init again, this will be reset to the default.
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
STBRP_HEURISTIC_Skyline_default=0,
|
||||||
|
STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,
|
||||||
|
STBRP_HEURISTIC_Skyline_BF_sortHeight
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// the details of the following structures don't matter to you, but they must
|
||||||
|
// be visible so you can handle the memory allocations for them
|
||||||
|
|
||||||
|
struct stbrp_node
|
||||||
|
{
|
||||||
|
stbrp_coord x,y;
|
||||||
|
stbrp_node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stbrp_context
|
||||||
|
{
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int align;
|
||||||
|
int init_mode;
|
||||||
|
int heuristic;
|
||||||
|
int num_nodes;
|
||||||
|
stbrp_node *active_head;
|
||||||
|
stbrp_node *free_head;
|
||||||
|
stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPLEMENTATION SECTION
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef STB_RECT_PACK_IMPLEMENTATION
|
||||||
|
#ifndef STBRP_SORT
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define STBRP_SORT qsort
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBRP_ASSERT
|
||||||
|
#include <assert.h>
|
||||||
|
#define STBRP_ASSERT assert
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define STBRP__NOTUSED(v) (void)(v)
|
||||||
|
#define STBRP__CDECL __cdecl
|
||||||
|
#else
|
||||||
|
#define STBRP__NOTUSED(v) (void)sizeof(v)
|
||||||
|
#define STBRP__CDECL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
STBRP__INIT_skyline = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
|
||||||
|
{
|
||||||
|
switch (context->init_mode) {
|
||||||
|
case STBRP__INIT_skyline:
|
||||||
|
STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
|
||||||
|
context->heuristic = heuristic;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
STBRP_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)
|
||||||
|
{
|
||||||
|
if (allow_out_of_mem)
|
||||||
|
// if it's ok to run out of memory, then don't bother aligning them;
|
||||||
|
// this gives better packing, but may fail due to OOM (even though
|
||||||
|
// the rectangles easily fit). @TODO a smarter approach would be to only
|
||||||
|
// quantize once we've hit OOM, then we could get rid of this parameter.
|
||||||
|
context->align = 1;
|
||||||
|
else {
|
||||||
|
// if it's not ok to run out of memory, then quantize the widths
|
||||||
|
// so that num_nodes is always enough nodes.
|
||||||
|
//
|
||||||
|
// I.e. num_nodes * align >= width
|
||||||
|
// align >= width / num_nodes
|
||||||
|
// align = ceil(width/num_nodes)
|
||||||
|
|
||||||
|
context->align = (context->width + context->num_nodes-1) / context->num_nodes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i < num_nodes-1; ++i)
|
||||||
|
nodes[i].next = &nodes[i+1];
|
||||||
|
nodes[i].next = NULL;
|
||||||
|
context->init_mode = STBRP__INIT_skyline;
|
||||||
|
context->heuristic = STBRP_HEURISTIC_Skyline_default;
|
||||||
|
context->free_head = &nodes[0];
|
||||||
|
context->active_head = &context->extra[0];
|
||||||
|
context->width = width;
|
||||||
|
context->height = height;
|
||||||
|
context->num_nodes = num_nodes;
|
||||||
|
stbrp_setup_allow_out_of_mem(context, 0);
|
||||||
|
|
||||||
|
// node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)
|
||||||
|
context->extra[0].x = 0;
|
||||||
|
context->extra[0].y = 0;
|
||||||
|
context->extra[0].next = &context->extra[1];
|
||||||
|
context->extra[1].x = (stbrp_coord) width;
|
||||||
|
context->extra[1].y = (1<<30);
|
||||||
|
context->extra[1].next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find minimum y position if it starts at x1
|
||||||
|
static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)
|
||||||
|
{
|
||||||
|
stbrp_node *node = first;
|
||||||
|
int x1 = x0 + width;
|
||||||
|
int min_y, visited_width, waste_area;
|
||||||
|
|
||||||
|
STBRP__NOTUSED(c);
|
||||||
|
|
||||||
|
STBRP_ASSERT(first->x <= x0);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// skip in case we're past the node
|
||||||
|
while (node->next->x <= x0)
|
||||||
|
++node;
|
||||||
|
#else
|
||||||
|
STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
|
||||||
|
#endif
|
||||||
|
|
||||||
|
STBRP_ASSERT(node->x <= x0);
|
||||||
|
|
||||||
|
min_y = 0;
|
||||||
|
waste_area = 0;
|
||||||
|
visited_width = 0;
|
||||||
|
while (node->x < x1) {
|
||||||
|
if (node->y > min_y) {
|
||||||
|
// raise min_y higher.
|
||||||
|
// we've accounted for all waste up to min_y,
|
||||||
|
// but we'll now add more waste for everything we've visited
|
||||||
|
waste_area += visited_width * (node->y - min_y);
|
||||||
|
min_y = node->y;
|
||||||
|
// the first time through, visited_width might be reduced
|
||||||
|
if (node->x < x0)
|
||||||
|
visited_width += node->next->x - x0;
|
||||||
|
else
|
||||||
|
visited_width += node->next->x - node->x;
|
||||||
|
} else {
|
||||||
|
// add waste area
|
||||||
|
int under_width = node->next->x - node->x;
|
||||||
|
if (under_width + visited_width > width)
|
||||||
|
under_width = width - visited_width;
|
||||||
|
waste_area += under_width * (min_y - node->y);
|
||||||
|
visited_width += under_width;
|
||||||
|
}
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pwaste = waste_area;
|
||||||
|
return min_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
stbrp_node **prev_link;
|
||||||
|
} stbrp__findresult;
|
||||||
|
|
||||||
|
static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)
|
||||||
|
{
|
||||||
|
int best_waste = (1<<30), best_x, best_y = (1 << 30);
|
||||||
|
stbrp__findresult fr;
|
||||||
|
stbrp_node **prev, *node, *tail, **best = NULL;
|
||||||
|
|
||||||
|
// align to multiple of c->align
|
||||||
|
width = (width + c->align - 1);
|
||||||
|
width -= width % c->align;
|
||||||
|
STBRP_ASSERT(width % c->align == 0);
|
||||||
|
|
||||||
|
// if it can't possibly fit, bail immediately
|
||||||
|
if (width > c->width || height > c->height) {
|
||||||
|
fr.prev_link = NULL;
|
||||||
|
fr.x = fr.y = 0;
|
||||||
|
return fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = c->active_head;
|
||||||
|
prev = &c->active_head;
|
||||||
|
while (node->x + width <= c->width) {
|
||||||
|
int y,waste;
|
||||||
|
y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
|
||||||
|
if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL
|
||||||
|
// bottom left
|
||||||
|
if (y < best_y) {
|
||||||
|
best_y = y;
|
||||||
|
best = prev;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// best-fit
|
||||||
|
if (y + height <= c->height) {
|
||||||
|
// can only use it if it first vertically
|
||||||
|
if (y < best_y || (y == best_y && waste < best_waste)) {
|
||||||
|
best_y = y;
|
||||||
|
best_waste = waste;
|
||||||
|
best = prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prev = &node->next;
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
best_x = (best == NULL) ? 0 : (*best)->x;
|
||||||
|
|
||||||
|
// if doing best-fit (BF), we also have to try aligning right edge to each node position
|
||||||
|
//
|
||||||
|
// e.g, if fitting
|
||||||
|
//
|
||||||
|
// ____________________
|
||||||
|
// |____________________|
|
||||||
|
//
|
||||||
|
// into
|
||||||
|
//
|
||||||
|
// | |
|
||||||
|
// | ____________|
|
||||||
|
// |____________|
|
||||||
|
//
|
||||||
|
// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
|
||||||
|
//
|
||||||
|
// This makes BF take about 2x the time
|
||||||
|
|
||||||
|
if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {
|
||||||
|
tail = c->active_head;
|
||||||
|
node = c->active_head;
|
||||||
|
prev = &c->active_head;
|
||||||
|
// find first node that's admissible
|
||||||
|
while (tail->x < width)
|
||||||
|
tail = tail->next;
|
||||||
|
while (tail) {
|
||||||
|
int xpos = tail->x - width;
|
||||||
|
int y,waste;
|
||||||
|
STBRP_ASSERT(xpos >= 0);
|
||||||
|
// find the left position that matches this
|
||||||
|
while (node->next->x <= xpos) {
|
||||||
|
prev = &node->next;
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
|
||||||
|
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
|
||||||
|
if (y + height <= c->height) {
|
||||||
|
if (y <= best_y) {
|
||||||
|
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
|
||||||
|
best_x = xpos;
|
||||||
|
//STBRP_ASSERT(y <= best_y); [DEAR IMGUI]
|
||||||
|
best_y = y;
|
||||||
|
best_waste = waste;
|
||||||
|
best = prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tail = tail->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fr.prev_link = best;
|
||||||
|
fr.x = best_x;
|
||||||
|
fr.y = best_y;
|
||||||
|
return fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)
|
||||||
|
{
|
||||||
|
// find best position according to heuristic
|
||||||
|
stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);
|
||||||
|
stbrp_node *node, *cur;
|
||||||
|
|
||||||
|
// bail if:
|
||||||
|
// 1. it failed
|
||||||
|
// 2. the best node doesn't fit (we don't always check this)
|
||||||
|
// 3. we're out of memory
|
||||||
|
if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {
|
||||||
|
res.prev_link = NULL;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// on success, create new node
|
||||||
|
node = context->free_head;
|
||||||
|
node->x = (stbrp_coord) res.x;
|
||||||
|
node->y = (stbrp_coord) (res.y + height);
|
||||||
|
|
||||||
|
context->free_head = node->next;
|
||||||
|
|
||||||
|
// insert the new node into the right starting point, and
|
||||||
|
// let 'cur' point to the remaining nodes needing to be
|
||||||
|
// stitched back in
|
||||||
|
|
||||||
|
cur = *res.prev_link;
|
||||||
|
if (cur->x < res.x) {
|
||||||
|
// preserve the existing one, so start testing with the next one
|
||||||
|
stbrp_node *next = cur->next;
|
||||||
|
cur->next = node;
|
||||||
|
cur = next;
|
||||||
|
} else {
|
||||||
|
*res.prev_link = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// from here, traverse cur and free the nodes, until we get to one
|
||||||
|
// that shouldn't be freed
|
||||||
|
while (cur->next && cur->next->x <= res.x + width) {
|
||||||
|
stbrp_node *next = cur->next;
|
||||||
|
// move the current node to the free list
|
||||||
|
cur->next = context->free_head;
|
||||||
|
context->free_head = cur;
|
||||||
|
cur = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stitch the list back in
|
||||||
|
node->next = cur;
|
||||||
|
|
||||||
|
if (cur->x < res.x + width)
|
||||||
|
cur->x = (stbrp_coord) (res.x + width);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
cur = context->active_head;
|
||||||
|
while (cur->x < context->width) {
|
||||||
|
STBRP_ASSERT(cur->x < cur->next->x);
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
STBRP_ASSERT(cur->next == NULL);
|
||||||
|
|
||||||
|
{
|
||||||
|
int count=0;
|
||||||
|
cur = context->active_head;
|
||||||
|
while (cur) {
|
||||||
|
cur = cur->next;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
cur = context->free_head;
|
||||||
|
while (cur) {
|
||||||
|
cur = cur->next;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
STBRP_ASSERT(count == context->num_nodes+2);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const stbrp_rect *p = (const stbrp_rect *) a;
|
||||||
|
const stbrp_rect *q = (const stbrp_rect *) b;
|
||||||
|
if (p->h > q->h)
|
||||||
|
return -1;
|
||||||
|
if (p->h < q->h)
|
||||||
|
return 1;
|
||||||
|
return (p->w > q->w) ? -1 : (p->w < q->w);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int STBRP__CDECL rect_original_order(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const stbrp_rect *p = (const stbrp_rect *) a;
|
||||||
|
const stbrp_rect *q = (const stbrp_rect *) b;
|
||||||
|
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
|
||||||
|
}
|
||||||
|
|
||||||
|
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
|
||||||
|
{
|
||||||
|
int i, all_rects_packed = 1;
|
||||||
|
|
||||||
|
// we use the 'was_packed' field internally to allow sorting/unsorting
|
||||||
|
for (i=0; i < num_rects; ++i) {
|
||||||
|
rects[i].was_packed = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort according to heuristic
|
||||||
|
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);
|
||||||
|
|
||||||
|
for (i=0; i < num_rects; ++i) {
|
||||||
|
if (rects[i].w == 0 || rects[i].h == 0) {
|
||||||
|
rects[i].x = rects[i].y = 0; // empty rect needs no space
|
||||||
|
} else {
|
||||||
|
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
|
||||||
|
if (fr.prev_link) {
|
||||||
|
rects[i].x = (stbrp_coord) fr.x;
|
||||||
|
rects[i].y = (stbrp_coord) fr.y;
|
||||||
|
} else {
|
||||||
|
rects[i].x = rects[i].y = STBRP__MAXVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// unsort
|
||||||
|
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);
|
||||||
|
|
||||||
|
// set was_packed flags and all_rects_packed status
|
||||||
|
for (i=0; i < num_rects; ++i) {
|
||||||
|
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);
|
||||||
|
if (!rects[i].was_packed)
|
||||||
|
all_rects_packed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the all_rects_packed status
|
||||||
|
return all_rects_packed;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
This software is available under 2 licenses -- choose whichever you prefer.
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
ALTERNATIVE A - MIT License
|
||||||
|
Copyright (c) 2017 Sean Barrett
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
|
commercial or non-commercial, and by any means.
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
|
software dedicate any and all copyright interest in the software to the public
|
||||||
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
|
this software under copyright law.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,34 @@
|
|||||||
|
#include "Mapping.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Mapping
|
||||||
|
{
|
||||||
|
auto create_memory_mapping() -> HANDLE
|
||||||
|
{
|
||||||
|
auto hMap = CreateFileMappingA(
|
||||||
|
INVALID_HANDLE_VALUE,
|
||||||
|
NULL,
|
||||||
|
PAGE_READWRITE,
|
||||||
|
0,
|
||||||
|
sizeof(_MAPPING_USER_MEMORY),
|
||||||
|
SHARED_NAME
|
||||||
|
);
|
||||||
|
|
||||||
|
return hMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto mapping_shared_memory(HANDLE hMapHandle) -> PMAPPING_USER_MEMORY
|
||||||
|
{
|
||||||
|
auto pData = (_MAPPING_USER_MEMORY*)MapViewOfFile(
|
||||||
|
hMapHandle,
|
||||||
|
FILE_MAP_ALL_ACCESS,
|
||||||
|
0, 0,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
return pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef MAPPING
|
||||||
|
#define MAPPING
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
#define SHARED_NAME "ServerMappingMmeory"
|
||||||
|
|
||||||
|
typedef struct _MAPPING_USER_MEMORY
|
||||||
|
{
|
||||||
|
char str[256];
|
||||||
|
|
||||||
|
//驱动执行
|
||||||
|
DWORD load_driver_code;
|
||||||
|
//轮巡
|
||||||
|
DWORD add_index_code;
|
||||||
|
|
||||||
|
DWORD server_pid;
|
||||||
|
DWORD client_pid;
|
||||||
|
|
||||||
|
//轮巡返回数
|
||||||
|
DWORD Index;
|
||||||
|
|
||||||
|
|
||||||
|
//返回状态
|
||||||
|
BOOL bIsSuc;
|
||||||
|
|
||||||
|
}MAPPING_USER_MEMORY,*PMAPPING_USER_MEMORY;
|
||||||
|
|
||||||
|
namespace Mapping
|
||||||
|
{
|
||||||
|
//创建共享内存
|
||||||
|
auto create_memory_mapping()->HANDLE;
|
||||||
|
|
||||||
|
//映射共享内存
|
||||||
|
auto mapping_shared_memory(HANDLE hMapHandle) ->PMAPPING_USER_MEMORY;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !MAPPING
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(__unix__)
|
||||||
|
#define VMP_IMPORT
|
||||||
|
#define VMP_API
|
||||||
|
#define VMP_WCHAR unsigned short
|
||||||
|
#else
|
||||||
|
#define VMP_IMPORT __declspec(dllimport)
|
||||||
|
#define VMP_API __stdcall
|
||||||
|
#define VMP_WCHAR wchar_t
|
||||||
|
#ifdef _M_IX86
|
||||||
|
#pragma comment(lib, "VMProtectSDK32.lib")
|
||||||
|
#elif _M_X64
|
||||||
|
#pragma comment(lib, "VMP/VMProtectSDK64.lib")
|
||||||
|
#elif _M_ARM64
|
||||||
|
#pragma comment(lib, "VMProtectARM64.lib")
|
||||||
|
#else
|
||||||
|
#error "Unsupported target architecture"
|
||||||
|
#endif
|
||||||
|
#endif // __APPLE__ || __unix__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// protection
|
||||||
|
VMP_IMPORT void VMP_API VMProtectBegin(const char *);
|
||||||
|
VMP_IMPORT void VMP_API VMProtectBeginVirtualization(const char *);
|
||||||
|
VMP_IMPORT void VMP_API VMProtectBeginMutation(const char *);
|
||||||
|
VMP_IMPORT void VMP_API VMProtectBeginUltra(const char *);
|
||||||
|
VMP_IMPORT void VMP_API VMProtectBeginVirtualizationLockByKey(const char *);
|
||||||
|
VMP_IMPORT void VMP_API VMProtectBeginUltraLockByKey(const char *);
|
||||||
|
VMP_IMPORT void VMP_API VMProtectEnd(void);
|
||||||
|
|
||||||
|
// utils
|
||||||
|
VMP_IMPORT bool VMP_API VMProtectIsProtected();
|
||||||
|
VMP_IMPORT bool VMP_API VMProtectIsDebuggerPresent(bool);
|
||||||
|
VMP_IMPORT bool VMP_API VMProtectIsVirtualMachinePresent(void);
|
||||||
|
VMP_IMPORT bool VMP_API VMProtectIsValidImageCRC(void);
|
||||||
|
VMP_IMPORT const char * VMP_API VMProtectDecryptStringA(const char *value);
|
||||||
|
VMP_IMPORT const VMP_WCHAR * VMP_API VMProtectDecryptStringW(const VMP_WCHAR *value);
|
||||||
|
VMP_IMPORT bool VMP_API VMProtectFreeString(const void *value);
|
||||||
|
|
||||||
|
// licensing
|
||||||
|
enum VMProtectSerialStateFlags
|
||||||
|
{
|
||||||
|
SERIAL_STATE_SUCCESS = 0,
|
||||||
|
SERIAL_STATE_FLAG_CORRUPTED = 0x00000001,
|
||||||
|
SERIAL_STATE_FLAG_INVALID = 0x00000002,
|
||||||
|
SERIAL_STATE_FLAG_BLACKLISTED = 0x00000004,
|
||||||
|
SERIAL_STATE_FLAG_DATE_EXPIRED = 0x00000008,
|
||||||
|
SERIAL_STATE_FLAG_RUNNING_TIME_OVER = 0x00000010,
|
||||||
|
SERIAL_STATE_FLAG_BAD_HWID = 0x00000020,
|
||||||
|
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED = 0x00000040,
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned short wYear;
|
||||||
|
unsigned char bMonth;
|
||||||
|
unsigned char bDay;
|
||||||
|
} VMProtectDate;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int nState; // VMProtectSerialStateFlags
|
||||||
|
VMP_WCHAR wUserName[256]; // user name
|
||||||
|
VMP_WCHAR wEMail[256]; // email
|
||||||
|
VMProtectDate dtExpire; // date of serial number expiration
|
||||||
|
VMProtectDate dtMaxBuild; // max date of build, that will accept this key
|
||||||
|
int bRunningTime; // running time in minutes
|
||||||
|
unsigned char nUserDataLength; // length of user data in bUserData
|
||||||
|
unsigned char bUserData[255]; // up to 255 bytes of user data
|
||||||
|
} VMProtectSerialNumberData;
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
VMP_IMPORT int VMP_API VMProtectSetSerialNumber(const char *serial);
|
||||||
|
VMP_IMPORT int VMP_API VMProtectGetSerialNumberState();
|
||||||
|
VMP_IMPORT bool VMP_API VMProtectGetSerialNumberData(VMProtectSerialNumberData *data, int size);
|
||||||
|
VMP_IMPORT int VMP_API VMProtectGetCurrentHWID(char *hwid, int size);
|
||||||
|
|
||||||
|
// activation
|
||||||
|
enum VMProtectActivationFlags
|
||||||
|
{
|
||||||
|
ACTIVATION_OK = 0,
|
||||||
|
ACTIVATION_SMALL_BUFFER,
|
||||||
|
ACTIVATION_NO_CONNECTION,
|
||||||
|
ACTIVATION_BAD_REPLY,
|
||||||
|
ACTIVATION_BANNED,
|
||||||
|
ACTIVATION_CORRUPTED,
|
||||||
|
ACTIVATION_BAD_CODE,
|
||||||
|
ACTIVATION_ALREADY_USED,
|
||||||
|
ACTIVATION_SERIAL_UNKNOWN,
|
||||||
|
ACTIVATION_EXPIRED,
|
||||||
|
ACTIVATION_NOT_AVAILABLE
|
||||||
|
};
|
||||||
|
|
||||||
|
VMP_IMPORT int VMP_API VMProtectActivateLicense(const char *code, char *serial, int size);
|
||||||
|
VMP_IMPORT int VMP_API VMProtectDeactivateLicense(const char *serial);
|
||||||
|
VMP_IMPORT int VMP_API VMProtectGetOfflineActivationString(const char *code, char *buf, int size);
|
||||||
|
VMP_IMPORT int VMP_API VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "VMProtectSDK.h"
|
||||||
|
|
||||||
|
#define VMP_PROC() VMProtectBegin(__FUNCTION__)
|
||||||
|
#define VMP_EDNP() VMProtectEnd();
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <array>
|
||||||
|
#include <cstdarg>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace XorCompileTime
|
||||||
|
{
|
||||||
|
constexpr auto time = __TIME__;
|
||||||
|
constexpr auto seed = static_cast<int>(time[7]) + static_cast<int>(time[6]) * 10 + static_cast<int>(time[4]) * 60 + static_cast<int>(time[3]) * 600 + static_cast<int>(time[1]) * 3600 + static_cast<int>(time[0]) * 36000;
|
||||||
|
|
||||||
|
template < int iValue >
|
||||||
|
struct RandomGenerator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static constexpr unsigned a = 16807;
|
||||||
|
static constexpr unsigned m = 0x7FFFFFFF;
|
||||||
|
static constexpr unsigned s = RandomGenerator<iValue - 1>::value;
|
||||||
|
static constexpr unsigned lo = a * (s & 0xFFFF);
|
||||||
|
static constexpr unsigned hi = a * (s >> 16);
|
||||||
|
static constexpr unsigned lo2 = lo + ((hi & 0x7FFF) << 16);
|
||||||
|
static constexpr unsigned hi2 = hi >> 15;
|
||||||
|
static constexpr unsigned lo3 = lo2 + hi;
|
||||||
|
public:
|
||||||
|
static constexpr unsigned max = m;
|
||||||
|
static constexpr unsigned value = lo3 > m ? lo3 - m : lo3;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct RandomGenerator<0>
|
||||||
|
{
|
||||||
|
static constexpr unsigned value = seed;
|
||||||
|
};
|
||||||
|
|
||||||
|
template < int N, int M >
|
||||||
|
struct RandomInt
|
||||||
|
{
|
||||||
|
static constexpr auto value = RandomGenerator< N + 1 >::value % M;
|
||||||
|
};
|
||||||
|
|
||||||
|
template < int N >
|
||||||
|
struct RandomChar
|
||||||
|
{
|
||||||
|
static const char value = static_cast<char>(1 + RandomInt< N, 0x7F - 1 >::value);
|
||||||
|
};
|
||||||
|
|
||||||
|
template < int N >
|
||||||
|
struct RandomCharW
|
||||||
|
{
|
||||||
|
static const wchar_t value = static_cast<wchar_t>(1 + RandomInt< N, 0x7F - 1 >::value);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <size_t N, int K>
|
||||||
|
struct XorString
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const char _key;
|
||||||
|
std::array< char, N + 1 > _encrypted;
|
||||||
|
constexpr char enc(char c) const { return c ^ _key; }
|
||||||
|
char dec(char c) const { return c ^ _key; }
|
||||||
|
public:
|
||||||
|
template <size_t... Is>
|
||||||
|
constexpr __forceinline XorString(const char* str, std::index_sequence< Is... >) : _key(RandomChar< K >::value), _encrypted{ enc(str[Is])... } {}
|
||||||
|
|
||||||
|
__forceinline decltype(auto) decrypt(void)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
_encrypted[i] = dec(_encrypted[i]);
|
||||||
|
}
|
||||||
|
_encrypted[N] = '\0';
|
||||||
|
return _encrypted.data();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <size_t N, int K>
|
||||||
|
struct XorStringW
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const wchar_t _key;
|
||||||
|
std::array< wchar_t, N + 1 > _encrypted;
|
||||||
|
constexpr wchar_t enc(wchar_t c) const { return c ^ _key; }
|
||||||
|
wchar_t dec(wchar_t c) const { return c ^ _key; }
|
||||||
|
public:
|
||||||
|
template <size_t... Is>
|
||||||
|
constexpr __forceinline XorStringW(const wchar_t* str, std::index_sequence< Is... >) : _key(RandomCharW< K >::value), _encrypted{ enc(str[Is])... } {}
|
||||||
|
|
||||||
|
__forceinline decltype(auto) decrypt(void)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
_encrypted[i] = dec(_encrypted[i]);
|
||||||
|
}
|
||||||
|
_encrypted[N] = '\0';
|
||||||
|
return _encrypted.data();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define XOR_STRING_A(s) (XorCompileTime::XorString<sizeof( s ) - 1,__COUNTER__>(s, std::make_index_sequence<sizeof(s) - 1>()).decrypt())
|
||||||
|
#define XOR_STRING_W(s) (XorCompileTime::XorStringW<sizeof( s ) - 1,__COUNTER__>(s, std::make_index_sequence<sizeof(s) - 1>()).decrypt())
|
||||||
|
|
||||||
|
|
||||||
|
#define XorStr(s) XOR_STRING_A(s)
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#include "comm.h"
|
||||||
|
#include "Driver.h"
|
||||||
|
#include "Mapping.h"
|
||||||
|
|
||||||
|
HANDLE hMapHandle;
|
||||||
|
|
||||||
|
namespace comm
|
||||||
|
{
|
||||||
|
auto coom_call_back(LPVOID parmar)-> DWORD
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
auto mapping_data = reinterpret_cast<PMAPPING_USER_MEMORY>(parmar);
|
||||||
|
if (mapping_data->add_index_code)
|
||||||
|
{
|
||||||
|
mapping_data->Index++;
|
||||||
|
strcpy_s(mapping_data->str, "ok");
|
||||||
|
|
||||||
|
mapping_data->add_index_code = FALSE;
|
||||||
|
}
|
||||||
|
if (mapping_data->load_driver_code)
|
||||||
|
{
|
||||||
|
auto suc = Driver::fn_get_instance()->driver_install();
|
||||||
|
|
||||||
|
mapping_data->bIsSuc = suc;
|
||||||
|
strcpy_s(mapping_data->str, "ok");
|
||||||
|
|
||||||
|
|
||||||
|
mapping_data->load_driver_code = FALSE;
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//ZeroMemory(mapping_data, sizeof(MAPPING_USER_MEMORY));
|
||||||
|
|
||||||
|
Sleep(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
auto create_coomback(LPVOID parmar) -> void
|
||||||
|
{
|
||||||
|
|
||||||
|
CreateThread(nullptr, 0, coom_call_back, parmar, 0, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef COMM_H
|
||||||
|
#define COMM_H
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum TYPE_COOM
|
||||||
|
{
|
||||||
|
BASE = 0x1000,
|
||||||
|
KD_LOAD_DRIVER,
|
||||||
|
ADD_INDEX_VAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace comm
|
||||||
|
{
|
||||||
|
auto create_coomback(LPVOID parmar)-> void;
|
||||||
|
|
||||||
|
|
||||||
|
auto coom_call_back(LPVOID)->DWORD;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !COMM_H
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
#include "driver_func.h"
|
||||||
|
#include "kdmapper/kd_driver.h"
|
||||||
|
#include "kdmapper/kdmapper.h"
|
||||||
|
#include "kdmapper/utils.h"
|
||||||
|
#include "Anti_Cheat_Driver.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef ULONG(WINAPI* NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)(char a1, PVOID a2, PVOID a3, PVOID a4);
|
||||||
|
NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc gNtConvertBetweenAuxiliary = NULL;
|
||||||
|
|
||||||
|
HANDLE null_device_handle;
|
||||||
|
|
||||||
|
OSVERSIONINFOW os{ 0 };
|
||||||
|
|
||||||
|
namespace driver_func
|
||||||
|
{
|
||||||
|
auto init() -> BOOL
|
||||||
|
{
|
||||||
|
os = utils::GetVersion();
|
||||||
|
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
|
||||||
|
{
|
||||||
|
null_device_handle = CreateFileA(XorStr("\\\\.\\Nul"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
||||||
|
if (null_device_handle != NULL && null_device_handle != INVALID_HANDLE_VALUE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if (os.dwBuildNumber >= 14393)
|
||||||
|
{
|
||||||
|
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (ntdll)
|
||||||
|
{
|
||||||
|
if (gNtConvertBetweenAuxiliary == nullptr)
|
||||||
|
{
|
||||||
|
gNtConvertBetweenAuxiliary = (NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)
|
||||||
|
GetProcAddress(ntdll, XorStr("NtConvertBetweenAuxiliaryCounterAndPerformanceCounter"));
|
||||||
|
|
||||||
|
return gNtConvertBetweenAuxiliary ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto kdmaper_load_driver() -> BOOL
|
||||||
|
{
|
||||||
|
if (kd_driver::Load())
|
||||||
|
{
|
||||||
|
if (kdmapper::MapDriver(kd_driver::iqvw64e_device_handle, kd_driver::ntoskrnlbase, (char*)Anti_Cheat_Driver))
|
||||||
|
{
|
||||||
|
kd_driver::Unload();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL
|
||||||
|
{
|
||||||
|
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
|
||||||
|
{
|
||||||
|
DWORD retlen = 0;
|
||||||
|
return DeviceIoControl(null_device_handle, 0x12345678, Buf, bufSize, Buf, bufSize, &retlen, NULL);
|
||||||
|
}
|
||||||
|
else if (os.dwBuildNumber >= 14393)
|
||||||
|
{
|
||||||
|
ULONG64 xxx = 0;
|
||||||
|
auto data = (ULONG64)Buf;
|
||||||
|
gNtConvertBetweenAuxiliary(1, &data, (PVOID)&xxx, NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef DRIVER_BULID_FUNC
|
||||||
|
#define DRIVER_BULID_FUNC
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
|
||||||
|
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
|
||||||
|
|
||||||
|
struct CMD_COMM
|
||||||
|
{
|
||||||
|
DWORD64 CommID;
|
||||||
|
DWORD64 Buf;
|
||||||
|
DWORD64 status;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IOCTL_PROCESS
|
||||||
|
{
|
||||||
|
DWORD64 Pid;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IOCTL_WINDOW
|
||||||
|
{
|
||||||
|
DWORD64 HWND;
|
||||||
|
DWORD64 Flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum DRIVER_COOM_TYPE
|
||||||
|
{
|
||||||
|
MSG_BASE = 0x10000,
|
||||||
|
DRIVER_COMM_TEST,
|
||||||
|
DRIVER_PROTECT_PROCESS,
|
||||||
|
DRIVER_CANCEL_PROTECT_PROCESS,
|
||||||
|
ADD_WHITE_PROCESS,
|
||||||
|
WINDOW_ANIT_SCREEN,
|
||||||
|
USER_EVENT_HANDLE,
|
||||||
|
PROTECT_THREAD_CONTRL,
|
||||||
|
INSTALL_MOUSE_KEYBOARD,
|
||||||
|
UNLOAD_MOUSE_KEYBOARD,
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace driver_func
|
||||||
|
{
|
||||||
|
auto init()->BOOL;
|
||||||
|
|
||||||
|
auto kdmaper_load_driver()->BOOL;
|
||||||
|
|
||||||
|
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !DRIVER_BULID_FUNC
|
||||||
@@ -0,0 +1,727 @@
|
|||||||
|
#pragma once
|
||||||
|
//-----------
|
||||||
|
//-----------
|
||||||
|
//By:QiHuan
|
||||||
|
//-----------
|
||||||
|
//-----------
|
||||||
|
unsigned char MmKd_sumper[0x3820] =
|
||||||
|
{ 0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xD8, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
|
||||||
|
0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x62, 0x65,
|
||||||
|
0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A,
|
||||||
|
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x17, 0xFE, 0xED, 0xDF, 0x76, 0x90, 0xBE, 0xDF, 0x76, 0x90, 0xBE,
|
||||||
|
0xDF, 0x76, 0x90, 0xBE, 0xCB, 0x1D, 0x91, 0xBF, 0xDC, 0x76, 0x90, 0xBE, 0xDF, 0x76, 0x91, 0xBE, 0xD2, 0x76, 0x90, 0xBE,
|
||||||
|
0xCB, 0x1D, 0x93, 0xBF, 0xDD, 0x76, 0x90, 0xBE, 0xCB, 0x1D, 0x94, 0xBF, 0xDC, 0x76, 0x90, 0xBE, 0xDF, 0x76, 0x90, 0xBE,
|
||||||
|
0xDC, 0x76, 0x90, 0xBE, 0x48, 0x04, 0x92, 0xBF, 0xDE, 0x76, 0x90, 0xBE, 0x52, 0x69, 0x63, 0x68, 0xDF, 0x76, 0x90, 0xBE,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00,
|
||||||
|
0x64, 0x86, 0x06, 0x00, 0xFF, 0xFB, 0x66, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x22, 0x00,
|
||||||
|
0x0B, 0x02, 0x0E, 0x1C, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
|
||||||
|
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||||
|
0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
|
||||||
|
0x00, 0x04, 0x00, 0x00, 0x5A, 0xEA, 0x00, 0x00, 0x01, 0x00, 0x60, 0x41, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x90, 0x50, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
|
||||||
|
0x78, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x14, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
||||||
|
0xA0, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x20, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x2A, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
|
||||||
|
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68,
|
||||||
|
0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
|
||||||
|
0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48,
|
||||||
|
0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||||
|
0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC8,
|
||||||
|
0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||||
|
0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48,
|
||||||
|
0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
|
||||||
|
0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x62,
|
||||||
|
0x2E, 0x72, 0x65, 0x6C, 0x6F, 0x63, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||||
|
0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xEC, 0x28, 0x48, 0x89, 0xD1, 0xC7, 0x42, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xC7,
|
||||||
|
0x42, 0x38, 0x00, 0x00, 0x00, 0x00, 0x31, 0xD2, 0xFF, 0x15, 0xE2, 0x0F, 0x00, 0x00, 0x31, 0xC0, 0x48, 0x83, 0xC4, 0x28,
|
||||||
|
0xC3, 0x55, 0x41, 0x57, 0x41, 0x56, 0x56, 0x57, 0x53, 0x48, 0x83, 0xEC, 0x38, 0x48, 0x8D, 0x6C, 0x24, 0x30, 0x4D, 0x89,
|
||||||
|
0xC7, 0x49, 0x89, 0xD6, 0x48, 0xC7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x44, 0x89, 0xFA, 0x45, 0x31, 0xC0, 0x45,
|
||||||
|
0x31, 0xC9, 0xFF, 0x15, 0xB4, 0x0F, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x61, 0x48, 0x89, 0xC6, 0x48, 0x89, 0xC1, 0x31,
|
||||||
|
0xD2, 0x45, 0x31, 0xC0, 0xFF, 0x15, 0xA6, 0x0F, 0x00, 0x00, 0xC7, 0x44, 0x24, 0x28, 0x10, 0x00, 0x00, 0x00, 0xC7, 0x44,
|
||||||
|
0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x31, 0xDB, 0x48, 0x89, 0xF1, 0x31, 0xD2, 0x45, 0x31, 0xC0, 0x45, 0x31, 0xC9, 0xFF,
|
||||||
|
0x15, 0x8B, 0x0F, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x2F, 0x48, 0x89, 0xC7, 0x48, 0x89, 0xC1, 0x4C, 0x89, 0xF2, 0x4D,
|
||||||
|
0x89, 0xF8, 0xE8, 0xDD, 0x0A, 0x00, 0x00, 0x48, 0x89, 0xF9, 0x48, 0x89, 0xF2, 0xFF, 0x15, 0x71, 0x0F, 0x00, 0x00, 0x48,
|
||||||
|
0x89, 0xF1, 0xFF, 0x15, 0x70, 0x0F, 0x00, 0x00, 0xEB, 0x15, 0xBB, 0x9A, 0x00, 0x00, 0xC0, 0xEB, 0x17, 0x48, 0x89, 0xF1,
|
||||||
|
0xFF, 0x15, 0x5E, 0x0F, 0x00, 0x00, 0xBB, 0x9A, 0x00, 0x00, 0xC0, 0x48, 0x89, 0xF1, 0xFF, 0x15, 0x58, 0x0F, 0x00, 0x00,
|
||||||
|
0x89, 0xD8, 0x48, 0x83, 0xC4, 0x38, 0x5B, 0x5F, 0x5E, 0x41, 0x5E, 0x41, 0x5F, 0x5D, 0xC3, 0xBB, 0x22, 0x00, 0x00, 0xC0,
|
||||||
|
0xEB, 0xE1, 0x41, 0x89, 0xCA, 0x43, 0x8D, 0x04, 0x10, 0x44, 0x0F, 0xAF, 0xC1, 0x41, 0x01, 0xC0, 0x0F, 0xAF, 0xC2, 0x44,
|
||||||
|
0x01, 0xC0, 0x05, 0xC9, 0x3C, 0x00, 0x00, 0x41, 0x0F, 0xAF, 0xC1, 0x29, 0xD0, 0x05, 0xC6, 0xDE, 0x0E, 0x00, 0x41, 0x0F,
|
||||||
|
0xAF, 0xC1, 0x05, 0x7D, 0x53, 0x00, 0x00, 0x44, 0x89, 0xC9, 0xD3, 0xE0, 0x89, 0xC1, 0x81, 0xE1, 0x1A, 0x8F, 0x48, 0xFB,
|
||||||
|
0x81, 0xC9, 0xC4, 0x70, 0x86, 0x04, 0x89, 0xC2, 0x81, 0xE2, 0xE5, 0x70, 0xB7, 0x04, 0x31, 0xCA, 0x81, 0xF2, 0x2C, 0xD2,
|
||||||
|
0xA5, 0x04, 0x25, 0xE8, 0xA2, 0x23, 0x00, 0x09, 0xD0, 0x89, 0xC1, 0x81, 0xE1, 0x31, 0x14, 0x62, 0x7E, 0x81, 0xC9, 0x8C,
|
||||||
|
0x42, 0x81, 0x00, 0x25, 0xCE, 0xEB, 0x9D, 0x81, 0x31, 0xC8, 0x89, 0xC1, 0x81, 0xF1, 0xBD, 0x54, 0x8A, 0xA0, 0x44, 0x89,
|
||||||
|
0xD2, 0x81, 0xE2, 0xD1, 0x2F, 0x08, 0xA0, 0x81, 0xCA, 0x08, 0x90, 0xA5, 0x40, 0x41, 0x81, 0xE2, 0x2E, 0xD0, 0xF7, 0x5F,
|
||||||
|
0x41, 0x31, 0xD2, 0x44, 0x89, 0xD2, 0x81, 0xF2, 0xD9, 0xBF, 0xAD, 0xE0, 0x35, 0x42, 0xAB, 0x75, 0x5F, 0x21, 0xD0, 0x41,
|
||||||
|
0x81, 0xF2, 0x26, 0x40, 0x52, 0x1F, 0x41, 0x21, 0xCA, 0x41, 0x09, 0xC2, 0x49, 0x63, 0xC2, 0x48, 0x69, 0xC0, 0xA1, 0x25,
|
||||||
|
0x56, 0x50, 0x48, 0x89, 0xC1, 0x48, 0xC1, 0xE9, 0x3F, 0x48, 0xC1, 0xF8, 0x32, 0x01, 0xC8, 0x48, 0x98, 0xC3, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54,
|
||||||
|
0x56, 0x57, 0x55, 0x53, 0x48, 0x83, 0xEC, 0x48, 0x49, 0x89, 0xD6, 0x48, 0x8B, 0x82, 0xB8, 0x00, 0x00, 0x00, 0x48, 0x83,
|
||||||
|
0xC0, 0x08, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x8B, 0x40, 0x10, 0x89, 0x44, 0x24, 0x2C, 0x48,
|
||||||
|
0x8B, 0x42, 0x18, 0x48, 0x89, 0x44, 0x24, 0x20, 0xB9, 0x2E, 0x11, 0x99, 0x7A, 0x41, 0xBF, 0x7C, 0xFE, 0xBB, 0x81, 0x81,
|
||||||
|
0xF9, 0x92, 0xD4, 0xC6, 0x16, 0x7E, 0x59, 0x81, 0xF9, 0xF0, 0xD0, 0x43, 0x58, 0x0F, 0x8F, 0xB2, 0x00, 0x00, 0x00, 0x81,
|
||||||
|
0xF9, 0xA5, 0x4D, 0x85, 0x38, 0x0F, 0x8F, 0x54, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x93, 0xD4, 0xC6, 0x16, 0x0F, 0x84, 0x95,
|
||||||
|
0x01, 0x00, 0x00, 0x81, 0xF9, 0x3F, 0xFD, 0x40, 0x18, 0x0F, 0x84, 0x0E, 0x02, 0x00, 0x00, 0x81, 0xF9, 0x90, 0x88, 0x66,
|
||||||
|
0x36, 0x75, 0xC0, 0x8B, 0x0D, 0x9B, 0x1E, 0x00, 0x00, 0x8B, 0x05, 0x91, 0x1E, 0x00, 0x00, 0x8D, 0x59, 0xFF, 0x0F, 0xAF,
|
||||||
|
0xD9, 0xBA, 0xC5, 0x91, 0xF8, 0x3E, 0xB9, 0xC5, 0x91, 0xF8, 0x3E, 0xE9, 0x09, 0x03, 0x00, 0x00, 0x81, 0xF9, 0xE0, 0x4E,
|
||||||
|
0x22, 0xC7, 0x0F, 0x8E, 0xCD, 0x00, 0x00, 0x00, 0x81, 0xF9, 0x09, 0x0E, 0x51, 0xF9, 0x0F, 0x8F, 0x24, 0x01, 0x00, 0x00,
|
||||||
|
0x81, 0xF9, 0xE1, 0x4E, 0x22, 0xC7, 0x0F, 0x84, 0xF2, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x77, 0x19, 0x6C, 0xD0, 0x0F, 0x84,
|
||||||
|
0x35, 0x02, 0x00, 0x00, 0x81, 0xF9, 0x76, 0xD7, 0xDD, 0xD9, 0x0F, 0x85, 0x63, 0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24,
|
||||||
|
0x20, 0x48, 0x8B, 0x40, 0x28, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x83, 0x7C, 0x24, 0x30, 0x00, 0xB9, 0x90, 0x88, 0x66,
|
||||||
|
0x36, 0x0F, 0x84, 0x44, 0xFF, 0xFF, 0xFF, 0xB9, 0x0A, 0x0E, 0x51, 0xF9, 0xE9, 0x3A, 0xFF, 0xFF, 0xFF, 0x81, 0xF9, 0x4F,
|
||||||
|
0xE6, 0x43, 0x69, 0x0F, 0x8F, 0xFC, 0x00, 0x00, 0x00, 0x81, 0xF9, 0xF1, 0xD0, 0x43, 0x58, 0x0F, 0x84, 0xFE, 0x01, 0x00,
|
||||||
|
0x00, 0x81, 0xF9, 0xDD, 0x55, 0xF0, 0x5B, 0x0F, 0x84, 0x07, 0x02, 0x00, 0x00, 0x81, 0xF9, 0x7C, 0xA6, 0xEC, 0x62, 0x0F,
|
||||||
|
0x85, 0x0A, 0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x44, 0x8B, 0x48, 0x0C, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x44,
|
||||||
|
0x8B, 0x40, 0x08, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x50, 0x04, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x08, 0xE8, 0xCF,
|
||||||
|
0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x38, 0xB9, 0x3F, 0xFD, 0x40, 0x18, 0x48, 0x3B, 0x42, 0x10, 0x0F, 0x84, 0xD0,
|
||||||
|
0xFE, 0xFF, 0xFF, 0xB9, 0xDD, 0x55, 0xF0, 0x5B, 0xE9, 0xC6, 0xFE, 0xFF, 0xFF, 0x81, 0xF9, 0x3F, 0x4B, 0xE0, 0xA6, 0x0F,
|
||||||
|
0x8E, 0xBE, 0x00, 0x00, 0x00, 0x81, 0xF9, 0x40, 0x4B, 0xE0, 0xA6, 0x0F, 0x84, 0xAD, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x87,
|
||||||
|
0x20, 0xF9, 0xA9, 0x0F, 0x84, 0xBF, 0x01, 0x00, 0x00, 0x81, 0xF9, 0xC2, 0x11, 0x04, 0xB0, 0x0F, 0x85, 0x96, 0xFE, 0xFF,
|
||||||
|
0xFF, 0xB9, 0xC5, 0x91, 0xF8, 0x3E, 0xE9, 0x8C, 0xFE, 0xFF, 0xFF, 0x81, 0xF9, 0xA6, 0x4D, 0x85, 0x38, 0x0F, 0x84, 0xA7,
|
||||||
|
0x01, 0x00, 0x00, 0x81, 0xF9, 0xC5, 0x91, 0xF8, 0x3E, 0x0F, 0x84, 0xC2, 0x01, 0x00, 0x00, 0x81, 0xF9, 0xFB, 0xD0, 0x10,
|
||||||
|
0x47, 0x0F, 0x84, 0x21, 0x02, 0x00, 0x00, 0xE9, 0x63, 0xFE, 0xFF, 0xFF, 0x81, 0xF9, 0x0A, 0x0E, 0x51, 0xF9, 0x0F, 0x84,
|
||||||
|
0xD6, 0x01, 0x00, 0x00, 0x81, 0xF9, 0xCD, 0xEC, 0x26, 0x00, 0x0F, 0x84, 0x0E, 0x02, 0x00, 0x00, 0x81, 0xF9, 0xF8, 0x90,
|
||||||
|
0xE5, 0x05, 0x0F, 0x85, 0x3F, 0xFE, 0xFF, 0xFF, 0xB9, 0x50, 0xE6, 0x43, 0x69, 0x45, 0x31, 0xE4, 0xE9, 0x32, 0xFE, 0xFF,
|
||||||
|
0xFF, 0x81, 0xF9, 0x5A, 0x6A, 0x07, 0x7A, 0x0F, 0x84, 0xF6, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x2E, 0x11, 0x99, 0x7A, 0x0F,
|
||||||
|
0x85, 0x35, 0x02, 0x00, 0x00, 0x8B, 0x44, 0x24, 0x2C, 0xB9, 0x77, 0x19, 0x6C, 0xD0, 0x3D, 0x4C, 0x54, 0x22, 0x00, 0x0F,
|
||||||
|
0x8C, 0x06, 0xFE, 0xFF, 0xFF, 0xB9, 0x40, 0x4B, 0xE0, 0xA6, 0xE9, 0xFC, 0xFD, 0xFF, 0xFF, 0x81, 0xF9, 0x7C, 0xFE, 0xBB,
|
||||||
|
0x81, 0x0F, 0x84, 0xFE, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x31, 0xEE, 0x4A, 0x8A, 0x0F, 0x85, 0xE4, 0xFD, 0xFF, 0xFF, 0x48,
|
||||||
|
0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x48, 0x18, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x50, 0x10, 0x48, 0x8B, 0x44,
|
||||||
|
0x24, 0x20, 0x4C, 0x8B, 0x40, 0x20, 0xE8, 0x41, 0x07, 0x00, 0x00, 0xB9, 0xE1, 0x4E, 0x22, 0xC7, 0xE9, 0xBA, 0xFD, 0xFF,
|
||||||
|
0xFF, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x4C, 0x8B, 0x40, 0x20, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x50, 0x18, 0x48,
|
||||||
|
0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x48, 0x10, 0xE8, 0xBC, 0xFB, 0xFF, 0xFF, 0x89, 0xC6, 0xB9, 0xF1, 0xD0, 0x43, 0x58,
|
||||||
|
0xBD, 0x02, 0x00, 0x00, 0x00, 0xE9, 0x89, 0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x48, 0x18, 0x48,
|
||||||
|
0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x50, 0x10, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x4C, 0x8B, 0x40, 0x20, 0xE8, 0xE6, 0x06,
|
||||||
|
0x00, 0x00, 0x8B, 0x0D, 0x44, 0x1C, 0x00, 0x00, 0x8B, 0x05, 0x3A, 0x1C, 0x00, 0x00, 0x8D, 0x59, 0xFF, 0x0F, 0xAF, 0xD9,
|
||||||
|
0xBA, 0xFB, 0xD0, 0x10, 0x47, 0xB9, 0xFB, 0xD0, 0x10, 0x47, 0xF6, 0xC3, 0x01, 0x0F, 0x84, 0xB8, 0x00, 0x00, 0x00, 0xB9,
|
||||||
|
0x31, 0xEE, 0x4A, 0x8A, 0xE9, 0xAE, 0x00, 0x00, 0x00, 0x8B, 0x44, 0x24, 0x2C, 0xB9, 0x76, 0xD7, 0xDD, 0xD9, 0x3D, 0x48,
|
||||||
|
0x54, 0x22, 0x00, 0x0F, 0x84, 0x26, 0xFD, 0xFF, 0xFF, 0xEB, 0x37, 0x85, 0xED, 0xB9, 0xCD, 0xEC, 0x26, 0x00, 0x41, 0x0F,
|
||||||
|
0x44, 0xCF, 0x41, 0x89, 0xF5, 0x89, 0xF7, 0xE9, 0x0F, 0xFD, 0xFF, 0xFF, 0xB9, 0xF1, 0xD0, 0x43, 0x58, 0x31, 0xED, 0x31,
|
||||||
|
0xF6, 0xE9, 0x01, 0xFD, 0xFF, 0xFF, 0x8B, 0x44, 0x24, 0x2C, 0xB9, 0xA6, 0x4D, 0x85, 0x38, 0x3D, 0x4C, 0x54, 0x22, 0x00,
|
||||||
|
0x0F, 0x84, 0xED, 0xFC, 0xFF, 0xFF, 0xB9, 0x93, 0xD4, 0xC6, 0x16, 0xE9, 0xE3, 0xFC, 0xFF, 0xFF, 0xB9, 0x90, 0x88, 0x66,
|
||||||
|
0x36, 0xE9, 0xD9, 0xFC, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x40, 0x28, 0x48, 0x89, 0x44, 0x24, 0x38,
|
||||||
|
0x48, 0x83, 0x7C, 0x24, 0x38, 0x00, 0xB9, 0x7C, 0xFE, 0xBB, 0x81, 0x74, 0x05, 0xB9, 0x7C, 0xA6, 0xEC, 0x62, 0x31, 0xFF,
|
||||||
|
0xE9, 0xB2, 0xFC, 0xFF, 0xFF, 0x8B, 0x0D, 0x8D, 0x1B, 0x00, 0x00, 0x8B, 0x05, 0x83, 0x1B, 0x00, 0x00, 0x8D, 0x59, 0xFF,
|
||||||
|
0x0F, 0xAF, 0xD9, 0xBA, 0xF8, 0x90, 0xE5, 0x05, 0xB9, 0xF8, 0x90, 0xE5, 0x05, 0xF6, 0xC3, 0x01, 0x74, 0x05, 0xB9, 0xC2,
|
||||||
|
0x11, 0x04, 0xB0, 0x83, 0xF8, 0x0A, 0x0F, 0x4C, 0xCA, 0xE9, 0x81, 0xFC, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x44,
|
||||||
|
0x8B, 0x48, 0x0C, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x44, 0x8B, 0x40, 0x08, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x8B, 0x50, 0x04,
|
||||||
|
0x48, 0x8B, 0x44, 0x24, 0x30, 0x8B, 0x08, 0xE8, 0x46, 0xFB, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x30, 0xB9, 0x5A, 0x6A,
|
||||||
|
0x07, 0x7A, 0x48, 0x3B, 0x42, 0x10, 0x0F, 0x84, 0x47, 0xFC, 0xFF, 0xFF, 0xB9, 0x87, 0x20, 0xF9, 0xA9, 0xE9, 0x3D, 0xFC,
|
||||||
|
0xFF, 0xFF, 0xB9, 0x50, 0xE6, 0x43, 0x69, 0x45, 0x89, 0xEC, 0xE9, 0x30, 0xFC, 0xFF, 0xFF, 0x8B, 0x05, 0x0B, 0x1B, 0x00,
|
||||||
|
0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF, 0xC8, 0x83, 0xE1, 0x01, 0x0F, 0x94, 0xC0, 0x83, 0x3D, 0xF4, 0x1A, 0x00, 0x00, 0x09,
|
||||||
|
0x0F, 0x9F, 0xC2, 0x30, 0xD0, 0x89, 0xC3, 0x80, 0xF3, 0x01, 0x20, 0xD1, 0x08, 0xD9, 0x30, 0xC1, 0xB9, 0xE1, 0x4E, 0x22,
|
||||||
|
0xC7, 0x0F, 0x85, 0xFC, 0xFB, 0xFF, 0xFF, 0xB9, 0x31, 0xEE, 0x4A, 0x8A, 0xE9, 0xF2, 0xFB, 0xFF, 0xFF, 0xB9, 0xCD, 0xEC,
|
||||||
|
0x26, 0x00, 0x41, 0x89, 0xFD, 0xE9, 0xE5, 0xFB, 0xFF, 0xFF, 0x81, 0xF9, 0x50, 0xE6, 0x43, 0x69, 0x0F, 0x85, 0xD9, 0xFB,
|
||||||
|
0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x8B, 0x00, 0x49, 0x89, 0x46, 0x38, 0x45, 0x89, 0x66, 0x30, 0x4C, 0x89, 0xF1,
|
||||||
|
0x31, 0xD2, 0xFF, 0x15, 0xBC, 0x09, 0x00, 0x00, 0x44, 0x89, 0xE0, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x5F, 0x5E, 0x41,
|
||||||
|
0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0xC3, 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x56, 0x57, 0x55, 0x53,
|
||||||
|
0x48, 0x83, 0xEC, 0x48, 0x48, 0x89, 0xCF, 0x48, 0x8D, 0x05, 0xEE, 0x01, 0x00, 0x00, 0x48, 0x89, 0x41, 0x68, 0x48, 0x8D,
|
||||||
|
0x05, 0x83, 0xF9, 0xFF, 0xFF, 0x48, 0x89, 0x41, 0x70, 0x48, 0x89, 0x81, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x05, 0x31,
|
||||||
|
0xFB, 0xFF, 0xFF, 0x48, 0x89, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0x63, 0x19, 0x00, 0x00, 0xE8, 0xA0, 0x02,
|
||||||
|
0x00, 0x00, 0x48, 0x8D, 0x35, 0xBF, 0x19, 0x00, 0x00, 0x48, 0x89, 0xF1, 0x48, 0x89, 0xC2, 0xFF, 0x15, 0x8B, 0x09, 0x00,
|
||||||
|
0x00, 0x48, 0x8D, 0x05, 0xA4, 0x19, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x30, 0xC6, 0x44, 0x24, 0x28, 0x00, 0xC7, 0x44,
|
||||||
|
0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xF9, 0x31, 0xD2, 0x49, 0x89, 0xF0, 0x41, 0xB9, 0x22, 0x00, 0x00, 0x00,
|
||||||
|
0xFF, 0x15, 0x66, 0x09, 0x00, 0x00, 0x89, 0x44, 0x24, 0x44, 0xB8, 0x23, 0xF4, 0x8F, 0x2D, 0xBE, 0x04, 0x37, 0xB8, 0x06,
|
||||||
|
0x48, 0x8D, 0x1D, 0x81, 0x19, 0x00, 0x00, 0x4C, 0x8B, 0x2D, 0x42, 0x09, 0x00, 0x00, 0x48, 0x8B, 0x3D, 0x4B, 0x09, 0x00,
|
||||||
|
0x00, 0x41, 0xBE, 0x09, 0x99, 0xEA, 0x73, 0x41, 0xBF, 0xC7, 0x3E, 0x9B, 0xBD, 0x41, 0xBC, 0x21, 0x13, 0x44, 0xFE, 0x3D,
|
||||||
|
0x03, 0x37, 0xB8, 0x06, 0x7F, 0x52, 0x3D, 0xF6, 0x9E, 0xCD, 0xBE, 0x7E, 0x67, 0x3D, 0x6F, 0x28, 0x32, 0xE8, 0x0F, 0x84,
|
||||||
|
0xA5, 0x00, 0x00, 0x00, 0x3D, 0x21, 0x13, 0x44, 0xFE, 0x0F, 0x85, 0x03, 0x01, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0xD8, 0x18,
|
||||||
|
0x00, 0x00, 0xE8, 0xEF, 0x02, 0x00, 0x00, 0x48, 0x89, 0xD9, 0x48, 0x89, 0xC2, 0x41, 0xFF, 0xD5, 0x48, 0x89, 0xD9, 0x48,
|
||||||
|
0x8D, 0x15, 0x0E, 0x19, 0x00, 0x00, 0xFF, 0xD7, 0x89, 0x44, 0x24, 0x40, 0x83, 0x7C, 0x24, 0x40, 0x00, 0xB8, 0xC2, 0x10,
|
||||||
|
0x9B, 0xA6, 0x41, 0x0F, 0x49, 0xC6, 0xEB, 0xA7, 0x3D, 0x22, 0xF4, 0x8F, 0x2D, 0x7F, 0x39, 0x3D, 0x04, 0x37, 0xB8, 0x06,
|
||||||
|
0x74, 0x7D, 0x3D, 0xF0, 0xDE, 0x7E, 0x0E, 0x75, 0x92, 0xB8, 0x04, 0x37, 0xB8, 0x06, 0xEB, 0x8B, 0x3D, 0xC2, 0x10, 0x9B,
|
||||||
|
0xA6, 0x0F, 0x84, 0x8C, 0x00, 0x00, 0x00, 0x3D, 0xC7, 0x3E, 0x9B, 0xBD, 0x0F, 0x85, 0x75, 0xFF, 0xFF, 0xFF, 0xB8, 0xF7,
|
||||||
|
0x9E, 0xCD, 0xBE, 0x8B, 0x6C, 0x24, 0x44, 0xE9, 0x67, 0xFF, 0xFF, 0xFF, 0x3D, 0x09, 0x99, 0xEA, 0x73, 0x74, 0x79, 0x3D,
|
||||||
|
0x23, 0xF4, 0x8F, 0x2D, 0x0F, 0x85, 0x55, 0xFF, 0xFF, 0xFF, 0x83, 0x7C, 0x24, 0x44, 0x00, 0xB8, 0x6F, 0x28, 0x32, 0xE8,
|
||||||
|
0x41, 0x0F, 0x49, 0xC4, 0xE9, 0x42, 0xFF, 0xFF, 0xFF, 0x8B, 0x05, 0x01, 0x19, 0x00, 0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF,
|
||||||
|
0xC8, 0xF6, 0xC1, 0x01, 0xB8, 0xF0, 0xDE, 0x7E, 0x0E, 0x0F, 0x44, 0xC6, 0x83, 0x3D, 0xE5, 0x18, 0x00, 0x00, 0x0A, 0x0F,
|
||||||
|
0x4C, 0xC6, 0xE9, 0x1C, 0xFF, 0xFF, 0xFF, 0x8B, 0x05, 0xDB, 0x18, 0x00, 0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF, 0xC8, 0xF6,
|
||||||
|
0xC1, 0x01, 0xB8, 0xF0, 0xDE, 0x7E, 0x0E, 0x41, 0x0F, 0x44, 0xC7, 0x83, 0x3D, 0xBE, 0x18, 0x00, 0x00, 0x0A, 0x41, 0x0F,
|
||||||
|
0x4C, 0xC7, 0xE9, 0xF4, 0xFE, 0xFF, 0xFF, 0x48, 0x8B, 0x0D, 0x36, 0x18, 0x00, 0x00, 0xFF, 0x15, 0x28, 0x08, 0x00, 0x00,
|
||||||
|
0xB8, 0xF7, 0x9E, 0xCD, 0xBE, 0x8B, 0x6C, 0x24, 0x40, 0xE9, 0xD9, 0xFE, 0xFF, 0xFF, 0x3D, 0xF7, 0x9E, 0xCD, 0xBE, 0x0F,
|
||||||
|
0x85, 0xCE, 0xFE, 0xFF, 0xFF, 0x89, 0xE8, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x5F, 0x5E, 0x41, 0x5C, 0x41, 0x5D, 0x41,
|
||||||
|
0x5E, 0x41, 0x5F, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0x41, 0x56, 0x56, 0x57, 0x55, 0x53, 0x48, 0x83, 0xEC, 0x30, 0x8B, 0x05,
|
||||||
|
0x64, 0x18, 0x00, 0x00, 0x8B, 0x0D, 0x5A, 0x18, 0x00, 0x00, 0x8D, 0x50, 0xFF, 0x0F, 0xAF, 0xD0, 0xF6, 0xC2, 0x01, 0x0F,
|
||||||
|
0x94, 0x44, 0x24, 0x2E, 0x83, 0xF9, 0x0A, 0x0F, 0x9C, 0x44, 0x24, 0x2F, 0xB8, 0x5D, 0xC4, 0xA0, 0x1A, 0x41, 0xBE, 0xF2,
|
||||||
|
0x3F, 0xB9, 0x60, 0x48, 0x8D, 0x35, 0xDA, 0x17, 0x00, 0x00, 0x48, 0x8B, 0x1D, 0xBB, 0x07, 0x00, 0x00, 0x48, 0x8B, 0x3D,
|
||||||
|
0xAC, 0x07, 0x00, 0x00, 0xBD, 0x9C, 0xE8, 0x2F, 0x91, 0x3D, 0xCA, 0x8F, 0x7D, 0x47, 0x7F, 0x28, 0x3D, 0x9C, 0xE8, 0x2F,
|
||||||
|
0x91, 0x74, 0x78, 0x3D, 0x5D, 0xC4, 0xA0, 0x1A, 0x75, 0xEB, 0x8A, 0x4C, 0x24, 0x2E, 0x80, 0x7C, 0x24, 0x2F, 0x00, 0xB8,
|
||||||
|
0xCB, 0x8F, 0x7D, 0x47, 0x41, 0x0F, 0x45, 0xC6, 0x84, 0xC9, 0x41, 0x0F, 0x45, 0xC6, 0xEB, 0xD1, 0x3D, 0xCB, 0x8F, 0x7D,
|
||||||
|
0x47, 0x74, 0x38, 0x3D, 0xF2, 0x3F, 0xB9, 0x60, 0x75, 0xC3, 0x48, 0x89, 0xF1, 0xFF, 0xD3, 0x48, 0x8B, 0x0D, 0x66, 0x17,
|
||||||
|
0x00, 0x00, 0xFF, 0xD7, 0x8B, 0x05, 0xD2, 0x17, 0x00, 0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF, 0xC8, 0xF6, 0xC1, 0x01, 0xB8,
|
||||||
|
0xCB, 0x8F, 0x7D, 0x47, 0x0F, 0x44, 0xC5, 0x83, 0x3D, 0xB6, 0x17, 0x00, 0x00, 0x0A, 0x0F, 0x4C, 0xC5, 0xEB, 0x92, 0x48,
|
||||||
|
0x89, 0xF1, 0xFF, 0xD3, 0x48, 0x8B, 0x0D, 0x35, 0x17, 0x00, 0x00, 0xFF, 0xD7, 0xB8, 0xF2, 0x3F, 0xB9, 0x60, 0xE9, 0x7A,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x48, 0x83, 0xC4, 0x30, 0x5B, 0x5D, 0x5F, 0x5E, 0x41, 0x5E, 0xC3, 0x48, 0x83, 0xEC, 0x18, 0x48, 0x89,
|
||||||
|
0xC8, 0x48, 0x83, 0xC1, 0x18, 0x48, 0x89, 0x4C, 0x24, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x10, 0x8A, 0x09, 0x88, 0x4C, 0x24,
|
||||||
|
0x07, 0xBA, 0x8F, 0xC5, 0xCC, 0xC4, 0x41, 0xB8, 0x21, 0x86, 0xF5, 0x71, 0x41, 0xB9, 0x51, 0xEA, 0xFA, 0xDE, 0x81, 0xFA,
|
||||||
|
0x50, 0xEA, 0xFA, 0xDE, 0x7F, 0x2C, 0x81, 0xFA, 0x24, 0xBD, 0xB2, 0x93, 0x74, 0x79, 0x81, 0xFA, 0x09, 0xD9, 0x9C, 0x9B,
|
||||||
|
0x0F, 0x84, 0x89, 0x00, 0x00, 0x00, 0x81, 0xFA, 0x8F, 0xC5, 0xCC, 0xC4, 0x75, 0xDC, 0xF6, 0x44, 0x24, 0x07, 0x01, 0xBA,
|
||||||
|
0x9B, 0xBD, 0x91, 0x5B, 0x41, 0x0F, 0x44, 0xD1, 0xEB, 0xCC, 0x81, 0xFA, 0x51, 0xEA, 0xFA, 0xDE, 0x74, 0x7B, 0x81, 0xFA,
|
||||||
|
0x9B, 0xBD, 0x91, 0x5B, 0x74, 0x7F, 0x81, 0xFA, 0x21, 0x86, 0xF5, 0x71, 0x75, 0xB4, 0x4C, 0x8B, 0x54, 0x24, 0x08, 0x42,
|
||||||
|
0x0F, 0xB7, 0x14, 0x50, 0x89, 0xD1, 0x81, 0xE1, 0x7A, 0x95, 0x00, 0x00, 0x81, 0xC9, 0x80, 0x60, 0x00, 0x00, 0x81, 0xE2,
|
||||||
|
0x85, 0x6A, 0x00, 0x00, 0x31, 0xCA, 0x81, 0xF2, 0x4C, 0xDB, 0x00, 0x00, 0x66, 0x42, 0x89, 0x14, 0x50, 0x48, 0x8B, 0x4C,
|
||||||
|
0x24, 0x08, 0x48, 0xFF, 0xC1, 0xBA, 0x24, 0xBD, 0xB2, 0x93, 0xE9, 0x77, 0xFF, 0xFF, 0xFF, 0x48, 0x89, 0x4C, 0x24, 0x08,
|
||||||
|
0x48, 0x8B, 0x54, 0x24, 0x08, 0x48, 0x83, 0xFA, 0x0C, 0xBA, 0x09, 0xD9, 0x9C, 0x9B, 0x41, 0x0F, 0x42, 0xD0, 0xE9, 0x5B,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x10, 0xC6, 0x02, 0x01, 0xBA, 0x9B, 0xBD, 0x91, 0x5B, 0xE9, 0x49, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xBA, 0x24, 0xBD, 0xB2, 0x93, 0x31, 0xC9, 0xE9, 0x3D, 0xFF, 0xFF, 0xFF, 0x48, 0x83, 0xC4, 0x18, 0xC3, 0x48, 0x83,
|
||||||
|
0xEC, 0x18, 0x48, 0x89, 0xC8, 0x48, 0x83, 0xC1, 0x2A, 0x48, 0x89, 0x4C, 0x24, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x10, 0x8A,
|
||||||
|
0x09, 0x88, 0x4C, 0x24, 0x07, 0xBA, 0x60, 0xB1, 0x0A, 0xC0, 0x41, 0xB8, 0xBA, 0xE9, 0x0E, 0x5A, 0x41, 0xB9, 0x14, 0x8E,
|
||||||
|
0x49, 0x22, 0x81, 0xFA, 0xE9, 0x9A, 0xC8, 0x27, 0x7F, 0x56, 0x81, 0xFA, 0x60, 0xB1, 0x0A, 0xC0, 0x74, 0x68, 0x81, 0xFA,
|
||||||
|
0x3F, 0xAC, 0xAD, 0xC6, 0x0F, 0x84, 0x8B, 0x00, 0x00, 0x00, 0x81, 0xFA, 0x14, 0x8E, 0x49, 0x22, 0x75, 0xDC, 0x4C, 0x8B,
|
||||||
|
0x54, 0x24, 0x08, 0x42, 0x0F, 0xB7, 0x14, 0x50, 0x89, 0xD1, 0x81, 0xE1, 0xE4, 0x2F, 0x00, 0x00, 0x81, 0xC9, 0x01, 0x50,
|
||||||
|
0x00, 0x00, 0x81, 0xE2, 0x1B, 0xD0, 0x00, 0x00, 0x31, 0xCA, 0x81, 0xF2, 0xCD, 0xEB, 0x00, 0x00, 0x66, 0x42, 0x89, 0x14,
|
||||||
|
0x50, 0x48, 0x8B, 0x4C, 0x24, 0x08, 0x48, 0xFF, 0xC1, 0xBA, 0xEA, 0x9A, 0xC8, 0x27, 0xEB, 0xA2, 0x81, 0xFA, 0xEA, 0x9A,
|
||||||
|
0xC8, 0x27, 0x74, 0x25, 0x81, 0xFA, 0xBA, 0xE9, 0x0E, 0x5A, 0x74, 0x4B, 0x81, 0xFA, 0xB1, 0x5D, 0xEE, 0x6C, 0x75, 0x8A,
|
||||||
|
0xEB, 0x4D, 0xF6, 0x44, 0x24, 0x07, 0x01, 0xBA, 0xB1, 0x5D, 0xEE, 0x6C, 0x41, 0x0F, 0x44, 0xD0, 0xE9, 0x75, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x48, 0x89, 0x4C, 0x24, 0x08, 0x48, 0x8B, 0x54, 0x24, 0x08, 0x48, 0x83, 0xFA, 0x15, 0xBA, 0x3F, 0xAC, 0xAD, 0xC6,
|
||||||
|
0x41, 0x0F, 0x42, 0xD1, 0xE9, 0x59, 0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x10, 0xC6, 0x02, 0x01, 0xBA, 0xB1, 0x5D,
|
||||||
|
0xEE, 0x6C, 0xE9, 0x47, 0xFF, 0xFF, 0xFF, 0xBA, 0xEA, 0x9A, 0xC8, 0x27, 0x31, 0xC9, 0xE9, 0x3B, 0xFF, 0xFF, 0xFF, 0x48,
|
||||||
|
0x83, 0xC4, 0x18, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0x25, 0x02, 0x05, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xC2, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x48, 0x8B, 0xC1, 0x49, 0x83, 0xF8, 0x08, 0x72, 0x37, 0x49, 0x83, 0xF8,
|
||||||
|
0x10, 0x77, 0x11, 0x4C, 0x8B, 0x1A, 0x4A, 0x8B, 0x54, 0x02, 0xF8, 0x4C, 0x89, 0x19, 0x4A, 0x89, 0x54, 0x01, 0xF8, 0xC3,
|
||||||
|
0x49, 0x83, 0xF8, 0x20, 0x77, 0x5A, 0x0F, 0x10, 0x02, 0x42, 0x0F, 0x10, 0x4C, 0x02, 0xF0, 0x0F, 0x11, 0x01, 0x42, 0x0F,
|
||||||
|
0x11, 0x4C, 0x01, 0xF0, 0xC3, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x85, 0xC0, 0x74, 0x15, 0x48, 0x2B, 0xD1,
|
||||||
|
0x72, 0x16, 0x44, 0x8A, 0x1C, 0x11, 0x48, 0xFF, 0xC1, 0x49, 0xFF, 0xC8, 0x44, 0x88, 0x59, 0xFF, 0x75, 0xF0, 0xC3, 0x0F,
|
||||||
|
0x1F, 0x44, 0x00, 0x00, 0x49, 0x03, 0xC8, 0x44, 0x8A, 0x5C, 0x11, 0xFF, 0x48, 0xFF, 0xC9, 0x49, 0xFF, 0xC8, 0x44, 0x88,
|
||||||
|
0x19, 0x75, 0xF0, 0xC3, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x8D, 0x1C, 0x02,
|
||||||
|
0x48, 0x2B, 0xD1, 0x73, 0x09, 0x4C, 0x3B, 0xD9, 0x0F, 0x87, 0x6E, 0x01, 0x00, 0x00, 0x0F, 0x10, 0x04, 0x11, 0x48, 0x83,
|
||||||
|
0xC1, 0x10, 0xF6, 0xC1, 0x0F, 0x74, 0x12, 0x48, 0x83, 0xE1, 0xF0, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x11, 0x00, 0x0F, 0x28,
|
||||||
|
0xC1, 0x48, 0x83, 0xC1, 0x10, 0x4C, 0x03, 0xC0, 0x4C, 0x2B, 0xC1, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x74, 0x6F,
|
||||||
|
0x49, 0x81, 0xF9, 0x00, 0x10, 0x00, 0x00, 0x0F, 0x87, 0xB3, 0x00, 0x00, 0x00, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x2D, 0x66,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
|
||||||
|
0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x10, 0x54, 0x11, 0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10,
|
||||||
|
0x64, 0x11, 0x30, 0x0F, 0x29, 0x41, 0xF0, 0x48, 0x83, 0xC1, 0x40, 0x49, 0xFF, 0xC9, 0x0F, 0x29, 0x49, 0xC0, 0x0F, 0x29,
|
||||||
|
0x51, 0xD0, 0x0F, 0x29, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19,
|
||||||
|
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x41, 0xF0, 0x0F, 0x10, 0x04, 0x11, 0x48, 0x83, 0xC1, 0x10,
|
||||||
|
0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0E, 0x4E, 0x8D, 0x5C, 0x01, 0xF0, 0x41, 0x0F, 0x10, 0x0C,
|
||||||
|
0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x41, 0xF0, 0xC3, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x49,
|
||||||
|
0x83, 0xE0, 0x3F, 0x0F, 0x18, 0x44, 0x11, 0x40, 0xEB, 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x0F, 0x10, 0x0C, 0x11,
|
||||||
|
0x0F, 0x10, 0x54, 0x11, 0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10, 0x64, 0x11, 0x30, 0x0F, 0x2B, 0x41, 0xF0, 0x48,
|
||||||
|
0x83, 0xC1, 0x40, 0x0F, 0x18, 0x44, 0x11, 0x40, 0x49, 0xFF, 0xC9, 0x0F, 0x2B, 0x49, 0xC0, 0x0F, 0x2B, 0x51, 0xD0, 0x0F,
|
||||||
|
0x2B, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xCC, 0x0F, 0xAE, 0xF8, 0xE9, 0x33, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0x40, 0x00,
|
||||||
|
0x49, 0x03, 0xC8, 0x0F, 0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10, 0x49, 0x83, 0xE8, 0x10, 0xF6, 0xC1, 0x0F, 0x74,
|
||||||
|
0x18, 0x4C, 0x8B, 0xD9, 0x48, 0x83, 0xE1, 0xF0, 0x0F, 0x10, 0x0C, 0x11, 0x41, 0x0F, 0x11, 0x03, 0x0F, 0x28, 0xC1, 0x4C,
|
||||||
|
0x8B, 0xC1, 0x4C, 0x2B, 0xC0, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x74, 0x39, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x04,
|
||||||
|
0x0F, 0x1F, 0x40, 0x00, 0x0F, 0x10, 0x4C, 0x11, 0xF0, 0x0F, 0x10, 0x54, 0x11, 0xE0, 0x0F, 0x10, 0x5C, 0x11, 0xD0, 0x0F,
|
||||||
|
0x10, 0x64, 0x11, 0xC0, 0x0F, 0x29, 0x01, 0x48, 0x83, 0xE9, 0x40, 0x49, 0xFF, 0xC9, 0x0F, 0x29, 0x49, 0x30, 0x0F, 0x29,
|
||||||
|
0x51, 0x20, 0x0F, 0x29, 0x59, 0x10, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19,
|
||||||
|
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x01, 0x0F, 0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10,
|
||||||
|
0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0F, 0x4C, 0x8B, 0xD9, 0x4D, 0x2B, 0xD8, 0x41, 0x0F, 0x10,
|
||||||
|
0x0C, 0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x01, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x28, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x64, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x9A, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xCE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x52, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1B, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x60, 0x1B, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC0, 0x11, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00,
|
||||||
|
0x30, 0x1B, 0x00, 0x00, 0x40, 0x1B, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFB, 0x66, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
|
||||||
|
0xF8, 0x21, 0x00, 0x00, 0xF8, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFB, 0x66, 0x6A, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0D, 0x00, 0x00, 0x00, 0x4C, 0x01, 0x00, 0x00, 0x48, 0x22, 0x00, 0x00, 0x48, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x30, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x00, 0x40,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x78, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x44, 0x53, 0x8B, 0xBE, 0xFF, 0x6B, 0xBF, 0xA0, 0x7B, 0x47, 0xB8, 0x13, 0xDB, 0x53,
|
||||||
|
0xCB, 0x3C, 0x4F, 0x51, 0x01, 0x00, 0x00, 0x00, 0x44, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x6A, 0x65, 0x63, 0x74, 0x5C, 0x58,
|
||||||
|
0x5C, 0x4D, 0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x52, 0x65, 0x6C,
|
||||||
|
0x65, 0x61, 0x73, 0x65, 0x5C, 0x4D, 0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x2E, 0x70, 0x64, 0x62,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x0B, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78,
|
||||||
|
0x74, 0x00, 0x00, 0x00, 0x30, 0x1B, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
|
||||||
|
0x24, 0x30, 0x30, 0x00, 0x80, 0x1B, 0x00, 0x00, 0xAA, 0x02, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
|
||||||
|
0x24, 0x32, 0x31, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x30, 0x30, 0x63, 0x66, 0x67, 0x00, 0x00,
|
||||||
|
0x80, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2E, 0x67, 0x66, 0x69, 0x64, 0x73, 0x00, 0x00, 0xA0, 0x20, 0x00, 0x00,
|
||||||
|
0x58, 0x01, 0x00, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0xF8, 0x21, 0x00, 0x00, 0xA0, 0x01, 0x00, 0x00,
|
||||||
|
0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x00, 0x00, 0x98, 0x23, 0x00, 0x00,
|
||||||
|
0x84, 0x00, 0x00, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
|
||||||
|
0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x2E, 0x62, 0x73, 0x73,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00,
|
||||||
|
0x00, 0x50, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x50, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x50, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x50, 0x00, 0x00,
|
||||||
|
0x70, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x00, 0x00,
|
||||||
|
0x20, 0x01, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x01, 0x00, 0x04, 0x42, 0x00, 0x00, 0x19, 0x11, 0x08, 0x35, 0x11, 0x03, 0x0C, 0x62, 0x08, 0x30, 0x07, 0x70,
|
||||||
|
0x06, 0x60, 0x05, 0xE0, 0x03, 0xF0, 0x01, 0x50, 0x30, 0x1B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5D, 0x10, 0x00, 0x00,
|
||||||
|
0x6B, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE7, 0x10, 0x00, 0x00, 0x01, 0x10, 0x09, 0x00, 0x10, 0x82, 0x0C, 0x30,
|
||||||
|
0x0B, 0x50, 0x0A, 0x70, 0x09, 0x60, 0x08, 0xC0, 0x06, 0xD0, 0x04, 0xE0, 0x02, 0xF0, 0x00, 0x00, 0x01, 0x0A, 0x06, 0x00,
|
||||||
|
0x0A, 0x52, 0x06, 0x30, 0x05, 0x50, 0x04, 0x70, 0x03, 0x60, 0x02, 0xE0, 0x01, 0x04, 0x01, 0x00, 0x04, 0x22, 0x00, 0x00,
|
||||||
|
0x02, 0x0A, 0x06, 0x00, 0x02, 0x06, 0x03, 0x06, 0x0A, 0x34, 0x06, 0x00, 0x0A, 0x32, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xBB, 0x88, 0xBB,
|
||||||
|
0xA9, 0xBB, 0xBA, 0xBB, 0xA5, 0xBB, 0xAF, 0xBB, 0xA9, 0xBB, 0x90, 0xBB, 0xA9, 0xBB, 0xBF, 0xBB, 0xBC, 0xBB, 0xCC, 0xBB,
|
||||||
|
0x00, 0x00, 0x90, 0xBB, 0x88, 0xBB, 0xA3, 0xBB, 0xBF, 0xBB, 0x88, 0xBB, 0xA9, 0xBB, 0xBA, 0xBB, 0xA5, 0xBB, 0xAF, 0xBB,
|
||||||
|
0xA9, 0xBB, 0xBF, 0xBB, 0x90, 0xBB, 0xA9, 0xBB, 0xBF, 0xBB, 0xBC, 0xBB, 0x93, 0xBB, 0xA0, 0xBB, 0xA5, 0xBB, 0xA2, 0xBB,
|
||||||
|
0xA7, 0xBB, 0xCC, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x32, 0xA2, 0xDF, 0x2D, 0x99, 0x2B, 0x00, 0x00, 0xCD, 0x5D, 0x20, 0xD2,
|
||||||
|
0x66, 0xD4, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x25, 0x10, 0x00, 0x00, 0x98, 0x23, 0x00, 0x00,
|
||||||
|
0x25, 0x10, 0x00, 0x00, 0xEE, 0x10, 0x00, 0x00, 0xA0, 0x23, 0x00, 0x00, 0xC0, 0x11, 0x00, 0x00, 0x58, 0x16, 0x00, 0x00,
|
||||||
|
0xCC, 0x23, 0x00, 0x00, 0x58, 0x16, 0x00, 0x00, 0x5C, 0x18, 0x00, 0x00, 0xCC, 0x23, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00,
|
||||||
|
0x42, 0x19, 0x00, 0x00, 0xE4, 0x23, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x36, 0x1A, 0x00, 0x00, 0xF4, 0x23, 0x00, 0x00,
|
||||||
|
0x36, 0x1A, 0x00, 0x00, 0x2C, 0x1B, 0x00, 0x00, 0xF4, 0x23, 0x00, 0x00, 0x60, 0x1B, 0x00, 0x00, 0x65, 0x1B, 0x00, 0x00,
|
||||||
|
0x18, 0x24, 0x00, 0x00, 0x80, 0x1B, 0x00, 0x00, 0x2A, 0x1E, 0x00, 0x00, 0x10, 0x24, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
|
||||||
|
0x2C, 0x50, 0x00, 0x00, 0xFC, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x48, 0x89, 0x5C, 0x24, 0x08, 0x57, 0x48, 0x83, 0xEC, 0x20, 0x48, 0x8B, 0xDA, 0x48, 0x8B, 0xF9, 0xE8, 0x17, 0x00, 0x00,
|
||||||
|
0x00, 0x48, 0x8B, 0xD3, 0x48, 0x8B, 0xCF, 0xE8, 0x38, 0xC6, 0xFF, 0xFF, 0x48, 0x8B, 0x5C, 0x24, 0x30, 0x48, 0x83, 0xC4,
|
||||||
|
0x20, 0x5F, 0xC3, 0xCC, 0x48, 0x8B, 0x05, 0x15, 0xE0, 0xFF, 0xFF, 0x45, 0x33, 0xC9, 0x49, 0xB8, 0x32, 0xA2, 0xDF, 0x2D,
|
||||||
|
0x99, 0x2B, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x05, 0x49, 0x3B, 0xC0, 0x75, 0x38, 0x0F, 0x31, 0x48, 0xC1, 0xE2, 0x20,
|
||||||
|
0x48, 0x8D, 0x0D, 0xF1, 0xDF, 0xFF, 0xFF, 0x48, 0x0B, 0xC2, 0x48, 0x33, 0xC1, 0x48, 0x89, 0x05, 0xE4, 0xDF, 0xFF, 0xFF,
|
||||||
|
0x66, 0x44, 0x89, 0x0D, 0xE2, 0xDF, 0xFF, 0xFF, 0x48, 0x8B, 0x05, 0xD5, 0xDF, 0xFF, 0xFF, 0x48, 0x85, 0xC0, 0x75, 0x0A,
|
||||||
|
0x49, 0x8B, 0xC0, 0x48, 0x89, 0x05, 0xC6, 0xDF, 0xFF, 0xFF, 0x48, 0xF7, 0xD0, 0x48, 0x89, 0x05, 0xC4, 0xDF, 0xFF, 0xFF,
|
||||||
|
0xC3, 0xCC, 0xCC, 0xCC, 0xB8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x52, 0x00, 0x00,
|
||||||
|
0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x4E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x9A, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xB6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xF8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x22, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x04, 0x49, 0x6F,
|
||||||
|
0x66, 0x43, 0x6F, 0x6D, 0x70, 0x6C, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x00, 0xC6, 0x02,
|
||||||
|
0x49, 0x6F, 0x41, 0x6C, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0xB5, 0x05, 0x4D, 0x6D, 0x50, 0x72,
|
||||||
|
0x6F, 0x62, 0x65, 0x41, 0x6E, 0x64, 0x4C, 0x6F, 0x63, 0x6B, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0xA1, 0x05, 0x4D, 0x6D,
|
||||||
|
0x4D, 0x61, 0x70, 0x4C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66,
|
||||||
|
0x79, 0x43, 0x61, 0x63, 0x68, 0x65, 0x00, 0x00, 0xCF, 0x05, 0x4D, 0x6D, 0x55, 0x6E, 0x6D, 0x61, 0x70, 0x4C, 0x6F, 0x63,
|
||||||
|
0x6B, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x00, 0xCC, 0x05, 0x4D, 0x6D, 0x55, 0x6E, 0x6C, 0x6F, 0x63, 0x6B,
|
||||||
|
0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x23, 0x03, 0x49, 0x6F, 0x46, 0x72, 0x65, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0x6E, 0x0B,
|
||||||
|
0x5F, 0x5F, 0x43, 0x5F, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72,
|
||||||
|
0x00, 0x00, 0x88, 0x08, 0x52, 0x74, 0x6C, 0x49, 0x6E, 0x69, 0x74, 0x55, 0x6E, 0x69, 0x63, 0x6F, 0x64, 0x65, 0x53, 0x74,
|
||||||
|
0x72, 0x69, 0x6E, 0x67, 0x00, 0x00, 0xF2, 0x02, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69,
|
||||||
|
0x63, 0x65, 0x00, 0x00, 0xFE, 0x02, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6D, 0x62, 0x6F, 0x6C,
|
||||||
|
0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x0A, 0x03, 0x49, 0x6F, 0x44, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x44, 0x65,
|
||||||
|
0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x0C, 0x03, 0x49, 0x6F, 0x44, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6D, 0x62,
|
||||||
|
0x6F, 0x6C, 0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x6E, 0x74, 0x6F, 0x73, 0x6B, 0x72, 0x6E, 0x6C, 0x2E, 0x65,
|
||||||
|
0x78, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x70, 0xA0, 0x78, 0xA0, 0x38, 0xA1, 0x50, 0xA1,
|
||||||
|
0x58, 0xA1, 0x60, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0x00, 0x00,
|
||||||
|
0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x14, 0x14, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0,
|
||||||
|
0x82, 0x14, 0x05, 0x30, 0x82, 0x14, 0x01, 0x02, 0x01, 0x01, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02,
|
||||||
|
0x1A, 0x05, 0x00, 0x30, 0x4C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xA0, 0x3E, 0x30,
|
||||||
|
0x3C, 0x30, 0x17, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x09, 0x03, 0x01, 0x00,
|
||||||
|
0xA0, 0x04, 0xA2, 0x02, 0x80, 0x00, 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04,
|
||||||
|
0x14, 0xDE, 0x84, 0xF6, 0x47, 0x2C, 0xFE, 0xD2, 0xD7, 0x48, 0xAD, 0x32, 0x79, 0x9A, 0x02, 0x1F, 0xDF, 0xF9, 0xEC, 0x93,
|
||||||
|
0xF9, 0xA0, 0x82, 0x11, 0x38, 0x30, 0x82, 0x05, 0x88, 0x30, 0x82, 0x04, 0x70, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10,
|
||||||
|
0x0C, 0xEA, 0x5C, 0x41, 0xB4, 0xB3, 0x56, 0x60, 0xB8, 0x83, 0xBA, 0x06, 0xDE, 0xF5, 0xA0, 0x53, 0x30, 0x0D, 0x06, 0x09,
|
||||||
|
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
|
||||||
|
0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65,
|
||||||
|
0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04,
|
||||||
|
0x0B, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65,
|
||||||
|
0x74, 0x77, 0x6F, 0x72, 0x6B, 0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x32, 0x54, 0x65, 0x72, 0x6D,
|
||||||
|
0x73, 0x20, 0x6F, 0x66, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F,
|
||||||
|
0x77, 0x77, 0x77, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61,
|
||||||
|
0x20, 0x28, 0x63, 0x29, 0x31, 0x30, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x56, 0x65, 0x72,
|
||||||
|
0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53,
|
||||||
|
0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x34,
|
||||||
|
0x30, 0x33, 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x31, 0x35, 0x30, 0x33, 0x32, 0x35, 0x32,
|
||||||
|
0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x81, 0xCB, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
|
||||||
|
0x43, 0x4E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x4A, 0x69, 0x61, 0x6E, 0x67, 0x78, 0x69,
|
||||||
|
0x31, 0x0E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x05, 0x4A, 0x69, 0x27, 0x61, 0x6E, 0x31, 0x2C, 0x30, 0x2A,
|
||||||
|
0x06, 0x03, 0x55, 0x04, 0x0A, 0x14, 0x23, 0x41, 0x6E, 0x46, 0x75, 0x20, 0x4E, 0x65, 0x74, 0x53, 0x68, 0x69, 0x65, 0x6C,
|
||||||
|
0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x20, 0x43, 0x6F, 0x2E, 0x2C, 0x20, 0x4C, 0x74,
|
||||||
|
0x64, 0x2E, 0x31, 0x3E, 0x30, 0x3C, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x35, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6C,
|
||||||
|
0x20, 0x49, 0x44, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x2D, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73,
|
||||||
|
0x6F, 0x66, 0x74, 0x20, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74,
|
||||||
|
0x69, 0x6F, 0x6E, 0x20, 0x76, 0x32, 0x31, 0x2C, 0x30, 0x2A, 0x06, 0x03, 0x55, 0x04, 0x03, 0x14, 0x23, 0x41, 0x6E, 0x46,
|
||||||
|
0x75, 0x20, 0x4E, 0x65, 0x74, 0x53, 0x68, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F,
|
||||||
|
0x67, 0x79, 0x20, 0x43, 0x6F, 0x2E, 0x2C, 0x20, 0x4C, 0x74, 0x64, 0x2E, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09,
|
||||||
|
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A,
|
||||||
|
0x02, 0x82, 0x01, 0x01, 0x00, 0xBF, 0x76, 0x8D, 0xA6, 0x12, 0x1F, 0x8D, 0x7B, 0x41, 0x60, 0xFA, 0x43, 0x79, 0xF7, 0x8D,
|
||||||
|
0x59, 0xEB, 0xA0, 0xAC, 0xD8, 0xDD, 0xD5, 0x45, 0xC2, 0x80, 0x22, 0xBB, 0xDF, 0x61, 0xD6, 0x4A, 0x02, 0x70, 0xDF, 0x3F,
|
||||||
|
0xFE, 0x52, 0xD8, 0xA5, 0xEA, 0x5A, 0xC2, 0x55, 0x5B, 0x98, 0xD1, 0x5E, 0x9F, 0x1E, 0x4E, 0x08, 0x33, 0x08, 0xED, 0x7C,
|
||||||
|
0x35, 0x06, 0x10, 0x34, 0xE1, 0xDF, 0x7C, 0x85, 0x9D, 0x63, 0x79, 0x5B, 0x1B, 0xCE, 0x54, 0x3C, 0xA3, 0xAC, 0x46, 0xC2,
|
||||||
|
0x06, 0xF7, 0xA3, 0xF8, 0xAE, 0x10, 0xE1, 0x53, 0xF5, 0xC2, 0x94, 0xA8, 0xFF, 0x04, 0xFC, 0x32, 0x2B, 0x36, 0x94, 0x82,
|
||||||
|
0x04, 0x88, 0xB5, 0x53, 0x5E, 0x66, 0xFC, 0xB8, 0x17, 0x7E, 0x3D, 0x34, 0x0F, 0xE1, 0xBA, 0xD8, 0xB7, 0x87, 0xAA, 0x01,
|
||||||
|
0x6D, 0xBC, 0x2E, 0x68, 0x7C, 0xC6, 0x00, 0xA4, 0xEB, 0xEC, 0x31, 0xB2, 0xE0, 0x93, 0xD3, 0x46, 0x79, 0xF9, 0xE0, 0x17,
|
||||||
|
0x8C, 0xC9, 0xE2, 0xDC, 0x99, 0x61, 0xB9, 0x4A, 0x56, 0xC4, 0xA8, 0x4F, 0x1E, 0xBD, 0x5F, 0x2D, 0x2F, 0x4D, 0x92, 0xE3,
|
||||||
|
0xE5, 0x60, 0xB3, 0x39, 0x1C, 0xE7, 0x70, 0xA2, 0x0C, 0x5F, 0xDE, 0xB1, 0x34, 0x19, 0x67, 0xC1, 0xA8, 0x91, 0xF8, 0x89,
|
||||||
|
0x87, 0x45, 0x8F, 0x5C, 0x54, 0x38, 0xD2, 0x80, 0x25, 0x81, 0xDF, 0xB2, 0xBF, 0x08, 0x43, 0xCB, 0x18, 0x1F, 0x20, 0x7A,
|
||||||
|
0x82, 0xC8, 0x58, 0x3E, 0x3A, 0xD6, 0x42, 0x03, 0x72, 0x27, 0xAC, 0xA8, 0x95, 0x68, 0xE2, 0x8F, 0xAC, 0xF8, 0xC4, 0x0C,
|
||||||
|
0x85, 0x6D, 0x8E, 0x24, 0xB8, 0x0B, 0x9E, 0x17, 0x22, 0xF4, 0xEE, 0xF6, 0xAD, 0x5C, 0xE3, 0x83, 0x70, 0x38, 0x1B, 0x6C,
|
||||||
|
0xE9, 0x60, 0x74, 0x1D, 0xD7, 0xE1, 0x78, 0x4B, 0x13, 0x24, 0xBA, 0x46, 0x77, 0xA3, 0x88, 0xCB, 0xBF, 0x10, 0x79, 0x6D,
|
||||||
|
0x9D, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x7B, 0x30, 0x82, 0x01, 0x77, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1D,
|
||||||
|
0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07,
|
||||||
|
0x80, 0x30, 0x40, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x39, 0x30, 0x37, 0x30, 0x35, 0xA0, 0x33, 0xA0, 0x31, 0x86, 0x2F,
|
||||||
|
0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x73, 0x63, 0x33, 0x2D, 0x32, 0x30, 0x31, 0x30, 0x2D, 0x63, 0x72, 0x6C,
|
||||||
|
0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x43, 0x53, 0x43, 0x33, 0x2D, 0x32,
|
||||||
|
0x30, 0x31, 0x30, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x3D, 0x30, 0x3B, 0x30, 0x39,
|
||||||
|
0x06, 0x0B, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x07, 0x17, 0x03, 0x30, 0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B,
|
||||||
|
0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77,
|
||||||
|
0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61, 0x30, 0x13, 0x06,
|
||||||
|
0x03, 0x55, 0x1D, 0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x71,
|
||||||
|
0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x65, 0x30, 0x63, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06,
|
||||||
|
0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E,
|
||||||
|
0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x3B, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05,
|
||||||
|
0x05, 0x07, 0x30, 0x02, 0x86, 0x2F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x73, 0x63, 0x33, 0x2D, 0x32, 0x30,
|
||||||
|
0x31, 0x30, 0x2D, 0x61, 0x69, 0x61, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F,
|
||||||
|
0x43, 0x53, 0x43, 0x33, 0x2D, 0x32, 0x30, 0x31, 0x30, 0x2E, 0x63, 0x65, 0x72, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,
|
||||||
|
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xCF, 0x99, 0xA9, 0xEA, 0x7B, 0x26, 0xF4, 0x4B, 0xC9, 0x8E, 0x8F, 0xD7, 0xF0, 0x05,
|
||||||
|
0x26, 0xEF, 0xE3, 0xD2, 0xA7, 0x9D, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x42, 0x01, 0x01, 0x04,
|
||||||
|
0x04, 0x03, 0x02, 0x04, 0x10, 0x30, 0x16, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x1B, 0x04,
|
||||||
|
0x08, 0x30, 0x06, 0x01, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
|
||||||
|
0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5A, 0x01, 0xF1, 0xB2, 0xC2, 0xB2, 0x39, 0xBA, 0x6D, 0x72, 0x84,
|
||||||
|
0xA0, 0xBF, 0x17, 0xA2, 0x6B, 0x32, 0xE8, 0x29, 0x9D, 0x93, 0x79, 0x34, 0x05, 0xC2, 0x64, 0x75, 0xBB, 0x92, 0xE5, 0x8E,
|
||||||
|
0x7B, 0x29, 0xB3, 0xED, 0xBD, 0xA4, 0x3D, 0x22, 0x8D, 0xB2, 0x95, 0x39, 0x94, 0x97, 0x69, 0x64, 0x2F, 0xF1, 0x42, 0x34,
|
||||||
|
0xA3, 0x35, 0x90, 0x85, 0x3D, 0xB8, 0x8F, 0x15, 0x18, 0x1F, 0x76, 0xDA, 0x50, 0x22, 0xB1, 0x51, 0x9E, 0x7E, 0x33, 0x20,
|
||||||
|
0x21, 0xA7, 0x04, 0xCC, 0x1F, 0x97, 0xF7, 0x8D, 0xFC, 0x89, 0xB1, 0x53, 0x43, 0xC1, 0xDC, 0x3D, 0xAA, 0x15, 0xF6, 0xD3,
|
||||||
|
0xF2, 0x8B, 0xC1, 0x1D, 0x06, 0x8D, 0xAB, 0x6F, 0x78, 0x3C, 0xBA, 0x2A, 0x42, 0xBB, 0xC9, 0x90, 0x4B, 0x30, 0x87, 0x07,
|
||||||
|
0x48, 0x59, 0x11, 0x04, 0x84, 0xAF, 0xC1, 0x85, 0xCB, 0x1D, 0x61, 0xC4, 0x04, 0x65, 0x81, 0xAD, 0x25, 0xB2, 0x0C, 0xB3,
|
||||||
|
0x1A, 0x0A, 0xE2, 0x2D, 0xE8, 0xF3, 0xF5, 0xBB, 0x37, 0x40, 0x4E, 0xEC, 0xE6, 0x86, 0x4D, 0x88, 0xA7, 0x33, 0x42, 0xA4,
|
||||||
|
0x3D, 0x68, 0xDE, 0x57, 0xC2, 0x8F, 0x35, 0xB4, 0xD8, 0x12, 0x31, 0x50, 0xFF, 0x36, 0x57, 0x04, 0x71, 0xC3, 0xD4, 0x66,
|
||||||
|
0x42, 0x72, 0x7C, 0xC9, 0x43, 0xAE, 0xBE, 0xCB, 0x77, 0x75, 0x2C, 0x87, 0x1E, 0x8E, 0xF3, 0x41, 0x74, 0xDE, 0x9A, 0x91,
|
||||||
|
0x2F, 0xD6, 0x5F, 0xBF, 0xDB, 0xFE, 0x89, 0x8A, 0xD2, 0x1D, 0x3B, 0x6B, 0x39, 0x75, 0x16, 0xCC, 0x02, 0x79, 0x62, 0x2D,
|
||||||
|
0x28, 0x38, 0x0E, 0x6A, 0xBD, 0x5C, 0x6A, 0x1F, 0xBF, 0x1D, 0x02, 0x13, 0xCB, 0x90, 0xF7, 0xF5, 0xC4, 0xD0, 0x15, 0x3E,
|
||||||
|
0x86, 0xEE, 0xD2, 0x8D, 0x60, 0x47, 0xF5, 0x6B, 0x88, 0x83, 0x84, 0xF5, 0x7D, 0x71, 0x05, 0x7E, 0x56, 0xF1, 0xEB, 0xA7,
|
||||||
|
0x80, 0x54, 0xCD, 0xEE, 0xE9, 0x30, 0x82, 0x05, 0x9A, 0x30, 0x82, 0x03, 0x82, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0A,
|
||||||
|
0x61, 0x19, 0x93, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
|
||||||
|
0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53,
|
||||||
|
0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F,
|
||||||
|
0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31,
|
||||||
|
0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20,
|
||||||
|
0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03,
|
||||||
|
0x13, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x56, 0x65, 0x72,
|
||||||
|
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x31,
|
||||||
|
0x30, 0x32, 0x32, 0x32, 0x31, 0x39, 0x32, 0x35, 0x31, 0x37, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x32, 0x32, 0x32, 0x31,
|
||||||
|
0x39, 0x33, 0x35, 0x31, 0x37, 0x5A, 0x30, 0x81, 0xCA, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
|
||||||
|
0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
|
||||||
|
0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56, 0x65,
|
||||||
|
0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B,
|
||||||
|
0x31, 0x3A, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20,
|
||||||
|
0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x2D, 0x20, 0x46, 0x6F, 0x72,
|
||||||
|
0x20, 0x61, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6F, 0x6E, 0x6C, 0x79,
|
||||||
|
0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3C, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20,
|
||||||
|
0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x61,
|
||||||
|
0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74,
|
||||||
|
0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x35, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A,
|
||||||
|
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02,
|
||||||
|
0x82, 0x01, 0x01, 0x00, 0xAF, 0x24, 0x08, 0x08, 0x29, 0x7A, 0x35, 0x9E, 0x60, 0x0C, 0xAA, 0xE7, 0x4B, 0x3B, 0x4E, 0xDC,
|
||||||
|
0x7C, 0xBC, 0x3C, 0x45, 0x1C, 0xBB, 0x2B, 0xE0, 0xFE, 0x29, 0x02, 0xF9, 0x57, 0x08, 0xA3, 0x64, 0x85, 0x15, 0x27, 0xF5,
|
||||||
|
0xF1, 0xAD, 0xC8, 0x31, 0x89, 0x5D, 0x22, 0xE8, 0x2A, 0xAA, 0xA6, 0x42, 0xB3, 0x8F, 0xF8, 0xB9, 0x55, 0xB7, 0xB1, 0xB7,
|
||||||
|
0x4B, 0xB3, 0xFE, 0x8F, 0x7E, 0x07, 0x57, 0xEC, 0xEF, 0x43, 0xDB, 0x66, 0x62, 0x15, 0x61, 0xCF, 0x60, 0x0D, 0xA4, 0xD8,
|
||||||
|
0xDE, 0xF8, 0xE0, 0xC3, 0x62, 0x08, 0x3D, 0x54, 0x13, 0xEB, 0x49, 0xCA, 0x59, 0x54, 0x85, 0x26, 0xE5, 0x2B, 0x8F, 0x1B,
|
||||||
|
0x9F, 0xEB, 0xF5, 0xA1, 0x91, 0xC2, 0x33, 0x49, 0xD8, 0x43, 0x63, 0x6A, 0x52, 0x4B, 0xD2, 0x8F, 0xE8, 0x70, 0x51, 0x4D,
|
||||||
|
0xD1, 0x89, 0x69, 0x7B, 0xC7, 0x70, 0xF6, 0xB3, 0xDC, 0x12, 0x74, 0xDB, 0x7B, 0x5D, 0x4B, 0x56, 0xD3, 0x96, 0xBF, 0x15,
|
||||||
|
0x77, 0xA1, 0xB0, 0xF4, 0xA2, 0x25, 0xF2, 0xAF, 0x1C, 0x92, 0x67, 0x18, 0xE5, 0xF4, 0x06, 0x04, 0xEF, 0x90, 0xB9, 0xE4,
|
||||||
|
0x00, 0xE4, 0xDD, 0x3A, 0xB5, 0x19, 0xFF, 0x02, 0xBA, 0xF4, 0x3C, 0xEE, 0xE0, 0x8B, 0xEB, 0x37, 0x8B, 0xEC, 0xF4, 0xD7,
|
||||||
|
0xAC, 0xF2, 0xF6, 0xF0, 0x3D, 0xAF, 0xDD, 0x75, 0x91, 0x33, 0x19, 0x1D, 0x1C, 0x40, 0xCB, 0x74, 0x24, 0x19, 0x21, 0x93,
|
||||||
|
0xD9, 0x14, 0xFE, 0xAC, 0x2A, 0x52, 0xC7, 0x8F, 0xD5, 0x04, 0x49, 0xE4, 0x8D, 0x63, 0x47, 0x88, 0x3C, 0x69, 0x83, 0xCB,
|
||||||
|
0xFE, 0x47, 0xBD, 0x2B, 0x7E, 0x4F, 0xC5, 0x95, 0xAE, 0x0E, 0x9D, 0xD4, 0xD1, 0x43, 0xC0, 0x67, 0x73, 0xE3, 0x14, 0x08,
|
||||||
|
0x7E, 0xE5, 0x3F, 0x9F, 0x73, 0xB8, 0x33, 0x0A, 0xCF, 0x5D, 0x3F, 0x34, 0x87, 0x96, 0x8A, 0xEE, 0x53, 0xE8, 0x25, 0x15,
|
||||||
|
0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x81, 0xCB, 0x30, 0x81, 0xC8, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x0A,
|
||||||
|
0x30, 0x08, 0x30, 0x06, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF,
|
||||||
|
0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86,
|
||||||
|
0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x7F, 0xD3, 0x65, 0xA7, 0xC2, 0xDD, 0xEC, 0xBB, 0xF0,
|
||||||
|
0x30, 0x09, 0xF3, 0x43, 0x39, 0xFA, 0x02, 0xAF, 0x33, 0x31, 0x33, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18,
|
||||||
|
0x30, 0x16, 0x80, 0x14, 0x62, 0xFB, 0x0A, 0x21, 0x5B, 0x7F, 0x43, 0x6E, 0x11, 0xDA, 0x09, 0x54, 0x50, 0x6B, 0xF5, 0xD2,
|
||||||
|
0x96, 0x71, 0xF1, 0x9E, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x4E, 0x30, 0x4C, 0x30, 0x4A, 0xA0, 0x48, 0xA0,
|
||||||
|
0x46, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73,
|
||||||
|
0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72, 0x6F, 0x64,
|
||||||
|
0x75, 0x63, 0x74, 0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x43, 0x6F, 0x64, 0x65, 0x56, 0x65,
|
||||||
|
0x72, 0x69, 0x66, 0x52, 0x6F, 0x6F, 0x74, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
|
||||||
|
0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x81, 0x2A, 0x82, 0x16, 0x8C, 0x34, 0x67, 0x2B, 0xE5,
|
||||||
|
0x03, 0xEB, 0x34, 0x7B, 0x8C, 0xA2, 0xA3, 0x50, 0x8A, 0xF4, 0x55, 0x86, 0xF1, 0x1E, 0x8C, 0x8E, 0xAE, 0x7D, 0xEE, 0x03,
|
||||||
|
0x19, 0xCE, 0x72, 0x95, 0x18, 0x48, 0xAD, 0x62, 0x11, 0xFD, 0x20, 0xFD, 0x3F, 0x47, 0x06, 0x01, 0x5A, 0xE2, 0xE0, 0x6F,
|
||||||
|
0x8C, 0x15, 0x2C, 0x4E, 0x3C, 0x6A, 0x50, 0x6C, 0x0B, 0x36, 0xA3, 0xCF, 0x7A, 0x0D, 0x9C, 0x42, 0xBC, 0x5C, 0xF8, 0x19,
|
||||||
|
0xD5, 0x60, 0xE3, 0x69, 0xE6, 0xE2, 0x23, 0x41, 0x67, 0x8C, 0x68, 0x83, 0x76, 0x2B, 0x8F, 0x93, 0xA3, 0x2A, 0xB5, 0x7F,
|
||||||
|
0xBE, 0x59, 0xFB, 0xA9, 0xC9, 0xB2, 0x26, 0x8F, 0xCA, 0xA2, 0xF3, 0x82, 0x1B, 0x98, 0x3E, 0x91, 0x95, 0x27, 0x97, 0x86,
|
||||||
|
0x61, 0xEE, 0x5B, 0x5D, 0x07, 0x6B, 0xCD, 0x86, 0xA8, 0xE2, 0x65, 0x80, 0xA8, 0xE2, 0x15, 0xE2, 0xB2, 0xBE, 0x23, 0x05,
|
||||||
|
0x6A, 0xBA, 0x0C, 0xF3, 0x47, 0x93, 0x4D, 0xAC, 0xA4, 0x8C, 0x07, 0x79, 0x39, 0xC0, 0x61, 0x12, 0x3A, 0x05, 0x0D, 0x89,
|
||||||
|
0xA3, 0xEC, 0x9F, 0x57, 0x89, 0x84, 0xFB, 0xEC, 0xCA, 0x7C, 0x47, 0x66, 0x14, 0x91, 0xD8, 0xB6, 0x0F, 0x19, 0x5D, 0xE6,
|
||||||
|
0xB8, 0x4A, 0xAC, 0xBC, 0x47, 0xC8, 0x71, 0x43, 0x96, 0xE6, 0x32, 0x20, 0xA5, 0xDC, 0x77, 0x86, 0xFD, 0x3C, 0xE3, 0x8B,
|
||||||
|
0x71, 0xDB, 0x7B, 0x9B, 0x03, 0xFC, 0xB7, 0x1D, 0x32, 0x64, 0xEB, 0x16, 0x52, 0xA0, 0x43, 0xA3, 0xFA, 0x2E, 0xAD, 0x59,
|
||||||
|
0x92, 0x4E, 0x7C, 0xC7, 0xF2, 0x33, 0x42, 0x48, 0x38, 0x51, 0x3A, 0x7C, 0x38, 0xC7, 0x1B, 0x24, 0x22, 0x28, 0x40, 0x1E,
|
||||||
|
0x1A, 0x46, 0x1F, 0x17, 0xDB, 0x18, 0xF7, 0xF0, 0x27, 0x35, 0x6C, 0xB8, 0x63, 0xD9, 0xCD, 0xB9, 0x64, 0x5D, 0x2B, 0xA5,
|
||||||
|
0x5E, 0xEF, 0xC6, 0x29, 0xB4, 0xF2, 0xC7, 0xF8, 0x21, 0xCC, 0x04, 0xBA, 0x57, 0xFD, 0x01, 0xB6, 0xAB, 0xC6, 0x67, 0xF9,
|
||||||
|
0xE7, 0xD3, 0x99, 0x7F, 0xF4, 0xF5, 0x22, 0xFA, 0x72, 0xF5, 0xFD, 0xFF, 0x3A, 0x1C, 0x42, 0x3A, 0xA1, 0xF9, 0x80, 0x18,
|
||||||
|
0xA5, 0xEE, 0x8D, 0x1C, 0xD4, 0x66, 0x9E, 0x45, 0x01, 0xFE, 0xAA, 0xEE, 0xFF, 0xFB, 0x17, 0x8F, 0x30, 0xF7, 0xF1, 0xCD,
|
||||||
|
0x29, 0xC5, 0x9D, 0xEC, 0xB5, 0xD5, 0x49, 0x00, 0x3D, 0x85, 0xB8, 0xCB, 0xBB, 0x93, 0x3A, 0x27, 0x6A, 0x49, 0xC0, 0x30,
|
||||||
|
0xAE, 0x66, 0xC9, 0xF7, 0x23, 0x28, 0x32, 0x76, 0xF9, 0xA4, 0x83, 0x56, 0xC8, 0x48, 0xCE, 0x5A, 0x96, 0xAA, 0xA0, 0xCC,
|
||||||
|
0x0C, 0xC4, 0x7F, 0xB4, 0x8E, 0x97, 0xAF, 0x6D, 0xE3, 0x54, 0x27, 0xC3, 0x9F, 0x86, 0xC0, 0xD6, 0xE4, 0x73, 0x08, 0x97,
|
||||||
|
0x05, 0xDB, 0xD0, 0x54, 0x62, 0x5E, 0x03, 0x48, 0xC2, 0xD5, 0x9F, 0x7F, 0xA7, 0x66, 0x8C, 0xD0, 0x9D, 0xB0, 0x4F, 0xD4,
|
||||||
|
0xD3, 0x98, 0x5F, 0x4B, 0x7A, 0xC9, 0x7F, 0xB2, 0x29, 0x52, 0xD0, 0x12, 0x80, 0xC7, 0x0F, 0x54, 0xB6, 0x1E, 0x67, 0xCD,
|
||||||
|
0xC6, 0xA0, 0x6C, 0x11, 0x03, 0x84, 0xD3, 0x48, 0x75, 0xE7, 0x2A, 0xFE, 0xB0, 0x3B, 0x6E, 0x0A, 0x3A, 0xA6, 0x6B, 0x76,
|
||||||
|
0x99, 0x05, 0xA3, 0xF1, 0x77, 0x68, 0x61, 0x33, 0x14, 0x47, 0x06, 0xFC, 0x53, 0x7F, 0x52, 0xBD, 0x92, 0x14, 0x5C, 0x4A,
|
||||||
|
0x24, 0x6A, 0x67, 0x8C, 0xAF, 0x8D, 0x90, 0xAA, 0xD0, 0xF6, 0x79, 0x21, 0x1B, 0x93, 0x26, 0x7C, 0xC3, 0xCE, 0x1E, 0xBD,
|
||||||
|
0x88, 0x38, 0x92, 0xAE, 0x45, 0xC6, 0x19, 0x6A, 0x49, 0x50, 0xB3, 0x05, 0xF8, 0xAE, 0x59, 0x37, 0x8A, 0x6A, 0x25, 0x03,
|
||||||
|
0x94, 0xB1, 0x59, 0x81, 0x50, 0xE8, 0xBA, 0x83, 0x80, 0xB7, 0x23, 0x35, 0xF4, 0x76, 0xB9, 0x67, 0x1D, 0x59, 0x18, 0xAD,
|
||||||
|
0x20, 0x8D, 0x94, 0x30, 0x82, 0x06, 0x0A, 0x30, 0x82, 0x04, 0xF2, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x52, 0x00,
|
||||||
|
0xE5, 0xAA, 0x25, 0x56, 0xFC, 0x1A, 0x86, 0xED, 0x96, 0xC9, 0xD4, 0x4B, 0x33, 0xC7, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86,
|
||||||
|
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xCA, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
|
||||||
|
0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69,
|
||||||
|
0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
|
||||||
|
0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77,
|
||||||
|
0x6F, 0x72, 0x6B, 0x31, 0x3A, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30,
|
||||||
|
0x30, 0x36, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x2D, 0x20,
|
||||||
|
0x46, 0x6F, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6F,
|
||||||
|
0x6E, 0x6C, 0x79, 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3C, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69,
|
||||||
|
0x67, 0x6E, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x50, 0x72,
|
||||||
|
0x69, 0x6D, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20,
|
||||||
|
0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x35, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x30,
|
||||||
|
0x30, 0x32, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x32, 0x30, 0x37, 0x32,
|
||||||
|
0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
|
||||||
|
0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
|
||||||
|
0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56, 0x65,
|
||||||
|
0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B,
|
||||||
|
0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x32, 0x54, 0x65, 0x72, 0x6D, 0x73, 0x20, 0x6F, 0x66, 0x20,
|
||||||
|
0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76,
|
||||||
|
0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61, 0x20, 0x28, 0x63, 0x29, 0x31,
|
||||||
|
0x30, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E,
|
||||||
|
0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6E, 0x69, 0x6E,
|
||||||
|
0x67, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
|
||||||
|
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01,
|
||||||
|
0x01, 0x00, 0xF5, 0x23, 0x4B, 0x5E, 0xA5, 0xD7, 0x8A, 0xBB, 0x32, 0xE9, 0xD4, 0x57, 0xF7, 0xEF, 0xE4, 0xC7, 0x26, 0x7E,
|
||||||
|
0xAD, 0x19, 0x98, 0xFE, 0xA8, 0x9D, 0x7D, 0x94, 0xF6, 0x36, 0x6B, 0x10, 0xD7, 0x75, 0x81, 0x30, 0x7F, 0x04, 0x68, 0x7F,
|
||||||
|
0xCB, 0x2B, 0x75, 0x1E, 0xCD, 0x1D, 0x08, 0x8C, 0xDF, 0x69, 0x94, 0xA7, 0x37, 0xA3, 0x9C, 0x7B, 0x80, 0xE0, 0x99, 0xE1,
|
||||||
|
0xEE, 0x37, 0x4D, 0x5F, 0xCE, 0x3B, 0x14, 0xEE, 0x86, 0xD4, 0xD0, 0xF5, 0x27, 0x35, 0xBC, 0x25, 0x0B, 0x38, 0xA7, 0x8C,
|
||||||
|
0x63, 0x9D, 0x17, 0xA3, 0x08, 0xA5, 0xAB, 0xB0, 0xFB, 0xCD, 0x6A, 0x62, 0x82, 0x4C, 0xD5, 0x21, 0xDA, 0x1B, 0xD9, 0xF1,
|
||||||
|
0xE3, 0x84, 0x3B, 0x8A, 0x2A, 0x4F, 0x85, 0x5B, 0x90, 0x01, 0x4F, 0xC9, 0xA7, 0x76, 0x10, 0x7F, 0x27, 0x03, 0x7C, 0xBE,
|
||||||
|
0xAE, 0x7E, 0x7D, 0xC1, 0xDD, 0xF9, 0x05, 0xBC, 0x1B, 0x48, 0x9C, 0x69, 0xE7, 0xC0, 0xA4, 0x3C, 0x3C, 0x41, 0x00, 0x3E,
|
||||||
|
0xDF, 0x96, 0xE5, 0xC5, 0xE4, 0x94, 0x71, 0xD6, 0x55, 0x01, 0xC7, 0x00, 0x26, 0x4A, 0x40, 0x3C, 0xB5, 0xA1, 0x26, 0xA9,
|
||||||
|
0x0C, 0xA7, 0x6D, 0x80, 0x8E, 0x90, 0x25, 0x7B, 0xCF, 0xBF, 0x3F, 0x1C, 0xEB, 0x2F, 0x96, 0xFA, 0xE5, 0x87, 0x77, 0xC6,
|
||||||
|
0xB5, 0x56, 0xB2, 0x7A, 0x3B, 0x54, 0x30, 0x53, 0x1B, 0xDF, 0x62, 0x34, 0xFF, 0x1E, 0xD1, 0xF4, 0x5A, 0x93, 0x28, 0x85,
|
||||||
|
0xE5, 0x4C, 0x17, 0x4E, 0x7E, 0x5B, 0xFD, 0xA4, 0x93, 0x99, 0x7F, 0xDF, 0xCD, 0xEF, 0xA4, 0x75, 0xEF, 0xEF, 0x15, 0xF6,
|
||||||
|
0x47, 0xE7, 0xF8, 0x19, 0x72, 0xD8, 0x2E, 0x34, 0x1A, 0xA6, 0xB4, 0xA7, 0x4C, 0x7E, 0xBD, 0xBB, 0x4F, 0x0C, 0x3D, 0x57,
|
||||||
|
0xF1, 0x30, 0xD6, 0xA6, 0x36, 0x8E, 0xD6, 0x80, 0x76, 0xD7, 0x19, 0x2E, 0xA5, 0xCD, 0x7E, 0x34, 0x2D, 0x89, 0x02, 0x03,
|
||||||
|
0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xFE, 0x30, 0x82, 0x01, 0xFA, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01,
|
||||||
|
0xFF, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x70, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x69,
|
||||||
|
0x30, 0x67, 0x30, 0x65, 0x06, 0x0B, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x07, 0x17, 0x03, 0x30, 0x56, 0x30,
|
||||||
|
0x28, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F,
|
||||||
|
0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x63, 0x70,
|
||||||
|
0x73, 0x30, 0x2A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x1E, 0x1A, 0x1C, 0x68, 0x74, 0x74,
|
||||||
|
0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F,
|
||||||
|
0x6D, 0x2F, 0x72, 0x70, 0x61, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01,
|
||||||
|
0x06, 0x30, 0x6D, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0C, 0x04, 0x61, 0x30, 0x5F, 0xA1, 0x5D, 0xA0,
|
||||||
|
0x5B, 0x30, 0x59, 0x30, 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, 0x30, 0x21,
|
||||||
|
0x30, 0x1F, 0x30, 0x07, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x04, 0x14, 0x8F, 0xE5, 0xD3, 0x1A, 0x86, 0xAC, 0x8D,
|
||||||
|
0x8E, 0x6B, 0xC3, 0xCF, 0x80, 0x6A, 0xD4, 0x48, 0x18, 0x2C, 0x7B, 0x19, 0x2E, 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, 0x74,
|
||||||
|
0x70, 0x3A, 0x2F, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F,
|
||||||
|
0x6D, 0x2F, 0x76, 0x73, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x67, 0x69, 0x66, 0x30, 0x34, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04,
|
||||||
|
0x2D, 0x30, 0x2B, 0x30, 0x29, 0xA0, 0x27, 0xA0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72,
|
||||||
|
0x6C, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x63, 0x61, 0x33, 0x2D,
|
||||||
|
0x67, 0x35, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x34, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x28,
|
||||||
|
0x30, 0x26, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70,
|
||||||
|
0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D,
|
||||||
|
0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03,
|
||||||
|
0x02, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x28, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x21,
|
||||||
|
0x30, 0x1F, 0xA4, 0x1D, 0x30, 0x1B, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x56, 0x65, 0x72,
|
||||||
|
0x69, 0x53, 0x69, 0x67, 0x6E, 0x4D, 0x50, 0x4B, 0x49, 0x2D, 0x32, 0x2D, 0x38, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E,
|
||||||
|
0x04, 0x16, 0x04, 0x14, 0xCF, 0x99, 0xA9, 0xEA, 0x7B, 0x26, 0xF4, 0x4B, 0xC9, 0x8E, 0x8F, 0xD7, 0xF0, 0x05, 0x26, 0xEF,
|
||||||
|
0xE3, 0xD2, 0xA7, 0x9D, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x7F, 0xD3, 0x65,
|
||||||
|
0xA7, 0xC2, 0xDD, 0xEC, 0xBB, 0xF0, 0x30, 0x09, 0xF3, 0x43, 0x39, 0xFA, 0x02, 0xAF, 0x33, 0x31, 0x33, 0x30, 0x0D, 0x06,
|
||||||
|
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x56, 0x22, 0xE6,
|
||||||
|
0x34, 0xA4, 0xC4, 0x61, 0xCB, 0x48, 0xB9, 0x01, 0xAD, 0x56, 0xA8, 0x64, 0x0F, 0xD9, 0x8C, 0x91, 0xC4, 0xBB, 0xCC, 0x0C,
|
||||||
|
0xE5, 0xAD, 0x7A, 0xA0, 0x22, 0x7F, 0xDF, 0x47, 0x38, 0x4A, 0x2D, 0x6C, 0xD1, 0x7F, 0x71, 0x1A, 0x7C, 0xEC, 0x70, 0xA9,
|
||||||
|
0xB1, 0xF0, 0x4F, 0xE4, 0x0F, 0x0C, 0x53, 0xFA, 0x15, 0x5E, 0xFE, 0x74, 0x98, 0x49, 0x24, 0x85, 0x81, 0x26, 0x1C, 0x91,
|
||||||
|
0x14, 0x47, 0xB0, 0x4C, 0x63, 0x8C, 0xBB, 0xA1, 0x34, 0xD4, 0xC6, 0x45, 0xE8, 0x0D, 0x85, 0x26, 0x73, 0x03, 0xD0, 0xA9,
|
||||||
|
0x8C, 0x64, 0x6D, 0xDC, 0x71, 0x92, 0xE6, 0x45, 0x05, 0x60, 0x15, 0x59, 0x51, 0x39, 0xFC, 0x58, 0x14, 0x6B, 0xFE, 0xD4,
|
||||||
|
0xA4, 0xED, 0x79, 0x6B, 0x08, 0x0C, 0x41, 0x72, 0xE7, 0x37, 0x22, 0x06, 0x09, 0xBE, 0x23, 0xE9, 0x3F, 0x44, 0x9A, 0x1E,
|
||||||
|
0xE9, 0x61, 0x9D, 0xCC, 0xB1, 0x90, 0x5C, 0xFC, 0x3D, 0xD2, 0x8D, 0xAC, 0x42, 0x3D, 0x65, 0x36, 0xD4, 0xB4, 0x3D, 0x40,
|
||||||
|
0x28, 0x8F, 0x9B, 0x10, 0xCF, 0x23, 0x26, 0xCC, 0x4B, 0x20, 0xCB, 0x90, 0x1F, 0x5D, 0x8C, 0x4C, 0x34, 0xCA, 0x3C, 0xD8,
|
||||||
|
0xE5, 0x37, 0xD6, 0x6F, 0xA5, 0x20, 0xBD, 0x34, 0xEB, 0x26, 0xD9, 0xAE, 0x0D, 0xE7, 0xC5, 0x9A, 0xF7, 0xA1, 0xB4, 0x21,
|
||||||
|
0x91, 0x33, 0x6F, 0x86, 0xE8, 0x58, 0xBB, 0x25, 0x7C, 0x74, 0x0E, 0x58, 0xFE, 0x75, 0x1B, 0x63, 0x3F, 0xCE, 0x31, 0x7C,
|
||||||
|
0x9B, 0x8F, 0x1B, 0x96, 0x9E, 0xC5, 0x53, 0x76, 0x84, 0x5B, 0x9C, 0xAD, 0x91, 0xFA, 0xAC, 0xED, 0x93, 0xBA, 0x5D, 0xC8,
|
||||||
|
0x21, 0x53, 0xC2, 0x82, 0x53, 0x63, 0xAF, 0x12, 0x0D, 0x50, 0x87, 0x11, 0x1B, 0x3D, 0x54, 0x52, 0x96, 0x8A, 0x2C, 0x9C,
|
||||||
|
0x3D, 0x92, 0x1A, 0x08, 0x9A, 0x05, 0x2E, 0xC7, 0x93, 0xA5, 0x48, 0x91, 0xD3, 0x31, 0x82, 0x02, 0x63, 0x30, 0x82, 0x02,
|
||||||
|
0x5F, 0x02, 0x01, 0x01, 0x30, 0x81, 0xC9, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
|
||||||
|
0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69,
|
||||||
|
0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56,
|
||||||
|
0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72,
|
||||||
|
0x6B, 0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x32, 0x54, 0x65, 0x72, 0x6D, 0x73, 0x20, 0x6F, 0x66,
|
||||||
|
0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E,
|
||||||
|
0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61, 0x20, 0x28, 0x63, 0x29,
|
||||||
|
0x31, 0x30, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
|
||||||
|
0x6E, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6E, 0x69,
|
||||||
|
0x6E, 0x67, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x43, 0x41, 0x02, 0x10, 0x0C, 0xEA, 0x5C, 0x41, 0xB4, 0xB3, 0x56, 0x60,
|
||||||
|
0xB8, 0x83, 0xBA, 0x06, 0xDE, 0xF5, 0xA0, 0x53, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0xA0,
|
||||||
|
0x70, 0x30, 0x10, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0C, 0x31, 0x02, 0x30, 0x00, 0x30,
|
||||||
|
0x19, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04,
|
||||||
|
0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0B,
|
||||||
|
0x31, 0x0E, 0x30, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x15, 0x30, 0x23, 0x06, 0x09,
|
||||||
|
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x16, 0x04, 0x14, 0x07, 0x1B, 0xE4, 0xEC, 0xB0, 0x92, 0xF5,
|
||||||
|
0xFA, 0xD7, 0xA5, 0x0A, 0x81, 0xF3, 0x87, 0x3E, 0xEA, 0x71, 0x96, 0xD5, 0x88, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
|
||||||
|
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x08, 0xB8, 0xA8, 0x34, 0xD2, 0x43, 0xC5, 0x19,
|
||||||
|
0xE2, 0x38, 0xF3, 0xB3, 0x78, 0xB3, 0x9B, 0x4D, 0x1A, 0xAF, 0x48, 0xDB, 0x1F, 0xC2, 0xE9, 0x47, 0x68, 0x20, 0xE5, 0x78,
|
||||||
|
0xBD, 0x6A, 0xED, 0x39, 0x50, 0xCB, 0x7A, 0xD9, 0x76, 0x82, 0x1E, 0x8D, 0x0B, 0x83, 0x2C, 0x57, 0xCE, 0xD2, 0xDB, 0x18,
|
||||||
|
0xAD, 0x2E, 0x86, 0x11, 0x8F, 0x97, 0x96, 0x12, 0xD4, 0x0A, 0x5C, 0x89, 0xA4, 0x47, 0x4B, 0x68, 0x31, 0xF9, 0x66, 0xE8,
|
||||||
|
0xC5, 0x1E, 0xF0, 0xA3, 0xDD, 0x7C, 0x72, 0xA2, 0xE6, 0xB4, 0x28, 0xB1, 0xEB, 0xEC, 0x64, 0x08, 0x55, 0x6B, 0x39, 0x43,
|
||||||
|
0xEB, 0x55, 0x7F, 0x58, 0x9D, 0x98, 0xBD, 0x95, 0x68, 0xEC, 0xB6, 0x33, 0x57, 0xE4, 0x5C, 0x11, 0xFF, 0x61, 0x92, 0xE6,
|
||||||
|
0xE4, 0x9D, 0x40, 0x1D, 0x39, 0x46, 0x86, 0xDD, 0x2B, 0xCF, 0xA6, 0x88, 0xE5, 0xFE, 0x40, 0xF5, 0xDD, 0xB3, 0x33, 0xAE,
|
||||||
|
0x15, 0xE3, 0x00, 0x66, 0x26, 0x3F, 0x25, 0x0E, 0xD5, 0xC8, 0xB6, 0xEB, 0xA4, 0x70, 0x8A, 0xBD, 0xE2, 0x7E, 0xEA, 0x0E,
|
||||||
|
0x69, 0x77, 0xC3, 0xEB, 0xA1, 0xAD, 0x83, 0xD0, 0x9A, 0xC7, 0x81, 0x11, 0x06, 0x08, 0x51, 0x19, 0x7C, 0xD9, 0xAE, 0x36,
|
||||||
|
0xEE, 0xED, 0x0F, 0x2B, 0x88, 0x95, 0x48, 0x7F, 0xBE, 0xD1, 0x07, 0xF2, 0x42, 0x26, 0x8A, 0x0C, 0x6F, 0xCF, 0x6D, 0x2F,
|
||||||
|
0x50, 0x86, 0x3C, 0xBB, 0xBC, 0x9D, 0xC6, 0x8F, 0xC0, 0x02, 0x40, 0x46, 0xC2, 0x44, 0x72, 0x28, 0xF8, 0xEC, 0x11, 0x62,
|
||||||
|
0x54, 0xD8, 0xA3, 0x29, 0xCE, 0xE6, 0x7F, 0xE5, 0x86, 0xA2, 0x2F, 0x1D, 0x99, 0xCE, 0xE1, 0xB4, 0x94, 0xE5, 0xB7, 0xC7,
|
||||||
|
0x91, 0xA2, 0x2C, 0x2C, 0x76, 0x97, 0x01, 0x1F, 0xDE, 0x8B, 0x8E, 0xC0, 0x19, 0x27, 0xE2, 0xAC, 0x0B, 0x1E, 0x82, 0x5A,
|
||||||
|
0x61, 0x9F, 0x56, 0x3B, 0xB0, 0x76, 0x9D, 0xF2,
|
||||||
|
};
|
||||||
@@ -0,0 +1,906 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
namespace driver_resource {
|
||||||
|
static unsigned char sys_code[0x45f8] =
|
||||||
|
{ 0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xE0, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
|
||||||
|
0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x62, 0x65,
|
||||||
|
0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A,
|
||||||
|
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xEE, 0x79, 0xEE, 0x0E, 0x8F, 0x17, 0xBD, 0x0E, 0x8F, 0x17, 0xBD,
|
||||||
|
0x0E, 0x8F, 0x17, 0xBD, 0x7A, 0x0E, 0x16, 0xBC, 0x0D, 0x8F, 0x17, 0xBD, 0x0E, 0x8F, 0x16, 0xBD, 0x1E, 0x8F, 0x17, 0xBD,
|
||||||
|
0x7A, 0x0E, 0x14, 0xBC, 0x0D, 0x8F, 0x17, 0xBD, 0x7A, 0x0E, 0x13, 0xBC, 0x0B, 0x8F, 0x17, 0xBD, 0x45, 0x0A, 0x12, 0xBC,
|
||||||
|
0x0F, 0x8F, 0x17, 0xBD, 0x45, 0x0A, 0x15, 0xBC, 0x0F, 0x8F, 0x17, 0xBD, 0x52, 0x69, 0x63, 0x68, 0x0E, 0x8F, 0x17, 0xBD,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x64, 0x86, 0x06, 0x00, 0x39, 0x97, 0xA4, 0x68, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x22, 0x00, 0x0B, 0x02, 0x0E, 0x29, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x62, 0xCF, 0x00, 0x00, 0x01, 0x00, 0x60, 0x41,
|
||||||
|
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x50, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x29, 0x00, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xD0, 0x20, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
|
||||||
|
0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00,
|
||||||
|
0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0xB8, 0x04, 0x00, 0x00,
|
||||||
|
0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC8, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x02, 0x00, 0x00,
|
||||||
|
0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x62, 0x2E, 0x72, 0x65, 0x6C, 0x6F, 0x63, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xEC, 0x28, 0x48, 0x8D, 0x0D, 0x1D, 0x20, 0x00, 0x00, 0xFF, 0x15, 0x4F, 0x10, 0x00,
|
||||||
|
0x00, 0x48, 0x8B, 0x0D, 0xF8, 0x1F, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0x48, 0xFF, 0x25, 0x35, 0x10, 0x00, 0x00, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x48, 0x83, 0xEC, 0x28, 0x83, 0x62, 0x30, 0x00,
|
||||||
|
0x48, 0x8B, 0xCA, 0x48, 0x83, 0x62, 0x38, 0x00, 0x33, 0xD2, 0xFF, 0x15, 0xF8, 0x0F, 0x00, 0x00, 0x33, 0xC0, 0x48, 0x83,
|
||||||
|
0xC4, 0x28, 0xC3, 0xCC, 0x48, 0x89, 0x5C, 0x24, 0x08, 0x48, 0x89, 0x74, 0x24, 0x10, 0x57, 0x48, 0x83, 0xEC, 0x20, 0x48,
|
||||||
|
0x8B, 0x82, 0xB8, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x48, 0x8B, 0xF2, 0x81, 0x78, 0x18, 0x07, 0x20, 0x86, 0x80, 0x48, 0x8B,
|
||||||
|
0x58, 0x20, 0x0F, 0x85, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xB6, 0x0B, 0x83, 0xE9, 0x19, 0x74, 0x63, 0x83, 0xE9, 0x01, 0x74,
|
||||||
|
0x4E, 0x83, 0xE9, 0x0B, 0x74, 0x39, 0x83, 0xE9, 0x0E, 0x74, 0x21, 0x83, 0xF9, 0x01, 0x74, 0x07, 0xBF, 0x01, 0x00, 0x00,
|
||||||
|
0xC0, 0xEB, 0x5D, 0x4C, 0x8B, 0x43, 0x20, 0x48, 0x8B, 0x53, 0x18, 0x48, 0x8B, 0x4B, 0x10, 0xE8, 0x74, 0x00, 0x00, 0x00,
|
||||||
|
0x8B, 0xF8, 0xEB, 0x48, 0x4C, 0x8B, 0x43, 0x20, 0x48, 0x8B, 0x53, 0x10, 0x48, 0x8B, 0x4B, 0x18, 0xE8, 0x7B, 0x02, 0x00,
|
||||||
|
0x00, 0xEB, 0x35, 0x48, 0x8B, 0x4B, 0x18, 0xFF, 0x15, 0x9F, 0x0F, 0x00, 0x00, 0x48, 0x89, 0x43, 0x10, 0xEB, 0x25, 0x48,
|
||||||
|
0x8B, 0x53, 0x28, 0x48, 0x8B, 0x4B, 0x18, 0xFF, 0x15, 0x4B, 0x0F, 0x00, 0x00, 0xEB, 0x15, 0x48, 0x8B, 0x4B, 0x20, 0x45,
|
||||||
|
0x33, 0xC0, 0x48, 0x8B, 0x53, 0x28, 0xFF, 0x15, 0x30, 0x0F, 0x00, 0x00, 0x48, 0x89, 0x43, 0x18, 0x48, 0x83, 0x66, 0x38,
|
||||||
|
0x00, 0x33, 0xD2, 0x48, 0x8B, 0xCE, 0x89, 0x7E, 0x30, 0xFF, 0x15, 0x31, 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x5C, 0x24, 0x30,
|
||||||
|
0x8B, 0xC7, 0x48, 0x8B, 0x74, 0x24, 0x38, 0x48, 0x83, 0xC4, 0x20, 0x5F, 0xC3, 0xCC, 0xCC, 0xCC, 0x48, 0x8B, 0xC4, 0x48,
|
||||||
|
0x89, 0x58, 0x08, 0x48, 0x89, 0x70, 0x10, 0x48, 0x89, 0x78, 0x18, 0x41, 0x56, 0x48, 0x83, 0xEC, 0x30, 0x49, 0x8B, 0xF0,
|
||||||
|
0x4C, 0x8B, 0xF2, 0x48, 0x83, 0x60, 0xE8, 0x00, 0x45, 0x33, 0xC9, 0x45, 0x33, 0xC0, 0x8B, 0xD6, 0xFF, 0x15, 0xE6, 0x0E,
|
||||||
|
0x00, 0x00, 0x48, 0x8B, 0xD8, 0x48, 0x89, 0x44, 0x24, 0x58, 0x48, 0x85, 0xC0, 0x75, 0x0A, 0xB8, 0x9A, 0x00, 0x00, 0xC0,
|
||||||
|
0xE9, 0x89, 0x00, 0x00, 0x00, 0x45, 0x33, 0xC0, 0x33, 0xD2, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x91, 0x0E, 0x00, 0x00, 0x90,
|
||||||
|
0xC7, 0x44, 0x24, 0x28, 0x10, 0x00, 0x00, 0x00, 0x83, 0x64, 0x24, 0x20, 0x00, 0x45, 0x33, 0xC9, 0x45, 0x33, 0xC0, 0x33,
|
||||||
|
0xD2, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x82, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xF8, 0x48, 0x85, 0xC0, 0x75, 0x14, 0x48, 0x8B,
|
||||||
|
0xCB, 0xFF, 0x15, 0x69, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0xB8, 0x0E, 0x00, 0x00, 0xEB, 0xAD, 0x4C, 0x8B,
|
||||||
|
0xC6, 0x49, 0x8B, 0xD6, 0x48, 0x8B, 0xCF, 0xE8, 0x80, 0x01, 0x00, 0x00, 0x48, 0x8B, 0xD3, 0x48, 0x8B, 0xCF, 0xFF, 0x15,
|
||||||
|
0x54, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x3B, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x8A, 0x0E,
|
||||||
|
0x00, 0x00, 0x33, 0xC0, 0xEB, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x58, 0xFF, 0x15, 0x7B, 0x0E, 0x00, 0x00, 0xB8, 0x22, 0x00,
|
||||||
|
0x00, 0xC0, 0x48, 0x8B, 0x5C, 0x24, 0x40, 0x48, 0x8B, 0x74, 0x24, 0x48, 0x48, 0x8B, 0x7C, 0x24, 0x50, 0x48, 0x83, 0xC4,
|
||||||
|
0x30, 0x41, 0x5E, 0xC3, 0x40, 0x53, 0x48, 0x83, 0xEC, 0x40, 0x48, 0x8D, 0x05, 0xEB, 0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0xD9,
|
||||||
|
0x48, 0x89, 0x41, 0x68, 0x48, 0x8D, 0x15, 0xCD, 0x03, 0x00, 0x00, 0x48, 0x8D, 0x05, 0x06, 0xFE, 0xFF, 0xFF, 0x48, 0x89,
|
||||||
|
0x41, 0x70, 0x48, 0x89, 0x81, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x05, 0x14, 0xFE, 0xFF, 0xFF, 0x48, 0x89, 0x81, 0xE0,
|
||||||
|
0x00, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0xCE, 0x1D, 0x00, 0x00, 0xFF, 0x15, 0xB0, 0x0D, 0x00, 0x00, 0x48, 0x8D, 0x05, 0xB9,
|
||||||
|
0x1D, 0x00, 0x00, 0x41, 0xB9, 0x22, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x30, 0x4C, 0x8D, 0x05, 0xAF, 0x1D, 0x00,
|
||||||
|
0x00, 0xC6, 0x44, 0x24, 0x28, 0x00, 0x33, 0xD2, 0x83, 0x64, 0x24, 0x20, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0xCA, 0x0D,
|
||||||
|
0x00, 0x00, 0x85, 0xC0, 0x78, 0x3D, 0x48, 0x8D, 0x15, 0x97, 0x03, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0x98, 0x1D, 0x00, 0x00,
|
||||||
|
0xFF, 0x15, 0x6A, 0x0D, 0x00, 0x00, 0x48, 0x8D, 0x15, 0x7B, 0x1D, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0x84, 0x1D, 0x00, 0x00,
|
||||||
|
0xFF, 0x15, 0xA6, 0x0D, 0x00, 0x00, 0x8B, 0xD8, 0x85, 0xC0, 0x79, 0x0F, 0x48, 0x8B, 0x0D, 0x59, 0x1D, 0x00, 0x00, 0xFF,
|
||||||
|
0x15, 0x9B, 0x0D, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x40, 0x5B, 0xC3, 0xFF, 0x25, 0xAD, 0x0D, 0x00, 0x00, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xC2, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x66,
|
||||||
|
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x25, 0x7A, 0x0D, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x48, 0x8B, 0xC1, 0x49,
|
||||||
|
0x83, 0xF8, 0x08, 0x72, 0x37, 0x49, 0x83, 0xF8, 0x10, 0x77, 0x11, 0x4C, 0x8B, 0x1A, 0x4A, 0x8B, 0x54, 0x02, 0xF8, 0x4C,
|
||||||
|
0x89, 0x19, 0x4A, 0x89, 0x54, 0x01, 0xF8, 0xC3, 0x49, 0x83, 0xF8, 0x20, 0x77, 0x5A, 0x0F, 0x10, 0x02, 0x42, 0x0F, 0x10,
|
||||||
|
0x4C, 0x02, 0xF0, 0x0F, 0x11, 0x01, 0x42, 0x0F, 0x11, 0x4C, 0x01, 0xF0, 0xC3, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x4D, 0x85, 0xC0, 0x74, 0x15, 0x48, 0x2B, 0xD1, 0x72, 0x16, 0x44, 0x8A, 0x1C, 0x11, 0x48, 0xFF, 0xC1, 0x49, 0xFF, 0xC8,
|
||||||
|
0x44, 0x88, 0x59, 0xFF, 0x75, 0xF0, 0xC3, 0x0F, 0x1F, 0x44, 0x00, 0x00, 0x49, 0x03, 0xC8, 0x44, 0x8A, 0x5C, 0x11, 0xFF,
|
||||||
|
0x48, 0xFF, 0xC9, 0x49, 0xFF, 0xC8, 0x44, 0x88, 0x19, 0x75, 0xF0, 0xC3, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x4E, 0x8D, 0x1C, 0x02, 0x48, 0x2B, 0xD1, 0x73, 0x09, 0x4C, 0x3B, 0xD9, 0x0F, 0x87, 0x6E, 0x01,
|
||||||
|
0x00, 0x00, 0x0F, 0x10, 0x04, 0x11, 0x48, 0x83, 0xC1, 0x10, 0xF6, 0xC1, 0x0F, 0x74, 0x12, 0x48, 0x83, 0xE1, 0xF0, 0x0F,
|
||||||
|
0x10, 0x0C, 0x11, 0x0F, 0x11, 0x00, 0x0F, 0x28, 0xC1, 0x48, 0x83, 0xC1, 0x10, 0x4C, 0x03, 0xC0, 0x4C, 0x2B, 0xC1, 0x4D,
|
||||||
|
0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x74, 0x6F, 0x49, 0x81, 0xF9, 0x00, 0x10, 0x00, 0x00, 0x0F, 0x87, 0xB3, 0x00, 0x00,
|
||||||
|
0x00, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x2D, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x10, 0x54, 0x11,
|
||||||
|
0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10, 0x64, 0x11, 0x30, 0x0F, 0x29, 0x41, 0xF0, 0x48, 0x83, 0xC1, 0x40, 0x49,
|
||||||
|
0xFF, 0xC9, 0x0F, 0x29, 0x49, 0xC0, 0x0F, 0x29, 0x51, 0xD0, 0x0F, 0x29, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D,
|
||||||
|
0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x41, 0xF0,
|
||||||
|
0x0F, 0x10, 0x04, 0x11, 0x48, 0x83, 0xC1, 0x10, 0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0E, 0x4E,
|
||||||
|
0x8D, 0x5C, 0x01, 0xF0, 0x41, 0x0F, 0x10, 0x0C, 0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x41, 0xF0, 0xC3, 0x66, 0x66,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x49, 0x83, 0xE0, 0x3F, 0x0F, 0x18, 0x44, 0x11, 0x40, 0xEB, 0x2E, 0x66, 0x66,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
|
||||||
|
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x90, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x10, 0x54, 0x11, 0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10,
|
||||||
|
0x64, 0x11, 0x30, 0x0F, 0x2B, 0x41, 0xF0, 0x48, 0x83, 0xC1, 0x40, 0x0F, 0x18, 0x44, 0x11, 0x40, 0x49, 0xFF, 0xC9, 0x0F,
|
||||||
|
0x2B, 0x49, 0xC0, 0x0F, 0x2B, 0x51, 0xD0, 0x0F, 0x2B, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xCC, 0x0F, 0xAE, 0xF8, 0xE9,
|
||||||
|
0x33, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0x40, 0x00, 0x49, 0x03, 0xC8, 0x0F, 0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10,
|
||||||
|
0x49, 0x83, 0xE8, 0x10, 0xF6, 0xC1, 0x0F, 0x74, 0x18, 0x4C, 0x8B, 0xD9, 0x48, 0x83, 0xE1, 0xF0, 0x0F, 0x10, 0x0C, 0x11,
|
||||||
|
0x41, 0x0F, 0x11, 0x03, 0x0F, 0x28, 0xC1, 0x4C, 0x8B, 0xC1, 0x4C, 0x2B, 0xC0, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06,
|
||||||
|
0x74, 0x39, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x04, 0x0F, 0x1F, 0x40, 0x00, 0x0F, 0x10, 0x4C, 0x11, 0xF0, 0x0F, 0x10, 0x54,
|
||||||
|
0x11, 0xE0, 0x0F, 0x10, 0x5C, 0x11, 0xD0, 0x0F, 0x10, 0x64, 0x11, 0xC0, 0x0F, 0x29, 0x01, 0x48, 0x83, 0xE9, 0x40, 0x49,
|
||||||
|
0xFF, 0xC9, 0x0F, 0x29, 0x49, 0x30, 0x0F, 0x29, 0x51, 0x20, 0x0F, 0x29, 0x59, 0x10, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D,
|
||||||
|
0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x01, 0x0F,
|
||||||
|
0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10, 0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0F, 0x4C,
|
||||||
|
0x8B, 0xD9, 0x4D, 0x2B, 0xD8, 0x41, 0x0F, 0x10, 0x0C, 0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x01, 0xC3, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0x5C, 0x00, 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x5C, 0x00,
|
||||||
|
0x6B, 0x00, 0x64, 0x00, 0x73, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0xCC, 0xCC,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x5C, 0x00, 0x44, 0x00, 0x6F, 0x00, 0x73, 0x00,
|
||||||
|
0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5C, 0x00, 0x6D, 0x00, 0x79, 0x00,
|
||||||
|
0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x28, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x6E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x94, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xCC, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x52, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x2C, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x12, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x12, 0x00, 0x40,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0xD0, 0x12, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x10, 0x13, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x13, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
|
||||||
|
0x30, 0x10, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0xD0, 0x12, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x90, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xB8, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x98, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xA0, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xA8, 0x20, 0x00, 0x40,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0xB0, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x39, 0x97, 0xA4, 0x68, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
|
||||||
|
0x80, 0x22, 0x00, 0x00, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x97, 0xA4, 0x68, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0D, 0x00, 0x00, 0x00, 0x4C, 0x01, 0x00, 0x00, 0xC4, 0x22, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x44, 0x53, 0xD7, 0x07, 0x48, 0xF0,
|
||||||
|
0xCF, 0x50, 0x04, 0x4F, 0x89, 0x49, 0x26, 0xCD, 0x6F, 0x05, 0xFF, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x58, 0x3A, 0x5C, 0x4D,
|
||||||
|
0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x52, 0x65, 0x6C, 0x65, 0x61,
|
||||||
|
0x73, 0x65, 0x5C, 0x4D, 0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x2E, 0x70, 0x64, 0x62, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xE0, 0x02, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xE0, 0x12, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
|
||||||
|
0x24, 0x30, 0x30, 0x00, 0x40, 0x13, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
|
||||||
|
0x24, 0x32, 0x31, 0x00, 0xF0, 0x15, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x73, 0x00,
|
||||||
|
0x00, 0x20, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x88, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2E, 0x30, 0x30, 0x63, 0x66, 0x67, 0x00, 0x00, 0xB8, 0x20, 0x00, 0x00,
|
||||||
|
0x18, 0x00, 0x00, 0x00, 0x2E, 0x67, 0x66, 0x69, 0x64, 0x73, 0x00, 0x00, 0xD0, 0x20, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00,
|
||||||
|
0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x80, 0x22, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x2E, 0x72, 0x64, 0x61,
|
||||||
|
0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x00, 0x00, 0x38, 0x24, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x64, 0x61, 0x74,
|
||||||
|
0x61, 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2E, 0x62, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x40, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
|
||||||
|
0x5C, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x50, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
||||||
|
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x00, 0x00, 0x70, 0x50, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
|
||||||
|
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
|
||||||
|
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x00, 0x5A, 0x01, 0x00, 0x00,
|
||||||
|
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x03, 0x00, 0x01, 0x16, 0x00, 0x06,
|
||||||
|
0x04, 0x42, 0x00, 0x00, 0x0A, 0x15, 0x0A, 0x00, 0x03, 0x16, 0x00, 0x06, 0x15, 0x74, 0x0A, 0x00, 0x15, 0x64, 0x09, 0x00,
|
||||||
|
0x15, 0x34, 0x08, 0x00, 0x15, 0x52, 0x11, 0xE0, 0xC5, 0x12, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x69, 0x11, 0x00, 0x00,
|
||||||
|
0x78, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE2, 0x11, 0x00, 0x00, 0x02, 0x0F, 0x08, 0x00, 0x02, 0x16, 0x00, 0x06,
|
||||||
|
0x0F, 0x64, 0x07, 0x00, 0x0F, 0x34, 0x06, 0x00, 0x0F, 0x32, 0x0B, 0x70, 0x02, 0x06, 0x04, 0x00, 0x02, 0x16, 0x00, 0x06,
|
||||||
|
0x06, 0x72, 0x02, 0x30, 0x02, 0x04, 0x03, 0x00, 0x07, 0x16, 0x00, 0x06, 0x04, 0x42, 0x00, 0x00, 0x02, 0x0A, 0x06, 0x00,
|
||||||
|
0x02, 0x06, 0x03, 0x06, 0x0A, 0x34, 0x06, 0x00, 0x0A, 0x32, 0x06, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xA2, 0xDF, 0x2D, 0x99, 0x2B, 0x00, 0x00, 0xCD, 0x5D, 0x20, 0xD2,
|
||||||
|
0x66, 0xD4, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x10, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x94, 0x24, 0x00, 0x00, 0x30, 0x10, 0x00, 0x00, 0x4F, 0x10, 0x00, 0x00,
|
||||||
|
0x38, 0x24, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x74, 0x24, 0x00, 0x00, 0x24, 0x11, 0x00, 0x00,
|
||||||
|
0x08, 0x12, 0x00, 0x00, 0x44, 0x24, 0x00, 0x00, 0x08, 0x12, 0x00, 0x00, 0xC5, 0x12, 0x00, 0x00, 0x88, 0x24, 0x00, 0x00,
|
||||||
|
0xF0, 0x12, 0x00, 0x00, 0xF5, 0x12, 0x00, 0x00, 0xB0, 0x24, 0x00, 0x00, 0x10, 0x13, 0x00, 0x00, 0x16, 0x13, 0x00, 0x00,
|
||||||
|
0xB0, 0x24, 0x00, 0x00, 0x40, 0x13, 0x00, 0x00, 0xEA, 0x15, 0x00, 0x00, 0xB0, 0x24, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
|
||||||
|
0x2C, 0x50, 0x00, 0x00, 0xA0, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x5C, 0x24, 0x08, 0x57, 0x48, 0x83,
|
||||||
|
0xEC, 0x20, 0x48, 0x8B, 0xDA, 0x48, 0x8B, 0xF9, 0xE8, 0x17, 0x00, 0x00, 0x00, 0x48, 0x8B, 0xD3, 0x48, 0x8B, 0xCF, 0xE8,
|
||||||
|
0xE8, 0xC1, 0xFF, 0xFF, 0x48, 0x8B, 0x5C, 0x24, 0x30, 0x48, 0x83, 0xC4, 0x20, 0x5F, 0xC3, 0xCC, 0x48, 0x8B, 0x05, 0xCD,
|
||||||
|
0xDF, 0xFF, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x1B, 0x48, 0xB9, 0x32, 0xA2, 0xDF, 0x2D, 0x99, 0x2B, 0x00, 0x00, 0x48, 0x3B,
|
||||||
|
0xC1, 0x74, 0x0C, 0x48, 0xF7, 0xD0, 0x48, 0x89, 0x05, 0xB7, 0xDF, 0xFF, 0xFF, 0xC3, 0xCC, 0xB9, 0x06, 0x00, 0x00, 0x00,
|
||||||
|
0xCD, 0x29, 0xCC, 0xCC, 0x88, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x52, 0x00, 0x00,
|
||||||
|
0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x6E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xA6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xCC, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x51, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x2C, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3A, 0x09, 0x52, 0x74, 0x6C, 0x49, 0x6E, 0x69, 0x74, 0x55, 0x6E, 0x69, 0x63, 0x6F, 0x64, 0x65,
|
||||||
|
0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x34, 0x06, 0x4D, 0x6D, 0x50, 0x72, 0x6F, 0x62, 0x65, 0x41, 0x6E, 0x64,
|
||||||
|
0x4C, 0x6F, 0x63, 0x6B, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x4B, 0x06, 0x4D, 0x6D, 0x55, 0x6E, 0x6C, 0x6F, 0x63, 0x6B,
|
||||||
|
0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x20, 0x06, 0x4D, 0x6D, 0x4D, 0x61, 0x70, 0x4C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x50,
|
||||||
|
0x61, 0x67, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x43, 0x61, 0x63, 0x68, 0x65, 0x00, 0x00, 0x4E, 0x06,
|
||||||
|
0x4D, 0x6D, 0x55, 0x6E, 0x6D, 0x61, 0x70, 0x4C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x00,
|
||||||
|
0x1D, 0x06, 0x4D, 0x6D, 0x4D, 0x61, 0x70, 0x49, 0x6F, 0x53, 0x70, 0x61, 0x63, 0x65, 0x00, 0x00, 0x4D, 0x06, 0x4D, 0x6D,
|
||||||
|
0x55, 0x6E, 0x6D, 0x61, 0x70, 0x49, 0x6F, 0x53, 0x70, 0x61, 0x63, 0x65, 0x00, 0x00, 0x16, 0x03, 0x49, 0x6F, 0x41, 0x6C,
|
||||||
|
0x6C, 0x6F, 0x63, 0x61, 0x74, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0x76, 0x04, 0x49, 0x6F, 0x66, 0x43, 0x6F, 0x6D, 0x70, 0x6C,
|
||||||
|
0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x00, 0x43, 0x03, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61,
|
||||||
|
0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x50, 0x03, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
|
||||||
|
0x53, 0x79, 0x6D, 0x62, 0x6F, 0x6C, 0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x5D, 0x03, 0x49, 0x6F, 0x44, 0x65,
|
||||||
|
0x6C, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x5F, 0x03, 0x49, 0x6F, 0x44, 0x65, 0x6C, 0x65,
|
||||||
|
0x74, 0x65, 0x53, 0x79, 0x6D, 0x62, 0x6F, 0x6C, 0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x78, 0x03, 0x49, 0x6F,
|
||||||
|
0x46, 0x72, 0x65, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0x05, 0x06, 0x4D, 0x6D, 0x47, 0x65, 0x74, 0x50, 0x68, 0x79, 0x73, 0x69,
|
||||||
|
0x63, 0x61, 0x6C, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x00, 0x00, 0x50, 0x0C, 0x5F, 0x5F, 0x43, 0x5F, 0x73, 0x70,
|
||||||
|
0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00, 0x00, 0x6E, 0x74, 0x6F, 0x73,
|
||||||
|
0x6B, 0x72, 0x6E, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
|
||||||
|
0x24, 0x00, 0x00, 0x00, 0x88, 0xA0, 0x90, 0xA0, 0x98, 0xA0, 0xA0, 0xA0, 0xA8, 0xA0, 0x28, 0xA1, 0x40, 0xA1, 0x48, 0xA1,
|
||||||
|
0x50, 0xA1, 0xE8, 0xA1, 0xF0, 0xA1, 0xF8, 0xA1, 0x00, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x29, 0xEC,
|
||||||
|
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0, 0x82, 0x29, 0xDD, 0x30, 0x82, 0x29, 0xD9, 0x02,
|
||||||
|
0x01, 0x01, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30,
|
||||||
|
0x5C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xA0, 0x4E, 0x30, 0x4C, 0x30, 0x17, 0x06,
|
||||||
|
0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x09, 0x03, 0x01, 0x00, 0xA0, 0x04, 0xA2, 0x02,
|
||||||
|
0x80, 0x00, 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04,
|
||||||
|
0x20, 0xF7, 0xB8, 0xA6, 0xA3, 0x4B, 0xA6, 0xA1, 0x4C, 0x4E, 0x26, 0x79, 0x26, 0x00, 0x97, 0xE8, 0x57, 0x75, 0xC2, 0xAE,
|
||||||
|
0x9A, 0x49, 0xEE, 0x4B, 0x98, 0xCB, 0x0C, 0x76, 0x83, 0xA8, 0x3A, 0x58, 0x5C, 0xA0, 0x82, 0x0F, 0xB5, 0x30, 0x82, 0x05,
|
||||||
|
0x30, 0x30, 0x82, 0x04, 0x18, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x04, 0x09, 0x18, 0x1B, 0x5F, 0xD5, 0xBB, 0x66,
|
||||||
|
0x75, 0x53, 0x43, 0xB5, 0x6F, 0x95, 0x50, 0x08, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01,
|
||||||
|
0x0B, 0x05, 0x00, 0x30, 0x65, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15,
|
||||||
|
0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E,
|
||||||
|
0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69,
|
||||||
|
0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1B, 0x44,
|
||||||
|
0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52,
|
||||||
|
0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x33, 0x31, 0x30, 0x32, 0x32, 0x31, 0x32, 0x30, 0x30,
|
||||||
|
0x30, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x38, 0x31, 0x30, 0x32, 0x32, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x30, 0x72,
|
||||||
|
0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,
|
||||||
|
0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17,
|
||||||
|
0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E,
|
||||||
|
0x63, 0x6F, 0x6D, 0x31, 0x31, 0x30, 0x2F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65,
|
||||||
|
0x72, 0x74, 0x20, 0x53, 0x48, 0x41, 0x32, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x43,
|
||||||
|
0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D,
|
||||||
|
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82,
|
||||||
|
0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xF8, 0xD3, 0xB3, 0x1C, 0x7F, 0x0E, 0x11, 0xAF, 0x67, 0x77, 0x07, 0xD3, 0x0B,
|
||||||
|
0x31, 0x49, 0x19, 0xCF, 0xD0, 0xFB, 0x45, 0x99, 0xB1, 0x3A, 0xDB, 0x44, 0xF5, 0x7F, 0xE5, 0xA8, 0x9D, 0xDB, 0x32, 0xD7,
|
||||||
|
0x71, 0xEA, 0x76, 0x9D, 0x05, 0x2E, 0xB7, 0x8F, 0xFA, 0x92, 0x43, 0xC0, 0xA5, 0xF9, 0x89, 0xD4, 0x37, 0x19, 0xD7, 0xB6,
|
||||||
|
0xAA, 0xF0, 0x9C, 0x86, 0xA5, 0xD8, 0x25, 0xAC, 0x0E, 0x79, 0x28, 0x3A, 0x7E, 0xE9, 0xD1, 0x67, 0xD3, 0xC6, 0xFB, 0x29,
|
||||||
|
0x27, 0xC7, 0xD3, 0x7B, 0x23, 0x94, 0xE4, 0x91, 0x23, 0x96, 0x90, 0x77, 0x82, 0xF9, 0xA1, 0x84, 0x23, 0x66, 0x12, 0x54,
|
||||||
|
0x33, 0x50, 0x74, 0xB1, 0x28, 0x26, 0xBB, 0x24, 0x69, 0xC2, 0xC2, 0x52, 0xF2, 0x14, 0x67, 0x8A, 0x89, 0x45, 0xD4, 0x2D,
|
||||||
|
0xA1, 0xA3, 0xE9, 0x88, 0x2C, 0x20, 0x95, 0xAE, 0x1C, 0x4A, 0x87, 0x08, 0xDF, 0x0C, 0xF5, 0xE2, 0x4D, 0x60, 0x18, 0xBE,
|
||||||
|
0xAA, 0xC4, 0xB2, 0xAE, 0x70, 0x31, 0x66, 0x33, 0x71, 0x3E, 0xAC, 0x70, 0xA2, 0xAB, 0xCE, 0x7F, 0xE9, 0x7C, 0xCB, 0x92,
|
||||||
|
0xA1, 0xE5, 0x3B, 0x31, 0x1C, 0xCF, 0xEA, 0xF2, 0x0A, 0xE4, 0x57, 0xBB, 0x4A, 0xB5, 0xE9, 0x74, 0xE6, 0x2B, 0xFE, 0x6C,
|
||||||
|
0xCB, 0x7E, 0x74, 0x39, 0x36, 0x0D, 0x90, 0xEF, 0xE4, 0xB5, 0x4E, 0xA4, 0xA9, 0xEA, 0x6A, 0x0A, 0xAB, 0x84, 0xF3, 0xAC,
|
||||||
|
0x67, 0x4E, 0xB5, 0xC4, 0xF7, 0x8C, 0xD1, 0x20, 0x25, 0x23, 0xEB, 0x08, 0x64, 0x3E, 0x52, 0x96, 0xC1, 0xF2, 0x0F, 0x12,
|
||||||
|
0xF4, 0xC5, 0x8E, 0x0F, 0xC1, 0xA2, 0xE8, 0x2C, 0x51, 0xF7, 0x73, 0xBC, 0xBD, 0x85, 0xB1, 0x62, 0x83, 0x73, 0x41, 0x82,
|
||||||
|
0x07, 0xE4, 0x38, 0x8B, 0x6A, 0x73, 0x20, 0xD0, 0x0F, 0x64, 0x73, 0x3C, 0x9E, 0x9F, 0xA6, 0x33, 0xA9, 0xFD, 0x19, 0xDF,
|
||||||
|
0x25, 0x93, 0xD1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xCD, 0x30, 0x82, 0x01, 0xC9, 0x30, 0x12, 0x06, 0x03,
|
||||||
|
0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x0E, 0x06, 0x03,
|
||||||
|
0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04,
|
||||||
|
0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x79, 0x06, 0x08, 0x2B, 0x06, 0x01,
|
||||||
|
0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x6D, 0x30, 0x6B, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
|
||||||
|
0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63,
|
||||||
|
0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x43, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86,
|
||||||
|
0x37, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69, 0x67, 0x69,
|
||||||
|
0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73,
|
||||||
|
0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x81, 0x81, 0x06,
|
||||||
|
0x03, 0x55, 0x1D, 0x1F, 0x04, 0x7A, 0x30, 0x78, 0x30, 0x3A, 0xA0, 0x38, 0xA0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70,
|
||||||
|
0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x34, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
|
||||||
|
0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F,
|
||||||
|
0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x3A, 0xA0, 0x38, 0xA0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70,
|
||||||
|
0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
|
||||||
|
0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F,
|
||||||
|
0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x4F, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x48, 0x30, 0x46, 0x30,
|
||||||
|
0x38, 0x06, 0x0A, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x00, 0x02, 0x04, 0x30, 0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B,
|
||||||
|
0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77,
|
||||||
|
0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x43, 0x50, 0x53, 0x30, 0x0A, 0x06,
|
||||||
|
0x08, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x03, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14,
|
||||||
|
0x5A, 0xC4, 0xB9, 0x7B, 0x2A, 0x0A, 0xA3, 0xA5, 0xEA, 0x71, 0x03, 0xC0, 0x60, 0xF9, 0x2D, 0xF6, 0x65, 0x75, 0x0E, 0x58,
|
||||||
|
0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0xEB, 0xA2, 0xAF, 0xF4, 0x92, 0xCB,
|
||||||
|
0x82, 0x31, 0x2D, 0x51, 0x8B, 0xA7, 0xA7, 0x21, 0x9D, 0xF3, 0x6D, 0xC8, 0x0F, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
|
||||||
|
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3E, 0xEC, 0x0D, 0x5A, 0x24, 0xB3, 0xF3,
|
||||||
|
0x22, 0xD1, 0x15, 0xC8, 0x2C, 0x7C, 0x25, 0x29, 0x76, 0xA8, 0x1D, 0x5D, 0x1C, 0x2D, 0x3A, 0x1A, 0xC4, 0xEF, 0x30, 0x61,
|
||||||
|
0xD7, 0x7E, 0x0B, 0x60, 0xFD, 0xC3, 0x3D, 0x0F, 0xC4, 0xAF, 0x8B, 0xFD, 0xEF, 0x2A, 0xDF, 0x20, 0x55, 0x37, 0xB0, 0xE1,
|
||||||
|
0xF6, 0xD1, 0x92, 0x75, 0x0F, 0x51, 0xB4, 0x6E, 0xA5, 0x8E, 0x5A, 0xE2, 0x5E, 0x24, 0x81, 0x4E, 0x10, 0xA4, 0xEE, 0x3F,
|
||||||
|
0x71, 0x8E, 0x63, 0x0E, 0x13, 0x4B, 0xAD, 0xD7, 0x5F, 0x44, 0x79, 0xF3, 0x36, 0x14, 0x06, 0x8A, 0xF7, 0x9C, 0x46, 0x4E,
|
||||||
|
0x5C, 0xFF, 0x90, 0xB1, 0x1B, 0x07, 0x0E, 0x91, 0x15, 0xFB, 0xBA, 0xAF, 0xB5, 0x51, 0xC2, 0x8D, 0x24, 0xAE, 0x24, 0xC6,
|
||||||
|
0xC7, 0x27, 0x2A, 0xA1, 0x29, 0x28, 0x1A, 0x3A, 0x71, 0x28, 0x02, 0x3C, 0x2E, 0x91, 0xA3, 0xC0, 0x25, 0x11, 0xE2, 0x9C,
|
||||||
|
0x14, 0x47, 0xA1, 0x7A, 0x68, 0x68, 0xAF, 0x9B, 0xA7, 0x5C, 0x20, 0x5C, 0xD9, 0x71, 0xB1, 0x0C, 0x8F, 0xBB, 0xA8, 0xF8,
|
||||||
|
0xC5, 0x12, 0x68, 0x9F, 0xCF, 0x40, 0xCB, 0x40, 0x44, 0xA5, 0x13, 0xF0, 0xE6, 0x64, 0x0C, 0x25, 0x08, 0x42, 0x32, 0xB2,
|
||||||
|
0x36, 0x8A, 0x24, 0x02, 0xFE, 0x2F, 0x72, 0x7E, 0x1C, 0xD7, 0x49, 0x45, 0x96, 0xE8, 0x59, 0x1D, 0xE9, 0xFA, 0x74, 0x64,
|
||||||
|
0x6B, 0xB2, 0xEB, 0x66, 0x43, 0xDA, 0xB3, 0xB0, 0x8C, 0xD5, 0xE9, 0x0D, 0xDD, 0xF6, 0x01, 0x20, 0xCE, 0x99, 0x31, 0x63,
|
||||||
|
0x3D, 0x08, 0x1A, 0x18, 0xB3, 0x81, 0x9B, 0x4F, 0xC6, 0x93, 0x10, 0x06, 0xFC, 0x07, 0x81, 0xFA, 0x8B, 0xDA, 0xF9, 0x82,
|
||||||
|
0x49, 0xF7, 0x62, 0x6E, 0xA1, 0x53, 0xFA, 0x12, 0x94, 0x18, 0x85, 0x2E, 0x92, 0x91, 0xEA, 0x68, 0x6C, 0x44, 0x32, 0xB2,
|
||||||
|
0x66, 0xA1, 0xE7, 0x18, 0xA4, 0x9A, 0x64, 0x51, 0xEF, 0x30, 0x82, 0x05, 0x34, 0x30, 0x82, 0x03, 0x1C, 0xA0, 0x03, 0x02,
|
||||||
|
0x01, 0x02, 0x02, 0x0A, 0x61, 0x1C, 0xB2, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86,
|
||||||
|
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
|
||||||
|
0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69,
|
||||||
|
0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D,
|
||||||
|
0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73,
|
||||||
|
0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x29, 0x30, 0x27, 0x06,
|
||||||
|
0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x64, 0x65,
|
||||||
|
0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x30, 0x1E,
|
||||||
|
0x17, 0x0D, 0x31, 0x31, 0x30, 0x34, 0x31, 0x35, 0x31, 0x39, 0x34, 0x31, 0x33, 0x37, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30,
|
||||||
|
0x34, 0x31, 0x35, 0x31, 0x39, 0x35, 0x31, 0x33, 0x37, 0x5A, 0x30, 0x65, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
|
||||||
|
0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69,
|
||||||
|
0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77,
|
||||||
|
0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x24, 0x30, 0x22, 0x06,
|
||||||
|
0x03, 0x55, 0x04, 0x03, 0x13, 0x1B, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72,
|
||||||
|
0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06,
|
||||||
|
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01,
|
||||||
|
0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xAD, 0x0E, 0x15, 0xCE, 0xE4, 0x43, 0x80, 0x5C, 0xB1, 0x87, 0xF3, 0xB7, 0x60, 0xF9,
|
||||||
|
0x71, 0x12, 0xA5, 0xAE, 0xDC, 0x26, 0x94, 0x88, 0xAA, 0xF4, 0xCE, 0xF5, 0x20, 0x39, 0x28, 0x58, 0x60, 0x0C, 0xF8, 0x80,
|
||||||
|
0xDA, 0xA9, 0x15, 0x95, 0x32, 0x61, 0x3C, 0xB5, 0xB1, 0x28, 0x84, 0x8A, 0x8A, 0xDC, 0x9F, 0x0A, 0x0C, 0x83, 0x17, 0x7A,
|
||||||
|
0x8F, 0x90, 0xAC, 0x8A, 0xE7, 0x79, 0x53, 0x5C, 0x31, 0x84, 0x2A, 0xF6, 0x0F, 0x98, 0x32, 0x36, 0x76, 0xCC, 0xDE, 0xDD,
|
||||||
|
0x3C, 0xA8, 0xA2, 0xEF, 0x6A, 0xFB, 0x21, 0xF2, 0x52, 0x61, 0xDF, 0x9F, 0x20, 0xD7, 0x1F, 0xE2, 0xB1, 0xD9, 0xFE, 0x18,
|
||||||
|
0x64, 0xD2, 0x12, 0x5B, 0x5F, 0xF9, 0x58, 0x18, 0x35, 0xBC, 0x47, 0xCD, 0xA1, 0x36, 0xF9, 0x6B, 0x7F, 0xD4, 0xB0, 0x38,
|
||||||
|
0x3E, 0xC1, 0x1B, 0xC3, 0x8C, 0x33, 0xD9, 0xD8, 0x2F, 0x18, 0xFE, 0x28, 0x0F, 0xB3, 0xA7, 0x83, 0xD6, 0xC3, 0x6E, 0x44,
|
||||||
|
0xC0, 0x61, 0x35, 0x96, 0x16, 0xFE, 0x59, 0x9C, 0x8B, 0x76, 0x6D, 0xD7, 0xF1, 0xA2, 0x4B, 0x0D, 0x2B, 0xFF, 0x0B, 0x72,
|
||||||
|
0xDA, 0x9E, 0x60, 0xD0, 0x8E, 0x90, 0x35, 0xC6, 0x78, 0x55, 0x87, 0x20, 0xA1, 0xCF, 0xE5, 0x6D, 0x0A, 0xC8, 0x49, 0x7C,
|
||||||
|
0x31, 0x98, 0x33, 0x6C, 0x22, 0xE9, 0x87, 0xD0, 0x32, 0x5A, 0xA2, 0xBA, 0x13, 0x82, 0x11, 0xED, 0x39, 0x17, 0x9D, 0x99,
|
||||||
|
0x3A, 0x72, 0xA1, 0xE6, 0xFA, 0xA4, 0xD9, 0xD5, 0x17, 0x31, 0x75, 0xAE, 0x85, 0x7D, 0x22, 0xAE, 0x3F, 0x01, 0x46, 0x86,
|
||||||
|
0xF6, 0x28, 0x79, 0xC8, 0xB1, 0xDA, 0xE4, 0x57, 0x17, 0xC4, 0x7E, 0x1C, 0x0E, 0xB0, 0xB4, 0x92, 0xA6, 0x56, 0xB3, 0xBD,
|
||||||
|
0xB2, 0x97, 0xED, 0xAA, 0xA7, 0xF0, 0xB7, 0xC5, 0xA8, 0x3F, 0x95, 0x16, 0xD0, 0xFF, 0xA1, 0x96, 0xEB, 0x08, 0x5F, 0x18,
|
||||||
|
0x77, 0x4F, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x81, 0xCB, 0x30, 0x81, 0xC8, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1D, 0x20,
|
||||||
|
0x04, 0x0A, 0x30, 0x08, 0x30, 0x06, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x04,
|
||||||
|
0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01,
|
||||||
|
0x01, 0xFF, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x45, 0xEB, 0xA2, 0xAF, 0xF4, 0x92, 0xCB,
|
||||||
|
0x82, 0x31, 0x2D, 0x51, 0x8B, 0xA7, 0xA7, 0x21, 0x9D, 0xF3, 0x6D, 0xC8, 0x0F, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,
|
||||||
|
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x62, 0xFB, 0x0A, 0x21, 0x5B, 0x7F, 0x43, 0x6E, 0x11, 0xDA, 0x09, 0x54, 0x50, 0x6B,
|
||||||
|
0xF5, 0xD2, 0x96, 0x71, 0xF1, 0x9E, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x4E, 0x30, 0x4C, 0x30, 0x4A, 0xA0,
|
||||||
|
0x48, 0xA0, 0x46, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63, 0x72,
|
||||||
|
0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72,
|
||||||
|
0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x43, 0x6F, 0x64, 0x65,
|
||||||
|
0x56, 0x65, 0x72, 0x69, 0x66, 0x52, 0x6F, 0x6F, 0x74, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
|
||||||
|
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x5C, 0xF5, 0xB2, 0x2D, 0x02, 0xCE, 0xED,
|
||||||
|
0x01, 0xB5, 0x35, 0x12, 0xD8, 0x13, 0xF7, 0xAA, 0x40, 0x14, 0xC7, 0xA1, 0x5C, 0xA0, 0x8A, 0x55, 0xED, 0x7E, 0x55, 0xEA,
|
||||||
|
0x6A, 0xC4, 0x57, 0x17, 0x6F, 0xD0, 0x47, 0x22, 0x42, 0x36, 0x58, 0xEF, 0xC5, 0xAC, 0x61, 0xC5, 0xF6, 0x2C, 0x52, 0xCE,
|
||||||
|
0x6A, 0xE6, 0xC8, 0x0D, 0x85, 0xDA, 0xB3, 0x34, 0x42, 0x0E, 0xA4, 0x02, 0x25, 0x18, 0x26, 0x72, 0xB9, 0x2A, 0x4E, 0xA5,
|
||||||
|
0x7E, 0x4B, 0x16, 0xF2, 0xA0, 0xE4, 0x0C, 0x44, 0x9C, 0xE2, 0x4D, 0x9A, 0xF4, 0x74, 0xF0, 0xF9, 0x27, 0xA6, 0x69, 0x90,
|
||||||
|
0x31, 0xC2, 0x44, 0x65, 0x43, 0x48, 0xC7, 0x48, 0x69, 0xD0, 0xFC, 0x84, 0x09, 0xF2, 0x86, 0x14, 0x0A, 0xC2, 0x29, 0x96,
|
||||||
|
0x85, 0x7F, 0x11, 0xEB, 0x87, 0x13, 0x17, 0x6E, 0xD3, 0xEC, 0x6B, 0xFF, 0x1D, 0x57, 0x8A, 0xB1, 0x7B, 0x1E, 0xA5, 0xA0,
|
||||||
|
0x7C, 0xE9, 0xA2, 0x7A, 0x68, 0xE5, 0xFA, 0xC6, 0xB1, 0x61, 0xD6, 0x72, 0x63, 0xFA, 0x37, 0x91, 0x63, 0x83, 0x55, 0x99,
|
||||||
|
0xF8, 0x1D, 0x61, 0x4F, 0x0C, 0x6F, 0xA3, 0xF7, 0xBC, 0xB1, 0x15, 0x2A, 0xCC, 0x8D, 0x85, 0xE3, 0x14, 0x17, 0xEF, 0x7E,
|
||||||
|
0x49, 0x44, 0x3F, 0xB0, 0x22, 0xC0, 0xF0, 0xAC, 0xBE, 0x2F, 0xDB, 0xE1, 0x0C, 0x86, 0xB0, 0xF4, 0x58, 0x5C, 0x5A, 0x10,
|
||||||
|
0xA9, 0x4B, 0xCD, 0xF3, 0x44, 0x8A, 0x46, 0x52, 0x08, 0x3E, 0x0A, 0x62, 0x10, 0xE9, 0x45, 0x95, 0x04, 0xB7, 0x8B, 0x8D,
|
||||||
|
0x4B, 0x07, 0x4F, 0x50, 0x0D, 0xB7, 0xBB, 0xE7, 0xFB, 0x8C, 0xA2, 0x78, 0x78, 0xC6, 0xC5, 0x3B, 0x76, 0x63, 0xB2, 0xCF,
|
||||||
|
0xE5, 0x21, 0x84, 0x5A, 0x66, 0xFC, 0xE0, 0x4C, 0x79, 0x83, 0x4E, 0xCF, 0xA8, 0xEE, 0x70, 0x05, 0x86, 0x58, 0x7C, 0xC2,
|
||||||
|
0x9C, 0xD7, 0x3C, 0xA3, 0xAD, 0x3C, 0x7E, 0x76, 0x62, 0x5C, 0x87, 0xD0, 0xED, 0x7C, 0xD5, 0xC5, 0x5B, 0x14, 0x21, 0xF4,
|
||||||
|
0xBE, 0x75, 0xA2, 0x75, 0xD2, 0xE9, 0xE1, 0x5A, 0xD0, 0x20, 0x30, 0x78, 0x41, 0x62, 0x4D, 0x6B, 0x5E, 0x6E, 0x1B, 0x17,
|
||||||
|
0x10, 0x24, 0x4A, 0xD8, 0x58, 0x87, 0x75, 0xD0, 0x15, 0xD7, 0x62, 0xBB, 0xFD, 0x18, 0x56, 0x65, 0x84, 0x25, 0x61, 0x97,
|
||||||
|
0x7F, 0xAA, 0xD4, 0x9D, 0xF4, 0xF3, 0x5D, 0x6D, 0xA0, 0x31, 0xC2, 0xE1, 0x9E, 0x02, 0xAC, 0x3E, 0x90, 0xC3, 0x32, 0x7E,
|
||||||
|
0xE8, 0x32, 0x90, 0x34, 0x16, 0xD0, 0x8B, 0x14, 0xCF, 0x95, 0xAC, 0xCE, 0xE5, 0x8C, 0x54, 0xA2, 0x65, 0xB8, 0xBF, 0xED,
|
||||||
|
0x18, 0x6A, 0x57, 0x07, 0x3E, 0xD3, 0xE7, 0x9A, 0x4A, 0x2F, 0x08, 0x1A, 0x04, 0x1C, 0x49, 0x87, 0x1A, 0x8A, 0xE6, 0x1B,
|
||||||
|
0x08, 0xA3, 0x65, 0xD8, 0x1C, 0x31, 0xC5, 0x0D, 0x9C, 0xBA, 0xB3, 0x68, 0xDD, 0xF4, 0x50, 0x76, 0x16, 0x06, 0x75, 0xFE,
|
||||||
|
0xC4, 0x03, 0xE7, 0xD1, 0x3E, 0xDF, 0xDC, 0x86, 0x2E, 0x10, 0x02, 0x7E, 0x66, 0x12, 0x96, 0x53, 0x4E, 0x7A, 0xF3, 0x36,
|
||||||
|
0x58, 0x79, 0xB1, 0x20, 0x42, 0xD8, 0x96, 0x3F, 0x35, 0xBE, 0x3F, 0x8E, 0xF2, 0x99, 0x97, 0x43, 0xF5, 0xE4, 0x0C, 0xE1,
|
||||||
|
0x3C, 0x68, 0x72, 0x8C, 0x8D, 0x49, 0xD7, 0x5A, 0x52, 0xB5, 0x73, 0xFB, 0x7A, 0x35, 0x94, 0x3A, 0x61, 0xB0, 0x84, 0x82,
|
||||||
|
0xC0, 0x48, 0x85, 0xC1, 0x97, 0x32, 0xD3, 0x9B, 0x72, 0x5F, 0xA0, 0xD2, 0x34, 0x8F, 0x7E, 0xF0, 0x46, 0x7C, 0xF2, 0x8C,
|
||||||
|
0x72, 0x94, 0xC7, 0x07, 0xB0, 0xD7, 0xB5, 0xB2, 0x30, 0xB8, 0x19, 0x65, 0xF0, 0x9C, 0x83, 0x27, 0xB0, 0xA0, 0xAB, 0xD0,
|
||||||
|
0xA2, 0x72, 0x7E, 0x05, 0x0F, 0xB3, 0xAE, 0xDD, 0xB9, 0x5B, 0x9B, 0x42, 0xBC, 0xC3, 0x26, 0x63, 0x45, 0x6B, 0x86, 0xF1,
|
||||||
|
0x1D, 0x46, 0x43, 0xED, 0xC8, 0x30, 0x82, 0x05, 0x45, 0x30, 0x82, 0x04, 0x2D, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10,
|
||||||
|
0x02, 0x9C, 0x50, 0xCD, 0xDE, 0xED, 0x67, 0xF7, 0x59, 0xC0, 0xCA, 0x64, 0x85, 0x46, 0x3C, 0xAC, 0x30, 0x0D, 0x06, 0x09,
|
||||||
|
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x72, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
|
||||||
|
0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67,
|
||||||
|
0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10,
|
||||||
|
0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x31, 0x30, 0x2F,
|
||||||
|
0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x53, 0x48, 0x41, 0x32,
|
||||||
|
0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67,
|
||||||
|
0x6E, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x35, 0x30, 0x39, 0x30, 0x30, 0x30,
|
||||||
|
0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x35, 0x31, 0x33, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x30,
|
||||||
|
0x81, 0x81, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x18, 0x30, 0x16, 0x06,
|
||||||
|
0x03, 0x55, 0x04, 0x07, 0x13, 0x0F, 0x4E, 0x65, 0x77, 0x20, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x20, 0x43, 0x69, 0x74,
|
||||||
|
0x79, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x22, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x2D, 0x53, 0x74,
|
||||||
|
0x61, 0x72, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x43, 0x4F, 0x2E,
|
||||||
|
0x2C, 0x20, 0x4C, 0x54, 0x44, 0x2E, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4D, 0x69, 0x63,
|
||||||
|
0x72, 0x6F, 0x2D, 0x53, 0x74, 0x61, 0x72, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x61,
|
||||||
|
0x6C, 0x20, 0x43, 0x4F, 0x2E, 0x2C, 0x20, 0x4C, 0x54, 0x44, 0x2E, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A,
|
||||||
|
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02,
|
||||||
|
0x82, 0x01, 0x01, 0x00, 0x86, 0x19, 0x10, 0xE5, 0x0D, 0x08, 0x06, 0xB9, 0x9C, 0xF9, 0x1F, 0x82, 0xAD, 0x38, 0xFE, 0x20,
|
||||||
|
0xE8, 0x5F, 0x7A, 0xC9, 0xFB, 0x42, 0x32, 0x4B, 0x2D, 0xE9, 0x91, 0xA9, 0xBF, 0x6C, 0x81, 0x51, 0x6C, 0x56, 0x71, 0x57,
|
||||||
|
0xA0, 0x3D, 0x83, 0x77, 0x22, 0x17, 0x6E, 0xF2, 0xDA, 0xA1, 0x0C, 0x85, 0x55, 0x84, 0x56, 0xBB, 0xF0, 0xE0, 0xE3, 0x25,
|
||||||
|
0x21, 0xCE, 0xDB, 0xA9, 0x37, 0xF1, 0x4D, 0xF0, 0xB8, 0xE4, 0xEA, 0xCF, 0x78, 0xE3, 0x6D, 0x16, 0x40, 0xA2, 0xA8, 0x00,
|
||||||
|
0x3B, 0xC8, 0x74, 0x8B, 0x12, 0xDF, 0x77, 0x2C, 0x34, 0x89, 0x94, 0x2E, 0x08, 0x95, 0x8D, 0xF9, 0x93, 0xF8, 0x4D, 0xBD,
|
||||||
|
0x15, 0x3F, 0xCF, 0x6D, 0x42, 0xC0, 0x9D, 0x71, 0xB7, 0xD6, 0xBA, 0xA6, 0x70, 0x7B, 0xB0, 0x8D, 0x28, 0x94, 0xC0, 0x1D,
|
||||||
|
0x6C, 0x9F, 0x2E, 0x52, 0x65, 0xC3, 0xEC, 0xBF, 0xE5, 0xE9, 0x6F, 0x7F, 0x95, 0x13, 0x85, 0x06, 0x89, 0x8E, 0xF0, 0x33,
|
||||||
|
0x9E, 0x0F, 0xD1, 0x4C, 0x43, 0x8E, 0x6A, 0x45, 0x15, 0xBC, 0xB8, 0x3F, 0x22, 0xDD, 0xDF, 0xE0, 0xCB, 0xF2, 0xEF, 0xB7,
|
||||||
|
0x96, 0x36, 0x3F, 0xBD, 0x7F, 0x14, 0xE3, 0x1E, 0x2F, 0x35, 0xB5, 0x22, 0x94, 0x1C, 0x5F, 0x5A, 0xFF, 0x4E, 0x95, 0x9B,
|
||||||
|
0x8E, 0x07, 0x17, 0xC9, 0xA7, 0xDB, 0xEB, 0xF9, 0xC8, 0x5A, 0xA7, 0x30, 0x3C, 0xD0, 0xCF, 0xFC, 0x56, 0x5E, 0xA6, 0xC5,
|
||||||
|
0x70, 0xE6, 0x56, 0x39, 0xDB, 0xD6, 0x02, 0x8B, 0x4C, 0x20, 0xE7, 0xAC, 0x16, 0xAA, 0x7C, 0xC4, 0xFD, 0x7D, 0x21, 0xE2,
|
||||||
|
0xEA, 0x03, 0xB4, 0xDD, 0x80, 0x68, 0x5B, 0x2F, 0x8B, 0x78, 0xB8, 0x76, 0xFB, 0x6F, 0xF1, 0x2E, 0x3C, 0x3A, 0x4A, 0x9D,
|
||||||
|
0x41, 0xA3, 0x3C, 0xCA, 0xF5, 0x34, 0x99, 0x02, 0xD5, 0xF9, 0xB2, 0xEE, 0xFF, 0xE4, 0xBD, 0xA4, 0x1C, 0x24, 0xED, 0xF7,
|
||||||
|
0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xC5, 0x30, 0x82, 0x01, 0xC1, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,
|
||||||
|
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x5A, 0xC4, 0xB9, 0x7B, 0x2A, 0x0A, 0xA3, 0xA5, 0xEA, 0x71, 0x03, 0xC0, 0x60, 0xF9,
|
||||||
|
0x2D, 0xF6, 0x65, 0x75, 0x0E, 0x58, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xCF, 0xB3, 0xB0,
|
||||||
|
0x0B, 0xD8, 0x9A, 0x3A, 0xF8, 0x27, 0x7A, 0x08, 0x6D, 0xB8, 0x46, 0xD9, 0x00, 0xF0, 0xB1, 0x7B, 0x38, 0x30, 0x0E, 0x06,
|
||||||
|
0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25,
|
||||||
|
0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x77, 0x06, 0x03, 0x55, 0x1D,
|
||||||
|
0x1F, 0x04, 0x70, 0x30, 0x6E, 0x30, 0x35, 0xA0, 0x33, 0xA0, 0x31, 0x86, 0x2F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F,
|
||||||
|
0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x73, 0x68,
|
||||||
|
0x61, 0x32, 0x2D, 0x61, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x2D, 0x63, 0x73, 0x2D, 0x67, 0x31, 0x2E, 0x63, 0x72, 0x6C,
|
||||||
|
0x30, 0x35, 0xA0, 0x33, 0xA0, 0x31, 0x86, 0x2F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x34, 0x2E,
|
||||||
|
0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x73, 0x68, 0x61, 0x32, 0x2D, 0x61, 0x73,
|
||||||
|
0x73, 0x75, 0x72, 0x65, 0x64, 0x2D, 0x63, 0x73, 0x2D, 0x67, 0x31, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x4C, 0x06, 0x03, 0x55,
|
||||||
|
0x1D, 0x20, 0x04, 0x45, 0x30, 0x43, 0x30, 0x37, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x03, 0x01, 0x30,
|
||||||
|
0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73,
|
||||||
|
0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F,
|
||||||
|
0x43, 0x50, 0x53, 0x30, 0x08, 0x06, 0x06, 0x67, 0x81, 0x0C, 0x01, 0x04, 0x01, 0x30, 0x81, 0x84, 0x06, 0x08, 0x2B, 0x06,
|
||||||
|
0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x78, 0x30, 0x76, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07,
|
||||||
|
0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69,
|
||||||
|
0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x4E, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02,
|
||||||
|
0x86, 0x42, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69, 0x67,
|
||||||
|
0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x53, 0x48,
|
||||||
|
0x41, 0x32, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x43, 0x6F, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6E, 0x69,
|
||||||
|
0x6E, 0x67, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x02,
|
||||||
|
0x30, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01,
|
||||||
|
0x01, 0x00, 0x2A, 0xC6, 0xFF, 0xBF, 0xE0, 0x0F, 0xF1, 0xB9, 0xD3, 0xDF, 0xE7, 0x12, 0x94, 0x66, 0xCC, 0x3B, 0xCD, 0xD0,
|
||||||
|
0x77, 0x02, 0x73, 0x06, 0xE4, 0xBA, 0x1C, 0xE7, 0x68, 0xD2, 0xAA, 0xA7, 0x68, 0x9A, 0xED, 0xE0, 0x74, 0x02, 0xCB, 0x3C,
|
||||||
|
0xFE, 0xDF, 0x43, 0x16, 0x79, 0xAE, 0x6B, 0xDC, 0x67, 0xB2, 0xF9, 0x3C, 0x28, 0x24, 0x3C, 0x66, 0x13, 0x39, 0x44, 0x4D,
|
||||||
|
0xBC, 0xAC, 0xF4, 0xDB, 0x08, 0x84, 0x58, 0x3D, 0x8F, 0x01, 0xC2, 0x14, 0x5B, 0xA5, 0x71, 0x28, 0xB1, 0x74, 0x5C, 0x34,
|
||||||
|
0x4D, 0xBA, 0xB5, 0x06, 0xA7, 0x6A, 0x4E, 0xFA, 0x08, 0xC8, 0x30, 0x97, 0x3C, 0x7A, 0x50, 0x34, 0x04, 0xC3, 0x84, 0xAC,
|
||||||
|
0x7E, 0xF9, 0x15, 0x1B, 0x24, 0x8A, 0xFF, 0xB5, 0xC9, 0xB4, 0x82, 0xCA, 0xCA, 0x42, 0xED, 0xCE, 0x69, 0x62, 0x8C, 0x83,
|
||||||
|
0xE4, 0xD3, 0x88, 0x63, 0x47, 0x54, 0x49, 0x20, 0x15, 0xAF, 0xA3, 0x17, 0xDD, 0xB5, 0x5D, 0xD5, 0x83, 0x67, 0xF8, 0x22,
|
||||||
|
0x07, 0x97, 0x73, 0x45, 0x08, 0x0D, 0x44, 0xC6, 0xE7, 0xCC, 0xAC, 0x45, 0x59, 0xDB, 0xBC, 0xFF, 0x6A, 0xDC, 0xE9, 0x4B,
|
||||||
|
0xC2, 0x23, 0x3F, 0x0C, 0x48, 0xCB, 0x63, 0x41, 0x91, 0xE0, 0x5F, 0x02, 0x54, 0x31, 0x50, 0xD5, 0xC5, 0xDE, 0x00, 0x30,
|
||||||
|
0x2D, 0x44, 0x30, 0xE6, 0x2B, 0x3C, 0x94, 0xF7, 0xC4, 0x90, 0x80, 0x8C, 0xC0, 0x31, 0x30, 0x25, 0xFC, 0xC8, 0x72, 0x37,
|
||||||
|
0x1C, 0x0D, 0x97, 0x61, 0x8A, 0x07, 0xF3, 0xE1, 0x2C, 0x68, 0x37, 0x91, 0x23, 0x92, 0xB2, 0xE8, 0xB3, 0x4B, 0x51, 0x0D,
|
||||||
|
0x29, 0x05, 0x11, 0xC9, 0x0F, 0xAA, 0x44, 0x24, 0xD8, 0x88, 0x7B, 0x84, 0x67, 0x06, 0x77, 0xBA, 0xE0, 0xE7, 0x22, 0x25,
|
||||||
|
0xCF, 0xA1, 0xBB, 0x47, 0x9E, 0x92, 0xDC, 0xE6, 0x90, 0x35, 0x41, 0x10, 0xDB, 0x44, 0x5A, 0x4B, 0xCA, 0x27, 0x31, 0x82,
|
||||||
|
0x19, 0xAA, 0x30, 0x82, 0x19, 0xA6, 0x02, 0x01, 0x01, 0x30, 0x81, 0x86, 0x30, 0x72, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
|
||||||
|
0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69,
|
||||||
|
0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
|
||||||
|
0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x31, 0x30,
|
||||||
|
0x2F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x53, 0x48, 0x41,
|
||||||
|
0x32, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69,
|
||||||
|
0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x41, 0x02, 0x10, 0x02, 0x9C, 0x50, 0xCD, 0xDE, 0xED, 0x67, 0xF7, 0x59, 0xC0,
|
||||||
|
0xCA, 0x64, 0x85, 0x46, 0x3C, 0xAC, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
|
||||||
|
0x00, 0xA0, 0x7C, 0x30, 0x10, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0C, 0x31, 0x02, 0x30,
|
||||||
|
0x00, 0x30, 0x19, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0C, 0x06, 0x0A, 0x2B, 0x06,
|
||||||
|
0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02,
|
||||||
|
0x01, 0x0B, 0x31, 0x0E, 0x30, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x15, 0x30, 0x2F,
|
||||||
|
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0x26, 0xB8, 0x5C, 0x7A, 0x74,
|
||||||
|
0x16, 0x4C, 0x9D, 0xDD, 0x39, 0x5A, 0x4E, 0x44, 0xDE, 0x8D, 0x77, 0x86, 0xA6, 0xBC, 0x6A, 0xD8, 0x11, 0x30, 0xAF, 0x96,
|
||||||
|
0xD8, 0xB5, 0x54, 0x15, 0xC6, 0x4E, 0x97, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01,
|
||||||
|
0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x74, 0x9F, 0x62, 0x39, 0xB4, 0xD4, 0x91, 0x58, 0xA5, 0x7D, 0xB0, 0xD0, 0x3A, 0x58,
|
||||||
|
0xE4, 0x14, 0xEC, 0x6C, 0x0E, 0x84, 0x26, 0x89, 0x21, 0x26, 0x40, 0x64, 0x50, 0xC2, 0x48, 0x58, 0xBF, 0x08, 0x37, 0xD9,
|
||||||
|
0xB7, 0xC6, 0x77, 0x22, 0x96, 0x15, 0x1C, 0xD3, 0xEF, 0x55, 0xBB, 0x82, 0x0D, 0x16, 0x04, 0x80, 0xF7, 0x64, 0xDB, 0x92,
|
||||||
|
0x69, 0xEE, 0x1E, 0x47, 0x1D, 0x36, 0xE3, 0xB6, 0x6C, 0xCB, 0xFE, 0x31, 0xD1, 0x10, 0xED, 0x79, 0x16, 0xFE, 0xE5, 0xDD,
|
||||||
|
0x3C, 0xC1, 0xF8, 0x46, 0x78, 0xEC, 0x80, 0x69, 0x89, 0xD4, 0x45, 0x16, 0xCA, 0xC2, 0xD3, 0xD0, 0x05, 0x16, 0xF2, 0x01,
|
||||||
|
0xC7, 0x3C, 0x67, 0x3A, 0xFA, 0x3C, 0xA3, 0x26, 0x42, 0x3C, 0x82, 0xDD, 0x1E, 0x2D, 0x2F, 0x4F, 0xC1, 0x42, 0x6B, 0x37,
|
||||||
|
0x72, 0xD5, 0x87, 0x5E, 0xE6, 0x39, 0x06, 0x51, 0x6B, 0x40, 0xD3, 0x87, 0x6C, 0xE9, 0x37, 0x3B, 0x30, 0xBD, 0x17, 0xE9,
|
||||||
|
0x90, 0x88, 0x43, 0x68, 0x94, 0xC0, 0x6F, 0xDF, 0x69, 0xAF, 0x09, 0xEF, 0x3B, 0x8E, 0x00, 0x8F, 0xCE, 0xF3, 0x57, 0x63,
|
||||||
|
0x6B, 0x16, 0x1E, 0x02, 0x49, 0xE9, 0x37, 0xBD, 0x5F, 0x15, 0x0D, 0x88, 0x01, 0x0D, 0x4B, 0x96, 0x05, 0x96, 0x7A, 0x9B,
|
||||||
|
0x4D, 0xAC, 0x11, 0x92, 0xD3, 0xA1, 0xF3, 0xFA, 0x21, 0xAA, 0x9B, 0xB9, 0x16, 0x21, 0xD8, 0x8F, 0x95, 0x8B, 0x74, 0x19,
|
||||||
|
0xA4, 0x79, 0x60, 0xDE, 0xF5, 0xEC, 0x94, 0x16, 0x9A, 0x37, 0xCA, 0xB1, 0x7D, 0x9A, 0x54, 0xA9, 0x94, 0x56, 0x54, 0x9D,
|
||||||
|
0x40, 0x02, 0xF4, 0xC0, 0x48, 0xEC, 0x8B, 0x98, 0x1B, 0x37, 0x75, 0x00, 0x71, 0x18, 0xA6, 0xF2, 0x40, 0x5E, 0x75, 0xD6,
|
||||||
|
0xE5, 0xFE, 0xF3, 0x83, 0x3D, 0xE8, 0xE8, 0x43, 0x99, 0xD8, 0x32, 0x20, 0xD7, 0xAE, 0x36, 0x3D, 0x14, 0xA1, 0xEC, 0x0E,
|
||||||
|
0x46, 0x57, 0xA1, 0x82, 0x17, 0x76, 0x30, 0x82, 0x17, 0x72, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x03,
|
||||||
|
0x03, 0x01, 0x31, 0x82, 0x17, 0x62, 0x30, 0x82, 0x17, 0x5E, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07,
|
||||||
|
0x02, 0xA0, 0x82, 0x17, 0x4F, 0x30, 0x82, 0x17, 0x4B, 0x02, 0x01, 0x03, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86,
|
||||||
|
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x77, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
|
||||||
|
0x09, 0x10, 0x01, 0x04, 0xA0, 0x68, 0x04, 0x66, 0x30, 0x64, 0x02, 0x01, 0x01, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86,
|
||||||
|
0xFD, 0x6C, 0x07, 0x01, 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
|
||||||
|
0x00, 0x04, 0x20, 0x8E, 0x5A, 0x97, 0x0D, 0xF2, 0xAB, 0x0E, 0x25, 0x07, 0xF4, 0xE0, 0x95, 0x24, 0x76, 0x14, 0x7B, 0xA7,
|
||||||
|
0xF9, 0x39, 0x54, 0x79, 0xCC, 0x48, 0x50, 0xF9, 0x5D, 0x28, 0x22, 0x50, 0x56, 0x1C, 0x8C, 0x02, 0x10, 0x6A, 0x89, 0xFF,
|
||||||
|
0x29, 0xE9, 0x7F, 0x6B, 0xC7, 0xBD, 0x45, 0x67, 0xD2, 0x0B, 0x48, 0xE0, 0xF6, 0x18, 0x0F, 0x32, 0x30, 0x32, 0x36, 0x30,
|
||||||
|
0x34, 0x32, 0x35, 0x30, 0x32, 0x33, 0x33, 0x35, 0x35, 0x5A, 0xA0, 0x82, 0x13, 0x3A, 0x30, 0x82, 0x06, 0xED, 0x30, 0x82,
|
||||||
|
0x04, 0xD5, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0A, 0x80, 0xEF, 0x18, 0x4B, 0x8D, 0xF1, 0x05, 0x82, 0xD1, 0xC4,
|
||||||
|
0x76, 0xA7, 0x95, 0x74, 0x68, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00,
|
||||||
|
0x30, 0x69, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06,
|
||||||
|
0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E,
|
||||||
|
0x31, 0x41, 0x30, 0x3F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x38, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20,
|
||||||
|
0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x47, 0x34, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70,
|
||||||
|
0x69, 0x6E, 0x67, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32,
|
||||||
|
0x30, 0x32, 0x35, 0x20, 0x43, 0x41, 0x31, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x35, 0x30, 0x36, 0x30, 0x34, 0x30, 0x30, 0x30,
|
||||||
|
0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x36, 0x30, 0x39, 0x30, 0x33, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30,
|
||||||
|
0x63, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,
|
||||||
|
0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31,
|
||||||
|
0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x53,
|
||||||
|
0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x73, 0x74,
|
||||||
|
0x61, 0x6D, 0x70, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x31,
|
||||||
|
0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
|
||||||
|
0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, 0x02, 0x0A, 0x02, 0x82, 0x02, 0x01, 0x00, 0xD0, 0x46, 0xAC, 0x2D, 0x12, 0xC6, 0x9E,
|
||||||
|
0xD0, 0xEA, 0xAE, 0x60, 0x56, 0xB3, 0x2B, 0x57, 0xBA, 0x6F, 0x51, 0xFF, 0x86, 0x70, 0x0A, 0x01, 0xDF, 0xCA, 0x37, 0xCC,
|
||||||
|
0x19, 0x42, 0x30, 0x63, 0x32, 0xA8, 0x99, 0xDF, 0x14, 0xD6, 0x71, 0xFB, 0x0B, 0xC0, 0xEB, 0xD1, 0xC5, 0x4C, 0x17, 0x70,
|
||||||
|
0x6C, 0x7C, 0x01, 0x48, 0xE7, 0x8B, 0xA6, 0xF3, 0xE7, 0x67, 0xC6, 0x4D, 0xFA, 0xFA, 0x3C, 0x74, 0x4D, 0xBF, 0xA4, 0xFB,
|
||||||
|
0xCE, 0xC7, 0xF5, 0x63, 0xF1, 0x37, 0x21, 0x4F, 0x24, 0x80, 0xD9, 0x1E, 0x10, 0x2A, 0x95, 0x43, 0xED, 0xDB, 0xCD, 0x66,
|
||||||
|
0x1E, 0xB0, 0x5B, 0x64, 0x7A, 0x91, 0x2B, 0xBD, 0x44, 0x9B, 0x7F, 0xE1, 0x08, 0x60, 0xB9, 0x2B, 0x2C, 0xA7, 0x7A, 0xA8,
|
||||||
|
0x99, 0xEE, 0xCC, 0xAF, 0x15, 0x72, 0x7D, 0x03, 0xBD, 0xB0, 0xCC, 0x7A, 0x64, 0x05, 0xA3, 0x14, 0x36, 0x0E, 0xCC, 0x38,
|
||||||
|
0xBC, 0x48, 0xE8, 0x4F, 0x51, 0x69, 0x4B, 0x9E, 0x1D, 0x34, 0x0A, 0x59, 0x7C, 0xA6, 0x3A, 0xD4, 0x70, 0x25, 0x77, 0x2B,
|
||||||
|
0x71, 0x34, 0xCF, 0x3D, 0x3D, 0x95, 0xD4, 0x3F, 0xFE, 0x70, 0x59, 0x65, 0x11, 0x2B, 0xE2, 0x1F, 0xC6, 0x23, 0xA0, 0xF1,
|
||||||
|
0x6F, 0x65, 0x28, 0xCA, 0xB3, 0x74, 0x8A, 0x3B, 0x54, 0x0D, 0x51, 0xD1, 0x5D, 0xD9, 0xA7, 0x70, 0xE3, 0x8C, 0x03, 0x70,
|
||||||
|
0xA8, 0x07, 0xF8, 0x94, 0x49, 0x13, 0x94, 0x20, 0xD0, 0xD3, 0xF7, 0xCA, 0x24, 0xB2, 0x8B, 0x93, 0x31, 0x81, 0x4E, 0x9C,
|
||||||
|
0x7A, 0x11, 0x87, 0xAF, 0xBC, 0xE8, 0xBB, 0x5C, 0xE7, 0x38, 0xCF, 0x28, 0x75, 0xB9, 0x2A, 0xA0, 0xAF, 0xA5, 0x27, 0x6E,
|
||||||
|
0x4B, 0x08, 0x70, 0x52, 0x6A, 0x2D, 0xB9, 0x08, 0x5C, 0x83, 0xDB, 0x70, 0xD9, 0x80, 0xF7, 0xC3, 0xAC, 0x92, 0x49, 0x2B,
|
||||||
|
0xBE, 0xDE, 0xA5, 0x3C, 0x0C, 0x3F, 0xA7, 0x8A, 0x03, 0x49, 0x16, 0x6B, 0x7A, 0x2C, 0x01, 0xEF, 0x1F, 0x72, 0x92, 0xB8,
|
||||||
|
0xD2, 0xE8, 0x64, 0xB7, 0x35, 0x1D, 0xFD, 0x89, 0x34, 0xC5, 0x4B, 0xE1, 0x0D, 0x4E, 0xA5, 0xBC, 0x9B, 0xA4, 0xC7, 0xB8,
|
||||||
|
0xE9, 0x87, 0x1E, 0x34, 0x0D, 0x0B, 0x7C, 0xDB, 0x27, 0xA9, 0xC9, 0xE9, 0x25, 0xE2, 0x2D, 0x2B, 0xF0, 0xE1, 0x29, 0xB3,
|
||||||
|
0xF1, 0x4D, 0x3B, 0x86, 0xA1, 0x7E, 0xF0, 0x24, 0xD7, 0x68, 0x44, 0xE4, 0x55, 0x6C, 0xF4, 0x75, 0x55, 0x59, 0xC3, 0xB9,
|
||||||
|
0x27, 0x87, 0x55, 0x99, 0x5C, 0xE2, 0xC7, 0x80, 0x3B, 0xEE, 0x9D, 0xDA, 0xC0, 0xB6, 0xEB, 0xF3, 0xD0, 0x3D, 0xD3, 0xF9,
|
||||||
|
0xD6, 0x1A, 0x35, 0xCC, 0x1A, 0x7E, 0xC5, 0x42, 0x19, 0x92, 0x94, 0x85, 0x03, 0xCB, 0xD6, 0x76, 0x85, 0x28, 0x1C, 0xB5,
|
||||||
|
0xA7, 0xA9, 0x65, 0x37, 0x74, 0x20, 0xB2, 0x14, 0x6D, 0x6B, 0xA1, 0x2A, 0xE0, 0x1E, 0x34, 0x87, 0x96, 0xAF, 0x31, 0xCA,
|
||||||
|
0x62, 0xE7, 0x8C, 0x26, 0xD2, 0x2D, 0x9E, 0x3D, 0x90, 0xF9, 0xA4, 0xF2, 0x2C, 0xB2, 0x8B, 0x33, 0x43, 0x21, 0x78, 0xFF,
|
||||||
|
0xFD, 0xC3, 0xA0, 0xAD, 0x8E, 0xEB, 0x95, 0x1C, 0x93, 0x95, 0xA0, 0x82, 0x7F, 0x0E, 0xDA, 0x49, 0x44, 0x4E, 0xC2, 0x7B,
|
||||||
|
0xBB, 0xCC, 0x44, 0x7A, 0x11, 0xA2, 0x7E, 0x02, 0x58, 0x8B, 0xEE, 0x88, 0xD3, 0x75, 0x2E, 0x4F, 0x58, 0xFB, 0x16, 0x7A,
|
||||||
|
0xEA, 0x56, 0xB3, 0xB3, 0x69, 0x0A, 0x15, 0x24, 0xE7, 0x9E, 0x4A, 0xD3, 0xDE, 0x95, 0xD6, 0x11, 0x34, 0xC9, 0x92, 0x17,
|
||||||
|
0x7B, 0xE8, 0x22, 0x03, 0x05, 0xB4, 0xD1, 0xA1, 0xF3, 0xAC, 0x37, 0x21, 0x21, 0xCD, 0x9B, 0x42, 0x1A, 0x69, 0xD0, 0x8A,
|
||||||
|
0x0A, 0x45, 0x1E, 0xD8, 0xB9, 0xF0, 0x24, 0xA6, 0xBC, 0x4C, 0x89, 0x70, 0x09, 0x43, 0x55, 0xC2, 0x9A, 0x70, 0x9F, 0x80,
|
||||||
|
0xF7, 0xFC, 0xFB, 0x79, 0xA7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x95, 0x30, 0x82, 0x01, 0x91, 0x30, 0x0C,
|
||||||
|
0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04,
|
||||||
|
0x16, 0x04, 0x14, 0xE4, 0x3B, 0xFC, 0xF2, 0x31, 0xED, 0xFD, 0xFD, 0xD7, 0xF3, 0x91, 0x71, 0x63, 0x19, 0x50, 0x43, 0xCF,
|
||||||
|
0x61, 0x8C, 0xE8, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xEF, 0x6F, 0x53, 0x4A,
|
||||||
|
0xE9, 0xE4, 0x06, 0x7C, 0x7A, 0xCA, 0xE2, 0x90, 0x56, 0xF6, 0x2F, 0xD4, 0x49, 0xEC, 0xCB, 0x4E, 0x30, 0x0E, 0x06, 0x03,
|
||||||
|
0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x16, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x01,
|
||||||
|
0x01, 0xFF, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x81, 0x95, 0x06,
|
||||||
|
0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x81, 0x88, 0x30, 0x81, 0x85, 0x30, 0x24, 0x06, 0x08, 0x2B,
|
||||||
|
0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70,
|
||||||
|
0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x5D, 0x06, 0x08, 0x2B, 0x06, 0x01,
|
||||||
|
0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x51, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74,
|
||||||
|
0x73, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43,
|
||||||
|
0x65, 0x72, 0x74, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x47, 0x34, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D,
|
||||||
|
0x70, 0x69, 0x6E, 0x67, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, 0x32,
|
||||||
|
0x35, 0x43, 0x41, 0x31, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x5F, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x58, 0x30, 0x56, 0x30,
|
||||||
|
0x54, 0xA0, 0x52, 0xA0, 0x50, 0x86, 0x4E, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64,
|
||||||
|
0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74,
|
||||||
|
0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x47, 0x34, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x69, 0x6E,
|
||||||
|
0x67, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, 0x32, 0x35, 0x43, 0x41,
|
||||||
|
0x31, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x20, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x19, 0x30, 0x17, 0x30, 0x08, 0x06, 0x06,
|
||||||
|
0x67, 0x81, 0x0C, 0x01, 0x04, 0x02, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x07, 0x01, 0x30,
|
||||||
|
0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x65,
|
||||||
|
0x2A, 0xAD, 0xF1, 0x1C, 0x27, 0x04, 0xB9, 0xAE, 0x60, 0x41, 0xEC, 0xD1, 0x08, 0x44, 0x9E, 0x63, 0x40, 0x72, 0x21, 0xF8,
|
||||||
|
0xE4, 0xF6, 0x22, 0x4F, 0xDB, 0x35, 0x8B, 0xA5, 0x0A, 0xB5, 0x6F, 0x85, 0x11, 0x1A, 0x7C, 0x16, 0x05, 0xD1, 0x19, 0x0F,
|
||||||
|
0xD8, 0x01, 0xAB, 0xD7, 0xCD, 0x68, 0xD9, 0x85, 0x8F, 0xA1, 0x21, 0xF3, 0xF6, 0x26, 0x44, 0x37, 0xF1, 0x4F, 0xB0, 0xB4,
|
||||||
|
0x93, 0xC1, 0x54, 0x16, 0xA3, 0x61, 0xFA, 0xDB, 0x21, 0x81, 0xBE, 0x0E, 0xE8, 0xB8, 0x23, 0x83, 0xC2, 0xBC, 0x7A, 0x50,
|
||||||
|
0xB8, 0xFA, 0x85, 0x82, 0xAA, 0x75, 0x3F, 0x30, 0xBF, 0x65, 0x15, 0xF8, 0xA6, 0xF3, 0xFF, 0x72, 0x26, 0x66, 0x52, 0x7B,
|
||||||
|
0x61, 0x7C, 0x01, 0x0F, 0xD4, 0x74, 0xA1, 0x4E, 0xB6, 0x3E, 0xD8, 0x31, 0x39, 0xAA, 0x3C, 0xEF, 0x66, 0xCE, 0xC9, 0x20,
|
||||||
|
0x88, 0x2D, 0xD0, 0x60, 0x85, 0x0F, 0xD9, 0x2D, 0xC7, 0x42, 0xF1, 0xC6, 0xD4, 0x50, 0xEE, 0xF9, 0x65, 0x2A, 0x5B, 0x87,
|
||||||
|
0x5A, 0x22, 0xA4, 0xE8, 0x5C, 0x51, 0x3F, 0x25, 0x0F, 0xC4, 0x00, 0x18, 0x1F, 0x65, 0x72, 0xD6, 0x53, 0x4C, 0xE2, 0x4C,
|
||||||
|
0xDE, 0x91, 0xDF, 0x28, 0x10, 0x04, 0x73, 0x14, 0x05, 0xA0, 0x79, 0x6D, 0xDA, 0xCF, 0x6C, 0x5E, 0x8C, 0x45, 0x8B, 0x34,
|
||||||
|
0xDE, 0x1E, 0x28, 0x6C, 0x43, 0x27, 0xC5, 0x83, 0x97, 0xF1, 0x50, 0x51, 0x29, 0xED, 0x6E, 0x36, 0x7C, 0xD0, 0x55, 0x37,
|
||||||
|
0x8B, 0x9E, 0x2D, 0xA7, 0x1E, 0x45, 0xFF, 0x42, 0xAB, 0xD7, 0x9C, 0xD6, 0xFE, 0x62, 0x40, 0xC5, 0x93, 0x15, 0x06, 0xB4,
|
||||||
|
0xC4, 0xDA, 0x88, 0xB4, 0x7D, 0xC2, 0x3C, 0x54, 0xC6, 0xED, 0xA1, 0x10, 0x26, 0x69, 0xAB, 0x25, 0x35, 0x77, 0x42, 0x1B,
|
||||||
|
0x5F, 0xA5, 0xAA, 0xF3, 0xF8, 0x15, 0xBA, 0xD0, 0xE8, 0x8C, 0x12, 0x05, 0x79, 0x19, 0x6A, 0x01, 0xCB, 0x84, 0x55, 0x3D,
|
||||||
|
0x1C, 0x2A, 0xC6, 0xFE, 0xCC, 0x93, 0x44, 0xB2, 0xE1, 0x01, 0xEC, 0xEE, 0xFF, 0x72, 0xEB, 0xD3, 0x41, 0xAB, 0x27, 0x33,
|
||||||
|
0xD0, 0x16, 0x70, 0x84, 0x1F, 0x56, 0x39, 0xF3, 0xAE, 0xFC, 0x22, 0x09, 0x9F, 0x39, 0x10, 0x4F, 0x0B, 0x52, 0x4A, 0x91,
|
||||||
|
0x86, 0x84, 0xB7, 0x63, 0x9D, 0x0E, 0x1E, 0x06, 0x98, 0xED, 0x3F, 0xE5, 0xC1, 0xDE, 0x94, 0x02, 0xB6, 0xFE, 0x04, 0xE5,
|
||||||
|
0x40, 0x92, 0x0D, 0xA8, 0x3A, 0xFA, 0x25, 0xFC, 0x32, 0x60, 0x75, 0xD2, 0x77, 0xE5, 0x74, 0xF1, 0x7D, 0x49, 0x50, 0xFB,
|
||||||
|
0xC1, 0xE0, 0x82, 0xDF, 0x25, 0xD9, 0x8B, 0xFB, 0xAE, 0x86, 0xA7, 0x70, 0x92, 0x05, 0x71, 0xBA, 0x23, 0x05, 0xCC, 0x65,
|
||||||
|
0x45, 0xC1, 0x86, 0xD0, 0xB2, 0x21, 0xA7, 0xA1, 0xAF, 0x45, 0xE4, 0x06, 0x80, 0xC8, 0x18, 0xC5, 0x06, 0xD5, 0xD5, 0x2D,
|
||||||
|
0xC2, 0xAD, 0x6A, 0x99, 0xCC, 0x1B, 0x75, 0x47, 0xDC, 0x49, 0x80, 0xA7, 0xF8, 0xEC, 0x27, 0x71, 0x55, 0x17, 0x7F, 0x9D,
|
||||||
|
0xD5, 0x25, 0x43, 0x4E, 0x68, 0xC5, 0x8C, 0xB6, 0xCD, 0x15, 0x95, 0x16, 0x31, 0x7B, 0x99, 0xCA, 0xF8, 0x0B, 0x7E, 0x0C,
|
||||||
|
0x8F, 0x7A, 0x1C, 0x09, 0x57, 0x1C, 0x02, 0xF9, 0x4A, 0x57, 0xD8, 0xC4, 0x9E, 0xCB, 0x6B, 0x9E, 0x22, 0xEF, 0x53, 0x1C,
|
||||||
|
0x55, 0x64, 0x4F, 0xEB, 0xA6, 0xD6, 0xFB, 0x21, 0x11, 0x36, 0x96, 0xC9, 0x0A, 0x3C, 0x82, 0x60, 0x6D, 0xA3, 0xF9, 0xB7,
|
||||||
|
0x69, 0xC6, 0x8F, 0xF5, 0x0B, 0x2E, 0x2E, 0x3D, 0xC5, 0x37, 0x01, 0x65, 0x4F, 0x1A, 0xB6, 0xE7, 0xE4, 0xF8, 0x43, 0x05,
|
||||||
|
0xFD, 0xC5, 0xAE, 0x88, 0x2E, 0xCF, 0x38, 0x64, 0xFB, 0xE6, 0xA6, 0x8B, 0xEA, 0xF7, 0x42, 0xBC, 0x79, 0x6C, 0x86, 0xD8,
|
||||||
|
0xDD, 0x35, 0x73, 0x82, 0x21, 0x48, 0xEC, 0x6A, 0xB7, 0xCD, 0x67, 0x30, 0x82, 0x06, 0xB4, 0x30, 0x82, 0x04, 0x9C, 0xA0,
|
||||||
|
0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0D, 0xC7, 0xAC, 0x57, 0x05, 0xFF, 0x21, 0x99, 0x2E, 0x40, 0x43, 0x22, 0x0C, 0x3A,
|
||||||
|
0x49, 0x86, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x62, 0x31,
|
||||||
|
0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04,
|
||||||
|
0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06,
|
||||||
|
0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63,
|
||||||
|
0x6F, 0x6D, 0x31, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72,
|
||||||
|
0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x34, 0x30, 0x1E, 0x17,
|
||||||
|
0x0D, 0x32, 0x35, 0x30, 0x35, 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x38, 0x30, 0x31,
|
||||||
|
0x31, 0x34, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x69, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
|
||||||
|
0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43,
|
||||||
|
0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x41, 0x30, 0x3F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x38,
|
||||||
|
0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x47, 0x34, 0x20,
|
||||||
|
0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x69, 0x6E, 0x67, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36,
|
||||||
|
0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x43, 0x41, 0x31, 0x30, 0x82, 0x02, 0x22,
|
||||||
|
0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00,
|
||||||
|
0x30, 0x82, 0x02, 0x0A, 0x02, 0x82, 0x02, 0x01, 0x00, 0xB4, 0x78, 0x31, 0xD3, 0x0A, 0x98, 0x41, 0x72, 0xBE, 0x3C, 0x46,
|
||||||
|
0xC0, 0x1C, 0xAC, 0x75, 0xDB, 0xA3, 0x46, 0x68, 0x74, 0xB4, 0x51, 0x17, 0x9D, 0x4D, 0xAD, 0x8D, 0x0D, 0x94, 0xB5, 0x99,
|
||||||
|
0x96, 0x83, 0x2C, 0x54, 0xED, 0x43, 0x6A, 0x11, 0x8F, 0x35, 0x17, 0x32, 0x6C, 0x42, 0xAA, 0xF9, 0x1B, 0xB0, 0x3A, 0x73,
|
||||||
|
0xE1, 0xA1, 0xFE, 0xA9, 0xBC, 0x5E, 0x2E, 0x1A, 0x3C, 0x23, 0xA8, 0xD8, 0xDF, 0x12, 0xF5, 0x22, 0xEB, 0x0B, 0xA2, 0x9B,
|
||||||
|
0x96, 0xDA, 0xA7, 0xED, 0x25, 0x82, 0x5A, 0x0C, 0xDB, 0x35, 0xF8, 0x91, 0xFB, 0x67, 0xE4, 0x1D, 0x48, 0xA5, 0x8C, 0xD3,
|
||||||
|
0xAA, 0x9C, 0x85, 0x43, 0xFE, 0x01, 0xB7, 0x49, 0x80, 0xC4, 0x01, 0xDE, 0x1D, 0x83, 0x67, 0x43, 0x1A, 0x97, 0x99, 0x18,
|
||||||
|
0xA7, 0xBE, 0xE3, 0x60, 0xC5, 0x50, 0x5D, 0x26, 0x47, 0xFB, 0xED, 0x2D, 0xAE, 0x3E, 0x80, 0xA3, 0xEC, 0x61, 0xFC, 0x04,
|
||||||
|
0xBB, 0xB1, 0x04, 0x6E, 0x40, 0xBD, 0xFB, 0x41, 0x76, 0xC3, 0x84, 0x09, 0x2D, 0x54, 0x93, 0x10, 0x6F, 0x32, 0x01, 0x1D,
|
||||||
|
0x82, 0x41, 0x62, 0x0C, 0xD6, 0x22, 0x39, 0x3C, 0x78, 0x3A, 0xD8, 0x85, 0x70, 0xC4, 0xA4, 0xA9, 0x3B, 0x45, 0xDA, 0x17,
|
||||||
|
0xD0, 0xCF, 0x7C, 0xD0, 0x4A, 0x4B, 0xB6, 0x5A, 0xCD, 0xC8, 0x7C, 0x34, 0x5E, 0x6F, 0xA7, 0xB7, 0x9A, 0x67, 0x60, 0x95,
|
||||||
|
0x37, 0x1A, 0x6A, 0xBA, 0x6C, 0xD3, 0x08, 0xD4, 0x8E, 0xC6, 0x6F, 0x92, 0x01, 0x64, 0xAE, 0x22, 0xBD, 0xB5, 0x42, 0x89,
|
||||||
|
0x9B, 0xFB, 0x3C, 0xD0, 0x58, 0xA8, 0x71, 0x29, 0x35, 0x55, 0x82, 0xD9, 0x94, 0x3C, 0x05, 0xB7, 0xE7, 0x15, 0x14, 0x15,
|
||||||
|
0x11, 0x26, 0x0E, 0xB3, 0x31, 0x48, 0xD9, 0x6B, 0xFC, 0xDB, 0x09, 0xC9, 0x45, 0xF3, 0x76, 0xD1, 0x54, 0x52, 0xDE, 0x1A,
|
||||||
|
0x4B, 0x80, 0x84, 0x78, 0x86, 0x3C, 0xCB, 0xD2, 0x1A, 0x68, 0x60, 0x69, 0x3C, 0xD5, 0xCA, 0x16, 0x27, 0xE2, 0x9D, 0x3E,
|
||||||
|
0xF3, 0x2F, 0x68, 0x1D, 0x16, 0x90, 0x4F, 0xF6, 0xA8, 0x7C, 0x49, 0xD2, 0xE7, 0x12, 0xEB, 0x7F, 0x19, 0xC6, 0xA5, 0x35,
|
||||||
|
0xE2, 0x50, 0xE7, 0x92, 0x2E, 0xC2, 0x72, 0x82, 0x82, 0xCF, 0xA7, 0xAE, 0x9B, 0x90, 0x35, 0xF5, 0x66, 0x50, 0x1E, 0x4A,
|
||||||
|
0x94, 0x25, 0xF7, 0x64, 0x0E, 0x31, 0xE4, 0x71, 0xCA, 0x4B, 0xEA, 0xEA, 0x06, 0xF2, 0x96, 0xC5, 0xD0, 0xB2, 0x40, 0x41,
|
||||||
|
0x06, 0x71, 0xB2, 0xDE, 0xD5, 0xBF, 0x00, 0xC3, 0x8C, 0x09, 0x92, 0x15, 0x35, 0x26, 0xB3, 0xEC, 0x15, 0xFC, 0x56, 0xD6,
|
||||||
|
0x06, 0xA8, 0xBB, 0x7D, 0x32, 0x67, 0x8E, 0xAD, 0xE1, 0x8F, 0x45, 0xDB, 0x41, 0xC7, 0x7C, 0x86, 0x38, 0xFF, 0xAB, 0xC7,
|
||||||
|
0x7A, 0xCA, 0x58, 0x31, 0x09, 0x94, 0x8A, 0x8B, 0x5E, 0xF2, 0x56, 0x9D, 0x8D, 0x2F, 0xE7, 0x27, 0x4F, 0xA4, 0xE8, 0xCB,
|
||||||
|
0xEA, 0xCD, 0xFA, 0x73, 0x3C, 0x33, 0xB2, 0xE7, 0x2E, 0xA0, 0xAB, 0x3B, 0x62, 0x4F, 0xDE, 0x85, 0xBF, 0xFF, 0x5B, 0x1F,
|
||||||
|
0xB9, 0x90, 0xCA, 0x88, 0x31, 0x1B, 0xD4, 0x04, 0x3C, 0x7A, 0xCF, 0x57, 0xAF, 0xFB, 0xBA, 0x6C, 0x34, 0xE7, 0x60, 0x24,
|
||||||
|
0xCA, 0x22, 0xC0, 0xEA, 0xD4, 0x1B, 0x66, 0x5D, 0x4A, 0x84, 0x1B, 0x53, 0x6A, 0xCC, 0x92, 0x92, 0xE2, 0x43, 0xA6, 0xC6,
|
||||||
|
0x46, 0x29, 0xD9, 0x6C, 0x8E, 0x0E, 0x2E, 0xEF, 0x41, 0x30, 0x81, 0x66, 0xD5, 0x45, 0x25, 0xF5, 0x59, 0xDE, 0x3E, 0xCE,
|
||||||
|
0x81, 0x69, 0xA7, 0x84, 0x5A, 0xF8, 0xC9, 0x4A, 0x33, 0x66, 0xDA, 0xA0, 0x3E, 0xB1, 0xD1, 0x54, 0x78, 0x46, 0x34, 0xA9,
|
||||||
|
0x58, 0xCF, 0x28, 0xE5, 0xAE, 0x83, 0xF1, 0xBA, 0x5F, 0x9B, 0x80, 0x8B, 0x29, 0xCC, 0xEC, 0x1B, 0xB6, 0x6B, 0x20, 0x63,
|
||||||
|
0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x5D, 0x30, 0x82, 0x01, 0x59, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1D,
|
||||||
|
0x13, 0x01, 0x01, 0xFF, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D,
|
||||||
|
0x0E, 0x04, 0x16, 0x04, 0x14, 0xEF, 0x6F, 0x53, 0x4A, 0xE9, 0xE4, 0x06, 0x7C, 0x7A, 0xCA, 0xE2, 0x90, 0x56, 0xF6, 0x2F,
|
||||||
|
0xD4, 0x49, 0xEC, 0xCB, 0x4E, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xEC, 0xD7,
|
||||||
|
0xE3, 0x82, 0xD2, 0x71, 0x5D, 0x64, 0x4C, 0xDF, 0x2E, 0x67, 0x3F, 0xE7, 0xBA, 0x98, 0xAE, 0x1C, 0x0F, 0x4F, 0x30, 0x0E,
|
||||||
|
0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D,
|
||||||
|
0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x77, 0x06, 0x08, 0x2B,
|
||||||
|
0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x6B, 0x30, 0x69, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05,
|
||||||
|
0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67,
|
||||||
|
0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x41, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
|
||||||
|
0x02, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69,
|
||||||
|
0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x54,
|
||||||
|
0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x47, 0x34, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x43, 0x06, 0x03,
|
||||||
|
0x55, 0x1D, 0x1F, 0x04, 0x3C, 0x30, 0x3A, 0x30, 0x38, 0xA0, 0x36, 0xA0, 0x34, 0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3A,
|
||||||
|
0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F,
|
||||||
|
0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x47,
|
||||||
|
0x34, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x20, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x19, 0x30, 0x17, 0x30, 0x08, 0x06, 0x06,
|
||||||
|
0x67, 0x81, 0x0C, 0x01, 0x04, 0x02, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x07, 0x01, 0x30,
|
||||||
|
0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x17,
|
||||||
|
0xCE, 0xFB, 0x16, 0x80, 0x1C, 0xFE, 0x07, 0x3D, 0x11, 0x76, 0x71, 0x30, 0xBD, 0xBE, 0x0B, 0xC8, 0xB5, 0x34, 0xA6, 0x7F,
|
||||||
|
0xCD, 0xD0, 0x87, 0xC5, 0x88, 0x1A, 0x30, 0x7F, 0x4F, 0xC3, 0x9B, 0x5C, 0x06, 0x73, 0xF0, 0xE8, 0xEE, 0x85, 0x4C, 0x63,
|
||||||
|
0x69, 0xA1, 0x5D, 0x95, 0xE3, 0x0C, 0xD2, 0x50, 0x6B, 0xC8, 0xF4, 0xD0, 0x33, 0x6A, 0x84, 0x24, 0xF7, 0xB7, 0xEB, 0x3C,
|
||||||
|
0x1B, 0x48, 0x8F, 0xE6, 0x4B, 0xCD, 0xDA, 0x7E, 0xC9, 0x77, 0x61, 0x38, 0xFE, 0x21, 0x08, 0x50, 0x13, 0xB8, 0xD4, 0xFE,
|
||||||
|
0x45, 0xE3, 0x8F, 0x2B, 0x49, 0x82, 0x79, 0xF4, 0x86, 0xFA, 0xD5, 0xEA, 0x1A, 0x96, 0x19, 0xDD, 0xEB, 0x2C, 0x05, 0x2D,
|
||||||
|
0xEA, 0xF2, 0x72, 0xF6, 0x53, 0x03, 0x3E, 0x34, 0xCB, 0xC4, 0xB8, 0x17, 0x7F, 0xDA, 0xF9, 0x9D, 0x63, 0x10, 0xC2, 0xBF,
|
||||||
|
0x0C, 0xC9, 0xBF, 0x6B, 0x11, 0x52, 0x82, 0x84, 0x7C, 0x9F, 0xA7, 0x37, 0x9E, 0xE6, 0x41, 0xF4, 0x17, 0xC1, 0xC0, 0x04,
|
||||||
|
0x18, 0x2B, 0xD1, 0x47, 0x6A, 0x8A, 0xB6, 0x7B, 0x6E, 0x8C, 0x1E, 0xF5, 0x58, 0xF6, 0x00, 0x83, 0x03, 0xF2, 0x58, 0xB2,
|
||||||
|
0xAE, 0xE9, 0x19, 0xDA, 0x20, 0x3F, 0xC1, 0xD1, 0xB6, 0xB6, 0x1F, 0x72, 0xD4, 0x8B, 0x00, 0xD1, 0x01, 0x7C, 0x75, 0x35,
|
||||||
|
0xEA, 0xBD, 0xC9, 0xD3, 0x9A, 0x97, 0xDE, 0x42, 0x1D, 0xF9, 0x93, 0x9C, 0xCE, 0x08, 0xF9, 0x92, 0x36, 0xAD, 0x54, 0x1F,
|
||||||
|
0x8D, 0x74, 0x00, 0xD5, 0x64, 0xA3, 0x8D, 0xFE, 0x09, 0xD9, 0xAE, 0xE3, 0x2F, 0x35, 0x86, 0x36, 0xA3, 0x57, 0xF8, 0x31,
|
||||||
|
0x74, 0x49, 0x0C, 0xC7, 0x53, 0x4A, 0x53, 0x8B, 0x87, 0x41, 0xC2, 0x9F, 0x67, 0x10, 0x2F, 0x04, 0x02, 0xAA, 0x31, 0x5B,
|
||||||
|
0xAA, 0xB5, 0xEE, 0xBD, 0x33, 0xD2, 0x7A, 0x03, 0x8E, 0xCE, 0xBE, 0x04, 0x5A, 0x3E, 0xCF, 0xB6, 0xCA, 0x48, 0x1C, 0x19,
|
||||||
|
0x5D, 0x34, 0x4D, 0x8A, 0xF6, 0x2E, 0xBD, 0xED, 0xCB, 0xDA, 0x88, 0x8A, 0x36, 0xA7, 0xAD, 0x44, 0x77, 0x6A, 0x7C, 0xC4,
|
||||||
|
0xC2, 0x5B, 0xF3, 0x66, 0x28, 0xB2, 0x7D, 0x33, 0xE3, 0x2D, 0xB9, 0xC5, 0x46, 0xC8, 0xEC, 0x62, 0x0D, 0xFD, 0x3A, 0x55,
|
||||||
|
0x7C, 0x72, 0x2A, 0x43, 0xA2, 0xAE, 0xFE, 0xA8, 0xD3, 0x63, 0xA8, 0x5C, 0xDE, 0x1B, 0x17, 0x32, 0xB4, 0xBE, 0x53, 0x4C,
|
||||||
|
0xB2, 0xF8, 0x65, 0xAA, 0x01, 0x76, 0xA6, 0xE1, 0x3A, 0x16, 0x77, 0x65, 0x10, 0xD4, 0xA6, 0x13, 0xEF, 0x49, 0x19, 0x8C,
|
||||||
|
0x4E, 0x18, 0xB4, 0xBF, 0x0F, 0x6F, 0x38, 0x34, 0x73, 0x5B, 0xA0, 0x31, 0x9C, 0x99, 0x65, 0xDF, 0xC1, 0x74, 0x72, 0xE2,
|
||||||
|
0x46, 0xEE, 0xE1, 0x01, 0x61, 0x3A, 0x6D, 0x31, 0x26, 0xE1, 0x76, 0x11, 0x90, 0x0E, 0x93, 0x97, 0x82, 0x92, 0x14, 0xB1,
|
||||||
|
0x64, 0xE3, 0x77, 0xAC, 0x69, 0x47, 0xAA, 0x1A, 0x41, 0xFF, 0xC3, 0x25, 0xB8, 0x37, 0xB3, 0xA2, 0x82, 0x2C, 0xF0, 0x25,
|
||||||
|
0x67, 0xAE, 0x91, 0xCC, 0x88, 0x3D, 0xB0, 0x2F, 0x8D, 0x26, 0x9B, 0x9D, 0xFE, 0xFE, 0x3E, 0xED, 0x15, 0xAC, 0x58, 0x28,
|
||||||
|
0x8A, 0x8B, 0xD1, 0x0E, 0x2C, 0xB1, 0xDF, 0x31, 0x1D, 0x99, 0xC8, 0x9F, 0xFE, 0xC6, 0x10, 0xB1, 0xF7, 0x21, 0xDB, 0xC6,
|
||||||
|
0xD9, 0x79, 0x4C, 0xF6, 0xAE, 0xD6, 0x3F, 0xF5, 0x30, 0x80, 0xE9, 0x30, 0xFC, 0x74, 0x2D, 0xC9, 0x13, 0x7A, 0xD8, 0x92,
|
||||||
|
0xB8, 0x4B, 0x50, 0xBC, 0xBB, 0x0D, 0xCF, 0x74, 0x1B, 0xA7, 0xBC, 0x06, 0x5A, 0xA6, 0xC8, 0x88, 0xE5, 0x82, 0x9D, 0xBE,
|
||||||
|
0x56, 0xAB, 0x12, 0xF7, 0xFC, 0x10, 0x0F, 0xBC, 0x85, 0xCA, 0x52, 0x33, 0xD2, 0xC7, 0x26, 0x6C, 0xAB, 0xC5, 0xA1, 0x6D,
|
||||||
|
0xA3, 0x36, 0xB6, 0xCC, 0xD6, 0x90, 0xF6, 0x4F, 0xB9, 0xB7, 0x5C, 0x30, 0x82, 0x05, 0x8D, 0x30, 0x82, 0x04, 0x75, 0xA0,
|
||||||
|
0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0E, 0x9B, 0x18, 0x8E, 0xF9, 0xD0, 0x2D, 0xE7, 0xEF, 0xDB, 0x50, 0xE2, 0x08, 0x40,
|
||||||
|
0x18, 0x5A, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0C, 0x05, 0x00, 0x30, 0x65, 0x31,
|
||||||
|
0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04,
|
||||||
|
0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06,
|
||||||
|
0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63,
|
||||||
|
0x6F, 0x6D, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1B, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72,
|
||||||
|
0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41,
|
||||||
|
0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x30, 0x38, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33,
|
||||||
|
0x31, 0x31, 0x31, 0x30, 0x39, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x62, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
|
||||||
|
0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69,
|
||||||
|
0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
|
||||||
|
0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x21, 0x30,
|
||||||
|
0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75,
|
||||||
|
0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x34, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, 0x09,
|
||||||
|
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, 0x02, 0x0A,
|
||||||
|
0x02, 0x82, 0x02, 0x01, 0x00, 0xBF, 0xE6, 0x90, 0x73, 0x68, 0xDE, 0xBB, 0xE4, 0x5D, 0x4A, 0x3C, 0x30, 0x22, 0x30, 0x69,
|
||||||
|
0x33, 0xEC, 0xC2, 0xA7, 0x25, 0x2E, 0xC9, 0x21, 0x3D, 0xF2, 0x8A, 0xD8, 0x59, 0xC2, 0xE1, 0x29, 0xA7, 0x3D, 0x58, 0xAB,
|
||||||
|
0x76, 0x9A, 0xCD, 0xAE, 0x7B, 0x1B, 0x84, 0x0D, 0xC4, 0x30, 0x1F, 0xF3, 0x1B, 0xA4, 0x38, 0x16, 0xEB, 0x56, 0xC6, 0x97,
|
||||||
|
0x6D, 0x1D, 0xAB, 0xB2, 0x79, 0xF2, 0xCA, 0x11, 0xD2, 0xE4, 0x5F, 0xD6, 0x05, 0x3C, 0x52, 0x0F, 0x52, 0x1F, 0xC6, 0x9E,
|
||||||
|
0x15, 0xA5, 0x7E, 0xBE, 0x9F, 0xA9, 0x57, 0x16, 0x59, 0x55, 0x72, 0xAF, 0x68, 0x93, 0x70, 0xC2, 0xB2, 0xBA, 0x75, 0x99,
|
||||||
|
0x6A, 0x73, 0x32, 0x94, 0xD1, 0x10, 0x44, 0x10, 0x2E, 0xDF, 0x82, 0xF3, 0x07, 0x84, 0xE6, 0x74, 0x3B, 0x6D, 0x71, 0xE2,
|
||||||
|
0x2D, 0x0C, 0x1B, 0xEE, 0x20, 0xD5, 0xC9, 0x20, 0x1D, 0x63, 0x29, 0x2D, 0xCE, 0xEC, 0x5E, 0x4E, 0xC8, 0x93, 0xF8, 0x21,
|
||||||
|
0x61, 0x9B, 0x34, 0xEB, 0x05, 0xC6, 0x5E, 0xEC, 0x5B, 0x1A, 0xBC, 0xEB, 0xC9, 0xCF, 0xCD, 0xAC, 0x34, 0x40, 0x5F, 0xB1,
|
||||||
|
0x7A, 0x66, 0xEE, 0x77, 0xC8, 0x48, 0xA8, 0x66, 0x57, 0x57, 0x9F, 0x54, 0x58, 0x8E, 0x0C, 0x2B, 0xB7, 0x4F, 0xA7, 0x30,
|
||||||
|
0xD9, 0x56, 0xEE, 0xCA, 0x7B, 0x5D, 0xE3, 0xAD, 0xC9, 0x4F, 0x5E, 0xE5, 0x35, 0xE7, 0x31, 0xCB, 0xDA, 0x93, 0x5E, 0xDC,
|
||||||
|
0x8E, 0x8F, 0x80, 0xDA, 0xB6, 0x91, 0x98, 0x40, 0x90, 0x79, 0xC3, 0x78, 0xC7, 0xB6, 0xB1, 0xC4, 0xB5, 0x6A, 0x18, 0x38,
|
||||||
|
0x03, 0x10, 0x8D, 0xD8, 0xD4, 0x37, 0xA4, 0x2E, 0x05, 0x7D, 0x88, 0xF5, 0x82, 0x3E, 0x10, 0x91, 0x70, 0xAB, 0x55, 0x82,
|
||||||
|
0x41, 0x32, 0xD7, 0xDB, 0x04, 0x73, 0x2A, 0x6E, 0x91, 0x01, 0x7C, 0x21, 0x4C, 0xD4, 0xBC, 0xAE, 0x1B, 0x03, 0x75, 0x5D,
|
||||||
|
0x78, 0x66, 0xD9, 0x3A, 0x31, 0x44, 0x9A, 0x33, 0x40, 0xBF, 0x08, 0xD7, 0x5A, 0x49, 0xA4, 0xC2, 0xE6, 0xA9, 0xA0, 0x67,
|
||||||
|
0xDD, 0xA4, 0x27, 0xBC, 0xA1, 0x4F, 0x39, 0xB5, 0x11, 0x58, 0x17, 0xF7, 0x24, 0x5C, 0x46, 0x8F, 0x64, 0xF7, 0xC1, 0x69,
|
||||||
|
0x88, 0x76, 0x98, 0x76, 0x3D, 0x59, 0x5D, 0x42, 0x76, 0x87, 0x89, 0x97, 0x69, 0x7A, 0x48, 0xF0, 0xE0, 0xA2, 0x12, 0x1B,
|
||||||
|
0x66, 0x9A, 0x74, 0xCA, 0xDE, 0x4B, 0x1E, 0xE7, 0x0E, 0x63, 0xAE, 0xE6, 0xD4, 0xEF, 0x92, 0x92, 0x3A, 0x9E, 0x3D, 0xDC,
|
||||||
|
0x00, 0xE4, 0x45, 0x25, 0x89, 0xB6, 0x9A, 0x44, 0x19, 0x2B, 0x7E, 0xC0, 0x94, 0xB4, 0xD2, 0x61, 0x6D, 0xEB, 0x33, 0xD9,
|
||||||
|
0xC5, 0xDF, 0x4B, 0x04, 0x00, 0xCC, 0x7D, 0x1C, 0x95, 0xC3, 0x8F, 0xF7, 0x21, 0xB2, 0xB2, 0x11, 0xB7, 0xBB, 0x7F, 0xF2,
|
||||||
|
0xD5, 0x8C, 0x70, 0x2C, 0x41, 0x60, 0xAA, 0xB1, 0x63, 0x18, 0x44, 0x95, 0x1A, 0x76, 0x62, 0x7E, 0xF6, 0x80, 0xB0, 0xFB,
|
||||||
|
0xE8, 0x64, 0xA6, 0x33, 0xD1, 0x89, 0x07, 0xE1, 0xBD, 0xB7, 0xE6, 0x43, 0xA4, 0x18, 0xB8, 0xA6, 0x77, 0x01, 0xE1, 0x0F,
|
||||||
|
0x94, 0x0C, 0x21, 0x1D, 0xB2, 0x54, 0x29, 0x25, 0x89, 0x6C, 0xE5, 0x0E, 0x52, 0x51, 0x47, 0x74, 0xBE, 0x26, 0xAC, 0xB6,
|
||||||
|
0x41, 0x75, 0xDE, 0x7A, 0xAC, 0x5F, 0x8D, 0x3F, 0xC9, 0xBC, 0xD3, 0x41, 0x11, 0x12, 0x5B, 0xE5, 0x10, 0x50, 0xEB, 0x31,
|
||||||
|
0xC5, 0xCA, 0x72, 0x16, 0x22, 0x09, 0xDF, 0x7C, 0x4C, 0x75, 0x3F, 0x63, 0xEC, 0x21, 0x5F, 0xC4, 0x20, 0x51, 0x6B, 0x6F,
|
||||||
|
0xB1, 0xAB, 0x86, 0x8B, 0x4F, 0xC2, 0xD6, 0x45, 0x5F, 0x9D, 0x20, 0xFC, 0xA1, 0x1E, 0xC5, 0xC0, 0x8F, 0xA2, 0xB1, 0x7E,
|
||||||
|
0x0A, 0x26, 0x99, 0xF5, 0xE4, 0x69, 0x2F, 0x98, 0x1D, 0x2D, 0xF5, 0xD9, 0xA9, 0xB2, 0x1D, 0xE5, 0x1B, 0x02, 0x03, 0x01,
|
||||||
|
0x00, 0x01, 0xA3, 0x82, 0x01, 0x3A, 0x30, 0x82, 0x01, 0x36, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF,
|
||||||
|
0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xEC, 0xD7,
|
||||||
|
0xE3, 0x82, 0xD2, 0x71, 0x5D, 0x64, 0x4C, 0xDF, 0x2E, 0x67, 0x3F, 0xE7, 0xBA, 0x98, 0xAE, 0x1C, 0x0F, 0x4F, 0x30, 0x1F,
|
||||||
|
0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0xEB, 0xA2, 0xAF, 0xF4, 0x92, 0xCB, 0x82, 0x31,
|
||||||
|
0x2D, 0x51, 0x8B, 0xA7, 0xA7, 0x21, 0x9D, 0xF3, 0x6D, 0xC8, 0x0F, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01,
|
||||||
|
0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x79, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04,
|
||||||
|
0x6D, 0x30, 0x6B, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74,
|
||||||
|
0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F,
|
||||||
|
0x6D, 0x30, 0x43, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x37, 0x68, 0x74, 0x74, 0x70, 0x3A,
|
||||||
|
0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63,
|
||||||
|
0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44,
|
||||||
|
0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x45, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x3E, 0x30,
|
||||||
|
0x3C, 0x30, 0x3A, 0xA0, 0x38, 0xA0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33,
|
||||||
|
0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65,
|
||||||
|
0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72,
|
||||||
|
0x6C, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x0A, 0x30, 0x08, 0x30, 0x06, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00,
|
||||||
|
0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0C, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,
|
||||||
|
0x70, 0xA0, 0xBF, 0x43, 0x5C, 0x55, 0xE7, 0x38, 0x5F, 0xA0, 0xA3, 0x74, 0x1B, 0x3D, 0xB6, 0x16, 0xD7, 0xF7, 0xBF, 0x57,
|
||||||
|
0x07, 0xBD, 0x9A, 0xAC, 0xA1, 0x87, 0x2C, 0xEC, 0x85, 0x5E, 0xA9, 0x1A, 0xBB, 0x22, 0xF8, 0x87, 0x1A, 0x69, 0x54, 0x22,
|
||||||
|
0xED, 0xA4, 0x88, 0x77, 0x6D, 0xBD, 0x1A, 0x14, 0xF4, 0x13, 0x4A, 0x7A, 0x2F, 0x2D, 0xB7, 0x38, 0xEF, 0xF4, 0xFF, 0x80,
|
||||||
|
0xB9, 0xF8, 0xA1, 0xF7, 0xF2, 0x72, 0xDE, 0x24, 0xBC, 0x52, 0x03, 0xC8, 0x4E, 0xD0, 0x2A, 0xDE, 0xFA, 0x2D, 0x56, 0xCF,
|
||||||
|
0xF9, 0xF4, 0xF7, 0xAC, 0x30, 0x7A, 0x9A, 0x8B, 0xB2, 0x5E, 0xD4, 0xCF, 0xD1, 0x43, 0x44, 0x9B, 0x43, 0x21, 0xEB, 0x96,
|
||||||
|
0x72, 0xA1, 0x48, 0xB4, 0x99, 0xCB, 0x9D, 0x4F, 0xA7, 0x06, 0x03, 0x13, 0x77, 0x27, 0x44, 0xD4, 0xE7, 0x7F, 0xE8, 0x59,
|
||||||
|
0xA8, 0xF0, 0xBF, 0x2F, 0x0B, 0xA6, 0xE9, 0xF2, 0x34, 0x3C, 0xEC, 0xF7, 0x03, 0xC7, 0x87, 0xA8, 0xD2, 0x4C, 0x40, 0x19,
|
||||||
|
0x35, 0x46, 0x6A, 0x69, 0x54, 0xB0, 0xB8, 0xA1, 0x56, 0x8E, 0xEC, 0xA4, 0xD5, 0x3D, 0xE8, 0xB1, 0xDC, 0xFD, 0x1C, 0xD8,
|
||||||
|
0xF4, 0x77, 0x5A, 0x5C, 0x54, 0x8C, 0x6F, 0xEF, 0xA1, 0x50, 0x3D, 0xFC, 0x76, 0x09, 0x68, 0x84, 0x9F, 0x6F, 0xCA, 0xDB,
|
||||||
|
0x20, 0x8D, 0x35, 0x60, 0x1C, 0x02, 0x03, 0xCB, 0x20, 0xB0, 0xAC, 0x58, 0xA0, 0x0E, 0x40, 0x63, 0xC5, 0x98, 0x22, 0xC1,
|
||||||
|
0xB2, 0x59, 0xF5, 0x55, 0x6B, 0xCF, 0x27, 0xAB, 0x6C, 0x76, 0xCE, 0x6F, 0x23, 0x2D, 0xF4, 0x7E, 0x71, 0x6A, 0x23, 0x6B,
|
||||||
|
0x22, 0xFF, 0x12, 0xB8, 0x54, 0x2D, 0x27, 0x7E, 0xD8, 0x3A, 0xD9, 0xF0, 0xB6, 0x87, 0x96, 0xFD, 0x5B, 0xD1, 0x5C, 0xAC,
|
||||||
|
0x18, 0xC3, 0x4D, 0x9F, 0x73, 0xB7, 0x01, 0xA9, 0x9F, 0x57, 0xAA, 0x5E, 0x28, 0xE2, 0xB9, 0x94, 0x31, 0x82, 0x03, 0x7C,
|
||||||
|
0x30, 0x82, 0x03, 0x78, 0x02, 0x01, 0x01, 0x30, 0x7D, 0x30, 0x69, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
|
||||||
|
0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43,
|
||||||
|
0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x41, 0x30, 0x3F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x38,
|
||||||
|
0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x47, 0x34, 0x20,
|
||||||
|
0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x69, 0x6E, 0x67, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36,
|
||||||
|
0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x43, 0x41, 0x31, 0x02, 0x10, 0x0A, 0x80,
|
||||||
|
0xEF, 0x18, 0x4B, 0x8D, 0xF1, 0x05, 0x82, 0xD1, 0xC4, 0x76, 0xA7, 0x95, 0x74, 0x68, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86,
|
||||||
|
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xA0, 0x81, 0xD1, 0x30, 0x1A, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86,
|
||||||
|
0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0D, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x01, 0x04,
|
||||||
|
0x30, 0x1C, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x05, 0x31, 0x0F, 0x17, 0x0D, 0x32, 0x36, 0x30,
|
||||||
|
0x34, 0x32, 0x35, 0x30, 0x32, 0x33, 0x33, 0x35, 0x35, 0x5A, 0x30, 0x2B, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
|
||||||
|
0x01, 0x09, 0x10, 0x02, 0x0C, 0x31, 0x1C, 0x30, 0x1A, 0x30, 0x18, 0x30, 0x16, 0x04, 0x14, 0xDD, 0x62, 0x30, 0xAC, 0x86,
|
||||||
|
0x0A, 0x2D, 0x30, 0x6B, 0xDA, 0x38, 0xB1, 0x68, 0x79, 0x52, 0x30, 0x07, 0xFB, 0x41, 0x7E, 0x30, 0x2F, 0x06, 0x09, 0x2A,
|
||||||
|
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0x81, 0x21, 0x92, 0x08, 0x64, 0xB2, 0xFA, 0x0A,
|
||||||
|
0x44, 0x19, 0xC0, 0x59, 0x47, 0x86, 0xE9, 0x42, 0xAD, 0xB5, 0x17, 0x01, 0xBF, 0x9C, 0x2A, 0x68, 0x0D, 0x09, 0x5D, 0x10,
|
||||||
|
0x2A, 0x27, 0xEF, 0xDA, 0x30, 0x37, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x02, 0x2F, 0x31,
|
||||||
|
0x28, 0x30, 0x26, 0x30, 0x24, 0x30, 0x22, 0x04, 0x20, 0x4A, 0xA0, 0x3F, 0xA2, 0x2C, 0xD7, 0x5C, 0x84, 0xC5, 0x5C, 0x93,
|
||||||
|
0x8F, 0x82, 0x8E, 0x67, 0x6B, 0x9C, 0xAE, 0xCA, 0xB3, 0x3F, 0xE3, 0x6D, 0x26, 0x9A, 0xA3, 0x34, 0xF1, 0x46, 0x11, 0x0A,
|
||||||
|
0x33, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x00,
|
||||||
|
0x38, 0x30, 0x43, 0xF5, 0x19, 0x7A, 0x3C, 0x2A, 0xD6, 0x3A, 0x9C, 0x58, 0x4C, 0x88, 0x94, 0xE8, 0x77, 0x79, 0xD9, 0xCE,
|
||||||
|
0x0D, 0xCB, 0xAB, 0x57, 0xD3, 0xFA, 0xF2, 0xF4, 0x1F, 0xD1, 0x1B, 0x7C, 0xFA, 0xA2, 0x13, 0x2D, 0x3C, 0xE1, 0xA5, 0x49,
|
||||||
|
0x05, 0x09, 0xDE, 0xDF, 0x75, 0x89, 0x5A, 0x13, 0xD3, 0x87, 0xFF, 0xCE, 0x1B, 0x42, 0xED, 0xB0, 0xBB, 0xAC, 0x88, 0x8A,
|
||||||
|
0x08, 0xA3, 0x29, 0x25, 0xE0, 0xFE, 0xD7, 0xEE, 0x8C, 0x83, 0x47, 0xCC, 0x33, 0x5E, 0xFD, 0x29, 0x93, 0xB3, 0x10, 0x29,
|
||||||
|
0x48, 0x76, 0x08, 0xAF, 0x9D, 0x00, 0xF1, 0x14, 0xE9, 0xB3, 0xE1, 0x43, 0x8A, 0xC1, 0x7C, 0xC5, 0x4C, 0x48, 0x94, 0x3B,
|
||||||
|
0x30, 0x53, 0x7E, 0x31, 0x8B, 0xDB, 0x6C, 0x0E, 0x62, 0x94, 0x11, 0xC1, 0xC9, 0x4C, 0x9E, 0x4A, 0xE2, 0x00, 0x74, 0xFC,
|
||||||
|
0xEE, 0x3F, 0x91, 0x93, 0x82, 0x23, 0xF8, 0xE0, 0x04, 0xBB, 0x8B, 0xB9, 0x53, 0x2A, 0xD7, 0x72, 0xB3, 0xA2, 0x86, 0x92,
|
||||||
|
0xB2, 0x75, 0x3A, 0xC4, 0xD5, 0x2B, 0xAF, 0x67, 0xAA, 0xBA, 0xE7, 0x91, 0x57, 0xE9, 0xE3, 0x5F, 0x16, 0x6F, 0xC8, 0x0E,
|
||||||
|
0x4A, 0xED, 0x18, 0x91, 0xC8, 0x7A, 0xDE, 0x53, 0x50, 0x72, 0x71, 0x0D, 0xEB, 0x5F, 0xE9, 0x72, 0xFC, 0x8B, 0x77, 0xC7,
|
||||||
|
0x27, 0x7C, 0x6E, 0xB4, 0xCC, 0x27, 0x44, 0x04, 0xC0, 0x7D, 0x4B, 0x50, 0x86, 0x9F, 0x2C, 0x5B, 0x61, 0x99, 0xDB, 0x84,
|
||||||
|
0xB5, 0x6C, 0xBD, 0x53, 0xAD, 0xEB, 0x76, 0x5C, 0xE6, 0x23, 0x10, 0xFD, 0x8C, 0xDC, 0x61, 0x18, 0x30, 0x74, 0x78, 0x01,
|
||||||
|
0x92, 0xEB, 0xD7, 0x66, 0x01, 0xB5, 0x1C, 0xD9, 0x0E, 0x5D, 0xC3, 0x09, 0xEC, 0xE6, 0x1F, 0x4F, 0x05, 0x59, 0x74, 0xE1,
|
||||||
|
0x66, 0xD6, 0x90, 0xA7, 0x95, 0x68, 0x9E, 0xAF, 0x65, 0x3F, 0x11, 0x49, 0x1A, 0x18, 0x93, 0xAF, 0x18, 0xA5, 0x31, 0x47,
|
||||||
|
0x20, 0xB0, 0x6A, 0x97, 0x5E, 0xE3, 0xCC, 0xDE, 0xA0, 0x29, 0x60, 0xC4, 0xDF, 0x1E, 0xFF, 0xEF, 0x2E, 0x08, 0x9C, 0x5A,
|
||||||
|
0xA0, 0x29, 0xCF, 0x0D, 0x3D, 0xA1, 0xA7, 0x15, 0xD2, 0x9C, 0xC5, 0x66, 0x47, 0x31, 0x02, 0xE7, 0xE8, 0x39, 0x59, 0xC0,
|
||||||
|
0xE7, 0x67, 0xB2, 0xC9, 0xD1, 0xE3, 0x10, 0x56, 0x10, 0x68, 0xE9, 0x06, 0x45, 0x64, 0x48, 0x71, 0x47, 0xB0, 0x0F, 0xC2,
|
||||||
|
0x4F, 0xDF, 0x00, 0xF2, 0x63, 0x0B, 0xE7, 0x5B, 0xA9, 0xCC, 0x8A, 0xEA, 0xB8, 0x2A, 0xF0, 0x52, 0xD9, 0x3F, 0x1C, 0xD7,
|
||||||
|
0x80, 0xC4, 0xCE, 0x22, 0x2B, 0xAA, 0x58, 0x3C, 0xA9, 0x86, 0x9D, 0x1F, 0x25, 0xC8, 0x4C, 0x90, 0xF2, 0xA6, 0xE0, 0x6B,
|
||||||
|
0x2B, 0x60, 0x21, 0x9C, 0x31, 0x07, 0xD7, 0x65, 0x51, 0x44, 0x11, 0xF8, 0xB2, 0xA4, 0xF4, 0x48, 0xCA, 0x09, 0xC5, 0x3F,
|
||||||
|
0x5C, 0x62, 0xD0, 0x69, 0x6A, 0x3F, 0x78, 0x6E, 0xC6, 0x88, 0x15, 0x62, 0xEB, 0x6F, 0xFA, 0x88, 0x81, 0x77, 0xC6, 0xB6,
|
||||||
|
0xB1, 0x2D, 0xAF, 0x57, 0x1C, 0x14, 0x1B, 0x4D, 0x99, 0x6A, 0xD6, 0x99, 0xCB, 0xC6, 0xAC, 0x06, 0xBB, 0x79, 0x21, 0x5A,
|
||||||
|
0xCC, 0x64, 0xA0, 0xDF, 0xFE, 0xB6, 0x0D, 0x73, 0x6B, 0xEF, 0x70, 0xF4, 0x09, 0x4A, 0xAC, 0xF4, 0x8B, 0xDE, 0x02, 0xFA,
|
||||||
|
0xF7, 0xC6, 0x24, 0x1D, 0xA7, 0x3F, 0x53, 0xB3, 0x5C, 0x59, 0x97, 0x12, 0x74, 0x6E, 0x3D, 0x42, 0xFD, 0xDB, 0xF9, 0x07,
|
||||||
|
0x6C, 0x3D, 0x3D, 0x01, 0x0F, 0x1F, 0x18, 0x40, 0x7B, 0x28, 0xB7, 0x97, 0x68, 0x6D, 0x86, 0x04, 0x43, 0x7A, 0x0C, 0xFE,
|
||||||
|
0xE6, 0x24, 0x03, 0xCE, 0xDB, 0x9F, 0x3D, 0xB6, 0x04, 0x4A, 0x3A, 0xC3, 0x13, 0x97, 0xD3, 0x17, 0x77, 0xED, 0x75, 0x6E,
|
||||||
|
0xE3, 0x69, 0x39, 0x3D, 0xFC, 0x27, 0x25, 0x12, 0xC9, 0xDB, 0x76, 0xD9,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,969 @@
|
|||||||
|
#include "kd_driver.h"
|
||||||
|
#include "utils.h"
|
||||||
|
//#include "..\Vmp\Vmp.h"
|
||||||
|
|
||||||
|
HANDLE kd_driver::iqvw64e_device_handle;
|
||||||
|
uint64_t kd_driver::ntoskrnlbase = 0;
|
||||||
|
std::string cachedDriverName = "";
|
||||||
|
|
||||||
|
std::wstring kd_driver::GetDriverPath() {
|
||||||
|
std::wstring temp = utils::GetFullTempPath();
|
||||||
|
if (temp.empty()) {
|
||||||
|
return L"";
|
||||||
|
}
|
||||||
|
return temp + L"\\" + GetDriverNameW();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring kd_driver::GetDriverNameW()
|
||||||
|
{
|
||||||
|
if (cachedDriverName.empty()) {
|
||||||
|
//Create a random name
|
||||||
|
char buffer[100]{};
|
||||||
|
static const char alphanum[] =
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
int len = rand() % 20 + 10;
|
||||||
|
for (int i = 0; i < len; ++i)
|
||||||
|
buffer[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
|
||||||
|
cachedDriverName = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring name(cachedDriverName.begin(), cachedDriverName.end());
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool kd_driver::AcquireDebugPrivilege() {
|
||||||
|
|
||||||
|
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (ntdll == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG SE_DEBUG_PRIVILEGE = 20UL;
|
||||||
|
BOOLEAN SeDebugWasEnabled;
|
||||||
|
NTSTATUS Status = nt::RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &SeDebugWasEnabled);
|
||||||
|
if (!NT_SUCCESS(Status)) {
|
||||||
|
Log((L"[-] Failed to acquire SE_DEBUG_PRIVILEGE") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "MmKd_sumper.h"
|
||||||
|
|
||||||
|
bool kd_driver::Load()
|
||||||
|
{
|
||||||
|
srand((unsigned)time(NULL) * GetCurrentThreadId());
|
||||||
|
|
||||||
|
std::wstring driver_path = GetDriverPath();
|
||||||
|
_wremove(driver_path.c_str());
|
||||||
|
|
||||||
|
if (!utils::CreateFileFromMemory(driver_path, reinterpret_cast<const char*>(MmKd_sumper), sizeof(MmKd_sumper))) {
|
||||||
|
Log((L"[-] Failed to create vulnerable driver file") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AcquireDebugPrivilege()) {
|
||||||
|
Log((L"[-] Failed to acquire SeDebugPrivilege") << std::endl);
|
||||||
|
_wremove(driver_path.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nt::RegisterAndStart(driver_path, GetDriverNameW())) {
|
||||||
|
Log((L"[-] Failed to register and start service for the vulnerable driver") << std::endl);
|
||||||
|
_wremove(driver_path.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mylink nuwer
|
||||||
|
|
||||||
|
iqvw64e_device_handle = CreateFileA(XorStr("\\\\.\\esp_link"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
||||||
|
if (iqvw64e_device_handle == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
kd_driver::Unload();
|
||||||
|
Log((L"[-] failed handle !!") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
kd_driver::ntoskrnlbase = utils::GetKernelModule("ntoskrnl.exe");
|
||||||
|
if (!kd_driver::ntoskrnlbase)
|
||||||
|
{
|
||||||
|
kd_driver::Unload();
|
||||||
|
Log((L"[-] Failed to get ntoskrnl.exe") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto os = utils::GetVersion();
|
||||||
|
if (os.dwBuildNumber >= 14393)
|
||||||
|
{
|
||||||
|
if (!kd_driver::ClearPiDDBCacheTable(iqvw64e_device_handle)) {
|
||||||
|
Log((L"[-] Failed to ClearPiDDBCacheTable") << std::endl);
|
||||||
|
kd_driver::Unload();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!kd_driver::ClearKernelHashBucketList(iqvw64e_device_handle)) {
|
||||||
|
Log((L"[-] Failed to ClearKernelHashBucketList") << std::endl);
|
||||||
|
kd_driver::Unload();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!kd_driver::ClearMmUnloadedDrivers(iqvw64e_device_handle)) {
|
||||||
|
Log((L"[!] Failed to ClearMmUnloadedDrivers") << std::endl);
|
||||||
|
kd_driver::Unload();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (!kd_driver::ClearWdFilterDriverList(iqvw64e_device_handle)) {
|
||||||
|
// Log((L"[!] Failed to ClearWdFilterDriverList") << std::endl);
|
||||||
|
// kd_driver::Unload();
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::Unload()
|
||||||
|
{
|
||||||
|
if (iqvw64e_device_handle != INVALID_HANDLE_VALUE)
|
||||||
|
CloseHandle(iqvw64e_device_handle);
|
||||||
|
|
||||||
|
if (!nt::StopAndRemove(GetDriverNameW()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::wstring driver_path = GetDriverPath();
|
||||||
|
|
||||||
|
if (_wremove(driver_path.c_str()) != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto set_calc_random_val()->_CALC_VERIFY
|
||||||
|
{
|
||||||
|
_CALC_VERIFY Verify{ 0 };
|
||||||
|
|
||||||
|
auto a = utils::get_random_val(0, 1000000);
|
||||||
|
auto b = utils::get_random_val(0, 1000000);
|
||||||
|
auto c = utils::get_random_val(0, 1000000);
|
||||||
|
auto d = utils::get_random_val(0, 1000000);
|
||||||
|
|
||||||
|
Verify.a = a;
|
||||||
|
Verify.b = b;
|
||||||
|
Verify.c = c;
|
||||||
|
Verify.d = d;
|
||||||
|
|
||||||
|
|
||||||
|
return Verify;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::MmCopy(HANDLE device_handle, uint64_t Base, uint64_t Buffer, SIZE_T Size)
|
||||||
|
{
|
||||||
|
_CALC_VERIFY Verify = set_calc_random_val();
|
||||||
|
Verify.calc_val = utils::calc_comm_verify_check(Verify.a, Verify.b, Verify.c, Verify.d);
|
||||||
|
|
||||||
|
COMM_INFO memory = { 0 };
|
||||||
|
memory.case_number = 0x13;
|
||||||
|
memory.destination = (DWORD64)Buffer;
|
||||||
|
memory.source = (DWORD64)Base;
|
||||||
|
memory.length = Size;
|
||||||
|
memory.Verify = &Verify;
|
||||||
|
|
||||||
|
DWORD bytes_returned = 0;
|
||||||
|
|
||||||
|
return DeviceIoControl(device_handle, IOCTL_MMCOPY, &memory, sizeof(memory), &memory, sizeof(memory), &bytes_returned, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::read(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size)
|
||||||
|
{
|
||||||
|
return MmCopy(device_handle, Base, (uint64_t)Buffer, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::write(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size)
|
||||||
|
{
|
||||||
|
return MmCopy(device_handle, (uint64_t)Buffer, (uint64_t)Base, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::writeEx(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size)
|
||||||
|
{
|
||||||
|
/*uint64_t physical_base = 0;
|
||||||
|
if (!GetPhysicalAddress(device_handle, Base, &physical_base))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const auto map_physical_addr = MapIoSpace(device_handle, physical_base, (uint32_t)Size);
|
||||||
|
if (map_physical_addr == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto result = MmCopy(device_handle, (uint64_t)Buffer, (uint64_t)map_physical_addr, Size);
|
||||||
|
|
||||||
|
UnmapIoSpace(device_handle, map_physical_addr, (uint32_t)Size);*/
|
||||||
|
return MdlIoSpace(device_handle, Base, Buffer, Size);
|
||||||
|
// return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool kd_driver::MdlIoSpace(HANDLE device_handle, uint64_t address, uint64_t* Buffer, SIZE_T Size)
|
||||||
|
{
|
||||||
|
_CALC_VERIFY Verify = set_calc_random_val();
|
||||||
|
Verify.calc_val = utils::calc_comm_verify_check(Verify.a, Verify.b, Verify.c, Verify.d);
|
||||||
|
|
||||||
|
COMM_INFO memory = { 0 };
|
||||||
|
memory.case_number = 0x14;
|
||||||
|
memory.destination = (DWORD64)Buffer;
|
||||||
|
memory.source = (DWORD64)address;
|
||||||
|
memory.length = Size;
|
||||||
|
memory.Verify = &Verify;
|
||||||
|
|
||||||
|
DWORD bytes_returned = 0;
|
||||||
|
return DeviceIoControl(device_handle, IOCTL_MMCOPYEX, &memory, sizeof(memory), &memory, sizeof(memory), &bytes_returned, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t kd_driver::get_kernel_module_export(HANDLE device_handle, uint64_t ker_base, const char* func_name)
|
||||||
|
{
|
||||||
|
IMAGE_DOS_HEADER dos_header{ 0 };
|
||||||
|
IMAGE_NT_HEADERS nt_hander{ 0 };
|
||||||
|
|
||||||
|
kd_driver::read(device_handle, ker_base, (uint64_t*)&dos_header, sizeof(IMAGE_DOS_HEADER));
|
||||||
|
kd_driver::read(device_handle, ker_base + dos_header.e_lfanew, (uint64_t*)&nt_hander, sizeof(IMAGE_NT_HEADERS));
|
||||||
|
|
||||||
|
const auto export_table = nt_hander.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
|
||||||
|
|
||||||
|
const auto export_data = reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(VirtualAlloc(nullptr, export_table.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
|
||||||
|
|
||||||
|
kd_driver::read(device_handle, ker_base + export_table.VirtualAddress, (uint64_t*)export_data, export_table.Size);
|
||||||
|
|
||||||
|
const auto delta = reinterpret_cast<uint64_t>(export_data) - export_table.VirtualAddress;
|
||||||
|
const auto func_name_tab = reinterpret_cast<uint32_t*>(export_data->AddressOfNames + delta);
|
||||||
|
const auto func_index_tab = reinterpret_cast<uint16_t*>(export_data->AddressOfNameOrdinals + delta);
|
||||||
|
const auto func_address_tab = reinterpret_cast<uint32_t*>(export_data->AddressOfFunctions + delta);
|
||||||
|
|
||||||
|
uint64_t func_addr = NULL;
|
||||||
|
for (size_t i = 0; i < export_data->NumberOfNames; i++)
|
||||||
|
{
|
||||||
|
const char* func_names = reinterpret_cast<const char*>((uint64_t)func_name_tab[i] + delta);
|
||||||
|
if (!strcmp(func_names, func_name))
|
||||||
|
{
|
||||||
|
const auto func_index = func_index_tab[i];
|
||||||
|
const auto func_address = reinterpret_cast<char*>(func_address_tab[func_index]) + ker_base;
|
||||||
|
|
||||||
|
func_addr = (uint64_t)func_address;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualFree(export_data, 0, MEM_RELEASE);
|
||||||
|
return func_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t kd_driver::ExAllocatePool(HANDLE device_handle, BYTE pool_type, SIZE_T size)
|
||||||
|
{
|
||||||
|
const auto ExAllocate = kd_driver::get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("ExAllocatePoolWithTag"));
|
||||||
|
if (!ExAllocate) {
|
||||||
|
Log((L"[!] Failed to find ExAllocatePool") << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t alloc = 0;
|
||||||
|
kd_driver::func_call(device_handle, (void*)ExAllocate, &alloc, pool_type, size, 'PwtA');
|
||||||
|
|
||||||
|
return alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::FreePool(HANDLE device_handle, uint64_t address) {
|
||||||
|
if (!address)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
static uint64_t kernel_ExFreePool = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("ExFreePool"));
|
||||||
|
|
||||||
|
if (!kernel_ExFreePool) {
|
||||||
|
Log((L"[!] Failed to find ExAllocatePool") << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return func_call<void>(device_handle, (void*)kernel_ExFreePool, nullptr, address);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PVOID kd_driver::RtlLookupElementGenericTableAvl(HANDLE device_handle, nt::PRTL_AVL_TABLE Table, PVOID Buffer) {
|
||||||
|
if (!Table)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
static uint64_t kernel_RtlDeleteElementGenericTableAvl = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("RtlLookupElementGenericTableAvl"));
|
||||||
|
|
||||||
|
if (!kernel_RtlDeleteElementGenericTableAvl) {
|
||||||
|
Log((L"[!] Failed to find RtlLookupElementGenericTableAvl") << std::endl);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID out;
|
||||||
|
|
||||||
|
if (!func_call(device_handle, (void*)kernel_RtlDeleteElementGenericTableAvl, &out, Table, Buffer))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN kd_driver::RtlDeleteElementGenericTableAvl(HANDLE device_handle, PVOID Table, PVOID Buffer)
|
||||||
|
{
|
||||||
|
if (!Table)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
static uint64_t kernel_RtlDeleteElementGenericTableAvl = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("RtlDeleteElementGenericTableAvl"));
|
||||||
|
|
||||||
|
if (!kernel_RtlDeleteElementGenericTableAvl) {
|
||||||
|
Log((L"[!] Failed to find RtlDeleteElementGenericTableAvl") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool out;
|
||||||
|
return (func_call(device_handle, (void*)kernel_RtlDeleteElementGenericTableAvl, &out, Table, Buffer) && out);
|
||||||
|
}
|
||||||
|
|
||||||
|
nt::PiDDBCacheEntry* kd_driver::LookupEntry(HANDLE device_handle, nt::PRTL_AVL_TABLE PiDDBCacheTable, ULONG timestamp, const wchar_t* name)
|
||||||
|
{
|
||||||
|
nt::PiDDBCacheEntry localentry{};
|
||||||
|
localentry.TimeDateStamp = timestamp;
|
||||||
|
localentry.DriverName.Buffer = (PWSTR)name;
|
||||||
|
localentry.DriverName.Length = (USHORT)(wcslen(name) * 2);
|
||||||
|
localentry.DriverName.MaximumLength = localentry.DriverName.Length + 2;
|
||||||
|
|
||||||
|
return (nt::PiDDBCacheEntry*)RtlLookupElementGenericTableAvl(device_handle, PiDDBCacheTable, (PVOID)&localentry);
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t kd_driver::FindPatternAtKernel(HANDLE device_handle, uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask) {
|
||||||
|
if (!dwAddress) {
|
||||||
|
Log(L"[-] No module address to find pattern" << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwLen > 1024 * 1024 * 1024) { //if read is > 1GB
|
||||||
|
Log(L"[-] Can't find pattern, Too big section" << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto sectionData = std::make_unique<BYTE[]>(dwLen);
|
||||||
|
if (!read(device_handle, dwAddress, (uint64_t*)sectionData.get(), dwLen)) {
|
||||||
|
Log(L"[-] Read failed in FindPatternAtKernel" << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto result = utils::FindPattern((uintptr_t)sectionData.get(), dwLen, bMask, szMask);
|
||||||
|
|
||||||
|
if (result <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
result = dwAddress - (uintptr_t)sectionData.get() + result;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t kd_driver::FindSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, PULONG size) {
|
||||||
|
if (!modulePtr)
|
||||||
|
return 0;
|
||||||
|
BYTE headers[0x1000];
|
||||||
|
if (!read(device_handle, modulePtr, (uint64_t*)headers, 0x1000)) {
|
||||||
|
Log(L"[-] Can't read module headers" << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ULONG sectionSize = 0;
|
||||||
|
uintptr_t section = (uintptr_t)utils::FindSection(sectionName, (uintptr_t)headers, §ionSize);
|
||||||
|
if (!section || !sectionSize) {
|
||||||
|
Log(L"[-] Can't find section" << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (size)
|
||||||
|
*size = sectionSize;
|
||||||
|
return section - (uintptr_t)headers + modulePtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uintptr_t kd_driver::FindPatternInSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, BYTE* bMask, const char* szMask) {
|
||||||
|
ULONG sectionSize = 0;
|
||||||
|
uintptr_t section = FindSectionAtKernel(device_handle, sectionName, modulePtr, §ionSize);
|
||||||
|
return FindPatternAtKernel(device_handle, section, sectionSize, bMask, szMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID kd_driver::ResolveRelativeAddress(HANDLE device_handle, _In_ PVOID Instruction, _In_ ULONG OffsetOffset, _In_ ULONG InstructionSize)
|
||||||
|
{
|
||||||
|
ULONG_PTR Instr = (ULONG_PTR)Instruction;
|
||||||
|
LONG RipOffset = 0;
|
||||||
|
if (!read(device_handle, Instr + OffsetOffset, (uint64_t*)&RipOffset, sizeof(LONG))) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
PVOID ResolvedAddr = (PVOID)(Instr + InstructionSize + RipOffset);
|
||||||
|
return ResolvedAddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::ExAcquireResourceExclusiveLite(HANDLE device_handle, PVOID Resource, BOOLEAN wait) {
|
||||||
|
if (!Resource)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
static uint64_t kernel_ExAcquireResourceExclusiveLite = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, XorStr("ExAcquireResourceExclusiveLite"));
|
||||||
|
|
||||||
|
if (!kernel_ExAcquireResourceExclusiveLite) {
|
||||||
|
Log((L"[!] Failed to find ExAcquireResourceExclusiveLite") << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN out;
|
||||||
|
return (func_call(device_handle, (void*)kernel_ExAcquireResourceExclusiveLite, &out, Resource, wait) && out);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::ExReleaseResourceLite(HANDLE device_handle, PVOID Resource) {
|
||||||
|
if (!Resource)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
static uint64_t kernel_ExReleaseResourceLite = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, XorStr( "ExReleaseResourceLite"));
|
||||||
|
|
||||||
|
if (!kernel_ExReleaseResourceLite) {
|
||||||
|
Log((L"[!] Failed to find ExReleaseResourceLite") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return func_call<void>(device_handle, (void*)kernel_ExReleaseResourceLite, nullptr, Resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool kd_driver::ClearPiDDBCacheTable(HANDLE device_handle) { //PiDDBCacheTable added on LoadDriver
|
||||||
|
|
||||||
|
#ifdef PDB_OFFSETS
|
||||||
|
auto PiDDBLockOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"PiDDBLock");
|
||||||
|
if (!PiDDBLockOffset)
|
||||||
|
{
|
||||||
|
Log(L"[-] Warning PiDDBLock not found" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto PiDDBCacheTableOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"PiDDBCacheTable");
|
||||||
|
if (!PiDDBLockOffset)
|
||||||
|
{
|
||||||
|
Log(L"[-] Warning PiDDBCacheTable not found" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID PiDDBLock = (PVOID)(kd_driver::ntoskrnlbase + PiDDBLockOffset);
|
||||||
|
nt::PRTL_AVL_TABLE PiDDBCacheTable = (nt::PRTL_AVL_TABLE)(kd_driver::ntoskrnlbase + PiDDBCacheTableOffset);
|
||||||
|
#else
|
||||||
|
auto PiDDBLockPtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x8B\xD8\x85\xC0\x0F\x88\x00\x00\x00\x00\x65\x48\x8B\x04\x25\x00\x00\x00\x00\x66\xFF\x88\x00\x00\x00\x00\xB2\x01\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x4C\x8B\x00\x24", "xxxxxx????xxxxx????xxx????xxxxx????x????xx?x"); // 8B D8 85 C0 0F 88 ? ? ? ? 65 48 8B 04 25 ? ? ? ? 66 FF 88 ? ? ? ? B2 01 48 8D 0D ? ? ? ? E8 ? ? ? ? 4C 8B ? 24 update for build 22000.132
|
||||||
|
auto PiDDBCacheTablePtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x66\x03\xD2\x48\x8D\x0D", "xxxxxx"); // 66 03 D2 48 8D 0D
|
||||||
|
|
||||||
|
if (PiDDBLockPtr == NULL) { // PiDDBLock pattern changes a lot from version 1607 of windows and we will need a second pattern if we want to keep simple as possible
|
||||||
|
PiDDBLockPtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x48\x8B\x0D\x00\x00\x00\x00\x48\x85\xC9\x0F\x85\x00\x00\x00\x00\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xE8", "xxx????xxxxx????xxx????x????x"); // 48 8B 0D ? ? ? ? 48 85 C9 0F 85 ? ? ? ? 48 8D 0D ? ? ? ? E8 ? ? ? ? E8 build 22449+ (pattern can be improved but just fine for now)
|
||||||
|
if (PiDDBLockPtr == NULL) {
|
||||||
|
PiDDBLockPtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x8B\xD8\x85\xC0\x0F\x88\x00\x00\x00\x00\x65\x48\x8B\x04\x25\x00\x00\x00\x00\x48\x8D\x0D\x00\x00\x00\x00\xB2\x01\x66\xFF\x88\x00\x00\x00\x00\x90\xE8\x00\x00\x00\x00\x4C\x8B\x00\x24", "xxxxxx????xxxxx????xxx????xxxxx????xx????xx?x"); // 8B D8 85 C0 0F 88 ? ? ? ? 65 48 8B 04 25 ? ? ? ? 48 8D 0D ? ? ? ? B2 01 66 FF 88 ? ? ? ? 90 E8 ? ? ? ? 4C 8B ? 24 update for build 26100.1000
|
||||||
|
if (PiDDBLockPtr == NULL) {
|
||||||
|
Log((L"[-] Warning PiDDBLock not found") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log((L"[+] PiDDBLock found with third pattern") << std::endl);
|
||||||
|
PiDDBLockPtr += 19;//third pattern offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log((L"[+] PiDDBLock found with second pattern") << std::endl);
|
||||||
|
PiDDBLockPtr += 16; //second pattern offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PiDDBLockPtr += 28; //first pattern offset
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PiDDBCacheTablePtr == NULL) {
|
||||||
|
PiDDBCacheTablePtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x48\x8B\xF9\x33\xC0\x48\x8D\x0D", "xxxxxxxx"); // 48 8B F9 33 C0 48 8D 0D
|
||||||
|
if (PiDDBCacheTablePtr == NULL) {
|
||||||
|
Log((L"[-] Warning PiDDBCacheTable not found") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log((L"[+] PiDDBCacheTable found with second pattern") << std::endl);
|
||||||
|
PiDDBCacheTablePtr += 2;//second pattern offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log((L"[+] PiDDBLock Ptr 0x") << std::hex << PiDDBLockPtr << std::endl);
|
||||||
|
Log((L"[+] PiDDBCacheTable Ptr 0x") << std::hex << PiDDBCacheTablePtr << std::endl);
|
||||||
|
|
||||||
|
PVOID PiDDBLock = ResolveRelativeAddress(device_handle, (PVOID)PiDDBLockPtr, 3, 7);
|
||||||
|
nt::PRTL_AVL_TABLE PiDDBCacheTable = (nt::PRTL_AVL_TABLE)ResolveRelativeAddress(device_handle, (PVOID)PiDDBCacheTablePtr, 6, 10);
|
||||||
|
#endif
|
||||||
|
//context part is not used by lookup, lock or delete why we should use it?
|
||||||
|
|
||||||
|
if (!ExAcquireResourceExclusiveLite(device_handle, PiDDBLock, true)) {
|
||||||
|
Log((L"[-] Can't lock PiDDBCacheTable") << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Log((L"[+] PiDDBLock Locked") << std::endl);
|
||||||
|
|
||||||
|
|
||||||
|
wstring n = GetDriverNameW();
|
||||||
|
// search our entry in the table
|
||||||
|
|
||||||
|
nt::PiDDBCacheEntry* pFoundEntry = (nt::PiDDBCacheEntry*)LookupEntry(device_handle, PiDDBCacheTable, iqvw64e_timestamp, n.c_str());
|
||||||
|
if (pFoundEntry == nullptr) {
|
||||||
|
Log(L"[-] Not found in cache" << std::endl);
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first, unlink from the list
|
||||||
|
PLIST_ENTRY prev;
|
||||||
|
if (!read(device_handle, (uintptr_t)pFoundEntry + (offsetof(struct nt::_PiDDBCacheEntry, List.Blink)), (uint64_t*)&prev, sizeof(_LIST_ENTRY*))) {
|
||||||
|
Log(L"[-] Can't get prev entry" << std::endl);
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
PLIST_ENTRY next;
|
||||||
|
if (!read(device_handle, (uintptr_t)pFoundEntry + (offsetof(struct nt::_PiDDBCacheEntry, List.Flink)), (uint64_t*)&next, sizeof(_LIST_ENTRY*))) {
|
||||||
|
Log(L"[-] Can't get next entry" << std::endl);
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log("[+] Found Table Entry = 0x" << std::hex << pFoundEntry << std::endl);
|
||||||
|
|
||||||
|
if (!write(device_handle, (uintptr_t)prev + (offsetof(struct _LIST_ENTRY, Flink)), (uint64_t*)&next, sizeof(_LIST_ENTRY*))) {
|
||||||
|
Log(L"[-] Can't set next entry" << std::endl);
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!write(device_handle, (uintptr_t)next + (offsetof(struct _LIST_ENTRY, Blink)), (uint64_t*)&prev, sizeof(_LIST_ENTRY*))) {
|
||||||
|
Log(L"[-] Can't set prev entry" << std::endl);
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// then delete the element from the avl table
|
||||||
|
if (!RtlDeleteElementGenericTableAvl(device_handle, PiDDBCacheTable, pFoundEntry)) {
|
||||||
|
Log(XOR_STRING_W(L"[-] Can't delete from PiDDBCacheTable") << std::endl);
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Decrement delete count
|
||||||
|
ULONG cacheDeleteCount = 0;
|
||||||
|
read(device_handle, (uintptr_t)PiDDBCacheTable + (offsetof(struct nt::_RTL_AVL_TABLE, DeleteCount)), (uint64_t*)&cacheDeleteCount, sizeof(ULONG));
|
||||||
|
if (cacheDeleteCount > 0) {
|
||||||
|
cacheDeleteCount--;
|
||||||
|
write(device_handle, (uintptr_t)PiDDBCacheTable + (offsetof(struct nt::_RTL_AVL_TABLE, DeleteCount)), (uint64_t*)&cacheDeleteCount, sizeof(ULONG));
|
||||||
|
}
|
||||||
|
|
||||||
|
// release the ddb resource lock
|
||||||
|
ExReleaseResourceLite(device_handle, PiDDBLock);
|
||||||
|
|
||||||
|
Log(XOR_STRING_W(L"[+] PiDDBCacheTable Cleaned") << std::endl);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::ClearMmUnloadedDrivers(HANDLE device_handle)
|
||||||
|
{
|
||||||
|
ULONG buffer_size = 0;
|
||||||
|
void* buffer = nullptr;
|
||||||
|
|
||||||
|
NTSTATUS status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemExtendedHandleInformation), buffer, buffer_size, &buffer_size);
|
||||||
|
|
||||||
|
while (status == nt::STATUS_INFO_LENGTH_MISMATCH)
|
||||||
|
{
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
|
||||||
|
buffer = VirtualAlloc(nullptr, buffer_size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||||
|
status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemExtendedHandleInformation), buffer, buffer_size, &buffer_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(status) || buffer == 0)
|
||||||
|
{
|
||||||
|
if (buffer != 0)
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t object = 0;
|
||||||
|
|
||||||
|
auto system_handle_inforamtion = static_cast<nt::PSYSTEM_HANDLE_INFORMATION_EX>(buffer);
|
||||||
|
|
||||||
|
for (auto i = 0u; i < system_handle_inforamtion->HandleCount; ++i)
|
||||||
|
{
|
||||||
|
const nt::SYSTEM_HANDLE current_system_handle = system_handle_inforamtion->Handles[i];
|
||||||
|
|
||||||
|
if (current_system_handle.UniqueProcessId != reinterpret_cast<HANDLE>(static_cast<uint64_t>(GetCurrentProcessId())))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (current_system_handle.HandleValue == device_handle)
|
||||||
|
{
|
||||||
|
object = reinterpret_cast<uint64_t>(current_system_handle.Object);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
|
||||||
|
if (!object)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint64_t device_object = 0;
|
||||||
|
|
||||||
|
if (!read(device_handle, object + 0x8, &device_object, sizeof(device_object)) || !device_object) {
|
||||||
|
//Log(L"[!] Failed to find device_object" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t driver_object = 0;
|
||||||
|
|
||||||
|
if (!read(device_handle, device_object + 0x8, &driver_object, sizeof(driver_object)) || !driver_object) {
|
||||||
|
//Log(L"[!] Failed to find driver_object" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t driver_section = 0;
|
||||||
|
|
||||||
|
if (!read(device_handle, driver_object + 0x28, &driver_section, sizeof(driver_section)) || !driver_section) {
|
||||||
|
//Log(L"[!] Failed to find driver_section" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNICODE_STRING us_driver_base_dll_name = { 0 };
|
||||||
|
|
||||||
|
if (!read(device_handle, driver_section + 0x58, (uint64_t*)&us_driver_base_dll_name, sizeof(us_driver_base_dll_name)) || us_driver_base_dll_name.Length == 0) {
|
||||||
|
//Log(L"[!] Failed to find driver name" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto unloadedName = std::make_unique<wchar_t[]>((ULONG64)us_driver_base_dll_name.Length / 2ULL + 1ULL);
|
||||||
|
if (!read(device_handle, (uintptr_t)us_driver_base_dll_name.Buffer, (uint64_t*)unloadedName.get(), us_driver_base_dll_name.Length)) {
|
||||||
|
//Log(L"[!] Failed to read driver name" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
us_driver_base_dll_name.Length = 0; //MiRememberUnloadedDriver will check if the length > 0 to save the unloaded driver
|
||||||
|
|
||||||
|
if (!write(device_handle, driver_section + 0x58, (uint64_t*)&us_driver_base_dll_name, sizeof(us_driver_base_dll_name))) {
|
||||||
|
//Log(L"[!] Failed to write driver name length" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Log(L"[+] MmUnloadedDrivers Cleaned: " << unloadedName << std::endl);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::ClearKernelHashBucketList(HANDLE device_handle)
|
||||||
|
{
|
||||||
|
uint64_t ci = utils::GetKernelModule("CI.dll");
|
||||||
|
if (!ci) {
|
||||||
|
Log(L"[-] Can't Find ci.dll module address" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Thanks @KDIo3 and @Swiftik from UnknownCheats
|
||||||
|
#ifdef PDB_OFFSETS
|
||||||
|
auto g_KernelHashBucketListOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"g_KernelHashBucketList");
|
||||||
|
if (!g_KernelHashBucketListOffset)
|
||||||
|
{
|
||||||
|
Log(L"[-] Can't Find g_KernelHashBucketList Offset" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto g_HashCacheLockOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"g_HashCacheLock");
|
||||||
|
if (!g_KernelHashBucketListOffset)
|
||||||
|
{
|
||||||
|
Log(L"[-] Can't Find g_HashCacheLock Offset" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID g_KernelHashBucketList = (PVOID)(ci + g_KernelHashBucketListOffset);
|
||||||
|
PVOID g_HashCacheLock = (PVOID)(ci + g_HashCacheLockOffset);
|
||||||
|
#else
|
||||||
|
auto sig = FindPatternInSectionAtKernel(device_handle, "PAGE", ci, PUCHAR("\x48\x8B\x1D\x00\x00\x00\x00\xEB\x00\xF7\x43\x40\x00\x20\x00\x00"), "xxx????x?xxxxxxx");
|
||||||
|
if (!sig) {
|
||||||
|
Log(L"[-] Can't Find g_KernelHashBucketList" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto sig2 = FindPatternAtKernel(device_handle, (uintptr_t)sig - 50, 50, PUCHAR("\x48\x8D\x0D"), "xxx");
|
||||||
|
if (!sig2) {
|
||||||
|
Log(L"[-] Can't Find g_HashCacheLock" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const auto g_KernelHashBucketList = ResolveRelativeAddress(device_handle, (PVOID)sig, 3, 7);
|
||||||
|
const auto g_HashCacheLock = ResolveRelativeAddress(device_handle, (PVOID)sig2, 3, 7);
|
||||||
|
if (!g_KernelHashBucketList || !g_HashCacheLock)
|
||||||
|
{
|
||||||
|
Log(L"[-] Can't Find g_HashCache relative address" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Log(L"[+] g_KernelHashBucketList Found 0x" << std::hex << g_KernelHashBucketList << std::endl);
|
||||||
|
|
||||||
|
if (!ExAcquireResourceExclusiveLite(device_handle, g_HashCacheLock, true)) {
|
||||||
|
Log(L"[-] Can't lock g_HashCacheLock" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Log(L"[+] g_HashCacheLock Locked" << std::endl);
|
||||||
|
|
||||||
|
nt::HashBucketEntry* prev = (nt::HashBucketEntry*)g_KernelHashBucketList;
|
||||||
|
nt::HashBucketEntry* entry = 0;
|
||||||
|
if (!read(device_handle, (uintptr_t)prev, (uint64_t*)&entry, sizeof(entry))) {
|
||||||
|
Log(L"[-] Failed to read first g_KernelHashBucketList entry!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!entry) {
|
||||||
|
Log(L"[!] g_KernelHashBucketList looks empty!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring wdname = GetDriverNameW();
|
||||||
|
std::wstring search_path = GetDriverPath();
|
||||||
|
SIZE_T expected_len = (search_path.length() - 2) * 2;
|
||||||
|
|
||||||
|
while (entry) {
|
||||||
|
|
||||||
|
USHORT wsNameLen = 0;
|
||||||
|
if (!read(device_handle, (uintptr_t)entry + offsetof(nt::HashBucketEntry, DriverName.Length), (uint64_t*)&wsNameLen, sizeof(wsNameLen)) || wsNameLen == 0) {
|
||||||
|
Log(L"[-] Failed to read g_KernelHashBucketList entry text len!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expected_len == wsNameLen) {
|
||||||
|
wchar_t* wsNamePtr = 0;
|
||||||
|
if (!read(device_handle, (uintptr_t)entry + offsetof(nt::HashBucketEntry, DriverName.Buffer), (uint64_t*)&wsNamePtr, sizeof(wsNamePtr)) || !wsNamePtr) {
|
||||||
|
Log(L"[-] Failed to read g_KernelHashBucketList entry text ptr!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto wsName = std::make_unique<wchar_t[]>((ULONG64)wsNameLen / 2ULL + 1ULL);
|
||||||
|
if (!read(device_handle, (uintptr_t)wsNamePtr, (uint64_t*)wsName.get(), wsNameLen)) {
|
||||||
|
Log(L"[-] Failed to read g_KernelHashBucketList entry text!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t find_result = std::wstring(wsName.get()).find(wdname);
|
||||||
|
if (find_result != std::wstring::npos) {
|
||||||
|
Log(L"[+] Found In g_KernelHashBucketList: " << std::wstring(&wsName[find_result]) << std::endl);
|
||||||
|
nt::HashBucketEntry* Next = 0;
|
||||||
|
if (!read(device_handle, (uintptr_t)entry, (uint64_t*)&Next, sizeof(Next))) {
|
||||||
|
Log(L"[-] Failed to read g_KernelHashBucketList next entry ptr!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!write(device_handle, (uintptr_t)prev, (uint64_t*)&Next, sizeof(Next))) {
|
||||||
|
Log(L"[-] Failed to write g_KernelHashBucketList prev entry ptr!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FreePool(device_handle, (uintptr_t)entry)) {
|
||||||
|
Log(L"[-] Failed to clear g_KernelHashBucketList entry pool!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Log(L"[+] g_KernelHashBucketList Cleaned" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prev = entry;
|
||||||
|
//read next
|
||||||
|
if (!read(device_handle, (uintptr_t)entry, (uint64_t*)&entry, sizeof(entry))) {
|
||||||
|
Log(L"[-] Failed to read g_KernelHashBucketList next entry!" << std::endl);
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
|
||||||
|
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kd_driver::ClearWdFilterDriverList(HANDLE device_handle)
|
||||||
|
{
|
||||||
|
auto WdFilter = utils::GetKernelModule("WdFilter.sys");
|
||||||
|
if (!WdFilter) {
|
||||||
|
Log("[+] WdFilter.sys not loaded, clear skipped" << std::endl);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PDB_OFFSETS
|
||||||
|
uintptr_t MpBmDocOpenRules = KDSymbolsHandler::GetInstance()->GetOffset(L"MpBmDocOpenRules");
|
||||||
|
if (!MpBmDocOpenRules)
|
||||||
|
{
|
||||||
|
Log("[-] Failed To Get MpBmDocOpenRules." << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MpBmDocOpenRules += WdFilter;
|
||||||
|
|
||||||
|
uintptr_t RuntimeDriversList_Head = MpBmDocOpenRules + 0x70;
|
||||||
|
uintptr_t RuntimeDriversCount = MpBmDocOpenRules + 0x60;
|
||||||
|
uintptr_t RuntimeDriversArray = MpBmDocOpenRules + 0x68;
|
||||||
|
read(device_handle, RuntimeDriversArray, &RuntimeDriversArray, sizeof(uintptr_t));
|
||||||
|
|
||||||
|
uintptr_t MpFreeDriverInfoEx = KDSymbolsHandler::GetInstance()->GetOffset(L"MpFreeDriverInfoEx");
|
||||||
|
if (!MpFreeDriverInfoEx)
|
||||||
|
{
|
||||||
|
Log("[-] Failed To Get MpFreeDriverInfoEx." << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MpFreeDriverInfoEx += WdFilter;
|
||||||
|
#else
|
||||||
|
auto RuntimeDriversList = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\x48\x8B\x0D\x00\x00\x00\x00\xFF\x05", "xxx????xx");
|
||||||
|
if (!RuntimeDriversList) {
|
||||||
|
Log("[!] Failed to find WdFilter RuntimeDriversList" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto RuntimeDriversCountRef = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\xFF\x05\x00\x00\x00\x00\x48\x39\x11", "xx????xxx");
|
||||||
|
if (!RuntimeDriversCountRef) {
|
||||||
|
Log("[!] Failed to find WdFilter RuntimeDriversCount" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MpCleanupDriverInfo->MpFreeDriverInfoEx
|
||||||
|
// The pattern only focus in the 0x8 offset and the possibility of the different order for the instructions
|
||||||
|
/*
|
||||||
|
49 8B C9 mov rcx, r9 ; P
|
||||||
|
49 89 50 08 mov [r8+8], rdx
|
||||||
|
E8 FB F0 FD FF call MpFreeDriverInfoEx
|
||||||
|
48 8B 0D FC AA FA FF mov rcx, cs:qword_1C0021BF0
|
||||||
|
E9 21 FF FF FF jmp loc_1C007701A
|
||||||
|
*/
|
||||||
|
auto MpFreeDriverInfoExRef = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\x89\x00\x08\xE8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE9", "x?xx???????????x");
|
||||||
|
if (!MpFreeDriverInfoExRef) {
|
||||||
|
/*
|
||||||
|
48 89 4A 08 mov [rdx+8], rcx
|
||||||
|
49 8B C8 mov rcx, r8 ; P
|
||||||
|
E8 C3 58 FE FF call sub_1C0065308
|
||||||
|
48 8B 0D 44 41 FA FF mov rcx, cs:qword_1C0023B90
|
||||||
|
E9 39 FF FF FF jmp loc_1C007F98A */
|
||||||
|
MpFreeDriverInfoExRef = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\x89\x00\x08\x00\x00\x00\xE8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE9", "x?x???x???????????x");
|
||||||
|
if (!MpFreeDriverInfoExRef) {
|
||||||
|
Log("[!] Failed to find WdFilter MpFreeDriverInfoEx" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log("[+] Found WdFilter MpFreeDriverInfoEx with second pattern" << std::endl);
|
||||||
|
}
|
||||||
|
MpFreeDriverInfoExRef += 0x3; // adjust for next sum offset
|
||||||
|
}
|
||||||
|
|
||||||
|
MpFreeDriverInfoExRef += 0x3; // skip until call instruction
|
||||||
|
|
||||||
|
RuntimeDriversList = (uintptr_t)ResolveRelativeAddress(device_handle, (PVOID)RuntimeDriversList, 3, 7);
|
||||||
|
uintptr_t RuntimeDriversList_Head = RuntimeDriversList - 0x8;
|
||||||
|
uintptr_t RuntimeDriversCount = (uintptr_t)ResolveRelativeAddress(device_handle, (PVOID)RuntimeDriversCountRef, 2, 6);
|
||||||
|
uintptr_t RuntimeDriversArray = RuntimeDriversCount + 0x8;
|
||||||
|
read(device_handle, RuntimeDriversArray, (uint64_t*)&RuntimeDriversArray, sizeof(uintptr_t));
|
||||||
|
uintptr_t MpFreeDriverInfoEx = (uintptr_t)ResolveRelativeAddress(device_handle, (PVOID)MpFreeDriverInfoExRef, 1, 5);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto ReadListEntry = [&](uintptr_t Address) -> LIST_ENTRY* { // Useful lambda to read LIST_ENTRY
|
||||||
|
LIST_ENTRY* Entry;
|
||||||
|
if (!read(device_handle, Address, (uint64_t*)&Entry, sizeof(LIST_ENTRY*))) return 0;
|
||||||
|
return Entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (LIST_ENTRY* Entry = ReadListEntry(RuntimeDriversList_Head);
|
||||||
|
Entry != (LIST_ENTRY*)RuntimeDriversList_Head;
|
||||||
|
Entry = ReadListEntry((uintptr_t)Entry + (offsetof(struct _LIST_ENTRY, Flink))))
|
||||||
|
{
|
||||||
|
UNICODE_STRING Unicode_String;
|
||||||
|
if (read(device_handle, (uintptr_t)Entry + 0x10, (uint64_t*)&Unicode_String, sizeof(UNICODE_STRING))) {
|
||||||
|
auto ImageName = std::make_unique<wchar_t[]>((ULONG64)Unicode_String.Length / 2ULL + 1ULL);
|
||||||
|
if (read(device_handle, (uintptr_t)Unicode_String.Buffer, (uint64_t*)ImageName.get(), Unicode_String.Length)) {
|
||||||
|
if (wcsstr(ImageName.get(), kd_driver::GetDriverNameW().c_str())) {
|
||||||
|
|
||||||
|
//remove from RuntimeDriversArray
|
||||||
|
bool removedRuntimeDriversArray = false;
|
||||||
|
PVOID SameIndexList = (PVOID)((uintptr_t)Entry - 0x10);
|
||||||
|
for (int k = 0; k < 256; k++) { // max RuntimeDriversArray elements
|
||||||
|
PVOID value = 0;
|
||||||
|
read(device_handle, RuntimeDriversArray + (k * 8), (uint64_t*)&value, sizeof(PVOID));
|
||||||
|
if (value == SameIndexList) {
|
||||||
|
PVOID emptyval = (PVOID)(RuntimeDriversCount + 1); // this is not count+1 is position of cout addr+1
|
||||||
|
write(device_handle, RuntimeDriversArray + (k * 8), (uint64_t*)&emptyval, sizeof(PVOID));
|
||||||
|
removedRuntimeDriversArray = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!removedRuntimeDriversArray) {
|
||||||
|
Log("[!] Failed to remove from RuntimeDriversArray" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto NextEntry = ReadListEntry(uintptr_t(Entry) + (offsetof(struct _LIST_ENTRY, Flink)));
|
||||||
|
auto PrevEntry = ReadListEntry(uintptr_t(Entry) + (offsetof(struct _LIST_ENTRY, Blink)));
|
||||||
|
|
||||||
|
write(device_handle, uintptr_t(NextEntry) + (offsetof(struct _LIST_ENTRY, Blink)), (uint64_t*)&PrevEntry, sizeof(LIST_ENTRY::Blink));
|
||||||
|
write(device_handle, uintptr_t(PrevEntry) + (offsetof(struct _LIST_ENTRY, Flink)), (uint64_t*)&NextEntry, sizeof(LIST_ENTRY::Flink));
|
||||||
|
|
||||||
|
// decrement RuntimeDriversCount
|
||||||
|
ULONG current = 0;
|
||||||
|
read(device_handle, RuntimeDriversCount, (uint64_t*)¤t, sizeof(ULONG));
|
||||||
|
current--;
|
||||||
|
write(device_handle, RuntimeDriversCount, (uint64_t*)¤t, sizeof(ULONG));
|
||||||
|
|
||||||
|
// call MpFreeDriverInfoEx
|
||||||
|
uintptr_t DriverInfo = (uintptr_t)Entry - 0x20;
|
||||||
|
|
||||||
|
//verify DriverInfo Magic
|
||||||
|
USHORT Magic = 0;
|
||||||
|
read(device_handle, DriverInfo, (uint64_t*)&Magic, sizeof(USHORT));
|
||||||
|
if (Magic != 0xDA18) {
|
||||||
|
Log("[!] DriverInfo Magic is invalid, new wdfilter version?, driver info will not be released to prevent bsod" << std::endl);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
func_call<void>(device_handle, (void*)MpFreeDriverInfoEx, nullptr, DriverInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log("[+] WdFilterDriverList Cleaned: " << ImageName << std::endl);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "drv.h"
|
||||||
|
#include "ntstruct.h"
|
||||||
|
#include "..\XorStr.h"
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define IOCTL_MMCOPY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x9512, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
|
#define IOCTL_MMCOPYEX CTL_CODE(FILE_DEVICE_UNKNOWN, 0x9513, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
|
|
||||||
|
namespace kd_driver
|
||||||
|
{
|
||||||
|
|
||||||
|
extern HANDLE iqvw64e_device_handle;
|
||||||
|
extern uint64_t ntoskrnlbase;
|
||||||
|
constexpr DWORD iqvw64e_timestamp = 0x5284EAC3;
|
||||||
|
|
||||||
|
std::wstring GetDriverPath();
|
||||||
|
std::wstring GetDriverNameW();
|
||||||
|
bool AcquireDebugPrivilege();
|
||||||
|
|
||||||
|
bool Load();
|
||||||
|
bool Unload();
|
||||||
|
|
||||||
|
bool MmCopy(HANDLE device_handle, uint64_t Base, uint64_t Buffer, SIZE_T Size);
|
||||||
|
bool read(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size);
|
||||||
|
bool write(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size);
|
||||||
|
|
||||||
|
bool writeEx(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size);
|
||||||
|
|
||||||
|
|
||||||
|
bool MdlIoSpace(HANDLE device_handle, uint64_t address, uint64_t* Buffer, SIZE_T Size);
|
||||||
|
|
||||||
|
uint64_t get_kernel_module_export(HANDLE device_handle, uint64_t ker_base, const char* func_name);
|
||||||
|
uint64_t ExAllocatePool(HANDLE device_handle, BYTE pool_type, SIZE_T size);
|
||||||
|
bool FreePool(HANDLE device_handle, uint64_t address);
|
||||||
|
|
||||||
|
nt::PiDDBCacheEntry* LookupEntry(HANDLE device_handle, nt::PRTL_AVL_TABLE PiDDBCacheTable, ULONG timestamp, const wchar_t* name);
|
||||||
|
PVOID RtlLookupElementGenericTableAvl(HANDLE device_handle, nt::PRTL_AVL_TABLE Table, PVOID Buffer);
|
||||||
|
BOOLEAN RtlDeleteElementGenericTableAvl(HANDLE device_handle, PVOID Table, PVOID Buffer);
|
||||||
|
|
||||||
|
uintptr_t FindPatternAtKernel(HANDLE device_handle, uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask);
|
||||||
|
uintptr_t FindSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, PULONG size);
|
||||||
|
uintptr_t FindPatternInSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, BYTE* bMask, const char* szMask);
|
||||||
|
|
||||||
|
PVOID ResolveRelativeAddress(HANDLE device_handle, _In_ PVOID Instruction, _In_ ULONG OffsetOffset, _In_ ULONG InstructionSize);
|
||||||
|
bool ExAcquireResourceExclusiveLite(HANDLE device_handle, PVOID Resource, BOOLEAN wait);
|
||||||
|
bool ExReleaseResourceLite(HANDLE device_handle, PVOID Resource);
|
||||||
|
|
||||||
|
|
||||||
|
bool ClearPiDDBCacheTable(HANDLE device_handle);
|
||||||
|
bool ClearMmUnloadedDrivers(HANDLE device_handle);
|
||||||
|
bool ClearKernelHashBucketList(HANDLE device_handle);
|
||||||
|
bool ClearWdFilterDriverList(HANDLE device_handle);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T, typename ...A>
|
||||||
|
bool func_call(HANDLE device_handle, void* func, T* out, const A...arg)
|
||||||
|
{
|
||||||
|
constexpr auto call_void = std::is_same_v<T, void>;
|
||||||
|
|
||||||
|
if constexpr (!call_void) {
|
||||||
|
if (!out)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
UNREFERENCED_PARAMETER(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const auto ntdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
const auto ntaddrom = reinterpret_cast<void*>(GetProcAddress(ntdll, ("NtAddAtom")));
|
||||||
|
|
||||||
|
char jmp_shellcode[] = { (char)0x48, (char)0xb8, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00,(char)0x00, (char)0xff, (char)0xe0 };
|
||||||
|
char original_func[sizeof(jmp_shellcode)];
|
||||||
|
*(uint64_t*)&jmp_shellcode[2] = (uint64_t)func;
|
||||||
|
|
||||||
|
uint64_t ker_NtAddatom = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("NtAddAtom"));
|
||||||
|
|
||||||
|
|
||||||
|
read(device_handle, ker_NtAddatom, (uint64_t*)&original_func, sizeof(jmp_shellcode));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (!writeEx(device_handle, ker_NtAddatom, (uint64_t*)&jmp_shellcode, sizeof(jmp_shellcode)))
|
||||||
|
{
|
||||||
|
//printf("write fail\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if constexpr (!call_void) {
|
||||||
|
using FunctionFn = T(__stdcall*)(A...);
|
||||||
|
const auto Function = reinterpret_cast<FunctionFn>(ntaddrom);
|
||||||
|
|
||||||
|
*out = Function(arg...);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
using FunctionFn = void(__stdcall*)(A...);
|
||||||
|
const auto Function = reinterpret_cast<FunctionFn>(ntaddrom);
|
||||||
|
|
||||||
|
Function(arg...);
|
||||||
|
}
|
||||||
|
|
||||||
|
return writeEx(device_handle, ker_NtAddatom, (uint64_t*)&original_func, sizeof(jmp_shellcode));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
#include "kdmapper.h"
|
||||||
|
|
||||||
|
BOOL kdmapper::MapDriver(HANDLE device_handle, uint64_t ker_base, char* map_base)
|
||||||
|
{
|
||||||
|
const auto pdos_header = reinterpret_cast<PIMAGE_DOS_HEADER>(map_base);
|
||||||
|
const auto pNT_header = reinterpret_cast<PIMAGE_NT_HEADERS>(map_base + pdos_header->e_lfanew);
|
||||||
|
|
||||||
|
auto image_size = pNT_header->OptionalHeader.SizeOfImage;
|
||||||
|
|
||||||
|
auto map_image_base = reinterpret_cast<char*>(VirtualAlloc(nullptr, image_size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE));
|
||||||
|
if (!map_image_base)
|
||||||
|
{
|
||||||
|
//printf("vritualalloc fail!!\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//image_size = image_size - TotalVirtualHeaderSize;
|
||||||
|
|
||||||
|
auto kernel_base = kd_driver::ExAllocatePool(device_handle, 0, image_size);
|
||||||
|
if (!kernel_base)
|
||||||
|
{
|
||||||
|
//printf("[-] ExAllocatePool fail\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//写入pe头
|
||||||
|
memcpy(map_image_base, map_base, pNT_header->OptionalHeader.SizeOfHeaders);
|
||||||
|
|
||||||
|
//节区拉伸
|
||||||
|
const auto section_header = IMAGE_FIRST_SECTION(pNT_header);
|
||||||
|
for (size_t i = 0; i < pNT_header->FileHeader.NumberOfSections; i++)
|
||||||
|
{
|
||||||
|
auto section_virtual = reinterpret_cast<char*>(map_image_base + section_header[i].VirtualAddress);
|
||||||
|
memcpy(section_virtual, reinterpret_cast<char*>(map_base + section_header[i].PointerToRawData), section_header[i].SizeOfRawData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//修复重定位表
|
||||||
|
//auto PReloc = reinterpret_cast<PIMAGE_BASE_RELOCATION>(map_image_base + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
|
||||||
|
|
||||||
|
auto current_base_relocation = reinterpret_cast<PIMAGE_BASE_RELOCATION>(reinterpret_cast<ULONG64>(map_image_base) + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
|
||||||
|
const auto reloc_end = reinterpret_cast<PIMAGE_BASE_RELOCATION>(reinterpret_cast<ULONG64>(current_base_relocation) + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
|
||||||
|
|
||||||
|
while (current_base_relocation < reloc_end && current_base_relocation->SizeOfBlock)
|
||||||
|
{
|
||||||
|
WORD* NumOfBlock = (WORD*)(current_base_relocation + 1);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < (current_base_relocation->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / 2; i++)
|
||||||
|
{
|
||||||
|
if (NumOfBlock[i] >> 12 == IMAGE_REL_BASED_DIR64)
|
||||||
|
{
|
||||||
|
auto RelocAddr = reinterpret_cast<uint64_t*>((char*)map_image_base + (NumOfBlock[i] & 0xFFF) + current_base_relocation->VirtualAddress);
|
||||||
|
*RelocAddr -= pNT_header->OptionalHeader.ImageBase;
|
||||||
|
|
||||||
|
|
||||||
|
*RelocAddr += (DWORD64)kernel_base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
current_base_relocation = reinterpret_cast<PIMAGE_BASE_RELOCATION>(reinterpret_cast<DWORD64>(current_base_relocation) + current_base_relocation->SizeOfBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//修复加载配置
|
||||||
|
auto load_config_directory = pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress;
|
||||||
|
if (load_config_directory) //有些驱动并没有加载表 如果没有就不用修复了
|
||||||
|
{
|
||||||
|
auto load_config_struct = (PIMAGE_LOAD_CONFIG_DIRECTORY)((uintptr_t)map_image_base + load_config_directory);
|
||||||
|
auto stack_cookie = load_config_struct->SecurityCookie;
|
||||||
|
stack_cookie = stack_cookie - (uintptr_t)kernel_base + (uintptr_t)map_image_base; //since our local image is already relocated the base returned will be kernel address
|
||||||
|
|
||||||
|
if (*(uintptr_t*)(stack_cookie) != 0x2B992DDFA232)
|
||||||
|
return false;
|
||||||
|
auto new_cookie = 0x2B992DDFA232 ^ GetCurrentProcessId() ^ GetCurrentThreadId(); // here we don't really care about the value of stack cookie, it will still works and produce nice result
|
||||||
|
if (new_cookie == 0x2B992DDFA232)
|
||||||
|
new_cookie = 0x2B992DDFA233;
|
||||||
|
|
||||||
|
*(uintptr_t*)(stack_cookie) = new_cookie; // the _security_cookie_complement will be init by the driver itself if they use crt
|
||||||
|
}
|
||||||
|
|
||||||
|
//修复导入表
|
||||||
|
auto pimpor = reinterpret_cast<PIMAGE_IMPORT_DESCRIPTOR>(map_image_base + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
|
||||||
|
while (pimpor->Name)
|
||||||
|
{
|
||||||
|
const auto Module = utils::GetKernelModule((char*)map_image_base + pimpor->Name);
|
||||||
|
|
||||||
|
auto Int = reinterpret_cast<PIMAGE_THUNK_DATA>(map_image_base + pimpor->OriginalFirstThunk);
|
||||||
|
auto Iat = reinterpret_cast<PIMAGE_THUNK_DATA>(map_image_base + pimpor->FirstThunk);
|
||||||
|
|
||||||
|
while (Int->u1.AddressOfData && Iat->u1.AddressOfData)
|
||||||
|
{
|
||||||
|
if (!IMAGE_SNAP_BY_ORDINAL(Int->u1.AddressOfData))
|
||||||
|
{
|
||||||
|
auto Names = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>(map_image_base + Int->u1.AddressOfData);
|
||||||
|
Iat->u1.AddressOfData = kd_driver::get_kernel_module_export(device_handle, ker_base, Names->Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
Int++; Iat++;
|
||||||
|
}
|
||||||
|
pimpor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
kd_driver::write(device_handle, (uint64_t)kernel_base, (uint64_t*)map_image_base, image_size);
|
||||||
|
|
||||||
|
auto entrypoint = kernel_base + pNT_header->OptionalHeader.AddressOfEntryPoint;
|
||||||
|
NTSTATUS status = 0;
|
||||||
|
kd_driver::func_call(device_handle, (void*)entrypoint, &status, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
|
//DWORD64 imagehead = 0;
|
||||||
|
//kd_driver::write(device_handle, kernel_base, &imagehead, pNT_header->OptionalHeader.SizeOfHeaders);
|
||||||
|
|
||||||
|
VirtualFree(map_image_base, 0, MEM_RELEASE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "kd_driver.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
namespace kdmapper
|
||||||
|
{
|
||||||
|
BOOL MapDriver(HANDLE device_handle, uint64_t ker_base, char* map_base);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
#include "ntstruct.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool nt::RegisterAndStart(const std::wstring& driver_path, const std::wstring& serviceName) {
|
||||||
|
const static DWORD ServiceTypeKernel = 1;
|
||||||
|
const std::wstring servicesPath = L"SYSTEM\\CurrentControlSet\\Services\\" + serviceName;
|
||||||
|
const std::wstring nPath = L"\\??\\" + driver_path;
|
||||||
|
|
||||||
|
HKEY dservice;
|
||||||
|
LSTATUS status = RegCreateKeyW(HKEY_LOCAL_MACHINE, servicesPath.c_str(), &dservice); //Returns Ok if already exists
|
||||||
|
if (status != ERROR_SUCCESS) {
|
||||||
|
Log("[-] Can't create service key" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = RegSetKeyValueW(dservice, NULL, L"ImagePath", REG_EXPAND_SZ, nPath.c_str(), (DWORD)(nPath.size() * sizeof(wchar_t)));
|
||||||
|
if (status != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(dservice);
|
||||||
|
Log("[-] Can't create 'ImagePath' registry value" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = RegSetKeyValueW(dservice, NULL, L"Type", REG_DWORD, &ServiceTypeKernel, sizeof(DWORD));
|
||||||
|
if (status != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(dservice);
|
||||||
|
Log("[-] Can't create 'Type' registry value" << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(dservice);
|
||||||
|
|
||||||
|
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (ntdll == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//auto RtlAdjustPrivilege = (nt::RtlAdjustPrivilege)GetProcAddress(ntdll, "RtlAdjustPrivilege");
|
||||||
|
//auto NtLoadDriver = (nt::NtLoadDriver)GetProcAddress(ntdll, "NtLoadDriver");
|
||||||
|
|
||||||
|
ULONG SE_LOAD_DRIVER_PRIVILEGE = 10UL;
|
||||||
|
BOOLEAN SeLoadDriverWasEnabled;
|
||||||
|
NTSTATUS Status = nt::RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, TRUE, FALSE, &SeLoadDriverWasEnabled);
|
||||||
|
if (!NT_SUCCESS(Status)) {
|
||||||
|
Log("Fatal error: failed to acquire SE_LOAD_DRIVER_PRIVILEGE. Make sure you are running as administrator." << std::endl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring wdriver_reg_path = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" + serviceName;
|
||||||
|
UNICODE_STRING serviceStr;
|
||||||
|
RtlInitUnicodeString(&serviceStr, wdriver_reg_path.c_str());
|
||||||
|
|
||||||
|
Status = nt::NtLoadDriver(&serviceStr);
|
||||||
|
|
||||||
|
|
||||||
|
Log("[+] NtLoadDriver Status 0x" << std::hex << Status << std::endl);
|
||||||
|
|
||||||
|
if (Status == 0xC0000603) { //STATUS_IMAGE_CERT_REVOKED
|
||||||
|
Log("[-] Your vulnerable driver list is enabled and have blocked the driver loading, you must disable vulnerable driver list to use kdmapper with intel driver" << std::endl);
|
||||||
|
Log("[-] Registry path to disable vulnerable driver list: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\CI\\Config" << std::endl);
|
||||||
|
Log("[-] Set 'VulnerableDriverBlocklistEnable' as dword to 0" << std::endl);
|
||||||
|
}
|
||||||
|
else if (Status == 0xC0000022 || Status == 0xC000009A) { //STATUS_ACCESS_DENIED and STATUS_INSUFFICIENT_RESOURCES
|
||||||
|
Log("[-] Access Denied or Insufficient Resources (0x" << std::hex << Status << "), Probably some anticheat or antivirus running blocking the load of vulnerable driver" << std::endl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Never should occur since kdmapper checks for "IsRunning" driver before
|
||||||
|
if (Status == 0xC000010E) {// STATUS_IMAGE_ALREADY_LOADED
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NT_SUCCESS(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool nt::StopAndRemove(const std::wstring& serviceName) {
|
||||||
|
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (ntdll == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::wstring wdriver_reg_path = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" + serviceName;
|
||||||
|
UNICODE_STRING serviceStr;
|
||||||
|
RtlInitUnicodeString(&serviceStr, wdriver_reg_path.c_str());
|
||||||
|
|
||||||
|
HKEY driver_service;
|
||||||
|
std::wstring servicesPath = L"SYSTEM\\CurrentControlSet\\Services\\" + serviceName;
|
||||||
|
LSTATUS status = RegOpenKeyW(HKEY_LOCAL_MACHINE, servicesPath.c_str(), &driver_service);
|
||||||
|
if (status != ERROR_SUCCESS) {
|
||||||
|
if (status == ERROR_FILE_NOT_FOUND) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
RegCloseKey(driver_service);
|
||||||
|
|
||||||
|
NTSTATUS st = nt::NtUnloadDriver(&serviceStr);
|
||||||
|
Log("[+] NtUnloadDriver Status 0x" << std::hex << st << std::endl);
|
||||||
|
if (st != ERROR_SUCCESS) {
|
||||||
|
Log("[-] Driver Unload Failed!!" << std::endl);
|
||||||
|
status = RegDeleteTreeW(HKEY_LOCAL_MACHINE, servicesPath.c_str());
|
||||||
|
return false; //lets consider unload fail as error because can cause problems with anti cheats later
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status = RegDeleteTreeW(HKEY_LOCAL_MACHINE, servicesPath.c_str());
|
||||||
|
if (status != ERROR_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <winternl.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
#pragma comment(lib, "ntdll.lib")
|
||||||
|
|
||||||
|
#define DEBUG_PRINTF 0
|
||||||
|
|
||||||
|
#if DEBUG_PRINTF
|
||||||
|
|
||||||
|
#define Log(content) std::wcout << content
|
||||||
|
#else
|
||||||
|
#define Log(content)
|
||||||
|
#endif // 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace nt
|
||||||
|
{
|
||||||
|
EXTERN_C NTSTATUS RtlAdjustPrivilege(ULONG Privilege, BOOLEAN Enable, BOOLEAN Client, BOOLEAN* WasEnabled);
|
||||||
|
EXTERN_C NTSTATUS NtLoadDriver(PUNICODE_STRING DriverServiceName);
|
||||||
|
EXTERN_C NTSTATUS NtUnloadDriver(PUNICODE_STRING DriverServiceName);
|
||||||
|
|
||||||
|
|
||||||
|
constexpr auto STATUS_INFO_LENGTH_MISMATCH = 0xC0000004;
|
||||||
|
|
||||||
|
constexpr auto SystemModuleInformation = 11;
|
||||||
|
constexpr auto SystemExtendedHandleInformation = 64;
|
||||||
|
|
||||||
|
bool RegisterAndStart(const std::wstring& driver_path, const std::wstring& serviceName);
|
||||||
|
bool StopAndRemove(const std::wstring& serviceName);
|
||||||
|
|
||||||
|
typedef struct _SYSTEM_HANDLE
|
||||||
|
{
|
||||||
|
PVOID Object;
|
||||||
|
HANDLE UniqueProcessId;
|
||||||
|
HANDLE HandleValue;
|
||||||
|
ULONG GrantedAccess;
|
||||||
|
USHORT CreatorBackTraceIndex;
|
||||||
|
USHORT ObjectTypeIndex;
|
||||||
|
ULONG HandleAttributes;
|
||||||
|
ULONG Reserved;
|
||||||
|
} SYSTEM_HANDLE, * PSYSTEM_HANDLE;
|
||||||
|
|
||||||
|
typedef struct _SYSTEM_HANDLE_INFORMATION_EX
|
||||||
|
{
|
||||||
|
ULONG_PTR HandleCount;
|
||||||
|
ULONG_PTR Reserved;
|
||||||
|
SYSTEM_HANDLE Handles[1];
|
||||||
|
} SYSTEM_HANDLE_INFORMATION_EX, * PSYSTEM_HANDLE_INFORMATION_EX;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _RTL_BALANCED_LINKS {
|
||||||
|
struct _RTL_BALANCED_LINKS* Parent;
|
||||||
|
struct _RTL_BALANCED_LINKS* LeftChild;
|
||||||
|
struct _RTL_BALANCED_LINKS* RightChild;
|
||||||
|
CHAR Balance;
|
||||||
|
UCHAR Reserved[3];
|
||||||
|
} RTL_BALANCED_LINKS;
|
||||||
|
typedef RTL_BALANCED_LINKS* PRTL_BALANCED_LINKS;
|
||||||
|
|
||||||
|
typedef struct _RTL_AVL_TABLE {
|
||||||
|
RTL_BALANCED_LINKS BalancedRoot;
|
||||||
|
PVOID OrderedPointer;
|
||||||
|
ULONG WhichOrderedElement;
|
||||||
|
ULONG NumberGenericTableElements;
|
||||||
|
ULONG DepthOfTree;
|
||||||
|
PVOID RestartKey;
|
||||||
|
ULONG DeleteCount;
|
||||||
|
PVOID CompareRoutine;
|
||||||
|
PVOID AllocateRoutine;
|
||||||
|
PVOID FreeRoutine;
|
||||||
|
PVOID TableContext;
|
||||||
|
} RTL_AVL_TABLE;
|
||||||
|
typedef RTL_AVL_TABLE* PRTL_AVL_TABLE;
|
||||||
|
|
||||||
|
typedef struct _PiDDBCacheEntry
|
||||||
|
{
|
||||||
|
LIST_ENTRY List;
|
||||||
|
UNICODE_STRING DriverName;
|
||||||
|
ULONG TimeDateStamp;
|
||||||
|
NTSTATUS LoadStatus;
|
||||||
|
char _0x0028[16]; // data from the shim engine, or uninitialized memory for custom drivers
|
||||||
|
} PiDDBCacheEntry, * NPiDDBCacheEntry;
|
||||||
|
|
||||||
|
typedef struct _HashBucketEntry
|
||||||
|
{
|
||||||
|
struct _HashBucketEntry* Next;
|
||||||
|
UNICODE_STRING DriverName;
|
||||||
|
ULONG CertHash[5];
|
||||||
|
} HashBucketEntry, * PHashBucketEntry;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct _CALC_VERIFY
|
||||||
|
{
|
||||||
|
int a, b, c, d;
|
||||||
|
ULONG64 calc_val;
|
||||||
|
|
||||||
|
}CALC_VERIFY,*PCALC_VERIFY;
|
||||||
|
|
||||||
|
typedef struct COMM_INFO
|
||||||
|
{
|
||||||
|
uintptr_t case_number;
|
||||||
|
uintptr_t reserved;
|
||||||
|
uintptr_t source;
|
||||||
|
uintptr_t destination;
|
||||||
|
uintptr_t length;
|
||||||
|
|
||||||
|
PCALC_VERIFY Verify;
|
||||||
|
|
||||||
|
}COMM_INFO, * PCOMM_INFO;
|
||||||
|
|
||||||
|
typedef struct _GET_PHYS_ADDRESS_BUFFER_INFO
|
||||||
|
{
|
||||||
|
uint64_t case_number;
|
||||||
|
uint64_t reserved;
|
||||||
|
uint64_t return_physical_address;
|
||||||
|
uint64_t address_to_translate;
|
||||||
|
}GET_PHYS_ADDRESS_BUFFER_INFO, * PGET_PHYS_ADDRESS_BUFFER_INFO;
|
||||||
|
|
||||||
|
typedef struct _MAP_IO_SPACE_BUFFER_INFO
|
||||||
|
{
|
||||||
|
uint64_t case_number;
|
||||||
|
uint64_t reserved;
|
||||||
|
uint64_t return_value;
|
||||||
|
uint64_t return_virtual_address;
|
||||||
|
uint64_t physical_address_to_map;
|
||||||
|
uint32_t size;
|
||||||
|
}MAP_IO_SPACE_BUFFER_INFO, * PMAP_IO_SPACE_BUFFER_INFO;
|
||||||
|
|
||||||
|
typedef struct _UNMAP_IO_SPACE_BUFFER_INFO
|
||||||
|
{
|
||||||
|
uint64_t case_number;
|
||||||
|
uint64_t reserved1;
|
||||||
|
uint64_t reserved2;
|
||||||
|
uint64_t virt_address;
|
||||||
|
uint64_t reserved3;
|
||||||
|
uint32_t number_of_bytes;
|
||||||
|
}UNMAP_IO_SPACE_BUFFER_INFO, * PUNMAP_IO_SPACE_BUFFER_INFO;
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
auto utils::GetKernelModule(const std::string& module_name) -> uint64_t
|
||||||
|
{
|
||||||
|
void* buffer = nullptr;
|
||||||
|
DWORD buffer_size = 0;
|
||||||
|
|
||||||
|
NTSTATUS status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemModuleInformation), buffer, buffer_size, &buffer_size);
|
||||||
|
|
||||||
|
while (status == nt::STATUS_INFO_LENGTH_MISMATCH) {
|
||||||
|
if (buffer != nullptr)
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
|
||||||
|
buffer = VirtualAlloc(nullptr, buffer_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||||
|
status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemModuleInformation), buffer, buffer_size, &buffer_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(status)) {
|
||||||
|
if (buffer != nullptr)
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto modules = static_cast<PRTL_PROCESS_MODULES>(buffer);
|
||||||
|
if (!modules)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (auto i = 0u; i < modules->NumberOfModules; ++i) {
|
||||||
|
const std::string current_module_name = std::string(reinterpret_cast<char*>(modules->Modules[i].FullPathName) + modules->Modules[i].OffsetToFileName);
|
||||||
|
|
||||||
|
if (!_stricmp(current_module_name.c_str(), module_name.c_str()))
|
||||||
|
{
|
||||||
|
const uint64_t result = reinterpret_cast<uint64_t>(modules->Modules[i].ImageBase);
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualFree(buffer, 0, MEM_RELEASE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOLEAN utils::bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) {
|
||||||
|
for (; *szMask; ++szMask, ++pData, ++bMask)
|
||||||
|
if (*szMask == 'x' && *pData != *bMask)
|
||||||
|
return 0;
|
||||||
|
return (*szMask) == 0;
|
||||||
|
}
|
||||||
|
uintptr_t utils::FindPattern(uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask)
|
||||||
|
{
|
||||||
|
size_t max_len = dwLen - strlen(szMask);
|
||||||
|
for (uintptr_t i = 0; i < max_len; i++)
|
||||||
|
if (bDataCompare((BYTE*)(dwAddress + i), bMask, szMask))
|
||||||
|
return (uintptr_t)(dwAddress + i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID utils::FindSection(const char* sectionName, uintptr_t modulePtr, PULONG size) {
|
||||||
|
size_t namelength = strlen(sectionName);
|
||||||
|
PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)(modulePtr + ((PIMAGE_DOS_HEADER)modulePtr)->e_lfanew);
|
||||||
|
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(headers);
|
||||||
|
for (DWORD i = 0; i < headers->FileHeader.NumberOfSections; ++i) {
|
||||||
|
PIMAGE_SECTION_HEADER section = §ions[i];
|
||||||
|
if (memcmp(section->Name, sectionName, namelength) == 0 &&
|
||||||
|
namelength == strlen((char*)section->Name)) {
|
||||||
|
if (!section->VirtualAddress) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
|
*size = section->Misc.VirtualSize;
|
||||||
|
}
|
||||||
|
return (PVOID)(modulePtr + section->VirtualAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::wstring utils::GetFullTempPath() {
|
||||||
|
wchar_t temp_directory[MAX_PATH + 1] = { 0 };
|
||||||
|
const uint32_t get_temp_path_ret = GetTempPathW(sizeof(temp_directory) / 2, temp_directory);
|
||||||
|
if (!get_temp_path_ret || get_temp_path_ret > MAX_PATH + 1) {
|
||||||
|
Log(L"[-] Failed to get temp path" << std::endl);
|
||||||
|
return L"";
|
||||||
|
}
|
||||||
|
if (temp_directory[wcslen(temp_directory) - 1] == L'\\')
|
||||||
|
temp_directory[wcslen(temp_directory) - 1] = 0x0;
|
||||||
|
|
||||||
|
return std::wstring(temp_directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::CreateFileFromMemory(const std::wstring& desired_file_path, const char* address, size_t size) {
|
||||||
|
std::ofstream file_ofstream(desired_file_path.c_str(), std::ios_base::out | std::ios_base::binary);
|
||||||
|
|
||||||
|
if (!file_ofstream.write(address, size)) {
|
||||||
|
file_ofstream.close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_ofstream.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto utils::calc_comm_verify_check(int a, int b, int c, int d)->ULONG64
|
||||||
|
{
|
||||||
|
int aaaa = c * b;
|
||||||
|
aaaa = aaaa + a * b + 15561;
|
||||||
|
int bbb = aaaa + c * a;
|
||||||
|
bbb = bbb * d - b;
|
||||||
|
int ddddd = bbb + d * c;
|
||||||
|
ddddd = ddddd + d * a + 974534;
|
||||||
|
ddddd = ddddd * d + 21373;
|
||||||
|
ddddd = ddddd << d;
|
||||||
|
int ccccc = ddddd | 2335464;
|
||||||
|
ccccc = ccccc ^ 211424;
|
||||||
|
ccccc = ccccc ^ a;
|
||||||
|
int eeeee = ccccc / 835347;
|
||||||
|
auto calc_verify_val = eeeee;
|
||||||
|
|
||||||
|
return calc_verify_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto utils::get_random_val(ULONG64 a, ULONG64 b) -> ULONG64
|
||||||
|
{
|
||||||
|
ULONG64 t1 = __rdtsc();
|
||||||
|
ULONG64 v = (((((t1 * (a ^ t1) + t1 * (b * a)) * 0x17) / 7) % (b - a + 1)) + a);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto utils::GetVersion() -> OSVERSIONINFOW
|
||||||
|
{
|
||||||
|
OSVERSIONINFOW os{ 0 };
|
||||||
|
typedef NTSTATUS(WINAPI* PFNRtlGetVersion)(PRTL_OSVERSIONINFOW);
|
||||||
|
static PFNRtlGetVersion RtlGetVersion = nullptr;
|
||||||
|
if (RtlGetVersion == nullptr)
|
||||||
|
{
|
||||||
|
HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
|
||||||
|
if (hNtdll != NULL)
|
||||||
|
{
|
||||||
|
RtlGetVersion = (PFNRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlGetVersion(&os);
|
||||||
|
return os;
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "kd_driver.h"
|
||||||
|
|
||||||
|
typedef struct _RTL_PROCESS_MODULE_INFORMATION
|
||||||
|
{
|
||||||
|
HANDLE Section;
|
||||||
|
PVOID MappedBase;
|
||||||
|
PVOID ImageBase;
|
||||||
|
ULONG ImageSize;
|
||||||
|
ULONG Flags;
|
||||||
|
USHORT LoadOrderIndex;
|
||||||
|
USHORT InitOrderIndex;
|
||||||
|
USHORT LoadCount;
|
||||||
|
USHORT OffsetToFileName;
|
||||||
|
UCHAR FullPathName[256];
|
||||||
|
} RTL_PROCESS_MODULE_INFORMATION, * PRTL_PROCESS_MODULE_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _RTL_PROCESS_MODULES
|
||||||
|
{
|
||||||
|
ULONG NumberOfModules;
|
||||||
|
RTL_PROCESS_MODULE_INFORMATION Modules[1];
|
||||||
|
} RTL_PROCESS_MODULES, * PRTL_PROCESS_MODULES;
|
||||||
|
|
||||||
|
namespace utils
|
||||||
|
{
|
||||||
|
|
||||||
|
auto GetKernelModule(const std::string& module_name) -> uint64_t;
|
||||||
|
BOOLEAN bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
|
||||||
|
uintptr_t FindPattern(uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask);
|
||||||
|
PVOID FindSection(const char* sectionName, uintptr_t modulePtr, PULONG size);
|
||||||
|
|
||||||
|
std::wstring GetFullTempPath();
|
||||||
|
|
||||||
|
bool CreateFileFromMemory(const std::wstring& desired_file_path, const char* address, size_t size);
|
||||||
|
|
||||||
|
auto calc_comm_verify_check(int a, int b, int c, int d)->ULONG64;
|
||||||
|
|
||||||
|
auto get_random_val(ULONG64 a, ULONG64 b)->ULONG64;
|
||||||
|
|
||||||
|
auto GetVersion()->OSVERSIONINFOW;
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,54 @@
|
|||||||
|
#include "Base.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "Mapping.h"
|
||||||
|
#include "server_palpit.h"
|
||||||
|
#include "server_pipe.h"
|
||||||
|
#include "Gui.h"
|
||||||
|
#include "XorStr.h"
|
||||||
|
|
||||||
|
#define MUTEX_NAME XOR_STRING_W(L"Local\\seriver_mutex_anit")
|
||||||
|
|
||||||
|
BOOL WINAPI CtrlHandler(DWORD type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case CTRL_C_EVENT:
|
||||||
|
case CTRL_BREAK_EVENT:
|
||||||
|
case CTRL_CLOSE_EVENT:
|
||||||
|
case CTRL_LOGOFF_EVENT:
|
||||||
|
case CTRL_SHUTDOWN_EVENT:
|
||||||
|
RequestShutdown(XorStr("console ctrl"));
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -> int
|
||||||
|
{
|
||||||
|
//AllocConsole();
|
||||||
|
//freopen("CONOUT$", "w+", stdout);
|
||||||
|
|
||||||
|
HANDLE mutex = CreateMutex(nullptr, TRUE, MUTEX_NAME);
|
||||||
|
if (!mutex || GetLastError() == ERROR_ALREADY_EXISTS)
|
||||||
|
{
|
||||||
|
if (mutex)
|
||||||
|
CloseHandle(mutex);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetConsoleCtrlHandler(CtrlHandler, TRUE);
|
||||||
|
|
||||||
|
Gui::CreateGuiWindow();
|
||||||
|
|
||||||
|
StartServer();
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return msg.wParam;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
//{{NO_DEPENDENCIES}}
|
||||||
|
// Microsoft Visual C++ 生成的包含文件。
|
||||||
|
// 供 Anit-Cheat_EXE.rc 使用
|
||||||
|
//
|
||||||
|
#define IDI_ICON1 101
|
||||||
|
|
||||||
|
// Next default values for new objects
|
||||||
|
//
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||||
|
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||||
|
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||||
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
#include "server_palpit.h"
|
||||||
|
#include "Mapping.h"
|
||||||
|
|
||||||
|
namespace server_palpit
|
||||||
|
{
|
||||||
|
|
||||||
|
DWORD WINAPI palpit_thread(LPVOID parmar)
|
||||||
|
{
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
auto mapping_data = reinterpret_cast<PMAPPING_USER_MEMORY>(parmar);
|
||||||
|
|
||||||
|
if (!mapping_data->server_pid)
|
||||||
|
mapping_data->server_pid = GetCurrentProcessId();
|
||||||
|
|
||||||
|
//
|
||||||
|
//尝试打开客户端进程
|
||||||
|
//
|
||||||
|
|
||||||
|
static int fail_index = 0;
|
||||||
|
static HANDLE hProcess = 0;
|
||||||
|
|
||||||
|
auto client_pid = mapping_data->client_pid;
|
||||||
|
if (hProcess == NULL)
|
||||||
|
{
|
||||||
|
if (fail_index > 3)
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, client_pid);
|
||||||
|
fail_index++;
|
||||||
|
|
||||||
|
Sleep(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//监控客户端进程是否退出
|
||||||
|
//
|
||||||
|
DWORD exitCode;
|
||||||
|
if (GetExitCodeProcess(hProcess, &exitCode)) {
|
||||||
|
if (exitCode != STILL_ACTIVE) {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto create_palpit_thread(LPVOID parmar) -> void
|
||||||
|
{
|
||||||
|
|
||||||
|
CreateThread(nullptr, 0, palpit_thread, parmar, 0, nullptr);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef PALPIT
|
||||||
|
#define PALPIT
|
||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
namespace server_palpit
|
||||||
|
{
|
||||||
|
//
|
||||||
|
//public
|
||||||
|
//
|
||||||
|
|
||||||
|
auto create_palpit_thread(LPVOID parmar) -> void;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !PALPIT
|
||||||
@@ -0,0 +1,554 @@
|
|||||||
|
#include "server_pipe.h"
|
||||||
|
#include "Driver.h"
|
||||||
|
|
||||||
|
struct ClientInfo
|
||||||
|
{
|
||||||
|
DWORD id = 0;
|
||||||
|
DWORD pid = 0;
|
||||||
|
LONG64 last_tick = 0;
|
||||||
|
LONG active = 1;
|
||||||
|
HANDLE pipe = nullptr;
|
||||||
|
std::wstring label;
|
||||||
|
};
|
||||||
|
|
||||||
|
static HANDLE g_exit_event = nullptr;
|
||||||
|
static LONG g_shutdown_requested = 0;
|
||||||
|
static LONG g_next_client_id = 0;
|
||||||
|
static LONG g_seen_client = 0;
|
||||||
|
static LONG64 g_session_id = 0;
|
||||||
|
static std::mutex g_clients_mutex;
|
||||||
|
static std::vector<std::shared_ptr<ClientInfo>> g_clients;
|
||||||
|
static constexpr DWORD kFirstClientTimeoutMs = 3000;
|
||||||
|
|
||||||
|
|
||||||
|
static void ExitServerProcess(UINT exit_code)
|
||||||
|
{
|
||||||
|
printf("[server] ExitProcess code=%u\n", exit_code);
|
||||||
|
fflush(stdout);
|
||||||
|
ExitProcess(exit_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ReadExact(HANDLE pipe, void* buffer, DWORD size)
|
||||||
|
{
|
||||||
|
BYTE* ptr = static_cast<BYTE*>(buffer);
|
||||||
|
DWORD total = 0;
|
||||||
|
while (total < size)
|
||||||
|
{
|
||||||
|
DWORD got = 0;
|
||||||
|
if (!ReadFile(pipe, ptr + total, size - total, &got, nullptr))
|
||||||
|
return false;
|
||||||
|
if (got == 0)
|
||||||
|
return false;
|
||||||
|
total += got;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool WriteExact(HANDLE pipe, const void* buffer, DWORD size)
|
||||||
|
{
|
||||||
|
const BYTE* ptr = static_cast<const BYTE*>(buffer);
|
||||||
|
DWORD total = 0;
|
||||||
|
while (total < size)
|
||||||
|
{
|
||||||
|
DWORD wrote = 0;
|
||||||
|
if (!WriteFile(pipe, ptr + total, size - total, &wrote, nullptr))
|
||||||
|
return false;
|
||||||
|
if (wrote == 0)
|
||||||
|
return false;
|
||||||
|
total += wrote;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::shared_ptr<ClientInfo>> SnapshotClients()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_clients_mutex);
|
||||||
|
return g_clients;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RemoveClient(DWORD id)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_clients_mutex);
|
||||||
|
for (auto& client : g_clients)
|
||||||
|
{
|
||||||
|
if (client && client->id == id)
|
||||||
|
InterlockedExchange(&client->active, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_clients.erase(
|
||||||
|
std::remove_if(g_clients.begin(), g_clients.end(),
|
||||||
|
[id](const std::shared_ptr<ClientInfo>& c) { return c && c->id == id; }),
|
||||||
|
g_clients.end());
|
||||||
|
|
||||||
|
if (InterlockedCompareExchange(&g_seen_client, 0, 0) != 0 && g_clients.empty())
|
||||||
|
{
|
||||||
|
printf("[server] all clients exited, server shutdown\n");
|
||||||
|
fflush(stdout);
|
||||||
|
SetEvent(g_exit_event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<ClientInfo> RegisterClient(HANDLE pipe, const Msg& hello)
|
||||||
|
{
|
||||||
|
auto client = std::make_shared<ClientInfo>();
|
||||||
|
client->id = static_cast<DWORD>(InterlockedIncrement(&g_next_client_id));
|
||||||
|
client->pid = hello.pid;
|
||||||
|
client->last_tick = static_cast<LONG64>(hello.tick);
|
||||||
|
client->pipe = pipe;
|
||||||
|
InterlockedExchange(&g_seen_client, 1);
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock(g_clients_mutex);
|
||||||
|
g_clients.push_back(client);
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BroadcastExit(const char* reason)
|
||||||
|
{
|
||||||
|
auto clients = SnapshotClients();
|
||||||
|
Msg msg{};
|
||||||
|
msg.type = static_cast<uint32_t>(MsgType::Exit);
|
||||||
|
msg.session_id = static_cast<uint64_t>(g_session_id);
|
||||||
|
|
||||||
|
printf("[server] broadcast exit: %s\n", reason ? reason : "unknown");
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
for (auto& client : clients)
|
||||||
|
{
|
||||||
|
if (client && client->pipe)
|
||||||
|
WriteExact(client->pipe, &msg, sizeof(msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RequestShutdown(const char* reason)
|
||||||
|
{
|
||||||
|
if (InterlockedCompareExchange(&g_shutdown_requested, 1, 0) == 0)
|
||||||
|
{
|
||||||
|
SetEvent(g_exit_event);
|
||||||
|
BroadcastExit(reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ReadMessage(HANDLE pipe, Msg& msg)
|
||||||
|
{
|
||||||
|
return ReadExact(pipe, &msg, sizeof(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool WriteMessage(HANDLE pipe, const Msg& msg)
|
||||||
|
{
|
||||||
|
return WriteExact(pipe, &msg, sizeof(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool SendCommandReply(
|
||||||
|
HANDLE pipe,
|
||||||
|
const Msg& req,
|
||||||
|
uint32_t status,
|
||||||
|
const void* output,
|
||||||
|
uint32_t output_size)
|
||||||
|
{
|
||||||
|
Msg reply{};
|
||||||
|
reply.type = static_cast<uint32_t>(MsgType::CommandReply);
|
||||||
|
reply.client_id = req.client_id;
|
||||||
|
reply.pid = GetCurrentProcessId();
|
||||||
|
reply.version = kProtocolVersion;
|
||||||
|
reply.command = req.command;
|
||||||
|
reply.status = status;
|
||||||
|
reply.input_size = 0;
|
||||||
|
reply.output_size = 0;
|
||||||
|
reply.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
reply.session_id = static_cast<uint64_t>(g_session_id);
|
||||||
|
reply.request_id = req.request_id;
|
||||||
|
|
||||||
|
if (output && output_size)
|
||||||
|
{
|
||||||
|
if (output_size > kPayloadBytes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(reply.payload, output, output_size);
|
||||||
|
reply.output_size = output_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return WriteMessage(pipe, reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool SendCommandStatus(HANDLE pipe, const Msg& req, uint32_t status)
|
||||||
|
{
|
||||||
|
return SendCommandReply(pipe, req, status, nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t HandlePrintf(const std::shared_ptr<ClientInfo>& client, const Msg& req)
|
||||||
|
{
|
||||||
|
if (req.input_size < sizeof(PrintfRequest))
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
const auto* in = reinterpret_cast<const PrintfRequest*>(req.payload);
|
||||||
|
printf("[server][printf][client=%lu pid=%lu] %s\n", client->id, client->pid, in->text);
|
||||||
|
fflush(stdout);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t HandleLoadDriver(const Msg& req)
|
||||||
|
{
|
||||||
|
return Driver::fn_get_instance()->driver_install() ? ERROR_SUCCESS : ERROR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t HandleUnloadDriver(const Msg& req)
|
||||||
|
{
|
||||||
|
if (req.input_size < sizeof(UnloadDriverRequest))
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
const auto* in = reinterpret_cast<const UnloadDriverRequest*>(req.payload);
|
||||||
|
if (!in->service_name[0])
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
SC_HANDLE scm = OpenSCManagerW(nullptr, nullptr, SC_MANAGER_CONNECT);
|
||||||
|
if (!scm)
|
||||||
|
return GetLastError();
|
||||||
|
|
||||||
|
SC_HANDLE service = OpenServiceW(scm, in->service_name, SERVICE_STOP | DELETE | SERVICE_QUERY_STATUS);
|
||||||
|
if (!service)
|
||||||
|
{
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
CloseServiceHandle(scm);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
SERVICE_STATUS status{};
|
||||||
|
ControlService(service, SERVICE_CONTROL_STOP, &status);
|
||||||
|
|
||||||
|
DWORD err = ERROR_SUCCESS;
|
||||||
|
if (!DeleteService(service))
|
||||||
|
{
|
||||||
|
err = GetLastError();
|
||||||
|
if (err == ERROR_SERVICE_MARKED_FOR_DELETE)
|
||||||
|
err = ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseServiceHandle(service);
|
||||||
|
CloseServiceHandle(scm);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t HandleBreakpointRemoved(const std::shared_ptr<ClientInfo>& client, const Msg& req)
|
||||||
|
{
|
||||||
|
if (req.input_size < sizeof(BreakpointRemovedRequest))
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
const auto* in = reinterpret_cast<const BreakpointRemovedRequest*>(req.payload);
|
||||||
|
printf("[server][breakpoint-removed][client=%lu pid=%lu] tid=%u dr0=0x%llx dr7=0x%llx\n",
|
||||||
|
client->id,
|
||||||
|
client->pid,
|
||||||
|
in->thread_id,
|
||||||
|
static_cast<unsigned long long>(in->dr0),
|
||||||
|
static_cast<unsigned long long>(in->dr7));
|
||||||
|
fflush(stdout);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool DispatchCommand(HANDLE pipe, const std::shared_ptr<ClientInfo>& client, const Msg& req)
|
||||||
|
{
|
||||||
|
if (!client)
|
||||||
|
return SendCommandStatus(pipe, req, ERROR_INVALID_PARAMETER);
|
||||||
|
|
||||||
|
if (req.input_size > kPayloadBytes || req.output_size > kPayloadBytes)
|
||||||
|
return SendCommandStatus(pipe, req, ERROR_INVALID_PARAMETER);
|
||||||
|
|
||||||
|
uint32_t status = ERROR_INVALID_FUNCTION;
|
||||||
|
|
||||||
|
switch (static_cast<CommandId>(req.command))
|
||||||
|
{
|
||||||
|
case CommandId::Printf:
|
||||||
|
status = HandlePrintf(client, req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CommandId::LoadDriver:
|
||||||
|
status = HandleLoadDriver(req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CommandId::UnloadDriver:
|
||||||
|
status = HandleUnloadDriver(req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CommandId::QueryStatus:
|
||||||
|
status = ERROR_SUCCESS;
|
||||||
|
break;
|
||||||
|
case CommandId::BreakpointRemoved:
|
||||||
|
status = HandleBreakpointRemoved(client, req);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("[server] unknown command=%u from client=%lu pid=%lu\n",
|
||||||
|
req.command, client->id, client->pid);
|
||||||
|
fflush(stdout);
|
||||||
|
status = ERROR_INVALID_FUNCTION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SendCommandStatus(pipe, req, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI FirstClientTimeoutProc(LPVOID)
|
||||||
|
{
|
||||||
|
DWORD wait = WaitForSingleObject(g_exit_event, kFirstClientTimeoutMs);
|
||||||
|
if (wait == WAIT_TIMEOUT &&
|
||||||
|
InterlockedCompareExchange(&g_seen_client, 0, 0) == 0)
|
||||||
|
{
|
||||||
|
printf("[server] no client connected in %lu ms, server shutdown\n", kFirstClientTimeoutMs);
|
||||||
|
fflush(stdout);
|
||||||
|
RequestShutdown("first client timeout");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI MonitorThreadProc(LPVOID)
|
||||||
|
{
|
||||||
|
while (WaitForSingleObject(g_exit_event, kHeartbeatIntervalMs) == WAIT_TIMEOUT)
|
||||||
|
{
|
||||||
|
const LONG64 now = NowMs();
|
||||||
|
auto clients = SnapshotClients();
|
||||||
|
|
||||||
|
for (const auto& client : clients)
|
||||||
|
{
|
||||||
|
if (!client)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (InterlockedCompareExchange(&client->active, 0, 0) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const LONG64 last = InterlockedCompareExchange64(&client->last_tick, 0, 0);
|
||||||
|
if (last != 0 && now - last > kHeartbeatTimeoutMs)
|
||||||
|
{
|
||||||
|
printf("[server] timeout pid=%lu id=%lu\n", client->pid, client->id);
|
||||||
|
fflush(stdout);
|
||||||
|
InterlockedExchange64(&client->last_tick, now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI ClientSessionProc(LPVOID param)
|
||||||
|
{
|
||||||
|
HANDLE pipe = reinterpret_cast<HANDLE>(param);
|
||||||
|
|
||||||
|
Msg hello{};
|
||||||
|
if (!ReadMessage(pipe, hello) || hello.type != static_cast<uint32_t>(MsgType::Hello))
|
||||||
|
{
|
||||||
|
CloseHandle(pipe);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto client = RegisterClient(pipe, hello);
|
||||||
|
printf("[server] client connected id=%lu pid=%lu session=%llu\n",
|
||||||
|
client->id, client->pid, static_cast<unsigned long long>(hello.session_id));
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
Msg ack{};
|
||||||
|
ack.type = static_cast<uint32_t>(MsgType::HelloAck);
|
||||||
|
ack.client_id = client->id;
|
||||||
|
ack.pid = GetCurrentProcessId();
|
||||||
|
ack.version = kProtocolVersion;
|
||||||
|
ack.tick = static_cast<uint64_t>(NowMs());
|
||||||
|
ack.session_id = static_cast<uint64_t>(g_session_id);
|
||||||
|
if (!WriteMessage(pipe, ack))
|
||||||
|
{
|
||||||
|
RemoveClient(client->id);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject(g_exit_event, 0) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Msg msg{};
|
||||||
|
if (!ReadMessage(pipe, msg))
|
||||||
|
{
|
||||||
|
printf("[server] client disconnected id=%lu pid=%lu\n", client->id, client->pid);
|
||||||
|
fflush(stdout);
|
||||||
|
RemoveClient(client->id);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.session_id != static_cast<uint64_t>(g_session_id))
|
||||||
|
{
|
||||||
|
printf("[server] client session mismatch id=%lu pid=%lu msg_session=%llu server_session=%llu\n",
|
||||||
|
client->id,
|
||||||
|
client->pid,
|
||||||
|
static_cast<unsigned long long>(msg.session_id),
|
||||||
|
static_cast<unsigned long long>(g_session_id));
|
||||||
|
fflush(stdout);
|
||||||
|
RemoveClient(client->id);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.type == static_cast<uint32_t>(MsgType::Heartbeat))
|
||||||
|
{
|
||||||
|
InterlockedExchange64(&client->last_tick, static_cast<LONG64>(msg.tick));
|
||||||
|
client->pid = msg.pid;
|
||||||
|
}
|
||||||
|
else if (msg.type == static_cast<uint32_t>(MsgType::Goodbye))
|
||||||
|
{
|
||||||
|
printf("[server] client goodbye id=%lu pid=%lu\n", client->id, client->pid);
|
||||||
|
fflush(stdout);
|
||||||
|
RemoveClient(client->id);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (msg.type == static_cast<uint32_t>(MsgType::Exit))
|
||||||
|
{
|
||||||
|
printf("[server] client exit id=%lu pid=%lu, remove only\n", client->id, client->pid);
|
||||||
|
fflush(stdout);
|
||||||
|
RemoveClient(client->id);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (msg.type == static_cast<uint32_t>(MsgType::CommandRequest))
|
||||||
|
{
|
||||||
|
if (!DispatchCommand(pipe, client, msg))
|
||||||
|
{
|
||||||
|
printf("[server] command reply failed id=%lu pid=%lu err=%lu\n",
|
||||||
|
client->id, client->pid, GetLastError());
|
||||||
|
fflush(stdout);
|
||||||
|
RemoveClient(client->id);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI AcceptThreadProc(LPVOID)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject(g_exit_event, 0) == WAIT_OBJECT_0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
HANDLE pipe = CreateNamedPipeW(
|
||||||
|
kPipeName,
|
||||||
|
PIPE_ACCESS_DUPLEX,
|
||||||
|
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
|
||||||
|
PIPE_UNLIMITED_INSTANCES,
|
||||||
|
sizeof(Msg),
|
||||||
|
sizeof(Msg),
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
if (pipe == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
printf("[server] CreateNamedPipeW failed: %lu\n", GetLastError());
|
||||||
|
Sleep(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL connected = ConnectNamedPipe(pipe, nullptr);
|
||||||
|
if (!connected)
|
||||||
|
{
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
if (err != ERROR_PIPE_CONNECTED)
|
||||||
|
{
|
||||||
|
CloseHandle(pipe);
|
||||||
|
if (WaitForSingleObject(g_exit_event, 0) == WAIT_OBJECT_0)
|
||||||
|
return 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE session_thread = CreateThread(nullptr, 0, ClientSessionProc, pipe, 0, nullptr);
|
||||||
|
if (!session_thread)
|
||||||
|
{
|
||||||
|
printf("[server] ClientSession thread failed: %lu\n", GetLastError());
|
||||||
|
CloseHandle(pipe);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(session_thread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL WINAPI CtrlHandler(DWORD type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case CTRL_C_EVENT:
|
||||||
|
case CTRL_BREAK_EVENT:
|
||||||
|
case CTRL_CLOSE_EVENT:
|
||||||
|
case CTRL_LOGOFF_EVENT:
|
||||||
|
case CTRL_SHUTDOWN_EVENT:
|
||||||
|
RequestShutdown("console ctrl");
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool InitializeServer()
|
||||||
|
{
|
||||||
|
g_exit_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
|
||||||
|
if (!g_exit_event)
|
||||||
|
{
|
||||||
|
printf("[server] CreateEventW failed: %lu\n", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_session_id = (static_cast<LONG64>(GetCurrentProcessId()) << 32) ^ NowMs();
|
||||||
|
|
||||||
|
printf("[server] started protocol=%u session=%llu pipe=%ws\n",
|
||||||
|
kProtocolVersion,
|
||||||
|
static_cast<unsigned long long>(g_session_id),
|
||||||
|
kPipeName);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto RunServerCore() -> BOOL
|
||||||
|
{
|
||||||
|
HANDLE first_client_timeout_thread = CreateThread(nullptr, 0, FirstClientTimeoutProc, nullptr, 0, nullptr);
|
||||||
|
if (!first_client_timeout_thread)
|
||||||
|
{
|
||||||
|
printf("[server] first client timeout thread failed: %lu\n", GetLastError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE monitor_thread = CreateThread(nullptr, 0, MonitorThreadProc, nullptr, 0, nullptr);
|
||||||
|
if (!monitor_thread)
|
||||||
|
{
|
||||||
|
printf("[server] monitor thread failed: %lu\n", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE accept_thread = CreateThread(nullptr, 0, AcceptThreadProc, nullptr, 0, nullptr);
|
||||||
|
if (!accept_thread)
|
||||||
|
{
|
||||||
|
printf("[server] accept thread failed: %lu\n", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
WaitForSingleObject(g_exit_event, INFINITE);
|
||||||
|
|
||||||
|
BroadcastExit("server shutdown");
|
||||||
|
Sleep(400);
|
||||||
|
|
||||||
|
|
||||||
|
CloseHandle(accept_thread);
|
||||||
|
CloseHandle(monitor_thread);
|
||||||
|
CloseHandle(first_client_timeout_thread);
|
||||||
|
CloseHandle(g_exit_event);
|
||||||
|
ExitServerProcess(0);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto StartServer() -> BOOL
|
||||||
|
{
|
||||||
|
if (!InitializeServer())
|
||||||
|
return FALSE;
|
||||||
|
return RunServerCore();
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
#include "Base.h"
|
||||||
|
|
||||||
|
static constexpr wchar_t kPipeName[] = L"\\\\.\\pipe\\HB_PIPE_DEMO";
|
||||||
|
static constexpr DWORD kHeartbeatIntervalMs = 250;
|
||||||
|
static constexpr DWORD kHeartbeatTimeoutMs = 2000;
|
||||||
|
static constexpr uint32_t kProtocolVersion = 4;
|
||||||
|
static constexpr size_t kPayloadBytes = 1024;
|
||||||
|
|
||||||
|
enum class MsgType : uint32_t
|
||||||
|
{
|
||||||
|
Hello = 1,
|
||||||
|
HelloAck = 2,
|
||||||
|
Heartbeat = 3,
|
||||||
|
Exit = 4,
|
||||||
|
Goodbye = 5,
|
||||||
|
CommandRequest = 6,
|
||||||
|
CommandReply = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class CommandId : uint32_t
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Printf = 1,
|
||||||
|
LoadDriver = 2,
|
||||||
|
UnloadDriver = 3,
|
||||||
|
QueryStatus = 4,
|
||||||
|
BreakpointRemoved = 5,
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
struct Msg
|
||||||
|
{
|
||||||
|
uint32_t type;
|
||||||
|
uint32_t client_id;
|
||||||
|
uint32_t pid;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t command;
|
||||||
|
uint32_t status;
|
||||||
|
uint32_t input_size;
|
||||||
|
uint32_t output_size;
|
||||||
|
uint32_t reserved;
|
||||||
|
uint64_t tick;
|
||||||
|
uint64_t session_id;
|
||||||
|
uint64_t request_id;
|
||||||
|
uint8_t payload[kPayloadBytes];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PrintfRequest
|
||||||
|
{
|
||||||
|
char text[512];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LoadDriverRequest
|
||||||
|
{
|
||||||
|
wchar_t service_name[128];
|
||||||
|
wchar_t driver_path[MAX_PATH];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UnloadDriverRequest
|
||||||
|
{
|
||||||
|
wchar_t service_name[128];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BreakpointRemovedRequest
|
||||||
|
{
|
||||||
|
uint32_t thread_id;
|
||||||
|
uint32_t reserved;
|
||||||
|
uint64_t dr0;
|
||||||
|
uint64_t dr7;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct QueryStatusReply
|
||||||
|
{
|
||||||
|
DWORD server_pid;
|
||||||
|
DWORD already_open;
|
||||||
|
char text[128];
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
struct PendingCommand
|
||||||
|
{
|
||||||
|
uint32_t command = static_cast<uint32_t>(CommandId::None);
|
||||||
|
DWORD status = ERROR_GEN_FAILURE;
|
||||||
|
uint64_t request_id = 0;
|
||||||
|
std::vector<uint8_t> input;
|
||||||
|
std::vector<uint8_t> output;
|
||||||
|
HANDLE done_event = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(PrintfRequest) <= kPayloadBytes, "PrintfRequest too large");
|
||||||
|
static_assert(sizeof(LoadDriverRequest) <= kPayloadBytes, "LoadDriverRequest too large");
|
||||||
|
static_assert(sizeof(UnloadDriverRequest) <= kPayloadBytes, "UnloadDriverRequest too large");
|
||||||
|
static_assert(sizeof(BreakpointRemovedRequest) <= kPayloadBytes, "BreakpointRemovedRequest too large");
|
||||||
|
|
||||||
|
inline LONG64 NowMs()
|
||||||
|
{
|
||||||
|
return static_cast<LONG64>(GetTickCount64());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
auto StartServer()->BOOL;
|
||||||
|
|
||||||
|
void RequestShutdown(const char* reason);
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,10 @@ VisualStudioVersion = 16.0.37206.5
|
|||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anti-Cheat_Driver", "Anti-Cheat_Driver\Anti-Cheat_Driver.vcxproj", "{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anti-Cheat_Driver", "Anti-Cheat_Driver\Anti-Cheat_Driver.vcxproj", "{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anit-Cheat_EXE", "Anit-Cheat_EXE\Anit-Cheat_EXE.vcxproj", "{17DDE567-4EAA-4E85-B533-02C4E6451072}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anit-Cheat_DLL", "Anit-Cheat_DLL\Anit-Cheat_DLL.vcxproj", "{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|ARM = Debug|ARM
|
Debug|ARM = Debug|ARM
|
||||||
@@ -41,6 +45,30 @@ Global
|
|||||||
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.ActiveCfg = Release|Win32
|
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Build.0 = Release|Win32
|
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Build.0 = Release|Win32
|
||||||
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Deploy.0 = Release|Win32
|
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Deploy.0 = Release|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|ARM.ActiveCfg = Debug|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|ARM64.ActiveCfg = Debug|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|ARM.ActiveCfg = Release|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|ARM64.ActiveCfg = Release|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x64.Build.0 = Release|x64
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|ARM.ActiveCfg = Debug|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|ARM64.ActiveCfg = Debug|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|ARM.ActiveCfg = Release|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|ARM64.ActiveCfg = Release|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x64.Build.0 = Release|x64
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x86.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform Condition="'$(Platform)' == ''">Win32</Platform>
|
<Platform Condition="'$(Platform)' == ''">Win32</Platform>
|
||||||
<RootNamespace>Anti_Cheat_Driver</RootNamespace>
|
<RootNamespace>Anti_Cheat_Driver</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
@@ -71,7 +72,7 @@
|
|||||||
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||||
<ConfigurationType>Driver</ConfigurationType>
|
<ConfigurationType>Driver</ConfigurationType>
|
||||||
<DriverType>WDM</DriverType>
|
<DriverType>WDM</DriverType>
|
||||||
<Driver_SpectreMitigation>Spectre</Driver_SpectreMitigation>
|
<Driver_SpectreMitigation>false</Driver_SpectreMitigation>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
|
||||||
<TargetVersion>Windows10</TargetVersion>
|
<TargetVersion>Windows10</TargetVersion>
|
||||||
@@ -114,12 +115,18 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
|
<TargetName>$(TargetName.Replace(' ',''))</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
|
||||||
|
<IntDir>$(Platform)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
|
<TargetName>Anti_Cheat_Driver</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
|
||||||
|
<IntDir>$(Platform)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
#include "comm_dispatch.h"
|
#include "comm_dispatch.h"
|
||||||
#include "protect_filter.h"
|
#include "protect_filter.h"
|
||||||
#include "anit_screen_grap.h"
|
#include "anit_screen_grap.h"
|
||||||
|
#include "create_thread_callback.h"
|
||||||
|
#include "mouse_keybord_hook.h"
|
||||||
|
|
||||||
namespace comm_dispatch
|
namespace comm_dispatch
|
||||||
{
|
{
|
||||||
auto dispatch(CMD_COMM* data) -> NTSTATUS
|
auto dispatch(CMD_COMM* data) -> NTSTATUS
|
||||||
{
|
{
|
||||||
auto status = STATUS_UNSUCCESSFUL;
|
auto status = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
switch (data->CommID)
|
switch (data->CommID)
|
||||||
{
|
{
|
||||||
case CMD::DRIVER_COMM_TEST:
|
case CMD::DRIVER_COMM_TEST:
|
||||||
@@ -19,6 +23,12 @@ namespace comm_dispatch
|
|||||||
status = protect_filter::add_protect_list((ULONG)process_data->Pid, NULL, FALSE);
|
status = protect_filter::add_protect_list((ULONG)process_data->Pid, NULL, FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CMD::DRIVER_CANCEL_PROTECT_PROCESS:
|
||||||
|
{
|
||||||
|
auto process_data = (IOCTL_PROCESS*)data->Buf;
|
||||||
|
status = protect_filter::remove_protect_list((ULONG)process_data->Pid, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CMD::ADD_WHITE_PROCESS:
|
case CMD::ADD_WHITE_PROCESS:
|
||||||
{
|
{
|
||||||
auto process_data = (IOCTL_PROCESS*)data->Buf;
|
auto process_data = (IOCTL_PROCESS*)data->Buf;
|
||||||
@@ -34,6 +44,42 @@ namespace comm_dispatch
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CMD::USER_EVENT_HANDLE:
|
||||||
|
{
|
||||||
|
auto user_handle = (HANDLE*)data->Buf;
|
||||||
|
|
||||||
|
status = ObReferenceObjectByHandle(
|
||||||
|
*user_handle,
|
||||||
|
EVENT_MODIFY_STATE,
|
||||||
|
*ExEventObjectType,
|
||||||
|
UserMode,
|
||||||
|
(PVOID*)&thread_notify_routine::g_UserEvent,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
|
||||||
|
DbgPrintEx(77, 0, "ObReferenceObjectByHandle[status]:%x\n", status);
|
||||||
|
DbgPrintEx(77, 0, "g_UserEvent:%p\n", thread_notify_routine::g_UserEvent);
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CMD::PROTECT_THREAD_CONTRL:
|
||||||
|
{
|
||||||
|
auto process_data = (IOCTL_PROCESS*)data->Buf;
|
||||||
|
thread_notify_routine::g_thread_protect = process_data->is_no_create_remote_thread;
|
||||||
|
status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CMD::INSTALL_MOUSE_KEYBOARD:
|
||||||
|
{
|
||||||
|
status = mouse_keybord_hook::install_mouse_keybord_hook();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CMD::UNLOAD_MOUSE_KEYBOARD:
|
||||||
|
{
|
||||||
|
status = mouse_keybord_hook::remove_mouse_keybord_hook();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ struct CMD_COMM
|
|||||||
struct IOCTL_PROCESS
|
struct IOCTL_PROCESS
|
||||||
{
|
{
|
||||||
DWORD64 Pid;
|
DWORD64 Pid;
|
||||||
|
BOOL is_no_create_remote_thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IOCTL_WINDOW
|
struct IOCTL_WINDOW
|
||||||
@@ -23,8 +24,13 @@ enum CMD
|
|||||||
MSG_BASE = 0x10000,
|
MSG_BASE = 0x10000,
|
||||||
DRIVER_COMM_TEST,
|
DRIVER_COMM_TEST,
|
||||||
DRIVER_PROTECT_PROCESS,
|
DRIVER_PROTECT_PROCESS,
|
||||||
|
DRIVER_CANCEL_PROTECT_PROCESS,
|
||||||
ADD_WHITE_PROCESS,
|
ADD_WHITE_PROCESS,
|
||||||
WINDOW_ANIT_SCREEN,
|
WINDOW_ANIT_SCREEN,
|
||||||
|
USER_EVENT_HANDLE,
|
||||||
|
PROTECT_THREAD_CONTRL,
|
||||||
|
INSTALL_MOUSE_KEYBOARD,
|
||||||
|
UNLOAD_MOUSE_KEYBOARD,
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace comm_dispatch
|
namespace comm_dispatch
|
||||||
|
|||||||
@@ -15,9 +15,10 @@ EXTERN_C NTKERNELAPI NTSTATUS ZwOpenThread(
|
|||||||
_In_ PCLIENT_ID ClientId
|
_In_ PCLIENT_ID ClientId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
namespace thread_notify_routine
|
namespace thread_notify_routine
|
||||||
{
|
{
|
||||||
|
PKEVENT g_UserEvent = NULL; // 用户态传入的事件对象
|
||||||
|
BOOL g_thread_protect;
|
||||||
|
|
||||||
// ´ò¿ªÏ߳̾ä±ú²¢ÖÕÖ¹
|
// ´ò¿ªÏ߳̾ä±ú²¢ÖÕÖ¹
|
||||||
NTSTATUS TerminateThreadByHandle(
|
NTSTATUS TerminateThreadByHandle(
|
||||||
@@ -69,7 +70,6 @@ namespace thread_notify_routine
|
|||||||
{
|
{
|
||||||
if (Create)
|
if (Create)
|
||||||
{
|
{
|
||||||
|
|
||||||
PEPROCESS process{ 0 };
|
PEPROCESS process{ 0 };
|
||||||
auto status = PsLookupProcessByProcessId(ProcessId, &process);
|
auto status = PsLookupProcessByProcessId(ProcessId, &process);
|
||||||
if (!NT_SUCCESS(status))
|
if (!NT_SUCCESS(status))
|
||||||
@@ -80,7 +80,7 @@ namespace thread_notify_routine
|
|||||||
if (!NT_SUCCESS(status))
|
if (!NT_SUCCESS(status))
|
||||||
goto end;*/
|
goto end;*/
|
||||||
|
|
||||||
if(!protect_filter::is_protect_pid(0, process))
|
if (!protect_filter::is_protect_pid(HandleToLong(ProcessId)))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/*if (protect_process != process)
|
/*if (protect_process != process)
|
||||||
@@ -94,17 +94,19 @@ namespace thread_notify_routine
|
|||||||
{
|
{
|
||||||
//DbgBreakPoint();
|
//DbgBreakPoint();
|
||||||
|
|
||||||
DbgPrintEx(77, 0, "[!] 恶意远程线程检测!\n");
|
//DbgPrintEx(77, 0, "[!] 恶意远程线程检测!\n");
|
||||||
|
//
|
||||||
DbgPrintEx(77, 0, "[!] 目标进程ID: %d\n", ProcessId);
|
//DbgPrintEx(77, 0, "[!] 目标进程ID: %d\n", ProcessId);
|
||||||
|
//
|
||||||
DbgPrintEx(77, 0, "[!] 创建者进程ID: %d\n", cutor_process_id);
|
//DbgPrintEx(77, 0, "[!] 创建者进程ID: %d\n", cutor_process_id);
|
||||||
|
//
|
||||||
DbgPrintEx(77, 0, "[!] 被创建线程ID: %d\n", ThreadId);
|
//DbgPrintEx(77, 0, "[!] 被创建线程ID: %d\n", ThreadId);
|
||||||
|
|
||||||
|
|
||||||
|
if (g_thread_protect)
|
||||||
|
{
|
||||||
TerminateThreadByHandle(ProcessId, ThreadId);
|
TerminateThreadByHandle(ProcessId, ThreadId);
|
||||||
|
}
|
||||||
|
//KeSetEvent(g_UserEvent, IO_NO_INCREMENT, FALSE);
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
ObDereferenceObject(process);
|
ObDereferenceObject(process);
|
||||||
|
|||||||
@@ -3,9 +3,13 @@
|
|||||||
|
|
||||||
namespace thread_notify_routine
|
namespace thread_notify_routine
|
||||||
{
|
{
|
||||||
|
extern BOOL g_thread_protect;
|
||||||
|
|
||||||
|
extern PKEVENT g_UserEvent;
|
||||||
|
|
||||||
auto create_thread_routine()->NTSTATUS;
|
auto create_thread_routine()->NTSTATUS;
|
||||||
|
|
||||||
auto unload_thread_routine()->NTSTATUS;
|
auto unload_thread_routine()->NTSTATUS;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -20,8 +20,6 @@ EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT drv_obj, PUNICODE_STRING)
|
|||||||
process_notify_callback::remov_process_notify();
|
process_notify_callback::remov_process_notify();
|
||||||
thread_notify_routine::unload_thread_routine();
|
thread_notify_routine::unload_thread_routine();
|
||||||
|
|
||||||
mouse_keybord_hook::remove_mouse_keybord_hook();
|
|
||||||
|
|
||||||
//load_image_notify_routine::remove_image_load_notify_routine();
|
//load_image_notify_routine::remove_image_load_notify_routine();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -30,15 +28,16 @@ EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT drv_obj, PUNICODE_STRING)
|
|||||||
kernel_api::kernel_api_init();
|
kernel_api::kernel_api_init();
|
||||||
kernel_comm_create::Init();
|
kernel_comm_create::Init();
|
||||||
|
|
||||||
protect_filter::add_protect_list(3632, 0, FALSE);
|
//把保护的进程插入到链表中
|
||||||
|
//protect_filter::add_protect_list(12204, 0, FALSE);
|
||||||
|
|
||||||
|
//mouse_keybord_hook::install_mouse_keybord_hook();
|
||||||
mouse_keybord_hook::install_mouse_keybord_hook();
|
DbgPrintEx(77, 0, "[+]ob_reg_callback status:%x\n", ob_call_back::register_ob_reg_callback());
|
||||||
//DbgPrintEx(77, 0, "[+]ob_reg_callback status:%x\n", ob_call_back::register_ob_reg_callback());
|
|
||||||
DbgPrintEx(77, 0, "[+]process_notify_callback status:%x\n", process_notify_callback::install_process_notify());
|
DbgPrintEx(77, 0, "[+]process_notify_callback status:%x\n", process_notify_callback::install_process_notify());
|
||||||
DbgPrintEx(77, 0, "[+]create_thread_routine status:%x\n", thread_notify_routine::create_thread_routine());
|
DbgPrintEx(77, 0, "[+]create_thread_routine status:%x\n", thread_notify_routine::create_thread_routine());
|
||||||
|
|
||||||
//load_image_notify_routine::create_image_load_notify_routine();
|
|
||||||
|
|
||||||
|
//我过滤了那个任务管理器 所以看不了结束进程效果 直接看能不能读搜索就行了 没有图标吧
|
||||||
|
//也搜索不了 我这个就是内存加载 也不会蓝屏啊
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -25,6 +25,9 @@ namespace kernel_api
|
|||||||
|
|
||||||
RtlInitUnicodeString(&unFuncName, L"ZwOpenThread");
|
RtlInitUnicodeString(&unFuncName, L"ZwOpenThread");
|
||||||
imported.nt_open_thread = (ULONG64)MmGetSystemRoutineAddress(&unFuncName);
|
imported.nt_open_thread = (ULONG64)MmGetSystemRoutineAddress(&unFuncName);
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&unFuncName, L"ObOpenObjectByName");
|
||||||
|
imported.ob_open_object_by_name = (ULONG64)MmGetSystemRoutineAddress(&unFuncName);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS ntquerysysteminformation(ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength)
|
NTSTATUS ntquerysysteminformation(ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength)
|
||||||
@@ -60,5 +63,10 @@ namespace kernel_api
|
|||||||
return reinterpret_cast<NTSTATUS(*)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID)>(imported.nt_open_thread)
|
return reinterpret_cast<NTSTATUS(*)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID)>(imported.nt_open_thread)
|
||||||
(ThreadHandle, DesiredAccess, ObjectAttributes, ClientId);
|
(ThreadHandle, DesiredAccess, ObjectAttributes, ClientId);
|
||||||
}
|
}
|
||||||
|
NTSTATUS obopenobjectbyname(POBJECT_ATTRIBUTES ObjectAttributes, POBJECT_TYPE ObjectType, KPROCESSOR_MODE AccessMode, PACCESS_STATE AccessState, ACCESS_MASK DesiredAccess, PVOID ParseContext, PHANDLE Handle)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<NTSTATUS(*)(POBJECT_ATTRIBUTES, POBJECT_TYPE, KPROCESSOR_MODE, PACCESS_STATE, ACCESS_MASK, PVOID, PHANDLE)>
|
||||||
|
(imported.ob_open_object_by_name)(ObjectAttributes, ObjectType, AccessMode, AccessState, DesiredAccess, ParseContext, Handle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,6 +20,7 @@ struct imported_
|
|||||||
ULONG64 ps_getprocess_id;
|
ULONG64 ps_getprocess_id;
|
||||||
ULONG64 se_locateprocess_imagename;
|
ULONG64 se_locateprocess_imagename;
|
||||||
ULONG64 nt_open_thread;
|
ULONG64 nt_open_thread;
|
||||||
|
ULONG64 ob_open_object_by_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace kernel_api
|
namespace kernel_api
|
||||||
@@ -42,4 +43,14 @@ namespace kernel_api
|
|||||||
PVOID rtlfindexportedroutinebyname(PVOID ImageBase, PCCH RoutineName);
|
PVOID rtlfindexportedroutinebyname(PVOID ImageBase, PCCH RoutineName);
|
||||||
|
|
||||||
NTSTATUS ntopenthread(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId);
|
NTSTATUS ntopenthread(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId);
|
||||||
|
|
||||||
|
NTSTATUS obopenobjectbyname(
|
||||||
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
|
POBJECT_TYPE ObjectType,
|
||||||
|
KPROCESSOR_MODE AccessMode,
|
||||||
|
PACCESS_STATE AccessState,
|
||||||
|
ACCESS_MASK DesiredAccess,
|
||||||
|
PVOID ParseContext,
|
||||||
|
PHANDLE Handle
|
||||||
|
);
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@ namespace mouse_key_win10
|
|||||||
__int64 __fastcall hkNtUserSendInput(unsigned int a1, volatile void* a2, int a3, int a4)
|
__int64 __fastcall hkNtUserSendInput(unsigned int a1, volatile void* a2, int a3, int a4)
|
||||||
{
|
{
|
||||||
auto pid = PsGetCurrentProcessId();
|
auto pid = PsGetCurrentProcessId();
|
||||||
if (protect_filter::is_white_pid(HandleToLong(pid), NULL))
|
if (protect_filter::is_white_pid(HandleToLong(pid)))
|
||||||
return origon_NtUserSendInput_win10(a1, a2, a3, a4);
|
return origon_NtUserSendInput_win10(a1, a2, a3, a4);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace mouse_key_win7
|
|||||||
{
|
{
|
||||||
auto pid = PsGetCurrentProcessId();
|
auto pid = PsGetCurrentProcessId();
|
||||||
|
|
||||||
if(protect_filter::is_white_pid(HandleToLong(pid), NULL))
|
if(protect_filter::is_white_pid(HandleToLong(pid)))
|
||||||
return origon_NtUserSendInput_win7(a1, a2, a3);
|
return origon_NtUserSendInput_win7(a1, a2, a3);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -52,13 +52,21 @@ namespace mouse_keybord_hook
|
|||||||
|
|
||||||
auto install_mouse_keybord_hook() -> BOOL
|
auto install_mouse_keybord_hook() -> BOOL
|
||||||
{
|
{
|
||||||
auto _eprocess_process = kernel_function::FindProcess("winlogon.exe");
|
//auto _eprocess_process = kernel_function::FindProcess("winlogon.exe");
|
||||||
if (!_eprocess_process)
|
//if (!_eprocess_process)
|
||||||
return FALSE;
|
// return FALSE;
|
||||||
|
//
|
||||||
auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process);
|
//auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process);
|
||||||
|
|
||||||
|
if (!_ntSendInput)
|
||||||
|
{
|
||||||
_ntSendInput = get_sendinput_hook_addr();
|
_ntSendInput = get_sendinput_hook_addr();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_ntSendInput[0] == 0xff || _ntSendInput[1] == 0x25)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
auto os = utils::GetVersion();
|
auto os = utils::GetVersion();
|
||||||
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
|
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
|
||||||
@@ -70,8 +78,8 @@ namespace mouse_keybord_hook
|
|||||||
inline_hooks_manager::fn_get_instance()->inline_install_hook(_ntSendInput, mouse_key_win10::hkNtUserSendInput, (void**)&origon_NtUserSendInput_win10);
|
inline_hooks_manager::fn_get_instance()->inline_install_hook(_ntSendInput, mouse_key_win10::hkNtUserSendInput, (void**)&origon_NtUserSendInput_win10);
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel_function::ke_unstack_detach_process(apc_state);
|
//kernel_function::ke_unstack_detach_process(apc_state);
|
||||||
ObDereferenceObject(_eprocess_process);
|
//ObDereferenceObject(_eprocess_process);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,11 +91,11 @@ namespace mouse_keybord_hook
|
|||||||
|
|
||||||
auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process);
|
auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process);
|
||||||
|
|
||||||
inline_hooks_manager::fn_get_instance()->inline_remov_hook((void**)_ntSendInput);
|
auto status = inline_hooks_manager::fn_get_instance()->inline_remov_hook((void**)_ntSendInput);
|
||||||
|
|
||||||
kernel_function::ke_unstack_detach_process(apc_state);
|
kernel_function::ke_unstack_detach_process(apc_state);
|
||||||
ObDereferenceObject(_eprocess_process);
|
ObDereferenceObject(_eprocess_process);
|
||||||
return 0;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@ auto ob_call_back::register_ob_reg_callback() -> NTSTATUS
|
|||||||
if(is_allow_process(image_file_name))
|
if(is_allow_process(image_file_name))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
if (protect_filter::is_protect_pid(HandleToLong(dwPid), nullptr))
|
if (protect_filter::is_protect_pid(HandleToLong(dwPid)))
|
||||||
{
|
{
|
||||||
pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess = 0;
|
pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess = 0;
|
||||||
pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess = 0;
|
pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess = 0;
|
||||||
|
|||||||
@@ -15,15 +15,17 @@ namespace process_notify_callback
|
|||||||
{
|
{
|
||||||
|
|
||||||
//进程退出时进行 对插链的清理操作
|
//进程退出时进行 对插链的清理操作
|
||||||
if (protect_filter::is_protect_pid(HandleToLong(ProcessId), nullptr))
|
if (protect_filter::is_protect_pid(HandleToLong(ProcessId))) {
|
||||||
protect_filter::remove_protect_list(g_protect_list, HandleToLong(ProcessId), nullptr);
|
|
||||||
|
|
||||||
if (protect_filter::is_white_pid(HandleToLong(ProcessId), nullptr))
|
//DbgPrintEx(77, 0, "%p\n", ProcessId);
|
||||||
{
|
|
||||||
|
protect_filter::remove_protect_list(HandleToLong(ProcessId), nullptr);
|
||||||
|
|
||||||
DbgBreakPoint();
|
|
||||||
protect_filter::remove_protect_list(g_white_list, HandleToLong(ProcessId), nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (protect_filter::is_white_pid(HandleToLong(ProcessId)))
|
||||||
|
protect_filter::remove_white_list( HandleToLong(ProcessId), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*DbgPrintEx(77, 0, "ParentId:%d | ProcessId:%d | Create:%d\n",
|
/*DbgPrintEx(77, 0, "ParentId:%d | ProcessId:%d | Create:%d\n",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "protect_filter.h"
|
#include "protect_filter.h"
|
||||||
|
|
||||||
LIST_ENTRY g_protect_list;
|
LIST_ENTRY g_protect_list = { 0 };
|
||||||
LIST_ENTRY g_white_list;
|
LIST_ENTRY g_white_list = { 0 };
|
||||||
|
|
||||||
namespace protect_filter
|
namespace protect_filter
|
||||||
{
|
{
|
||||||
@@ -13,6 +13,12 @@ namespace protect_filter
|
|||||||
|
|
||||||
auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL
|
auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL
|
||||||
{
|
{
|
||||||
|
PEPROCESS process{ 0 };
|
||||||
|
if (!NT_SUCCESS(PsLookupProcessByProcessId(UlongToHandle(Pid), &process)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
ObDereferenceObject(process);
|
||||||
|
|
||||||
auto PFilter = reinterpret_cast<PFILTER>(ExAllocatePoolWithTag(PagedPool, sizeof(FILTER), 'wag'));
|
auto PFilter = reinterpret_cast<PFILTER>(ExAllocatePoolWithTag(PagedPool, sizeof(FILTER), 'wag'));
|
||||||
if (!PFilter)
|
if (!PFilter)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -21,12 +27,7 @@ namespace protect_filter
|
|||||||
|
|
||||||
if (Pid)
|
if (Pid)
|
||||||
{
|
{
|
||||||
PEPROCESS eprocess{ 0 };
|
|
||||||
if (!NT_SUCCESS(PsLookupProcessByProcessId(ULongToHandle(Pid), &eprocess)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
PFilter->Pid = Pid;
|
PFilter->Pid = Pid;
|
||||||
PFilter->Eprocess = eprocess;
|
|
||||||
}
|
}
|
||||||
if (hwnd)
|
if (hwnd)
|
||||||
{
|
{
|
||||||
@@ -40,7 +41,7 @@ namespace protect_filter
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto is_protect_pid(ULONG Pid, PEPROCESS Eprocess)->BOOL
|
auto is_protect_pid(ULONG Pid)->BOOL
|
||||||
{
|
{
|
||||||
if (IsListEmpty(&g_protect_list))
|
if (IsListEmpty(&g_protect_list))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -51,22 +52,20 @@ namespace protect_filter
|
|||||||
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
|
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
|
||||||
list_head = list_head->Flink;
|
list_head = list_head->Flink;
|
||||||
|
|
||||||
|
if (MmIsAddressValid(list_data))
|
||||||
|
{
|
||||||
if (Pid)
|
if (Pid)
|
||||||
{
|
{
|
||||||
if (list_data->Pid == Pid)
|
if (list_data->Pid == Pid)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (Eprocess)
|
|
||||||
{
|
|
||||||
if (list_data->Eprocess == Eprocess)
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto is_white_pid(ULONG Pid, PEPROCESS Eprocess)->BOOL
|
auto is_white_pid(ULONG Pid)->BOOL
|
||||||
{
|
{
|
||||||
if (IsListEmpty(&g_white_list))
|
if (IsListEmpty(&g_white_list))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -82,35 +81,73 @@ namespace protect_filter
|
|||||||
if (list_data->Pid == Pid)
|
if (list_data->Pid == Pid)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (Eprocess)
|
|
||||||
{
|
|
||||||
if (list_data->Eprocess == Eprocess)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto remove_protect_list(LIST_ENTRY list_entry, ULONG Pid, HWND hwnd)->BOOL
|
auto remove_protect_list(ULONG Pid, HWND hwnd)->BOOL
|
||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(hwnd);
|
UNREFERENCED_PARAMETER(hwnd);
|
||||||
|
|
||||||
BOOL is_remove_list = FALSE;
|
BOOL is_remove_list = FALSE;
|
||||||
|
|
||||||
if (IsListEmpty(&list_entry))
|
//auto List_Entry = list_entry;
|
||||||
|
|
||||||
|
if (IsListEmpty(&g_protect_list))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
auto list_head = list_entry.Flink;
|
auto list_head = g_protect_list.Flink;
|
||||||
while (list_head != &list_entry)
|
while (list_head != &g_protect_list)
|
||||||
{
|
{
|
||||||
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
|
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
|
||||||
|
|
||||||
list_head = list_head->Flink;
|
list_head = list_head->Flink;
|
||||||
|
|
||||||
|
|
||||||
|
//DbgPrintEx(77, 0, "[+]list_head:%p | list_entry:%p\n", list_head, list_head);
|
||||||
|
|
||||||
if (list_data->Pid == Pid)
|
if (list_data->Pid == Pid)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//DbgPrintEx(77, 0, "[+]%d\n", list_data->Pid);
|
||||||
|
RemoveEntryList(list_head->Blink);
|
||||||
|
is_remove_list = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_remove_list)
|
||||||
|
{
|
||||||
|
ExFreePoolWithTag(list_data, 'wag');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
auto remove_white_list(ULONG Pid, HWND hwnd)->BOOL
|
||||||
|
{
|
||||||
|
UNREFERENCED_PARAMETER(hwnd);
|
||||||
|
BOOL is_remove_list = FALSE;
|
||||||
|
|
||||||
|
//auto List_Entry = list_entry;
|
||||||
|
|
||||||
|
if (IsListEmpty(&g_white_list))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
auto list_head = g_white_list.Flink;
|
||||||
|
while (list_head != &g_white_list)
|
||||||
|
{
|
||||||
|
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
|
||||||
|
|
||||||
|
list_head = list_head->Flink;
|
||||||
|
|
||||||
|
|
||||||
|
//DbgPrintEx(77, 0, "[+]list_head:%p | list_entry:%p\n", list_head, list_head);
|
||||||
|
|
||||||
|
if (list_data->Pid == Pid)
|
||||||
|
{
|
||||||
|
|
||||||
|
//DbgPrintEx(77, 0, "[+]%d\n", list_data->Pid);
|
||||||
RemoveEntryList(list_head->Blink);
|
RemoveEntryList(list_head->Blink);
|
||||||
is_remove_list = TRUE;
|
is_remove_list = TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
typedef struct _FILTER
|
typedef struct _FILTER
|
||||||
{
|
{
|
||||||
LIST_ENTRY List;
|
LIST_ENTRY List;
|
||||||
PEPROCESS Eprocess;
|
//PEPROCESS Eprocess;
|
||||||
ULONG Pid;
|
ULONG Pid;
|
||||||
HWND hWnd;
|
HWND hWnd;
|
||||||
}FILTER,*PFILTER;
|
}FILTER,*PFILTER;
|
||||||
@@ -18,9 +18,11 @@ namespace protect_filter
|
|||||||
|
|
||||||
auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL;
|
auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL;
|
||||||
|
|
||||||
auto is_protect_pid(ULONG Pid, PEPROCESS Eprocess) -> BOOL;
|
auto is_protect_pid(ULONG Pid) -> BOOL;
|
||||||
|
|
||||||
auto is_white_pid(ULONG Pid, PEPROCESS Eprocess)->BOOL;
|
auto is_white_pid(ULONG Pid)->BOOL;
|
||||||
|
|
||||||
auto remove_protect_list(LIST_ENTRY list_entry, ULONG Pid, HWND hwnd)->BOOL;
|
auto remove_protect_list(ULONG Pid, HWND hwnd)->BOOL;
|
||||||
|
|
||||||
|
auto remove_white_list(ULONG Pid, HWND hwnd)->BOOL;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user