逆向系列之简单读写其他进程的内存
- 在windows下读取其他进程的内存非常简单,刨除其他进程主动防御手段,只要满足以下条件就可以读取内存
- 知道进程id
- 知道内存地址
- 接下来我将写一段wpf程序,随后用c语言来读取其中某个方法栈上内存(某个局部变量)
wpf程序循环展示一个变量的值
int age = 100;
while (true)
{
int* ptr = &age;
Debug.WriteLine((long)ptr);
MessageBox.Show(age.ToString());
}
c语言win32程序读取 wpf程序age 的值
- 上述wpf程序打印了
age 的地址,所以这里直接使用即可,至于processId 可以在任务管理器中查看
DWORD processID = 20996;
HANDLE handle = OpenProcess(PROCESS_VM_READ, FALSE, processID);
char* buffer = (char*)malloc(4);
SIZE_T t;
ReadProcessMemory(handle, 623163987272, buffer, 4, &t);
- 以上代码是为了演示,让代码看起来更简洁,抛去了
assert代码,实际开发中不判定win api调用是否成功是一个坏习惯,不要学!!!
- 读取内存效果展示
c语言win32程序写入wpf程序age的值
DWORD processID = 25864;
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
char num = 99;
SIZE_T t = 0;
WriteProcessMemory(handle, 1015761655160, &num, 1, &t);
附录
-
OpenProcess
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
dwDesiredAccess
- 这个参数指定对目标进程的访问权限。它可以是多个权限标志的组合,常见的权限有
PROCESS_ALL_ACCESS: 访问进程的所有权限。
PROCESS_VM_READ: 读取进程的内存。
PROCESS_VM_WRITE: 写入进程的内存。
bInheritHandle: 这个参数指定是否允许子进程继承句柄。
dwProcessId(DWORD 类型)
-
ReadProcessMemory
BOOL ReadProcessMemory(
HANDLE hProcess,
LPCVOID lpBaseAddress,
LPVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesRead
);
-
WriteProcessMemory
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);