99.遍历进程并直接写入内存

  • 包含头文件

    1 //进程快照
    2 #include<TlHelp32.h>
  • 进程名

    1 //进程名
    2 #define exename  "PlantsVsZombies.exe"
  • 创建进程快照

     1 HANDLE hpro=NULL;
     2
     3     //存储进程快照信息
     4     PROCESSENTRY32 pe32 = { 0 };
     5
     6     //设置进程快照结构体大小
     7     pe32.dwSize = sizeof(pe32);
     8
     9     //创建进程快照
    10     HANDLE hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  • 遍历进程快照

    //遍历进程快照
        BOOL  bmore = Process32First(hprocess, &pe32);
        while (bmore)
        {
            //如果找到打开进程
            if (strcmp(exename, pe32.szExeFile) == 0)
            {
                hpro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
                break;
            }
    
            //遍历下一个
            bmore = Process32Next(hprocess, &pe32);
        }
  • 初始化指向的地址并读取

     1 //用于读取
     2     int *p = malloc(4);
     3     //指向的地址
     4     int *pfind = 0x09121D88;
     5     //标识读取了几个字节
     6     int size = 0;
     7     //读取内存
     8     ReadProcessMemory(hpro, pfind, p, 4, &size);
     9
    10     printf("%d", *p);
  • 初始化指向的地址并写入

    1   int *p = malloc(4);
    2     *p = 888;
    3
    4     //指向的地址
    5     int *pfind = 0x09121D88;
    6     //标识写入了几个字节
    7     int size = 0;
    8     //写入
    9     WriteProcessMemory(hpro, pfind, p, 4, &size);
  • 关闭进程

    1 TerminateProcess(hpro, 0);

完整代码

 1 #include<stdio.h>
 2 #include <stdlib.h>
 3 #include<Windows.h>
 4 //进程快照
 5 #include<TlHelp32.h>
 6 //进程名
 7 #define exename  "PlantsVsZombies.exe"
 8
 9 //读取进程
10 void read()
11 {
12     HANDLE hpro=NULL;
13
14     //存储进程快照信息
15     PROCESSENTRY32 pe32 = { 0 };
16
17     //设置进程快照结构体大小
18     pe32.dwSize = sizeof(pe32);
19
20     //创建进程快照
21     HANDLE hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
22
23     //遍历进程快照
24     BOOL  bmore = Process32First(hprocess, &pe32);
25     while (bmore)
26     {
27         //如果找到打开进程
28         if (strcmp(exename, pe32.szExeFile) == 0)
29         {
30             hpro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
31             break;
32         }
33
34         //遍历下一个
35         bmore = Process32Next(hprocess, &pe32);
36     }
37     //用于读取
38     int *p = malloc(4);
39     //指向的地址
40     int *pfind = 0x09121D88;
41     //标识读取了几个字节
42     int size = 0;
43     //读取内存
44     ReadProcessMemory(hpro, pfind, p, 4, &size);
45
46     printf("%d", *p);
47 }
48
49 //写入内存
50 void write()
51 {
52     //用于遍历进程
53     HANDLE hpro = NULL;
54
55     //存储进程快照信息
56     PROCESSENTRY32 pe32 = { 0 };
57
58     //设置进程快照结构体大小
59     pe32.dwSize = sizeof(pe32);
60
61     //创建进程快照
62     HANDLE hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
63
64     //遍历进程快照
65     BOOL  bmore = Process32First(hprocess, &pe32);
66     while (bmore)
67     {
68         //如果找到打开进程
69         if (strcmp(exename, pe32.szExeFile) == 0)
70         {
71             hpro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
72             break;
73         }
74
75         //遍历下一个
76         bmore = Process32Next(hprocess, &pe32);
77     }
78     int *p = malloc(4);
79     *p = 888;
80
81     //指向的地址
82     int *pfind = 0x09121D88;
83     //标识写入了几个字节
84     int size = 0;
85     //写入
86     WriteProcessMemory(hpro, pfind, p, 4, &size);
87
88     printf("%d", *p);
89 }
90
91 void main()
92 {
93     read();
94     write();
95
96     system("pause");
97 }

原文地址:https://www.cnblogs.com/xiaochi/p/8479666.html

时间: 2024-10-11 20:23:33

99.遍历进程并直接写入内存的相关文章

【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通信,在一个进程之中,只能单一的对其写或者是读,而不可以及执行写操作又执行读操作.这一点,我们可以将其想象成我们的水管,分别连着不同的两端,在有水流的时候,一端只能进行输入,另一端只能进行输出,而不可以同时输入和输出. 管道又分为有名管道和匿名管道,两者的区别在于对于匿名管道,其只能在具有亲缘关系的父

win32进程间通讯--共享内存

小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 1 hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)szName); 2.在需要进行数据共享的地方映射缓存区视图,将要写入的数据放入pbuf 1 pBuf = (c

进程通信之共享内存

共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自

C# HttpBrowser 跨进程访问,解决内存泄露问题

1 #undef DEBUG 2 using Microsoft.Win32; 3 using Newtonsoft.Json; 4 using System; 5 using System.Collections.Generic; 6 using System.Collections.Specialized; 7 using System.Diagnostics; 8 using System.Diagnostics.Contracts; 9 using System.Drawing; 10

进程通信之共享内存篇

共享内存原理示意图 shmget函数语法: shmat函数语法 shmdt函数语法 代码分析: /* shmem.c */ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFER_SIZE 2048 int main

linux 进程通信之 共享内存

共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容. 关于共享内存使用的API key_t ftok(const char *pathname, int proj_id); #在IPC中,我们经常用一个 key_t 的值来创建或者打开 信号量,共享内存和消息队列.这个 key_t 就是由ftok函数产生的. pathname:指定的文件名,该文件必须是存在而且可以访问 proj_

程序员之---C语言细节22(函数返回指针注意事项&amp;lt;悬空指针&amp;gt;、查看进程能够分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针会悬空,由于在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中.生命期和程序一样长,函数退出时变量 // 依旧有效 return fruit; }

程序猿之---C语言细节22(函数返回指针注意事项&lt;悬空指针&gt;、查看进程可以分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程可以分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针以及悬空,因为在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中,生命期和程序一样长,函数退出时变量 // 依然有效 return fruit; }

C++得到当前进程所占用的内存

原文地址:C++得到当前进程所占用的内存作者:雪碧狗 使用SDK的PSAPI (Process Status Helper)中的BOOL GetProcessMemoryInfo(  HANDLE Process,  PPROCESS_MEMORY_COUNTERS ppsmemCounters,  DWORD cb); typedef struct _PROCESS_MEMORY_COUNTERS {  DWORD cb;  DWORD PageFaultCount;  SIZE_T Peak