- 浏览: 275686 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
weituotian:
这篇文章真的很好阿
C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 -
clshuai:
博主,你好,看了你的这篇文章,让我很敬佩。可谓内容之全,涵盖范 ...
C#操作Excel -
devilhand:
DataGridView刷新数据的问题 -
devilhand:
DataGridView刷新数据的问题 -
devilhand:
DataGridView刷新数据的问题
最近闲来无事发现周围的朋友都在玩《植物大战僵尸》的游戏!于是动了制作这游戏工具的念头!虽然在网上同类工具很多 但是用C#写的我几乎看不到!所以我想用C#写一个!
首先用CE或者OD或者其他反汇编工具找出游戏的内存基址!
游戏内存基址:base = 0x006A9EC0
游戏阳光地址:[base+0x768]+0x5560
游戏金钱地址:[base+0x82C]+0x28
游戏关卡地址:[base+0x82C]+0x24 //关卡如:A-B 实际值为:(A-1)×10+B
至于如何获取这些地址不在我们这论坛研究的范围中!
对了我是用工具vs2008编写的!
新建窗体:
using System; using System.Drawing; using System.Text; using System.Windows.Forms; namespace PlantsVsZombiesTool { /// <summary> /// /// </summary> public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } //启动无线阳光 private void btnGet_Click(object sender, EventArgs e) { if (Helper.GetPidByProcessName(processName) == 0) { MessageBox.Show("哥们启用之前游戏总该运行吧!"); return; } if (btnGet.Text == "启用-阳光无限") { timer1.Enabled = true; btnGet.Text = "关闭-阳光无限"; } else { timer1.Enabled = false; btnGet.Text = "启用-阳光无限"; } } private void timer1_Tick(object sender, EventArgs e) { if (Helper.GetPidByProcessName(processName) == 0) { timer1.Enabled = false; btnGet.Text = "启用-阳光无限"; } int address = ReadMemoryValue(baseAddress); //读取基址(该地址不会改变) address = address + 0x768; //获取2级地址 address = ReadMemoryValue(address); address = address + 0x5560; //获取存放阳光数值的地址 WriteMemory(address, 0x1869F); //写入数据到地址(0x1869F表示99999) timer1.Interval = 1000; } //启动无线金钱 private void btnMoney_Click(object sender, EventArgs e) { if (Helper.GetPidByProcessName(processName) == 0) { MessageBox.Show("哥们启用之前游戏总该运行吧!"); return; } if (btnMoney.Text == "启用-金钱无限") { timer2.Enabled = true; btnMoney.Text = "关闭-金钱无限"; } else { timer2.Enabled = false; btnMoney.Text = "启用-金钱无限"; } } private void timer2_Tick(object sender, EventArgs e) { if (Helper.GetPidByProcessName(processName) == 0) { timer2.Enabled = false; btnMoney.Text = "启用-金钱无限"; } int address = ReadMemoryValue(baseAddress); //读取基址(该地址不会改变) address = address + 0x82C; //获取2级地址 address = ReadMemoryValue(address); address = address + 0x28; //得到金钱地址 WriteMemory(address, 0x1869F); //写入数据到地址(0x1869F表示99999) timer2.Interval = 1000; } private void btnGo_Click(object sender, EventArgs e) { if (Helper.GetPidByProcessName(processName) == 0) { MessageBox.Show("哥们启用之前游戏总该运行吧!"); return; } int address = ReadMemoryValue(baseAddress); //读取基址(该地址不会改变) address = address + 0x82C; //获取2级地址 address = ReadMemoryValue(address); address = address + 0x24; int lev = 1; try { lev = int.Parse(txtLev.Text.Trim()); } catch { MessageBox.Show("输入的关卡格式不真确!默认设置为1"); } WriteMemory(address, lev); } //读取制定内存中的值 public int ReadMemoryValue(int baseAdd) { return Helper.ReadMemoryValue(baseAdd, processName); } //将值写入指定内存中 public void WriteMemory(int baseAdd, int value) { Helper.WriteMemoryValue(baseAdd, processName, value); } private int baseAddress = 0x006A9EC0; //游戏内存基址 private string processName = "PlantsVsZombies"; //游戏进程名字 } }
下面这个类是整个工具的核心
using System; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; namespace PlantsVsZombiesTool { public abstract class Helper { [DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")] public static extern bool ReadProcessMemory ( IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, IntPtr lpNumberOfBytesRead ); [DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")] public static extern IntPtr OpenProcess ( int dwDesiredAccess, bool bInheritHandle, int dwProcessId ); [DllImport("kernel32.dll")] private static extern void CloseHandle ( IntPtr hObject ); //写内存 [DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")] public static extern bool WriteProcessMemory ( IntPtr hProcess, IntPtr lpBaseAddress, int[] lpBuffer, int nSize, IntPtr lpNumberOfBytesWritten ); //获取窗体的进程标识ID public static int GetPid(string windowTitle) { int rs = 0; Process[] arrayProcess = Process.GetProcesses(); foreach (Process p in arrayProcess) { if (p.MainWindowTitle.IndexOf(windowTitle) != -1) { rs = p.Id; break; } } return rs; } //根据进程名获取PID public static int GetPidByProcessName(string processName) { Process[] arrayProcess = Process.GetProcessesByName(processName); foreach (Process p in arrayProcess) { return p.Id; } return 0; } //根据窗体标题查找窗口句柄(支持模糊匹配) public static IntPtr FindWindow(string title) { Process[] ps = Process.GetProcesses(); foreach (Process p in ps) { if (p.MainWindowTitle.IndexOf(title) != -1) { return p.MainWindowHandle; } } return IntPtr.Zero; } //读取内存中的值 public static int ReadMemoryValue(int baseAddress,string processName) { try { byte[] buffer = new byte[4]; IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址 IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero); //将制定内存中的值读入缓冲区 CloseHandle(hProcess); return Marshal.ReadInt32(byteAddress); } catch { return 0; } } //将值写入指定内存地址中 public static void WriteMemoryValue(int baseAddress, string processName, int value) { IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限 WriteProcessMemory(hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero); CloseHandle(hProcess); } } }
发表评论
-
C#获取本地IP
2012-06-06 14:39 885/// <summary> ... -
只能启动单个程序
2012-05-04 12:51 782bool ret; System. ... -
.Net控件命名规范
2012-04-25 14:45 772<!--------------A----------- ... -
DataGridView绑定数据时,时间格式显示不全的问题
2012-04-25 13:54 991DataGridView绑定数据时,时间格式显示问题 今天做 ... -
把Dgv的颜色改回默认颜色
2012-04-25 13:35 923dgv.Rows[i].DefaultCellStyle.Ba ... -
Winform 去掉 最大化 最小化 关闭按钮 保留左侧图片
2012-04-23 17:02 1141using System; using System.Col ... -
禁用窗体的关闭按钮
2012-04-23 16:58 837[DllImport("USER32 ... -
c#中用声音提示报警
2012-03-14 09:51 1693using System; using System.Ru ... -
WinForm 查看控制台输出
2012-02-15 10:39 1268/// <summary> ... -
C# 启动外部程序的几种方法
2011-10-17 19:15 7191. 启动外部程序,不等待其退出。2. 启动外部程序,等待其退 ... -
解决VS2005不能调试线程问题
2011-08-12 12:33 2368昨天突然VS2005不能调试线程,网上找了很多方法都不行,后来 ... -
通过域名获取IP的两种方法
2011-07-16 15:09 1812//每次都去Dns服务器上 ... -
执行命名行命令
2011-07-16 14:41 681/// <summary> / ... -
获取指定目录下所有文件
2011-07-01 20:48 1452命名空间 using System.Collections; ... -
C#控制Excel的打印格式
2011-06-22 20:54 3692Excel.Application appExcel=n ... -
C#操作Excel
2011-06-22 14:28 1577using System; using System. ... -
C# 操作Excel的类
2011-06-22 14:20 1326using System; using Micro ... -
DataGridView刷新数据的问题
2011-06-21 11:39 41951、操作:UI线程修改数据后重新绑定dgv,一个后台线程定时刷 ... -
VS2005水晶报表注册码
2011-06-18 13:40 7016707437608 -
按Enter键时,焦点移到下一个控件
2011-06-18 10:06 1204#region 按Enter键时,焦点移 ...
相关推荐
C# 操作内存 C# 操作内存 C# 操作内存 C# 操作内存 C# 操作内存 C# 操作内存 C# 操作内存 C# 操作内存
C#操作共享内存读写工程、C#操作共享内存读写工程、C#操作共享内存读写工程
c# 内存共享操作,可以创建、读取、写入内存共享区,
好吧 我承认这东西效率真不咋地 也别喷我的代码 我承认我的代码写的也不咋地 ...还有就是 这程序 可能存在许多潜在的bug 比如内存溢出 不过我能知道的或者知道怎么解决的问题 我已近解决了 总之 这代码仅供参考
C# 共享内存 存储 C# 共享内存 存储 C# 共享内存 存储
C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存
特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。...
明白内存管理的基本行为将有助于我们解释我们程序中变量是如何操作的。在本文中我将讨论栈和堆的一些基本知识,变量的类型和某些变量的工作原理。 1.C++的手动回收机制 2.net的自动回收机制 3.使用C++实现自动回收...
c#写的模拟操作系统程序,包括内存管理,cpc管理,磁盘管理,i/o管理。(河北大学操作系统课程设计)
C#共享内存的实例,附源码和工程文件。 网上有C#的共享内存类,不过功能太简单了。 故,对此进行了改进。通过利用共享内存的一部分空间来存储当前内存中存储的数据信息(count和length),完成了对内存读写功能的...
c# 操作内存的方法 可以读取写入内存,将信息保存到内存中,
C#编写的模拟操作系统虚拟内存分页请求管理 计算机操作系统第三版 汤小丹等编著 根据课本算法流程编写 原创
C# 调用WinIO读写寄存器以及映射内存(含源码) C# 调用WinIO读写寄存器以及映射内存(含源码) C# 调用WinIO读写寄存器以及映射内存(含源码) LoadLibrary GetProcAddress FreeLibrary InitializeWinIoType ...
C# CPU内存使用率 实例源码(系统操作)
c# Excel 操作类,可实现EXCEL的大部分操作,并且可以把数据库查询出的结果datatable直接导到EXCEL里面,注释详细! /// /// 将内存中数据表格插入到Excel指定工作表的指定位置 /// /// 数据表 /// 工作表...
C# 中基于 COM+ 的结构化存储,C#代码与javaScript函数的相互调用,C#共享内存操作类
C# 系统操作 实时显示CPU内存使用率 Microsoft.VisualBasic.Devices.Computer myInfo = new Microsoft.VisualBasic.Devices.Computer(); //获取物理内存总量 pbMemorySum.Maximum = Convert.ToInt32(myInfo.Info....
谈下你对 Redis 的了解? 1)Redis是一种基于键值对的NoSQL数据库(非关系...包括c#引用的包,操作类,包括操作List,Hash、SortedSet等全有了 更多请查阅 https://blog.csdn.net/weijia3624/article/details/130691865
模拟操作系统 c# 语言 文件管理 内存管理 进程管理
利用共享内存实现进程间的通信,可用于操作系统的教学。(原创)