逆向系列之简单读写其他进程的内存

  • 在windows下读取其他进程的内存非常简单,刨除其他进程主动防御手段,只要满足以下条件就可以读取内存
    1. 知道进程id
    2. 知道内存地址
  • 接下来我将写一段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); // 这里用PROCESS_VM_WRITE,WriteProcessMemory会失败

char num = 99;

SIZE_T t = 0;

WriteProcessMemory(handle, 1015761655160, &num, 1, &t);
  • 写入内存效果展示

附录

  • OpenProcess

    HANDLE OpenProcess(
      DWORD dwDesiredAccess, // 所需的访问权限
      BOOL  bInheritHandle,  // 是否可以继承句柄
      DWORD dwProcessId      // 目标进程的 ID
    );
    
    • dwDesiredAccess
      • 这个参数指定对目标进程的访问权限。它可以是多个权限标志的组合,常见的权限有
        • PROCESS_ALL_ACCESS: 访问进程的所有权限。
        • PROCESS_VM_READ: 读取进程的内存。
        • PROCESS_VM_WRITE: 写入进程的内存。
    • bInheritHandle: 这个参数指定是否允许子进程继承句柄。
    • dwProcessIdDWORD 类型)
      • 进程id
  • 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 // 实际写入的字节数
    );
    
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com