如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法

admin 2024年4月20日01:13:10评论2 views字数 2398阅读7分59秒阅读模式
如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法
关于CsWhispers

CsWhispers是一款针对C#编程项目的源代码生成工具,该工具基于C#开发,并且完全开源,可以帮助广大研究人员向已有的C#项目添加D/Invoke和间接系统调用方法源码。

如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法
工具要求

C#项目

NuGet包

Visual Studio

支持的API

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和结构体/枚举类型添加进来,其中的每一项必须单独作为一行写入:

NtOpenProcessHANDLENTSTATUSCLIENT_IDUNICODE_STRINGOBJECT_ATTRIBUTESPWSTRPCWSTR

全局命名空间将会自动添加到进代码项目中以实现代码清理:

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和间接系统调用方法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月20日01:13:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法https://cn-sec.com/archives/2632865.html

发表评论

匿名网友 填写信息