首页 > 系统相关 >【C#应用】C# 对 Windows API 内存操作

【C#应用】C# 对 Windows API 内存操作

时间:2024-11-21 21:28:44浏览次数:1  
标签:IntPtr C# Windows API static 内存 memory

在C#中,我们可以通过调用Windows API来进行内存操作,这在一些特定的场景下非常有用。比如在需要与底层系统进行交互、进行内存分配和释放、修改其他进程的内存等情况下,使用Windows API可以帮助我们实现这些功能。

应用场景

内存分配和释放

通过Windows API可以实现内存的动态分配和释放,这在一些需要动态管理内存的场景下非常有用。比如在开发一些底层的系统工具或者对内存要求较高的应用程序时,可以使用Windows API来进行内存的分配和释放。

修改其他进程的内存

有时候我们需要修改其他进程的内存,比如在进行游戏作弊、软件破解等方面。通过Windows API可以实现对其他进程内存的读取和修改,从而实现这些功能。

例子

内存分配和释放

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool VirtualFree(IntPtr lpAddress, uint dwSize, FreeType dwFreeType);

    [Flags]
    enum AllocationType
    {
        Commit = 0x1000,
        Reserve = 0x2000
    }

    [Flags]
    enum MemoryProtection
    {
        ExecuteReadWrite = 0x40
    }

    enum FreeType
    {
        Release = 0x8000
    }

    static void Main()
    {
        // 分配内存
        IntPtr memory = VirtualAlloc(IntPtr.Zero, 4096, AllocationType.Commit | AllocationType.Reserve, MemoryProtection.ExecuteReadWrite);
        if (memory == IntPtr.Zero)
        {
            Console.WriteLine("Failed to allocate memory");
            return;
        }

        // 在分配的内存中存储整数值
        int valueToStore = 42;
        Marshal.WriteInt32(memory, valueToStore);
        
        // 从分配的内存中读取整数值
        int valueRead = Marshal.ReadInt32(memory);
        Console.WriteLine("Value read from allocated memory: " + valueRead);
        
        // 释放内存
        bool result = VirtualFree(memory, 0, FreeType.Release);
        if (!result)
        {
            Console.WriteLine("Failed to free memory");
        }

    }
}

修改其他进程的内存

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll")]
    static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);

    [DllImport("kernel32.dll")]
    static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesRead);

    [DllImport("kernel32.dll")]
    static extern bool CloseHandle(IntPtr hObject);

    [Flags]
    public enum ProcessAccessFlags : uint
    {
        All = 0x001F0FFF,
        QueryInformation = 0x0400,
        VirtualMemoryOperation = 0x0008,
        VirtualMemoryRead = 0x0010,
        VirtualMemoryWrite = 0x0020
    }

    static void Main()
    {
        // 获取进程句柄
        Process process = Process.GetProcessesByName("notepad")[0];
        IntPtr processHandle = OpenProcess(ProcessAccessFlags.All, false, process.Id);

        // 读取其他进程的内存
        IntPtr baseAddress = process.MainModule.BaseAddress;
        byte[] buffer = new byte[4];
        int bytesRead;
        ReadProcessMemory(processHandle, baseAddress, buffer, (uint)buffer.Length, out bytesRead);

        // 使用读取的内存

        // 关闭进程句柄
        CloseHandle(processHandle);
    }
}

以上是两个简单的例子,演示了如何使用Windows API来进行内存的分配和释放,以及如何修改其他进程的内存。在实际开发中,我们可以根据具体的需求来调用不同的Windows API来实现更复杂的内存操作功能。通过使用Windows API,我们可以更灵活地对内存进行管理,从而实现一些特定的功能。

原创 iamrick 技术老小子

标签:IntPtr,C#,Windows,API,static,内存,memory
From: https://www.cnblogs.com/o-O-oO/p/18561589

相关文章

  • Java性能为什么比c#高很多?
    实际上,Java和C#的性能并不是一成不变的,它们在不同的场景和条件下可能会有不同的表现。以下是一些可能导致Java在某些情况下性能比C#高的原因:1.**JIT编译**: -Java使用即时编译(JIT)技术,这种技术允许JVM在运行时优化字节码。随着时间的推移,JVM可以对经常执行的代码......
  • 全网首发!红帽 RHEL 10.0 一键安装 Oracle 19C,硬核!
    大家好,这里是Lucifer三思而后行,专注于提升数据库运维效率。目录社群交流前言安装准备环境信息安装命令安装过程连接测试写在最后往期精彩文章社群交流为了给大家提供一些技术交流的平台,目前已成立的技术交流群:Oracle数据库交流群国产数据库交流群Linux技术交......
  • Cppcheck 静态代码分析
    Cppcheck工具主要用于静态代码分析,帮助开发者在不运行代码的情况下发现潜在的错误、代码质量问题或性能隐患。Cppcheck安装sudoaptinstallcppcheckCppcheck使用基本用法cppcheck[选项][文件或目录]常用命令和选项检查单个文件cppcheckexample.cpp检......
  • 深入计算机语言之C++:STL之vector的模拟实现
    ......
  • windows基础二
    Windows2声明!学习视频来自B站up主泷羽sec有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站......
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
    block.pyultralytics\nn\modules\block.py目录block.py1.所需的库和模块2.classDFL(nn.Module):3.classProto(nn.Module):4.classHGStem(nn.Module): 5.classHGBlock(nn.Module): 6.classSPP(nn.Module): 7.classSPPF(nn.Module): 8.classC1(nn.Module):......
  • 神经网络(系统性学习四):深度学习——卷积神经网络(CNN)
    相关文章:神经网络中常用的激活函数神经网络(系统性学习一):入门篇神经网络(系统性学习二):单层神经网络(感知机)神经网络(系统性学习三):多层感知机(MLP)        卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一种深度学习模型,专为处理具有网格拓扑结构的数据而设计,最常见的应......
  • Cocos Creator引擎开发:物理引擎使用_物理材质的应用
    物理材质的应用在CocosCreator中,物理材质(PhysicsMaterial)是用于定义物理对象表面特性的资源。通过物理材质,可以控制物体之间的摩擦力、弹性等属性,从而实现更加真实和丰富的物理效果。本节将详细介绍物理材质的原理和应用方法,并通过具体的代码示例来演示如何在项目中使用......
  • Cocos Creator引擎开发:物理引擎使用_物理触发器与事件处理
    物理触发器与事件处理在CocosCreator中,物理触发器和事件处理是实现复杂物理交互的重要手段。物理触发器(Trigger)是一种特殊的碰撞体,用于检测物体之间的接触,但不会产生物理响应。事件处理则是当触发器检测到接触时,执行特定的逻辑。物理触发器的基本概念物理触发器在物理世......
  • Cocos Creator引擎开发:物理引擎使用_物理世界的设置与调试
    物理世界的设置与调试在CocosCreator中,物理引擎是模拟现实世界物理规律的关键组件,它可以帮助开发者实现逼真的物理效果,如碰撞检测、刚体运动、关节连接等。本节将详细介绍如何在CocosCreator中设置和调试物理世界,包括物理世界的初始化、物理材质的设置、物理关节的使用以......