CsWhispers是一款针对C#编程项目的源代码生成工具,该工具基于C#开发,并且完全开源,可以帮助广大研究人员向已有的C#项目添加D/Invoke和间接系统调用方法源码。
C#项目
NuGet包
Visual Studio
NtAllocateVirtualMemory
NtClose
NtCreateSection
NtCreateThreadEx
NtFreeVirtualMemory
NtMapViewOfSection
NtOpenFile
NtOpenProcess
NtProtectVirtualMemory
NtQueryVirtualMemory
NtReadVirtualMemory
NtUnmapViewOfSection
NtWriteVirtualMemory
广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone https://github.com/rasta-mouse/CsWhispers.git
接下来,打开Visual Studio并导入项目,根据代码架构构建解决方案即可。
工具使用 首先,我们需要将最新版本的NuGet包添加到你的项目中,并允许不安全的代码:
<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
全局命名空间将会自动添加到进代码项目中以实现代码清理:
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());
}
D/Invoke
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);
}
}
接下来,我们就可以在主代码中调用这个类,并且无需添加任何额外的声明或语句:
namespace ConsoleApp1;
internal static class Program
{
public static void Main()
{
var status = NtCreateThreadEx();
}
}
许可证协议 本项目的开发与发布遵循MIT开源许可证协议。
项目地址 CsWhispers:
https://github.com/rasta-mouse/CsWhispers/
【 原文始发于微信公众号(FreeBuf):如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论