
Generador de código fuente para añadir métodos D/Invoke y syscalls indirectas a un proyecto de C#.
Generador de código fuente para añadir métodos D/Invoke y syscalls indirectas a un proyecto C#.
Añade el paquete NuGet más reciente a tu proyecto y habilita el código no seguro.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net481</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
</PropertyGroup>
<!-- CsWhispers package -->
<ItemGroup>
<PackageReference Include="CsWhispers" Version="0.0.3" />
</ItemGroup>
<!-- Allow unsafe code -->
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>
Crea un archivo en tu proyecto llamado CsWhispers.txt y establece sus propiedades de acción de compilación en AdditionalFiles.
<ItemGroup>
<None Remove="CsWhispers.txt" />
<AdditionalFiles Include="CsWhispers.txt" />
</ItemGroup>
Añade cada API NT y cualquier estructura/enumeración de soporte que quieras incluir en tu proyecto. Cada una debe estar en su propia línea, por ejemplo:
NtOpenProcess
HANDLE
NTSTATUS
CLIENT_ID
UNICODE_STRING
OBJECT_ATTRIBUTES
PWSTR
PCWSTR
Consulta la Wiki del proyecto para obtener una lista completa de las API admitidas.
Los espacios de nombres globales se añaden automáticamente para permitir un código limpio.
public static unsafe void Main()
{
// use self as example
using var self = Process.GetCurrentProcess();
HANDLE hProcess;
OBJECT_ATTRIBUTES oa;
CLIENT_ID cid = new()
{
UniqueProcess = new HANDLE((IntPtr)self.Id)
};
var status = NtOpenProcess(
&hProcess,
PROCESS_ALL_ACCESS,
&oa,
&cid);
Console.WriteLine("Status: {0}", status.SeverityCode);
Console.WriteLine("HANDLE: 0x{0:X}", hProcess.Value.ToInt64());
}
CsWhispers incluye una versión reducida de D/Invoke, por lo que también puedes invocar Generic.GetLibraryAddress, Generic.DynamicFunctionInvoke, etc.
Todo el código generado se coloca en una clase parcial CsWhispers.Syscalls, que puedes extender para añadir tus propias API. Por ejemplo, crea MyAPIs.cs y añade:
namespace CsWhispers;
public static partial class Syscalls
{
public static NTSTATUS NtCreateThreadEx()
{
// whatever
return new NTSTATUS(0);
}
}
Luego puedes llamarlo desde tu código principal sin tener que añadir directivas using adicionales.
namespace ConsoleApp1;
internal static class Program
{
public static void Main()
{
var status = NtCreateThreadEx();
}
}
CsWhispers.txt.Este proyecto se inspiró en las versiones anteriores de SysWhipsers y SharpWhispers en particular. Así que nos quitamos el sombrero ante @Jackson_T, @KlezVirus, @d_glenx, y todos los demás que han contribuido con código y/o ideas.