前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法

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

作者头像
FB客服
发布2024-04-15 14:34:18
800
发布2024-04-15 14:34:18
举报
文章被收录于专栏:FreeBufFreeBuf
关于CsWhispers

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

工具要求

C#项目 NuGet包 Visual Studio

支持的API

NtAllocateVirtualMemory NtClose NtCreateSection NtCreateThreadEx NtFreeVirtualMemory NtMapViewOfSection NtOpenFile NtOpenProcess NtProtectVirtualMemory NtQueryVirtualMemory NtReadVirtualMemory NtUnmapViewOfSection NtWriteVirtualMemory

工具下载

广大研究人员可以直接使用下列命令将该项目源码克隆至本地:

代码语言:javascript
复制
git clone https://github.com/rasta-mouse/CsWhispers.git

接下来,打开Visual Studio并导入项目,根据代码架构构建解决方案即可。

工具使用

首先,我们需要将最新版本的NuGet包添加到你的项目中,并允许不安全的代码:

代码语言:javascript
复制
<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”:

代码语言:javascript
复制
<ItemGroup>

  <None Remove="CsWhispers.txt" />

  <AdditionalFiles Include="CsWhispers.txt" />

</ItemGroup>

接下来,将任何你想要引入你项目中的NT API和结构体/枚举类型添加进来,其中的每一项必须单独作为一行写入:

代码语言:javascript
复制
NtOpenProcess

 

HANDLE

NTSTATUS

CLIENT_ID

UNICODE_STRING

OBJECT_ATTRIBUTES

 

PWSTR

PCWSTR

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

代码语言:javascript
复制
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的文件,并添加下列代码:

代码语言:javascript
复制
namespace CsWhispers;

 

public static partial class Syscalls

{

    public static NTSTATUS NtCreateThreadEx()

    {

        // whatever

        return new NTSTATUS(0);

    }

}

接下来,我们就可以在主代码中调用这个类,并且无需添加任何额外的声明或语句:

代码语言:javascript
复制
namespace ConsoleApp1;

 

internal static class Program

{

    public static void Main()

    {

        var status = NtCreateThreadEx();

    }

}


许可证协议



本项目的开发与发布遵循MIT开源许可证协议。

项目地址

CsWhispers:

https://github.com/rasta-mouse/CsWhispers/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • D/Invoke
  • 类的继承使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档