
Générateur de source pour ajouter les méthodes D/Invoke et les syscalls indirects à un projet C#.
Générateur de source pour ajouter des méthodes D/Invoke et d'appels système indirects à un projet C#.
Ajoutez le dernier package NuGet à votre projet et autorisez le code non sécurisé.
<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>
Créez un fichier nommé CsWhispers.txt dans votre projet et définissez ses propriétés d'action de build sur AdditionalFiles.
<ItemGroup>
<None Remove="CsWhispers.txt" />
<AdditionalFiles Include="CsWhispers.txt" />
</ItemGroup>
Ajoutez chaque API NT et toute structure/énumération associée que vous souhaitez inclure dans votre projet. Chacune doit être sur sa propre ligne, par exemple :
NtOpenProcess
HANDLE
NTSTATUS
CLIENT_ID
UNICODE_STRING
OBJECT_ATTRIBUTES
PWSTR
PCWSTR
Consultez le wiki du projet pour une liste complète des API prises en charge.
Les espaces de noms globaux sont automatiquement ajoutés pour permettre un code propre.
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 inclut une version minimaliste de D/Invoke, vous pouvez donc également appeler Generic.GetLibraryAddress, Generic.DynamicFunctionInvoke, etc.
Tout le code généré va dans une classe partielle CsWhispers.Syscalls, que vous pouvez étendre pour ajouter vos propres API. Par exemple, créez MyAPIs.cs et ajoutez :
namespace CsWhispers;
public static partial class Syscalls
{
public static NTSTATUS NtCreateThreadEx()
{
// whatever
return new NTSTATUS(0);
}
}
Cela peut ensuite être appelé dans votre code principal sans avoir à ajouter de directives using supplémentaires.
namespace ConsoleApp1;
internal static class Program
{
public static void Main()
{
var status = NtCreateThreadEx();
}
}
CsWhispers.txt.Ce projet s'est inspiré des versions précédentes de SysWhispers et SharpWhispers en particulier. Donc chapeau à @Jackson_T, @KlezVirus, @d_glenx, et à tous ceux qui ont contribué du code et/ou des idées.