
Source Generator zum Hinzufügen von D/Invoke- und indirekten Syscall-Methoden zu einem C#-Projekt.
Source-Generator zum Hinzufügen von D/Invoke- und indirekten Syscall-Methoden zu einem C#-Projekt.
Fügen Sie Ihrem Projekt das neueste NuGet-Paket hinzu und lassen Sie unsicheren Code zu.
<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>
Erstellen Sie in Ihrem Projekt eine Datei namens CsWhispers.txt und setzen Sie die Buildaktion-Eigenschaft auf AdditionalFiles.
<ItemGroup>
<None Remove="CsWhispers.txt" />
<AdditionalFiles Include="CsWhispers.txt" />
</ItemGroup>
Fügen Sie jede NT-API und alle unterstützenden Strukturen/Aufzählungen hinzu, die Sie in Ihr Projekt aufnehmen möchten. Jede muss in einer eigenen Zeile stehen, zum Beispiel:
NtOpenProcess
HANDLE
NTSTATUS
CLIENT_ID
UNICODE_STRING
OBJECT_ATTRIBUTES
PWSTR
PCWSTR
Die vollständige Liste der unterstützten APIs finden Sie im Projekt-Wiki.
Globale Namespaces werden automatisch hinzugefügt, um sauberen Code zu ermöglichen.
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 enthält eine minimierte Version von D/Invoke, sodass Sie auch Generic.GetLibraryAddress, Generic.DynamicFunctionInvoke usw. aufrufen können.
Der gesamte generierte Code wird in einer partiellen Klasse CsWhispers.Syscalls gesammelt, die Sie erweitern können, um Ihre eigenen APIs hinzuzufügen. Erstellen Sie beispielsweise MyAPIs.cs und fügen Sie Folgendes hinzu:
namespace CsWhispers;
public static partial class Syscalls
{
public static NTSTATUS NtCreateThreadEx()
{
// whatever
return new NTSTATUS(0);
}
}
Dies kann dann in Ihrem Hauptcode aufgerufen werden, ohne zusätzliche using-Anweisungen hinzufügen zu müssen.
namespace ConsoleApp1;
internal static class Program
{
public static void Main()
{
var status = NtCreateThreadEx();
}
}
CsWhispers.txt deklarieren zu müssen.Dieses Projekt wurde von den früheren Versionen von SysWhipsers und insbesondere SharpWhispers inspiriert. Daher: Hut ab an @Jackson_T, @KlezVirus, @d_glenx und alle anderen, die Code und/oder Ideen beigetragen haben.