C# Read/Write another Process' Memory ZZ
Today's tutorial is about...processes' memory! In this article I'll show you how to read/write a process' memory using C#. This is a good way to learn a part of WinAPI and also understand the basics of memory allocation.
Before starting, we need a "target" - I choose notepad.exe.
1.Finding the Memory Address
As you might probably know, applications store each variable's value at a specific memory address,
we need to know that memory adress in order to edit anything. Since
there's not other way around (or I'm not aware of it?) the only solution
is to start searching, using a debugger.
To get that memory address, I used OllyDbg - don't worry, all the steps are written below.
First, open notepad.exe, type some text (like "hello world") and attach OllyDbg (File->Attach). Press F9 and then ALT+M to open the Memory Map.
It should look like this:

Press CTRL+B and it will open the Binary Search Window. Now, because the value is stored in memory as Unicode, you have to type the string you're looking for in the 2nd textbox:

Once you hit Ok another window will pop up - the Memory Dump. Here, look at the very first memory address
(on the left) - from that address we'll start reading. In the image
below, the highlighted part contains the message I typed in Notepad.
Note: don't use the memory address from the image - it's not the same memory address every time

We got the memory address, now...don't close/restart the application. If you restart it, the memory for the text will be reallocated, so the address will most likely be changed.
2.Read Process' Memory
In order to read the value from that memory address, we need to import 2 functions into C#: OpenProcess() and ReadProcessMemory() from kernel32.dll.
- [DllImport("kernel32.dll")]
- public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
- [DllImport("kernel32.dll")]
- public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
When a process is opened, you must also specify the desired access (this
time, you request access for reading the memory), so this constant is
needed:
- const int PROCESS_WM_READ = 0x0010;
Since the whole code is self explanatory, I'll just add short comments where they're needed:
- using System;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using System.Text;
- public class MemoryRead
- {
- const int PROCESS_WM_READ = 0x0010;
- [DllImport("kernel32.dll")]
- public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
- [DllImport("kernel32.dll")]
- public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
- public static void Main()
- {
- Process process = Process.GetProcessesByName("notepad")[0];
- IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
- int bytesRead = 0;
- byte[] buffer = new byte[24]; //'Hello World!' takes 12*2 bytes because of Unicode
- // 0x0046A3B8 is the address where I found the string, replace it with what you found
- ReadProcessMemory((int)processHandle, 0x0046A3B8, buffer, buffer.Length, ref bytesRead);
- Console.WriteLine(Encoding.Unicode.GetString(buffer) + " (" + bytesRead.ToString() + "bytes)");
- Console.ReadLine();
- }
- }
3.Write Process' Memory
Writing to a memory address is a little bit different: you'll need OpenProcess() and WriteProcessMemory().
- [DllImport("kernel32.dll")]
- public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
- [DllImport("kernel32.dll", SetLastError = true)]
- static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);
However, special permissions are required: while opening the process request the following access: PROCESS_VM_WRITE | PROCESS_VM_OPERATION.
- const int PROCESS_VM_WRITE = 0x0020;
- const int PROCESS_VM_OPERATION = 0x0008;
Note: notepad's textbox is storing the number of bytes
it has to read from the memory - that value is updated only when the
text is changed by user. If you write to the memory address a longer
string, it will be truncated.
The complete code is available below:
- using System;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using System.Text;
- public class MemoryRead
- {
- const int PROCESS_VM_WRITE = 0x0020;
- const int PROCESS_VM_OPERATION = 0x0008;
- [DllImport("kernel32.dll")]
- public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
- [DllImport("kernel32.dll", SetLastError = true)]
- static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);
- public static void Main()
- {
- Process process = Process.GetProcessesByName("notepad")[0];
- IntPtr processHandle = OpenProcess(0x1F0FFF, false, process.Id);
- int bytesWritten = 0;
- byte[] buffer = Encoding.Unicode.GetBytes("It works!\0"); // '\0' marks the end of string
- // replace 0x0046A3B8 with your address
- WriteProcessMemory((int)processHandle, 0x0046A3B8, buffer, buffer.Length, ref bytesWritten);
- Console.ReadLine();
- }
- }
C# Read/Write another Process' Memory ZZ的更多相关文章
- C# Read/Write another Process' Memory z
http://www.codeproject.com/Articles/670373/Csharp-Read-Write-another-Process-Memory This article aim ...
- ORA-04030: out of process memory when trying to allocate 152 bytes (Logminer LCR c,krvtadc)
今天使用LogMiner找回误更新的数据时,查询v$logmnr_contents时,遇到了"ORA-04030: out of process memory when trying to ...
- SAP work process Memory allocate
Memory allocation sequence to dialog work processes in SAP What is the memory allocation sequence to ...
- C# Read/Write another Process' Memory
https://codingvision.net/security/c-read-write-another-process-memory Today’s tutorial is about…proc ...
- Automated Memory Analysis
catalogue . 静态分析.动态分析.内存镜像分析对比 . Memory Analysis Approach . volatility: An advanced memory forensics ...
- Process Explorer使用图文教程
这是一款由Sysinternals开发的Windows系统和应用程序监视工具,目前Sysinternals已经被微软收购,此款不仅结合了文件监视和注册表监视两个工具的功能,还增加了多项重要的增强功能, ...
- mm/memory
/* * linux/mm/memory.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * demand-loading started ...
- Read ListViewItem content from another process z
Normal Windows GUI applications work with messages that are sent to a window or control and the cont ...
- 通过ctypes获得python windows process的内存使用情况
通过ctypes 类库中的win32方法GetProcessMemoryInfo()获得当前进程的内存使用情况.该函数可以在32或者64位,python2.6+及python3.x之上都能有用. &q ...
随机推荐
- OS X环境下SVN回滚工程到指定版本,回滚指定文件到指定版本
1.打开命令行终端 2.cd + 工程或文件目录 3.svn update 工程目录或文件目录 -r 版本号 在Xcode中选中文件,右键选择''show in finder''(也可以用快捷键,不过 ...
- Nginx的反向代理
先通过简单的图来说明一下正向代理和反向代理吧~ 正向代理 代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介.刚开始的时候,代理多数是帮助内网client访问外网server用的(比 ...
- C语言——N个人围成一圈报数淘汰问题
<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? ...
- Lua数组排序
代码 network = { {name = "grauna", IP = "210.26.30.34"}, {name = "arraial&quo ...
- .NET异步操作学习之一:Async/Await中异常的处理
以前的异常处理,习惯了过程式的把出现的异常全部捕捉一遍,然后再进行处理.Async/Await关键字出来之后的确简化了异步编程,但也带来了一些问题.接下来自己将对这对关键字进行学习.然后把研究结果放在 ...
- Homebrew安装php5及composer for mac教程
安装brew 可以查看教程:mac os x 10.9.1 安装 Homebrew软件包管理工具及brew安装maven3.1.1 首先更新下brew软件库 brew update brew tap ...
- android中监听layout布局
android开发可以对layout文件夹中的xml文件里的布局进行监听,并处理事件,如:对RelativeLayout,LinearLayout,FrameLayout,GridLayout等布局容 ...
- bzoj2427: [HAOI2010]软件安装
Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...
- bzoj3667: Rabin-Miller算法
Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质 ...
- 贴板子系列_1-km算法,匈牙利算法
KM算法 #include <bits/stdc++.h> #define N 1500 #define inf 999999999 using namespace std; ,ny=,k ...