access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中

access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中,由于当前进程的(主要指内核进程和用户进程,或内核态的用户进程之间进行拷贝,由于双方的页表不同所以不能访问到对方的东西,可以用这个函数把对方的页映射到高端内存然后进行拷贝,实现不同进程间的内存拷贝)

 

 

#include <linux/sched.h>
#include <linux/mm.h>

extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
char buf[4096+8] = "TEST ACCESS_PROCESS_VM 000000";
void test_user_copy(void)
{
 struct task_struct *t;
 int len = 1024*4;
 long addr = 0x8696008; //this is a fixed addr printed by tfile.c, never change.
 int found = 0;
 int i;

        for_each_process(t) {
            if(!strncmp("a.out", t->comm, 5)) {found++; break; }
            printk("%p %s/n", t, t->comm);
        }
        if(!found) return;

        //so I can see kernel writing is done from user space. each time, the addr is not the
        //same
        sprintf(buf + 16, "%p", &addr);

        for(i = 0; i < 6*256; i++) { //256 pages = 1M
            access_process_vm(t, addr+i*4096, buf, len, 1);  //addr USER, buf is KERNEL
        }
        printk("i = %d addr max = %lx /n", i, addr + i*4096);
}

int mod_init(void)
{
 test_user_copy();
 return 0;
}

void mod_exit(void)
{
}

module_init(mod_init);
module_exit(mod_exit);

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------

test.c

 

#include <stdlib.h>
#include <stdio.h>
char *cp;

main()
{
    cp = malloc(1024*4); //4M
    printf("cp = %p size = 4k/n", cp);//change addr value in module according to this printed value.


    for(;;) {
      getchar();
      printf("%s, /n", cp);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows平台下,可以使用以下步骤将一个string类型的数据存入共享内存,并在另一个进程取出数据: 1. 创建共享内存对象 使用CreateFileMapping函数创建一个共享内存对象。该函数的参数包括:共享内存对象句柄、安全属性、共享内存对象名称和共享内存大小等。例如: ``` HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 使用无效句柄值创建一个页面文件映射对象 NULL, // 默认安全属性 PAGE_READWRITE, // 可读可写 0, // 文件映射的高位文件大小 sizeof(string), // 文件映射的低位文件大小 "MySharedMemory"); // 共享内存对象名称 ``` 2. 在当前进程映射共享内存 使用MapViewOfFile函数将共享内存对象映射到当前进程的地址空间。该函数的参数包括:共享内存对象句柄、文件映射访问权限、偏移量和映射长度等。例如: ``` LPVOID lpMapAddress = MapViewOfFile( hMapFile, // 共享内存对象句柄 FILE_MAP_ALL_ACCESS, // 读写权限 0, 0, sizeof(string)); // 映射长度 ``` 3. 将数据写入共享内存 将string结构体数据写入共享内存。例如: ``` string data = "Hello, World!"; memcpy(lpMapAddress, &data, sizeof(string)); ``` 4. 在另一个进程打开共享内存对象 使用OpenFileMapping函数打开先前创建的共享内存对象。例如: ``` HANDLE hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, // 读写权限 FALSE, "MySharedMemory"); // 共享内存对象名称 ``` 5. 在另一个进程映射共享内存 使用MapViewOfFile函数将共享内存对象映射到另一个进程的地址空间。例如: ``` LPVOID lpMapAddress = MapViewOfFile( hMapFile, // 共享内存对象句柄 FILE_MAP_ALL_ACCESS, // 读写权限 0, 0, sizeof(string)); // 映射长度 ``` 6. 从共享内存读取数据 从共享内存读取数据。例如: ``` string data; memcpy(&data, lpMapAddress, sizeof(string)); ``` 7. 断开共享内存映射 在两个进程都完成数据读写后,应该调用UnmapViewOfFile函数断开共享内存映射。例如: ``` UnmapViewOfFile(lpMapAddress); ``` 8. 关闭共享内存对象 最后,使用CloseHandle函数关闭共享内存对象句柄。例如: ``` CloseHandle(hMapFile); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值