C#读写游戏内存源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace 内存读写实例
{
    public class 原创外挂类
    {
        #region Api引用
        //打开进程,返回进程句柄
        [DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")]
        public static extern IntPtr OpenProcess
        (
            int dwDesiredAccess,        //渴望得到的访问权限(标志)
            bool bInheritHandle,        //是否继承句柄
            int dwProcessId             //进程标示符

        );

        //读内存
        [DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
        public static extern bool ReadProcessMemory
        (
            IntPtr hProcess,            //远程进程句柄。 被读取者
            IntPtr lpBaseAddress,       //远程进程中内存地址。 从具体何处读取
            IntPtr lpBuffer,            //本地进程中内存地址. 函数将读取的内容写入此处
            int nSize,                  //要传送的字节数。要写入多少
            IntPtr lpNumberOfBytesRead  //实际传送的字节数. 函数返回时报告实际写入多少
        );

        //写内存
        [DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")]
        public static extern bool WriteProcessMemory
        (
            IntPtr hProcess,                //由OpenProcess返回的进程句柄。
            IntPtr lpBaseAddress,           //要写的内存首地址
            int[] lpBuffer,                 //指向要写的数据的指针。
            int nSize,                      //要写入的字节数。
            IntPtr lpNumberOfBytesWritten   //实际数据的长度

        );

        //关闭内核对象
        [DllImport("kernel32.dll")]
        private static extern void CloseHandle
        (
            IntPtr hObject                 //欲关闭的对象句柄
        );
        #endregion

        /// <summary>
        /// 根据进程名获取PID
        /// </summary>
        /// <param name="processName">必须是纯进程名,不可以用后缀,如.exe</param>
        /// <returns>返回进程ID</returns>
        public static int 进程名取进程ID(string processName)
        {
            Process[] arrayProcess = Process.GetProcessesByName(processName);
            foreach (Process p in arrayProcess)
            {
                return p.Id;
            }
            return -1;
        }

        /// <summary>
        /// 读内存中的值,以整数形式返回
        /// </summary>
        /// <param name="processName">必须是不带后缀名的进程名</param>
        /// <param name="baseAddress">如果是十六进制,必须在地址前加0x</param>
        /// <returns></returns>
        public static int 读内存整数型(string processName, int baseAddress)
        {
            try
            {
                byte[] buffer = new byte[4];
                IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);         //获取缓冲区地址
                IntPtr hProcess = OpenProcess(0x1F0FFF, false, 进程名取进程ID(processName));     //0x1F0FFF表示最高权限
                ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero);  //将制定内存中的值读入缓冲区
                CloseHandle(hProcess);
                return Marshal.ReadInt32(byteAddress);
            }
            catch
            {
                return -1;
            }

        }

        /// <summary>
        /// 写内存整数型
        /// </summary>
        /// <param name="processName">纯进程名,不能有后缀名</param>
        /// <param name="baseAddress">欲写入的内存地址</param>
        /// <param name="value">欲写入的值</param>
        public static void 写内存整数型(string processName, int baseAddress, int value)
        {
            IntPtr hProcess = OpenProcess(0x1F0FFF, false, 进程名取进程ID(processName)); //0x1F0FFF 最高权限
            WriteProcessMemory(hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero);
            CloseHandle(hProcess);
        }

    }
}

  

时间: 2024-10-29 10:46:16

C#读写游戏内存源码的相关文章

linux内存源码分析 - 内存压缩(同步关系)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易理解,这里我们就说说在页面迁移过程中是如何进行同步的.不过首先可能没看过的朋友需要先看看linux内存源码分析 - 内存压缩(一),因为会涉及里面的一些知识. 其实一句话可以概括页面迁移时是如何进行同步的,就是:我要开始对这

Chrome自带恐龙小游戏的源码研究(完)

在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每达到100分就会出现闪烁特效,游戏第一次gameover时显示历史最高分.分数记录器由DistanceMeter构造函数实现,以下是它的全部代码: 1 DistanceMeter.dimensions = { 2 WIDTH: 10, //每个字符的宽度 3 HEIGHT: 13, //每个字符的高 4 DE

Chrome自带恐龙小游戏的源码研究(七)

在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较简单,缺点是对不规则物体的检测不够精确.如果不做更为精细的处理,结果会像下图: 如图所示,两个盒子虽然有重叠部分,但实际情况是恐龙和仙人掌之间并未发生碰撞.为了解决这个问题,需要建立多个碰撞盒子: 不过这样还是有问题,观察图片,恐龙和仙人掌都有四个碰撞盒子,如果每次Game Loop里都对这些盒子进行碰撞检测

Chrome自带恐龙小游戏的源码研究(五)

在上一篇<Chrome自带恐龙小游戏的源码研究(四)>中实现了障碍物的绘制及移动,从这一篇开始主要研究恐龙的绘制及一系列键盘动作的实现. 会眨眼睛的恐龙 在游戏开始前的待机界面,如果仔细观察会发现恐龙会时不时地眨眼睛.这是通过交替绘制这两个图像实现的: 可以通过一张图片来了解这个过程: 为实现图片的切换,需要一个计时器timer,并且需要知道两张图片切换的时间间隔msPerFrame.当计时器timer的时间大于切换的时间间隔msPerFrame时,将图片切换到下一张,到达最后一张时又从第一张

Chrome自带恐龙小游戏的源码研究(六)

在上一篇<Chrome自带恐龙小游戏的源码研究(五)>中实现了眨眼睛的恐龙,这一篇主要研究恐龙的跳跃. 恐龙的跳跃 游戏通过敲击键盘的Spacebar或者Up来实现恐龙的跳跃.先用一张图来表示整个跳跃的过程: 首先规定向下为正方向,即重力加速度(g)为正,起跳的速度(v)为负,恐龙距离画布上方的距离为yPos: 每一帧动画中,速度都会与重力加速度相加得到新的速度,再用新的速度与yPos相加得到新的yPos,改变恐龙的位置为新的yPos,表现出来为yPos不断减小: 当恐龙升至最高点,此时速度为

双人对战的球类游戏IOS源码

双人对战的球类游戏源码,这个是一款双人对战的ios球类游戏源码,游戏的源码也比较详细的,我们在屏幕上下看到各有一个球门,内有一球,两边通过控制轮盘使球进入对方的球门的,其实玩法也很简单的,我们知道体育类的游戏目前,还是很少的,大家可以参考一下这个游戏的方案,希望能够推出更强大的游戏. <ignore_js_op> <ignore_js_op> 详细说明:http://ios.662p.com/thread-1426-1-1.html

是男人就下100层【第五层】——2048游戏从源码到发布市场

上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的所有源代码公开并结合这个实例在这篇文章中介绍一下如何添加广告和实现分享功能. 最终运行效果如下(更多运行效果请看<是男人就下100层[第五层]--换肤版2048游戏>): 一.如何实现换肤 换肤的思路其实很简单,在ActionBar中添加菜单,当用户选择某一个皮肤后就将当前的皮肤状态修改并保存到SharedPreference中,

RPG游戏案例源码

再发一份我的另外一个作品吧,源码OzgGameRPG,本游戏主要用于技术的研究和积累,目前只部署了ios平台.游戏第一次启动的时候会把数据库复制到可写文件夹,若数据库结构因为一些改动发生了变化,需要把旧的数据库删除. 编译时需要将本游戏的目录复制到cocos2d-x-2.2.3/projects/. 游戏中所用的一部分图片来自 http://www.66rpg.com/type.php?t=17 另一部分图片来自http://usui.moo.jp/rpg_tukuru.html 声音文件来自 

Chrome自带恐龙小游戏的源码研究(四)

在上一篇<Chrome自带恐龙小游戏的源码研究(三)>中实现了让游戏昼夜交替,这一篇主要研究如何绘制障碍物. 障碍物有两种:仙人掌和翼龙.仙人掌有大小两种类型,可以同时并列多个:翼龙按高.中.低的随机飞行高度出现,不可并行.仙人掌和地面有着相同的速度向左移动,翼龙则快一些或慢一些,因为添加了随机的速度修正.我们使用一个障碍物列表管理它们,当它们移出屏幕外时则将其从列表中移除.同时再用一个列表记录它们的类型: 1 Obstacle.obstacles = []; //存储障碍物的数组 2 Obs