
C# プロジェクトに D/Invoke と間接システムコールメソッドを追加するためのソースジェネレーター。
C# プロジェクトに D/Invoke と間接システムコールのメソッドを追加するソース ジェネレーター。
最新の NuGet パッケージをプロジェクトに追加し、unsafe コードを許可します。
<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>
プロジェクト内に CsWhispers.txt というファイルを作成し、そのビルドアクションのプロパティを AdditionalFiles に設定します。
<ItemGroup>
<None Remove="CsWhispers.txt" />
<AdditionalFiles Include="CsWhispers.txt" />
</ItemGroup>
プロジェクトに含めたい各 NT API と、それを補完する構造体/列挙型を追加します。それぞれを 1 行ずつ記述する必要があります。例:
NtOpenProcess
HANDLE
NTSTATUS
CLIENT_ID
UNICODE_STRING
OBJECT_ATTRIBUTES
PWSTR
PCWSTR
サポートされている API の完全な一覧については、プロジェクト Wiki を参照してください。
クリーンなコードを実現するため、グローバル名前空間が自動的に追加されます。
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 には D/Invoke の最小化バージョンが含まれているため、Generic.GetLibraryAddress や Generic.DynamicFunctionInvoke などを呼び出すこともできます。
生成されたコードはすべて部分的な CsWhispers.Syscalls クラスに格納され、独自の API を追加するために拡張できます。たとえば、MyAPIs.cs を作成して次のように追加します。
namespace CsWhispers;
public static partial class Syscalls
{
public static NTSTATUS NtCreateThreadEx()
{
// whatever
return new NTSTATUS(0);
}
}
これにより、追加の using ステートメントを記述しなくても、メイン コードから呼び出すことができます。
namespace ConsoleApp1;
internal static class Program
{
public static void Main()
{
var status = NtCreateThreadEx();
}
}
CsWhispers.txt で宣言しなくても API の構造体/列挙型を暗黙的に追加する。このプロジェクトは、特に SysWhipsers と SharpWhispers の以前のバージョンに触発されています。@Jackson_T、@KlezVirus、@d_glenx、そしてコードやアイデアを提供してくれたすべての人々に敬意を表します。