
C# 프로젝트에 D/Invoke 및 간접 syscall 메서드를 추가하는 소스 생성기.
C# 프로젝트에 D/Invoke 및 간접 syscall 메서드를 추가하는 소스 생성기입니다.
최신 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 및 지원 구조체/열거형을 추가하세요. 각 항목은 한 줄에 하나씩이어야 합니다. 예를 들면:
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 등을 호출할 수도 있습니다.
생성된 모든 코드는 partial 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, 그리고 코드와 아이디어를 기여한 모든 분들께 감사를 표합니다.